pixi.js + three.js
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script type="importmap">
{
"imports": {
"@mulsense/xnew": "https://unpkg.com/@mulsense/xnew@0.2.x/dist/xnew.mjs",
"@mulsense/xnew/addons/xpixi": "https://unpkg.com/@mulsense/xnew@0.2.x/dist/addons/xpixi.mjs",
"@mulsense/xnew/addons/xthree": "https://unpkg.com/@mulsense/xnew@0.2.x/dist/addons/xthree.mjs",
"pixi.js": "https://cdnjs.cloudflare.com/ajax/libs/pixi.js/8.6.6/pixi.min.mjs",
"three": "https://cdn.jsdelivr.net/npm/three@0.176.0/+esm"
}
}
</script>
<script type="module" src="./script.js"></script>
</head>
<body style="margin: 0; height: 100vh;">
<div id="main" style="width: 100%; height: 100%;"></div>
</body>
</html>
script.js
import xnew from '@mulsense/xnew';
import xpixi from '@mulsense/xnew/addons/xpixi';
import xthree from '@mulsense/xnew/addons/xthree';
import * as PIXI from 'pixi.js';
import * as THREE from 'three';
xnew('#main', Main);
function Main(main) {
xnew.extend(xnew.basics.Screen, { width: 800, height: 400 });
// three setup
xthree.initialize({ canvas: new OffscreenCanvas(main.canvas.width, main.canvas.height) });
xthree.camera.position.set(0, 0, +100);
// pixi setup
xpixi.initialize({ canvas: main.canvas });
xnew(Cubes);
xnew(Texture, { texture: xpixi.sync(xthree.canvas) });
xnew(Boxes);
}
function Texture(unit, { texture } = {}) {
const object = xpixi.nest(new PIXI.Sprite(texture));
}
function Boxes(self) {
const object = xpixi.nest(new PIXI.Container());
object.position.set(xpixi.canvas.width / 2, xpixi.canvas.height / 2); // center
for (let y = -1; y <= 1; y++) {
for (let x = -1; x <= 1; x++) {
xnew(Box, { x: 80 * x, y: 80 * y, size: 40, color: 0xEA1E63 });
}
}
self.on('-update', () => object.rotation += 0.01);
}
function Box(self, { x, y, size, color }) {
const object = xpixi.nest(new PIXI.Container());
object.position.set(x, y);
object.addChild(new PIXI.Graphics().rect(-size / 2, -size / 2, size, size).fill(color));
self.on('-update', () => object.rotation += 0.01);
}
function Cubes(unit) {
const object = xthree.nest(new THREE.Object3D());
for (let z = -1; z <= 1; z++) {
for (let y = -1; y <= 1; y++) {
for (let x = -1; x <= 1; x++) {
xnew(Cube, { x: 15 * x, y: 15 * y, z: 15 * z, size: 6 });
}
}
}
unit.on('-update', () => {
object.rotation.y += 0.01;
object.rotation.z += 0.01;
});
}
function Cube(unit, { x, y, z, size }) {
const geometry = new THREE.BoxGeometry(size, size, size);
const material = new THREE.MeshNormalMaterial();
const object = xthree.nest(new THREE.Mesh(geometry, material));
object.position.set(x, y, z);
unit.on('-update', () => {
object.rotation.x += 0.01;
object.rotation.y += 0.01;
});
}