UNPKG

polygonjs-engine

Version:

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

110 lines (109 loc) 3.34 kB
import {WebGLRenderTarget as WebGLRenderTarget2} from "three/src/renderers/WebGLRenderTarget"; import {WebGLMultisampleRenderTarget as WebGLMultisampleRenderTarget2} from "three/src/renderers/WebGLMultisampleRenderTarget"; const CONTEXT_OPTIONS = {}; var WebGLContext; (function(WebGLContext2) { WebGLContext2["WEBGL"] = "webgl"; WebGLContext2["WEBGL2"] = "webgl2"; WebGLContext2["EXPERIMENTAL_WEBGL"] = "experimental-webgl"; WebGLContext2["EXPERIMENTAL_WEBGL2"] = "experimental-webgl2"; })(WebGLContext || (WebGLContext = {})); export class RenderersController { constructor() { this._next_renderer_id = 0; this._next_env_map_id = 0; this._renderers = {}; this._env_maps = {}; this._require_webgl2 = false; this._resolves = []; } setRequireWebGL2() { if (!this._require_webgl2) { this._require_webgl2 = true; } } webgl2Available() { if (this._webgl2_available === void 0) { this._webgl2_available = this._set_webgl2_available(); } return this._webgl2_available; } _set_webgl2_available() { const canvas = document.createElement("canvas"); return (window.WebGL2RenderingContext && canvas.getContext(WebGLContext.WEBGL2)) != null; } renderingContext(canvas) { let gl = null; if (this._require_webgl2) { gl = this._rendering_context_webgl(canvas, true); if (!gl) { console.warn("failed to create webgl2 context"); } } if (!gl) { gl = this._rendering_context_webgl(canvas, false); } return gl; } _rendering_context_webgl(canvas, webgl2) { let context_name; if (this.webgl2Available()) { context_name = WebGLContext.WEBGL2; } else { context_name = webgl2 ? WebGLContext.WEBGL2 : WebGLContext.WEBGL; } let gl = canvas.getContext(context_name, CONTEXT_OPTIONS); if (!gl) { context_name = webgl2 ? WebGLContext.EXPERIMENTAL_WEBGL2 : WebGLContext.EXPERIMENTAL_WEBGL; gl = canvas.getContext(context_name, CONTEXT_OPTIONS); } return gl; } registerRenderer(renderer) { if (renderer._polygon_id) { throw new Error("render already registered"); } renderer._polygon_id = this._next_renderer_id += 1; this._renderers[renderer._polygon_id] = renderer; if (Object.keys(this._renderers).length == 1) { this.flush_callbacks_with_renderer(renderer); } } deregisterRenderer(renderer) { delete this._renderers[renderer._polygon_id]; renderer.dispose(); } firstRenderer() { const first_id = Object.keys(this._renderers)[0]; if (first_id) { return this._renderers[first_id]; } return null; } renderers() { return Object.values(this._renderers); } flush_callbacks_with_renderer(renderer) { let callback; while (callback = this._resolves.pop()) { callback(renderer); } } async waitForRenderer() { const renderer = this.firstRenderer(); if (renderer) { return renderer; } else { return new Promise((resolve, reject) => { this._resolves.push(resolve); }); } } renderTarget(width, height, parameters) { if (this.webgl2Available()) { return new WebGLMultisampleRenderTarget2(width, height, parameters); } else { return new WebGLRenderTarget2(width, height, parameters); } } }