UNPKG

@polygonjs/polygonjs

Version:

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

185 lines (184 loc) 5.99 kB
"use strict"; import { WebGLRenderer, WebGLRenderTarget, NoColorSpace, NoToneMapping } from "three"; import { WEBGL_RENDERER_DEFAULT_PARAMS } from "../../core/render/Common"; const CONTEXT_OPTIONS = { // powerPreference: 'high-performance', // attempt to fix issues in safari // antialias: false, // leave that to the renderer node // preserveDrawingBuffer: true, // this could only be useful to capture static images }; var WebGLContext = /* @__PURE__ */ ((WebGLContext2) => { WebGLContext2["WEBGL"] = "webgl"; WebGLContext2["WEBGL2"] = "webgl2"; WebGLContext2["EXPERIMENTAL_WEBGL"] = "experimental-webgl"; WebGLContext2["EXPERIMENTAL_WEBGL2"] = "experimental-webgl2"; return WebGLContext2; })(WebGLContext || {}); let nextRendererId = 0; const _RenderersController = class { constructor(poly) { this.poly = poly; // private _firstRenderer: WebGLRenderer | null = null; // private _lastRenderer: WebGLRenderer | null = null; this._printDebug = false; this._requireWebGL2 = false; // private _env_maps: TextureByString = {}; // private _next_env_map_id: number = 0; this._webGLContextByCanvas = /* @__PURE__ */ new Map(); this._defaultRendererByCanvas = /* @__PURE__ */ new Map(); } dispose() { this._webGLContextByCanvas.clear(); this._defaultRendererByCanvas.forEach((renderer) => { renderer.dispose(); }); this._defaultRendererByCanvas.clear(); } setPrintDebug(state = true) { this._printDebug = state; } printDebug() { return this._printDebug; } printDebugMessage(message) { if (!this._printDebug) { return; } console.warn("[Poly debug]", message); } setRequireWebGL2() { if (!this._requireWebGL2) { this._requireWebGL2 = true; } } webGL2Available(canvas) { if (this._webgl2_available === void 0) { this._webgl2_available = this._getWebGL2Available(canvas); } return this._webgl2_available; } _getWebGL2Available(canvas) { canvas = canvas || this.poly.canvasRegister.dummyCanvas(); return (globalThis.WebGL2RenderingContext && canvas.getContext("webgl2" /* WEBGL2 */)) != null; } defaultWebGLRendererForCanvas(canvas) { let renderer = this._defaultRendererByCanvas.get(canvas); if (!renderer) { const context = this.getRenderingContext(canvas); renderer = this.createWebGLRenderer({ ...WEBGL_RENDERER_DEFAULT_PARAMS, canvas, context }); this._defaultRendererByCanvas.set(canvas, renderer); } return renderer; } // disposeWebGLRendererForCanvas(canvas: HTMLCanvasElement) { // const renderer = this._defaultRendererByCanvas.get(canvas); // if (renderer) { // renderer.dispose(); // this._defaultRendererByCanvas.delete(canvas); // } // } createWebGLRenderer(params) { const renderer = new WebGLRenderer(params); if (params.canvas != null && params.canvas instanceof HTMLCanvasElement) { this.poly.canvasRegister.registerCanvas(params.canvas, renderer); } else { console.warn("canvas not registerable"); console.log(params.canvas); } this.assignIdToRenderer(renderer); this.printDebugMessage([`create renderer:`, params]); return renderer; } assignIdToRenderer(renderer) { if (renderer._polygonId != null) { return; } const nextId = nextRendererId += 1; renderer._polygonId = nextId; } rendererId(renderer) { const id = renderer._polygonId; if (id == null) { console.error("renderer has no _polygonId"); return; } return id; } getRenderingContext(canvas) { let gl = this._webGLContextByCanvas.get(canvas); if (gl) { return gl; } gl = this._getRenderingContextWebgl(canvas, true); if (!gl) { console.warn("failed to create webgl2 context"); } if (!gl) { gl = this._getRenderingContextWebgl(canvas, false); } if (!gl) { console.error("failed to create webgl context"); return null; } if (gl._polygonjsContextId == null) { gl._polygonjsContextId = _RenderersController._nextGlContextId++; } this._webGLContextByCanvas.set(canvas, gl); return gl; } _getRenderingContextWebgl(canvas, webgl2) { let contextName; if (this.webGL2Available(canvas)) { contextName = "webgl2" /* WEBGL2 */; } else { contextName = webgl2 ? "webgl2" /* WEBGL2 */ : "webgl" /* WEBGL */; } let gl = canvas.getContext(contextName, CONTEXT_OPTIONS); if (gl) { this.printDebugMessage(`create gl context: ${contextName}.`); } else { contextName = webgl2 ? "experimental-webgl2" /* EXPERIMENTAL_WEBGL2 */ : "experimental-webgl" /* EXPERIMENTAL_WEBGL */; this.printDebugMessage(`create gl context: ${contextName}.`); gl = canvas.getContext(contextName, CONTEXT_OPTIONS); } return gl; } createRenderTarget(width, height, parameters) { if (this.webGL2Available()) { const multiSampleRenderTarget = new WebGLRenderTarget(width, height, parameters); multiSampleRenderTarget.samples = 2; return multiSampleRenderTarget; } else { return new WebGLRenderTarget(width, height, parameters); } } linearRenderer() { return this._linearRenderer = this._linearRenderer || this._createLinearRenderer(); } _createLinearRenderer() { const canvas = this.poly.canvasRegister.findOrCreateCanvas(); const gl = this.getRenderingContext(canvas); if (!gl) { return; } const renderer = this.createWebGLRenderer({ // antialias: true, // stencil: true, // depth: false, alpha: true, premultipliedAlpha: true, canvas, context: gl }); this.poly.canvasRegister.registerCanvas(canvas, renderer); renderer.outputColorSpace = NoColorSpace; renderer.toneMapping = NoToneMapping; return renderer; } }; export let RenderersController = _RenderersController; RenderersController._nextGlContextId = 0;