UNPKG

polygonjs-engine

Version:

node-based webgl 3D engine https://polygonjs.com

199 lines (198 loc) 6.34 kB
import {WebGLRenderer as WebGLRenderer2} from "three/src/renderers/WebGLRenderer"; import {Vector2 as Vector22} from "three/src/math/Vector2"; import {NodeContext as NodeContext2} from "../../../../poly/NodeContext"; import {SceneObjNode} from "../../Scene"; import {Poly as Poly2} from "../../../../Poly"; import { WebGlRendererRopNode, DEFAULT_SHADOW_MAP_TYPE, DEFAULT_OUTPUT_ENCODING, DEFAULT_TONE_MAPPING } from "../../../rop/WebGlRenderer"; import {RopType} from "../../../../poly/registers/nodes/Rop"; import {ParamConfig} from "../../../utils/params/ParamsConfig"; export function CameraRenderParamConfig(Base) { return class Mixin extends Base { constructor() { super(...arguments); this.render = ParamConfig.FOLDER(); this.setScene = ParamConfig.BOOLEAN(0); this.scene = ParamConfig.OPERATOR_PATH("/scene1", { visibleIf: {setScene: 1}, nodeSelection: { context: NodeContext2.OBJ, types: [SceneObjNode.type()] } }); this.setRenderer = ParamConfig.BOOLEAN(0); this.renderer = ParamConfig.OPERATOR_PATH("./renderers1/webGlRenderer1", { visibleIf: {setRenderer: 1}, nodeSelection: { context: NodeContext2.ROP, types: [WebGlRendererRopNode.type()] } }); this.setCssRenderer = ParamConfig.BOOLEAN(0); this.cssRenderer = ParamConfig.OPERATOR_PATH("./renderers1/css2DRenderer1", { visibleIf: {setCssRenderer: 1}, nodeSelection: { context: NodeContext2.ROP, types: [RopType.CSS2D, RopType.CSS3D] } }); } }; } export class RenderController { constructor(node) { this.node = node; this._renderers_by_canvas_id = {}; this._resolution_by_canvas_id = {}; this._super_sampling_size = new Vector22(); } render(canvas, size, aspect) { if (this.node.pv.doPostProcess) { this.node.post_process_controller.render(canvas, size); } else { this.render_with_renderer(canvas); } if (this._resolved_cssRenderer_rop && this._resolved_scene && this.node.pv.setCssRenderer) { const cssRenderer = this.cssRenderer(canvas); if (cssRenderer) { cssRenderer.render(this._resolved_scene, this.node.object); } } } render_with_renderer(canvas) { const renderer = this.renderer(canvas); if (renderer) { if (this._resolved_scene) { renderer.render(this._resolved_scene, this.node.object); } } } async update() { this.update_scene(); this.update_renderer(); this.update_cssRenderer(); } get resolved_scene() { return this._resolved_scene; } update_scene() { if (this.node.pv.setScene) { const param = this.node.p.scene; if (param.isDirty()) { param.find_target(); } const node = param.found_node_with_context_and_type(NodeContext2.OBJ, SceneObjNode.type()); if (node) { if (node.isDirty()) { node.cookController.cook_main_without_inputs(); } this._resolved_scene = node.object; } } else { this._resolved_scene = this.node.scene().threejsScene(); } } update_renderer() { if (this.node.pv.setRenderer) { const param = this.node.p.renderer; if (param.isDirty()) { param.find_target(); } this._resolved_renderer_rop = param.found_node_with_context_and_type(NodeContext2.ROP, RopType.WEBGL); } else { this._resolved_renderer_rop = void 0; } } update_cssRenderer() { if (this.node.pv.setCssRenderer) { const param = this.node.p.cssRenderer; if (param.isDirty()) { param.find_target(); } this._resolved_cssRenderer_rop = param.found_node_with_context_and_type(NodeContext2.ROP, [ RopType.CSS2D, RopType.CSS3D ]); } else { if (this._resolved_cssRenderer_rop) { } this._resolved_cssRenderer_rop = void 0; } } renderer(canvas) { return this._renderers_by_canvas_id[canvas.id]; } cssRenderer(canvas) { if (this._resolved_cssRenderer_rop && this.node.pv.setCssRenderer) { return this._resolved_cssRenderer_rop.renderer(canvas); } } createRenderer(canvas, size) { const gl = Poly2.renderersController.renderingContext(canvas); if (!gl) { console.error("failed to create webgl context"); return; } let renderer; if (this.node.pv.setRenderer) { this.update_renderer(); if (this._resolved_renderer_rop) { renderer = this._resolved_renderer_rop.create_renderer(canvas, gl); } } if (!renderer) { renderer = RenderController._create_default_renderer(canvas, gl); } Poly2.renderersController.registerRenderer(renderer); this._renderers_by_canvas_id[canvas.id] = renderer; this._super_sampling_size.copy(size); if (renderer.sampling) { this._super_sampling_size.multiplyScalar(renderer.sampling); } this.set_renderer_size(canvas, this._super_sampling_size); return renderer; } static _create_default_renderer(canvas, gl) { const renderer = new WebGLRenderer2({ canvas, antialias: true, alpha: true, context: gl }); renderer.shadowMap.enabled = true; renderer.shadowMap.type = DEFAULT_SHADOW_MAP_TYPE; renderer.physicallyCorrectLights = true; renderer.toneMapping = DEFAULT_TONE_MAPPING; renderer.toneMappingExposure = 1; renderer.outputEncoding = DEFAULT_OUTPUT_ENCODING; return renderer; } delete_renderer(canvas) { const renderer = this.renderer(canvas); if (renderer) { Poly2.renderersController.deregisterRenderer(renderer); } } canvas_resolution(canvas) { return this._resolution_by_canvas_id[canvas.id]; } set_renderer_size(canvas, size) { this._resolution_by_canvas_id[canvas.id] = this._resolution_by_canvas_id[canvas.id] || new Vector22(); this._resolution_by_canvas_id[canvas.id].copy(size); const renderer = this.renderer(canvas); if (renderer) { const update_style = false; renderer.setSize(size.x, size.y, update_style); } if (this._resolved_cssRenderer_rop) { const cssRenderer = this.cssRenderer(canvas); if (cssRenderer) { cssRenderer.setSize(size.x, size.y); } } } }