XGPU

TwoCubes_Sample.ts

import { GPURenderer, RenderPipeline } from "xgpu";
import { Sample } from "../HelloTriangle/Sample";
import { Cube } from "../ColorCube/Cube";
import { ModelViewMatrix } from "../InstanceCube/ModelViewMatrix";

export class TwoCubes_Sample extends Sample {

protected async start(renderer: GPURenderer): Promise<void> {

const cube = new Cube()
const trans: ModelViewMatrix = cube.resources.transform;

trans.z = -2000;
trans.scaleX = trans.scaleY = trans.scaleZ = 150;

//cube.createPipelineInstanceArray allow us to define
//the resources available per instance during the 'onDraw'.

const nbCube: number = 2;
const instances = cube.createPipelineInstanceArray([
trans
], nbCube)

console.log("instances = ",instances)

const now = new Date().getTime();
cube.addEventListener(RenderPipeline.ON_DRAW, (pipelineId: number) => {
console.log("pipelineId = ",pipelineId)

const time = (new Date().getTime() - now) / 1000;
const { transform } = instances[pipelineId];

//the word "transform" here is the name used to store this ressource
//in Pipeline.initFromObject.

//=> Pipeline.resource is the value returned by Pipeline.initFromObject ,
// it contains all the resource défined during its call directly binded
// to Pipeline.bindgroups

transform.x = - renderer.width * 0.4 + renderer.width * 0.8 * pipelineId;
transform.rotationX = transform.rotationY = transform.rotationZ = pipelineId + time;
instances[pipelineId].apply()
})


renderer.addPipeline(cube);
}
}