Path: blob/main/projects/HexGL/bkcore/threejs/RenderManager.js
4627 views
/*!1* bkcore.threejs.RenderManager helps handling multiple scenes, cameras and render loops.2*3* @author Thibaut 'BKcore' Despoulain <http://bkcore.com>4* @license MIT5*6* Initialize the a RenderManager by passing a Renderer object:7* var renderManager = new bkcore.threejs.RenderManager(new THREE.WebGLRenderer());8*9* A render setup structure :10* {11* id <String> : render setup ID,12* scene <THREE.Scene> : main scene,13* camera <THREE.Camera> : main camera,14* render <Function> : render loop called when render setup is active (current),15* objects <Dic> : object references accessible in the render loop via this.objects16* }17*18* The render method's context will be the render setup's object, so in your render loop:19* function(delta, renderer)20* {21* this.scene;22* this.camera;23* this.id;24* this.objects;25* renderer.render(...);26* }27*28* Use the "objects" attribute to store useful references and variables like time, geometries, materials, etc.29* Example:30* renderManager.add('mySetup', scene, camera, function(delta, renderer)31* {32* this.objects.timer += delta;33* this.objects.torus.rotation.z = Math.PI * Math.cos(this.objects.timer);34* renderer.render(this.scene, this.camera);35* },36* {37* timer: 0,38* torus: torusMesh39* });40*/4142var bkcore = bkcore || {};43bkcore.threejs = bkcore.threejs || {};4445(function(w){46var perfNow;47var perfNowNames = ['now', 'webkitNow', 'msNow', 'mozNow'];48if(!!w['performance']) for(var i = 0; i < perfNowNames.length; ++i)49{50var n = perfNowNames[i];51if(!!w['performance'][n])52{53perfNow = function(){return w['performance'][n]()};54break;55}56}57if(!perfNow)58{59perfNow = Date.now;60}61w.perfNow = perfNow;62})(window);6364bkcore.threejs.RenderManager = function(renderer)65{66this.renderer = renderer;67this.time = window.perfNow();6869this.renders = {};70this.current = {};71this.size = 0;7273this.defaultRenderMethod = function(delta, renderer)74{75renderer.render(this.scene, this.camera);76};77};7879bkcore.threejs.RenderManager.prototype.add = function(id, scene, camera, render, objects)80{81render = render || this.defaultRenderMethod;82objects = objects || {};8384this.renders[id] = {85id: id,86scene: scene,87camera: camera,88render: render,89objects: objects90};9192if(this.size == 0) this.current = this.renders[id];9394this.size++;95};9697bkcore.threejs.RenderManager.prototype.get = function(id)98{99return this.renders[id];100};101102bkcore.threejs.RenderManager.prototype.remove = function(id)103{104if(id in this.renders)105{106delete this.renders[id];107this.size--;108}109};110111bkcore.threejs.RenderManager.prototype.renderCurrent = function()112{113if(this.current && this.current.render)114{115var now = window.perfNow();116var delta = now - this.time;117this.time = now;118119this.current.render.call(this.current, delta, this.renderer);120}121else console.warn('RenderManager: No current render defined.');122};123124bkcore.threejs.RenderManager.prototype.setCurrent = function(id)125{126if(id in this.renders)127{128this.current = this.renders[id];129}130else console.warn('RenderManager: Render "'+id+'" not found.');131};132133