mirror of
https://github.com/DaanVandenBosch/phantasmal-world.git
synced 2025-04-05 15:28:29 +08:00
57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
![]() |
import { ModelStore } from "../stores/ModelStore";
|
||
|
import { Disposer } from "../../core/observable/Disposer";
|
||
|
import { Renderer } from "../../core/rendering/Renderer";
|
||
|
import { GfxRenderer } from "../../core/rendering/GfxRenderer";
|
||
|
import { LogManager } from "../../core/Logger";
|
||
|
import { ninja_object_to_node } from "../../core/rendering/conversion/ninja_geometry";
|
||
|
|
||
|
const logger = LogManager.get("viewer/rendering/ModelRenderer");
|
||
|
|
||
|
export class ModelGfxRenderer implements Renderer {
|
||
|
private readonly disposer = new Disposer();
|
||
|
|
||
|
readonly canvas_element: HTMLCanvasElement;
|
||
|
|
||
|
constructor(private readonly store: ModelStore, private readonly renderer: GfxRenderer) {
|
||
|
this.canvas_element = renderer.canvas_element;
|
||
|
|
||
|
renderer.camera.pan(0, 0, 50);
|
||
|
|
||
|
this.disposer.add_all(store.current_nj_object.observe(this.nj_object_or_xvm_changed));
|
||
|
}
|
||
|
|
||
|
dispose(): void {
|
||
|
this.disposer.dispose();
|
||
|
}
|
||
|
|
||
|
start_rendering(): void {
|
||
|
this.renderer.start_rendering();
|
||
|
}
|
||
|
|
||
|
stop_rendering(): void {
|
||
|
this.renderer.stop_rendering();
|
||
|
}
|
||
|
|
||
|
set_size(width: number, height: number): void {
|
||
|
this.renderer.set_size(width, height);
|
||
|
}
|
||
|
|
||
|
private nj_object_or_xvm_changed = (): void => {
|
||
|
this.renderer.destroy_scene();
|
||
|
|
||
|
const nj_object = this.store.current_nj_object.val;
|
||
|
|
||
|
if (nj_object) {
|
||
|
// Convert textures and geometry.
|
||
|
const node = ninja_object_to_node(nj_object);
|
||
|
this.renderer.scene.root_node.add_child(node);
|
||
|
|
||
|
this.renderer.scene.traverse(node => {
|
||
|
node.mesh?.upload(this.renderer.gfx);
|
||
|
}, undefined);
|
||
|
}
|
||
|
|
||
|
this.renderer.schedule_render();
|
||
|
};
|
||
|
}
|