Skip to content

Commit

Permalink
fix(memory): remove not use floatArray (#201)
Browse files Browse the repository at this point in the history
fix poor performance in handling shadow
fix point shadow not remove
remove not use floatArray
  • Loading branch information
ZenderJK committed Jun 1, 2023
1 parent 8cfd1ab commit 6ee2b2f
Show file tree
Hide file tree
Showing 4 changed files with 166 additions and 70 deletions.
97 changes: 97 additions & 0 deletions samples/lights/Sample_AddRemovePointLight.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import { GUIHelp } from "@orillusion/debug/GUIHelp";
import { AtmosphericComponent, BoxGeometry, CameraUtil, Color, Engine3D, HoverCameraController, LitMaterial, MeshRenderer, Object3D, Object3DUtil, PointLight, Scene3D, SphereGeometry, View3D, } from "@orillusion/core";
import { PointLightsScript } from "./PointLightsScript";

class Sample_AddRemovePointLight {
scene: Scene3D;
hoverCameraController: HoverCameraController;
lightObj: any;
constructor() { }

async run() {

await Engine3D.init({});

GUIHelp.init();

this.scene = new Scene3D();
this.scene.addComponent(AtmosphericComponent);
// init camera3D
let mainCamera = CameraUtil.createCamera3D(null, this.scene);
mainCamera.perspective(60, Engine3D.aspect, 1, 2000.0);
//set camera data
mainCamera.object3D.addComponent(HoverCameraController).setCamera(0, -25, 500);

await this.initScene(this.scene);

let view = new View3D();
view.scene = this.scene;
view.camera = mainCamera;

Engine3D.startRenderViews([view]);

}

initScene(scene: Scene3D) {
let lightObj3D = new Object3D();
let render = lightObj3D.addComponent(MeshRenderer);
render.geometry = new SphereGeometry(5, 30, 30);
render.material = new LitMaterial();

scene.addChild(lightObj3D);


let cube = new BoxGeometry(10, 10, 10);
let mat = new LitMaterial();

// make 20 box
for (let i = 0; i < 20; i++) {
for (let j = 0; j < 10; j++) {
let box = new Object3D();
let mr2 = box.addComponent(MeshRenderer);
mr2.geometry = cube;
mr2.material = mat;
scene.addChild(box);

box.transform.x = i * 40 - 200;
box.transform.y = 5;
box.transform.z = j * 40 - 200;
}
}

//create floor
let floor = Object3DUtil.GetSingleCube(2000, 1, 2000, 0.5, 0.5, 0.5);
this.scene.addChild(floor);

let list: Object3D[] = [];
GUIHelp.addButton("addPointLight", () => {
for (let i = 0; i < 5; i++) {
let pointLight = new Object3D();
let script = pointLight.addComponent(PointLight);
script.lightColor = Color.random();
script.intensity = 6 * Math.random() + 3;
script.range = 25 * Math.random() + 15;
script.castShadow = true;
pointLight.x = Math.random() * 200 - 100;
pointLight.y = 5;
pointLight.z = Math.random() * 200 - 100;
scene.addChild(pointLight);
list.push(pointLight);
}
});

GUIHelp.addButton("removePointLight", () => {
for (let i = 0; i < Math.min(5, list.length); i++) {
let index = Math.floor(list.length * Math.random());
let obj = list[index];
if (obj) {
list.splice(index, 1)
scene.removeChild(obj)
obj.destroy();
}
}
});
}
}

new Sample_AddRemovePointLight().run();
134 changes: 67 additions & 67 deletions samples/lights/Sample_DirectLightShadow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,73 +4,73 @@ import { GUIUtil } from "@samples/utils/GUIUtil";

//sample of direction light
class Sample_DirectLightShadow {
scene: Scene3D;

async run() {
Engine3D.setting.shadow.autoUpdate = true;
Engine3D.setting.shadow.shadowBias = 0.0001;
Engine3D.setting.shadow.shadowBound = 100;

await Engine3D.init({});

GUIHelp.init();

this.scene = new Scene3D();
this.scene.addComponent(AtmosphericComponent);

// init camera3D
let mainCamera = CameraUtil.createCamera3D(null, this.scene);
mainCamera.perspective(60, Engine3D.aspect, 1, 5000.0);
//set camera data
mainCamera.object3D.z = -15;
mainCamera.object3D.addComponent(HoverCameraController).setCamera(-15, -35, 150);

await this.initScene();

let view = new View3D();
view.scene = this.scene;
view.camera = mainCamera;

this.initLight();
Engine3D.startRenderView(view);

}

// create direction light
private initLight() {
// add a direction light
let lightObj3D = new Object3D();
let sunLight = lightObj3D.addComponent(DirectLight);
sunLight.intensity = 15;
sunLight.lightColor = KelvinUtil.color_temperature_to_rgb(6553);
sunLight.castShadow = true;
lightObj3D.rotationX = 53.2;
lightObj3D.rotationY = 220;
lightObj3D.rotationZ = 5.58;

GUIUtil.renderDirLight(sunLight);
this.scene.addChild(lightObj3D);

let obj = new Object3D();
let mr = obj.addComponent(MeshRenderer);
mr.geometry = new BoxGeometry(20, 100, 20);
mr.material = new LitMaterial();
this.scene.addChild(obj);
}



initScene() {
let mat = new LitMaterial();
mat.baseMap = Engine3D.res.grayTexture;
// mat.roughness = 0.4;
// mat.metallic = 0.6;
let floor = new Object3D();
let render = floor.addComponent(MeshRenderer);
render.geometry = new BoxGeometry(200, 1, 200);
render.material = mat;
this.scene.addChild(floor);
}
scene: Scene3D;

async run() {
Engine3D.setting.shadow.autoUpdate = true;
Engine3D.setting.shadow.shadowBias = 0.0001;
Engine3D.setting.shadow.shadowBound = 100;

await Engine3D.init({});

GUIHelp.init();

this.scene = new Scene3D();
this.scene.addComponent(AtmosphericComponent);

// init camera3D
let mainCamera = CameraUtil.createCamera3D(null, this.scene);
mainCamera.perspective(60, Engine3D.aspect, 1, 5000.0);
//set camera data
mainCamera.object3D.z = -15;
mainCamera.object3D.addComponent(HoverCameraController).setCamera(-15, -35, 150);

await this.initScene();

let view = new View3D();
view.scene = this.scene;
view.camera = mainCamera;

this.initLight();
Engine3D.startRenderView(view);

}

// create direction light
private initLight() {
// add a direction light
let lightObj3D = new Object3D();
let sunLight = lightObj3D.addComponent(DirectLight);
sunLight.intensity = 15;
sunLight.lightColor = KelvinUtil.color_temperature_to_rgb(6553);
sunLight.castShadow = true;
lightObj3D.rotationX = 53.2;
lightObj3D.rotationY = 220;
lightObj3D.rotationZ = 5.58;

GUIUtil.renderDirLight(sunLight);
this.scene.addChild(lightObj3D);

let obj = new Object3D();
let mr = obj.addComponent(MeshRenderer);
mr.geometry = new BoxGeometry(20, 100, 20);
mr.material = new LitMaterial();
this.scene.addChild(obj);
}



initScene() {
let mat = new LitMaterial();
mat.baseMap = Engine3D.res.grayTexture;
// mat.roughness = 0.4;
// mat.metallic = 0.6;
let floor = new Object3D();
let render = floor.addComponent(MeshRenderer);
render.geometry = new BoxGeometry(200, 1, 200);
render.material = mat;
this.scene.addChild(floor);
}
}

new Sample_DirectLightShadow().run();
2 changes: 0 additions & 2 deletions src/gfx/graphics/webGpu/core/bindGroups/MatrixBindGroup.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { Matrix4 } from '../../../../../math/Matrix4';
import { UUID } from '../../../../../util/Global';
import { Time } from '../../../../../util/Time';
import { WebGPUDescriptorCreator } from '../../descriptor/WebGPUDescriptorCreator';
import { webGPUContext } from '../../Context3D';
import { StorageGPUBuffer } from '../buffer/StorageGPUBuffer';
/**
Expand Down
3 changes: 2 additions & 1 deletion src/gfx/graphics/webGpu/core/buffer/GPUBufferBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,6 @@ export class GPUBufferBase {
this.apply();
}

this.outFloat32Array = new Float32Array(size);
}

protected createBufferByStruct<T extends Struct>(usage: GPUBufferUsageFlags, struct: { new(): T }, count: number) {
Expand Down Expand Up @@ -381,6 +380,8 @@ export class GPUBufferBase {

private _readFlag: boolean = false;
public readBuffer() {
this.outFloat32Array ||= new Float32Array(this.memory.shareDataBuffer.byteLength / 4);

if (!this._readBuffer) {
this._readBuffer = webGPUContext.device.createBuffer({
size: this.memory.shareDataBuffer.byteLength,
Expand Down

0 comments on commit 6ee2b2f

Please sign in to comment.