Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mamayaya1
GitHub Repository: mamayaya1/game
Path: blob/main/projects/HexGL/bkcore/threejs/RenderManager.js
4627 views
1
/*!
2
* bkcore.threejs.RenderManager helps handling multiple scenes, cameras and render loops.
3
*
4
* @author Thibaut 'BKcore' Despoulain <http://bkcore.com>
5
* @license MIT
6
*
7
* Initialize the a RenderManager by passing a Renderer object:
8
* var renderManager = new bkcore.threejs.RenderManager(new THREE.WebGLRenderer());
9
*
10
* A render setup structure :
11
* {
12
* id <String> : render setup ID,
13
* scene <THREE.Scene> : main scene,
14
* camera <THREE.Camera> : main camera,
15
* render <Function> : render loop called when render setup is active (current),
16
* objects <Dic> : object references accessible in the render loop via this.objects
17
* }
18
*
19
* The render method's context will be the render setup's object, so in your render loop:
20
* function(delta, renderer)
21
* {
22
* this.scene;
23
* this.camera;
24
* this.id;
25
* this.objects;
26
* renderer.render(...);
27
* }
28
*
29
* Use the "objects" attribute to store useful references and variables like time, geometries, materials, etc.
30
* Example:
31
* renderManager.add('mySetup', scene, camera, function(delta, renderer)
32
* {
33
* this.objects.timer += delta;
34
* this.objects.torus.rotation.z = Math.PI * Math.cos(this.objects.timer);
35
* renderer.render(this.scene, this.camera);
36
* },
37
* {
38
* timer: 0,
39
* torus: torusMesh
40
* });
41
*/
42
43
var bkcore = bkcore || {};
44
bkcore.threejs = bkcore.threejs || {};
45
46
(function(w){
47
var perfNow;
48
var perfNowNames = ['now', 'webkitNow', 'msNow', 'mozNow'];
49
if(!!w['performance']) for(var i = 0; i < perfNowNames.length; ++i)
50
{
51
var n = perfNowNames[i];
52
if(!!w['performance'][n])
53
{
54
perfNow = function(){return w['performance'][n]()};
55
break;
56
}
57
}
58
if(!perfNow)
59
{
60
perfNow = Date.now;
61
}
62
w.perfNow = perfNow;
63
})(window);
64
65
bkcore.threejs.RenderManager = function(renderer)
66
{
67
this.renderer = renderer;
68
this.time = window.perfNow();
69
70
this.renders = {};
71
this.current = {};
72
this.size = 0;
73
74
this.defaultRenderMethod = function(delta, renderer)
75
{
76
renderer.render(this.scene, this.camera);
77
};
78
};
79
80
bkcore.threejs.RenderManager.prototype.add = function(id, scene, camera, render, objects)
81
{
82
render = render || this.defaultRenderMethod;
83
objects = objects || {};
84
85
this.renders[id] = {
86
id: id,
87
scene: scene,
88
camera: camera,
89
render: render,
90
objects: objects
91
};
92
93
if(this.size == 0) this.current = this.renders[id];
94
95
this.size++;
96
};
97
98
bkcore.threejs.RenderManager.prototype.get = function(id)
99
{
100
return this.renders[id];
101
};
102
103
bkcore.threejs.RenderManager.prototype.remove = function(id)
104
{
105
if(id in this.renders)
106
{
107
delete this.renders[id];
108
this.size--;
109
}
110
};
111
112
bkcore.threejs.RenderManager.prototype.renderCurrent = function()
113
{
114
if(this.current && this.current.render)
115
{
116
var now = window.perfNow();
117
var delta = now - this.time;
118
this.time = now;
119
120
this.current.render.call(this.current, delta, this.renderer);
121
}
122
else console.warn('RenderManager: No current render defined.');
123
};
124
125
bkcore.threejs.RenderManager.prototype.setCurrent = function(id)
126
{
127
if(id in this.renders)
128
{
129
this.current = this.renders[id];
130
}
131
else console.warn('RenderManager: Render "'+id+'" not found.');
132
};
133