XGPU

Shadow_Sample.ts

LightShadowPlugin.ts

ShadowPipeline.ts

import { GPURenderer, RenderPipeline } from "xgpu";
import { Sample } from "../HelloTriangle/Sample";
import { Dragon } from "../Light/Dragon";
import { LightShadowPlugin } from "./LightShadowPlugin";
import { Light } from "../Light/Light";


export class Shadow_Sample extends Sample {

private started: boolean = false;
protected async start(renderer: GPURenderer): Promise<void> {
if (this.started) return;
this.started = true;

const dragon = new Dragon();
dragon.debug = "dragon";

dragon.model.scaleXYZ = 600;
renderer.addPipeline(dragon)

const plugin = new LightShadowPlugin(dragon, {
position: dragon.position,
normal: dragon.normal,
modelMatrix: dragon.model,
cameraMatrix: dragon.camera
}).apply() as LightShadowPlugin;

const light: Light = plugin.light;
light.y = light.z = renderer.canvas.width * 0.9;

const now = new Date().getTime();
dragon.camera.eyePosition.y = renderer.canvas.height * 0.4;
dragon.addEventListener(RenderPipeline.ON_DRAW_BEGIN, () => {
const time = (new Date().getTime() - now) / 1000;
dragon.camera.rotationY += 0.01;

light.r = Math.abs(Math.sin(time))
light.g = Math.abs(Math.cos(1 + time * 0.66))
light.b = Math.abs(Math.sin(2 + time * 0.33))
});
}

}