elation-engine 0.9.113 → 0.9.115

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/css/systems/render.css +5 -1
  2. package/package.json +1 -1
  3. package/scripts/assets.js +103 -20
  4. package/scripts/assetworker.js +18 -1
  5. package/scripts/external/holoplay.js +1494 -0
  6. package/scripts/external/octree.js +0 -0
  7. package/scripts/external/three/CSS3DRenderer.js +46 -43
  8. package/scripts/external/three/CubemapToEquirectangular.js +1 -1
  9. package/scripts/external/three/three-extras.js +1553 -392
  10. package/scripts/external/three/three-icosa.js +2575 -0
  11. package/scripts/external/three/three-loaders.js +925 -133
  12. package/scripts/external/three/three-postprocessing.js +3 -3
  13. package/scripts/external/three/three-r116dev.js +50930 -0
  14. package/scripts/external/three/three-spotlighttextures.js +50953 -0
  15. package/scripts/external/three/three-vrm.js +2 -2
  16. package/scripts/external/three/three-working.js +35968 -0
  17. package/scripts/external/three/three.js +38532 -24087
  18. package/scripts/external/three-mesh-bvh.js +5370 -0
  19. package/scripts/external/three-old/BVHLoader.js +406 -0
  20. package/scripts/external/three-old/ColladaLoader.js +5519 -0
  21. package/scripts/external/three-old/ColladaLoader2.js +1694 -0
  22. package/scripts/external/three-old/CubemapToEquirectangular.js +188 -0
  23. package/scripts/external/three-old/DDSLoader.js +269 -0
  24. package/scripts/external/three-old/FBXLoader-mine.js +5063 -0
  25. package/scripts/external/three-old/FBXLoader.js +5112 -0
  26. package/scripts/external/three-old/FlyControls.js +295 -0
  27. package/scripts/external/three-old/GLTF2Loader.js +2950 -0
  28. package/scripts/external/three-old/GLTFLoader.js +2213 -0
  29. package/scripts/external/three-old/JSONLoader.js +435 -0
  30. package/scripts/external/three-old/MTLLoader.js +533 -0
  31. package/scripts/external/three-old/OBJLoader-experimental.js +874 -0
  32. package/scripts/external/three-old/OBJLoader-working.js +727 -0
  33. package/scripts/external/three-old/OBJLoader.js +723 -0
  34. package/scripts/external/three-old/OBJMTLLoader.js +440 -0
  35. package/scripts/external/three-old/OrbitControls.js +592 -0
  36. package/scripts/external/three-old/PLYLoader.js +517 -0
  37. package/scripts/external/three-old/TransformControls.js +1100 -0
  38. package/scripts/external/three-old/VRMLLoader.js +1021 -0
  39. package/scripts/external/three-old/glTFLoader-combined.js +2513 -0
  40. package/scripts/external/three-old/nodethree.js +44018 -0
  41. package/scripts/external/three-old/render/BleachBypassShader.js +64 -0
  42. package/scripts/external/three-old/render/BloomPass.js +116 -0
  43. package/scripts/external/three-old/render/CSS3DRenderer.js +310 -0
  44. package/scripts/external/three-old/render/ClearPass.js +44 -0
  45. package/scripts/external/three-old/render/ConvolutionShader.js +101 -0
  46. package/scripts/external/three-old/render/CopyShader.js +46 -0
  47. package/scripts/external/three-old/render/EffectComposer.js +211 -0
  48. package/scripts/external/three-old/render/FXAAShader.js +88 -0
  49. package/scripts/external/three-old/render/FilmPass.js +60 -0
  50. package/scripts/external/three-old/render/FilmShader.js +104 -0
  51. package/scripts/external/three-old/render/ManualMSAARenderPass.js +168 -0
  52. package/scripts/external/three-old/render/MaskPass.js +97 -0
  53. package/scripts/external/three-old/render/OculusRenderPass.js +84 -0
  54. package/scripts/external/three-old/render/OculusRiftEffect.js +240 -0
  55. package/scripts/external/three-old/render/PortalRenderPass.js +166 -0
  56. package/scripts/external/three-old/render/RecordingPass.js +208 -0
  57. package/scripts/external/three-old/render/RenderPass.js +57 -0
  58. package/scripts/external/three-old/render/SSAOShader.js +259 -0
  59. package/scripts/external/three-old/render/SepiaShader.js +54 -0
  60. package/scripts/external/three-old/render/ShaderPass.js +66 -0
  61. package/scripts/external/three-old/render/VREffect.js +482 -0
  62. package/scripts/external/three-old/shimthree.js +23 -0
  63. package/scripts/external/three-old/stats.js +6 -0
  64. package/scripts/external/three-old/three-88dev.js +45004 -0
  65. package/scripts/external/three-old/three-backgroundoptimization.js +44432 -0
  66. package/scripts/external/three-old/three-updates.js +44735 -0
  67. package/scripts/external/three-old/three-working.js +44719 -0
  68. package/scripts/external/three-old/three.js +44431 -0
  69. package/scripts/external/three-old/threex.rendererstats.js +66 -0
  70. package/scripts/external/three-old/tween.js +13 -0
  71. package/scripts/external/webvr-polyfill-new.js +3497 -0
  72. package/scripts/external/webvr-polyfill-newest.js +3491 -0
  73. package/scripts/external/webvr-polyfill-old.js +6337 -0
  74. package/scripts/geometries.js +2 -2
  75. package/scripts/math.js +6 -6
  76. package/scripts/systems/admin.js +1 -1
  77. package/scripts/systems/controls.js +6 -4
  78. package/scripts/systems/physics.js +10 -10
  79. package/scripts/systems/render.js +58 -20
  80. package/scripts/systems/render2.js +38 -0
  81. package/scripts/things/camera.js +6 -1
  82. package/scripts/things/generic-trackedvectors.js +1875 -0
  83. package/scripts/things/generic.js +3 -4
  84. package/scripts/things/label2d.js +1 -1
  85. package/scripts/things/leapmotion.js +6 -6
  86. package/scripts/things/menu.js +1 -1
  87. package/scripts/things/player-bak.js +638 -0
  88. package/scripts/things/player.js +28 -10
  89. package/scripts/things/skysphere.js +1 -1
  90. package/scripts/things/terrain.js +1 -1
  91. package/scripts/things/text.js +1 -1
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @author alteredq / http://alteredqualia.com/
3
+ */
4
+
5
+ THREE.MaskPass = function ( scene, camera ) {
6
+
7
+ THREE.Pass.call( this );
8
+
9
+ this.scene = scene;
10
+ this.camera = camera;
11
+
12
+ this.clear = true;
13
+ this.needsSwap = false;
14
+
15
+ this.inverse = false;
16
+
17
+ };
18
+
19
+ THREE.MaskPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {
20
+
21
+ constructor: THREE.MaskPass,
22
+
23
+ render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {
24
+
25
+ var context = renderer.context;
26
+ var state = renderer.state;
27
+
28
+ // don't update color or depth
29
+
30
+ state.buffers.color.setMask( false );
31
+ state.buffers.depth.setMask( false );
32
+
33
+ // lock buffers
34
+
35
+ state.buffers.color.setLocked( true );
36
+ state.buffers.depth.setLocked( true );
37
+
38
+ // set up stencil
39
+
40
+ var writeValue, clearValue;
41
+
42
+ if ( this.inverse ) {
43
+
44
+ writeValue = 0;
45
+ clearValue = 1;
46
+
47
+ } else {
48
+
49
+ writeValue = 1;
50
+ clearValue = 0;
51
+
52
+ }
53
+
54
+ state.buffers.stencil.setTest( true );
55
+ state.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );
56
+ state.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );
57
+ state.buffers.stencil.setClear( clearValue );
58
+
59
+ // draw into the stencil buffer
60
+
61
+ renderer.render( this.scene, this.camera, readBuffer, this.clear );
62
+ renderer.render( this.scene, this.camera, writeBuffer, this.clear );
63
+
64
+ // unlock color and depth buffer for subsequent rendering
65
+
66
+ state.buffers.color.setLocked( false );
67
+ state.buffers.depth.setLocked( false );
68
+
69
+ // only render where stencil is set to 1
70
+
71
+ state.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1
72
+ state.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );
73
+
74
+ }
75
+
76
+ } );
77
+
78
+
79
+ THREE.ClearMaskPass = function () {
80
+
81
+ THREE.Pass.call( this );
82
+
83
+ this.needsSwap = false;
84
+
85
+ };
86
+
87
+ THREE.ClearMaskPass.prototype = Object.create( THREE.Pass.prototype );
88
+
89
+ Object.assign( THREE.ClearMaskPass.prototype, {
90
+
91
+ render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {
92
+
93
+ renderer.state.buffers.stencil.setTest( false );
94
+
95
+ }
96
+
97
+ } );
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @author jbaicoianu / http://baicoianu.com/
3
+ */
4
+
5
+ THREE.OculusRenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {
6
+
7
+ this.scene = scene;
8
+ this.camera = camera;
9
+
10
+ this.overrideMaterial = overrideMaterial;
11
+
12
+ this.clearColor = clearColor;
13
+ this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1;
14
+
15
+ this.oldClearColor = new THREE.Color();
16
+ this.oldClearAlpha = 1;
17
+
18
+ this.oculuseffect = false;
19
+
20
+ this.enabled = true;
21
+ this.clear = false;
22
+ this.needsSwap = false;
23
+
24
+ this.initOculus();
25
+
26
+ };
27
+
28
+ THREE.OculusRenderPass.prototype = {
29
+
30
+ initOculus: function() {
31
+ this.oculusparams = {};
32
+ //document.body.addEventListener('click', this.fullscreen.bind(this));
33
+ },
34
+ fullscreen: function() {
35
+ if (!this.isfullscreen) {
36
+ if (document.body.webkitRequestFullScreen) {
37
+ document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
38
+ } else if (document.body.mozRequestFullScreen) {
39
+ document.body.mozRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
40
+ } else if (document.body.requestFullScreen) {
41
+ document.body.requestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
42
+ }
43
+ }
44
+ },
45
+
46
+ setOculusParameters: function(params) {
47
+ this.oculusparams = params;
48
+ },
49
+
50
+ render: function ( renderer, writeBuffer, readBuffer, delta ) {
51
+
52
+ this.oculusparams.renderTarget = readBuffer;
53
+ if (!this.oculuseffect) {
54
+ this.oculuseffect = new THREE.OculusRiftEffect(renderer, this.oculusparams);
55
+ } else {
56
+ this.oculuseffect.setOutputTarget(readBuffer);
57
+ }
58
+ this.scene.overrideMaterial = this.overrideMaterial;
59
+
60
+ if ( this.clearColor ) {
61
+
62
+ this.oldClearColor.copy( renderer.getClearColor() );
63
+ this.oldClearAlpha = renderer.getClearAlpha();
64
+
65
+ renderer.setClearColor( this.clearColor, this.clearAlpha );
66
+
67
+ }
68
+
69
+ this.oculuseffect.render( this.scene, this.camera, readBuffer, this.clear );
70
+
71
+ if ( this.clearColor ) {
72
+
73
+ renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );
74
+
75
+ }
76
+ renderer.setViewport(0, 0, window.innerWidth, window.innerHeight);
77
+
78
+ this.scene.overrideMaterial = null;
79
+
80
+ elation.events.fire({element: this, type: 'render'});
81
+ }
82
+
83
+ };
84
+
@@ -0,0 +1,240 @@
1
+ /**
2
+ * @author troffmo5 / http://github.com/troffmo5
3
+ *
4
+ * Effect to render the scene in stereo 3d side by side with lens distortion.
5
+ * It is written to be used with the Oculus Rift (http://www.oculusvr.com/) but
6
+ * it works also with other HMD using the same technology
7
+ */
8
+
9
+ THREE.OculusRiftEffect = function ( renderer, options ) {
10
+ // worldFactor indicates how many units is 1 meter
11
+ var worldFactor = (options && options.worldFactor) ? options.worldFactor: 1.0;
12
+
13
+ // Specific HMD parameters
14
+ var HMD = (options && options.HMD) ? options.HMD: {
15
+ // Parameters from the Oculus Rift DK1
16
+ hResolution: window.innerWidth,
17
+ vResolution: window.innerHeight,
18
+ hScreenSize: 0.14976,
19
+ vScreenSize: 0.0936,
20
+ interpupillaryDistance: 0.064,
21
+ lensSeparationDistance: 0.064,
22
+ eyeToScreenDistance: 0.041,
23
+ distortionK : [1.0, 0.22, 0.24, 0.0],
24
+ chromaAbParameter: [ 0.996, -0.004, 1.014, 0.0]
25
+ };
26
+
27
+ // Perspective camera
28
+ var pCamera = new THREE.PerspectiveCamera();
29
+ pCamera.matrixAutoUpdate = false;
30
+ pCamera.target = new THREE.Vector3();
31
+
32
+ // Orthographic camera
33
+ var oCamera = new THREE.OrthographicCamera( -1, 1, 1, -1, 1, 1000 );
34
+ oCamera.position.z = 1;
35
+
36
+ // pre-render hooks
37
+ this.preLeftRender = function() {};
38
+ this.preRightRender = function() {};
39
+
40
+ this.renderTarget = false;
41
+ this.outputTarget = false;
42
+
43
+ renderer.autoClear = false;
44
+ var emptyColor = new THREE.Color("black");
45
+
46
+ this.setRenderTarget = function( renderTarget ) {
47
+
48
+ this.renderTarget = renderTarget;
49
+ RTMaterial.uniforms[ "texid" ].value = renderTarget;
50
+
51
+ }
52
+ this.setOutputTarget = function( outputTarget ) {
53
+
54
+ this.outputTarget = outputTarget;
55
+
56
+ }
57
+
58
+
59
+ // Render target
60
+ var RTParams = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };
61
+ //var renderTarget = new THREE.WebGLRenderTarget( HMD.hResolution / 2, HMD.vResolution, RTParams );
62
+ var RTMaterial = new THREE.ShaderMaterial( {
63
+ uniforms: {
64
+ "texid": { type: "t", value: this.renderTarget },
65
+ "scale": { type: "v2", value: new THREE.Vector2(1.0,1.0) },
66
+ "scaleIn": { type: "v2", value: new THREE.Vector2(1.0,1.0) },
67
+ "lensCenter": { type: "v2", value: new THREE.Vector2(0.0,0.0) },
68
+ "hmdWarpParam": { type: "v4", value: new THREE.Vector4(1.0,0.0,0.0,0.0) },
69
+ "chromAbParam": { type: "v4", value: new THREE.Vector4(1.0,0.0,0.0,0.0) }
70
+ },
71
+ vertexShader: [
72
+ "varying vec2 vUv;",
73
+ "void main() {",
74
+ " vUv = uv;",
75
+ " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
76
+ "}"
77
+ ].join("\n"),
78
+
79
+ fragmentShader: [
80
+ "uniform vec2 scale;",
81
+ "uniform vec2 scaleIn;",
82
+ "uniform vec2 lensCenter;",
83
+ "uniform vec4 hmdWarpParam;",
84
+ 'uniform vec4 chromAbParam;',
85
+ "uniform sampler2D texid;",
86
+ "varying vec2 vUv;",
87
+ "void main()",
88
+ "{",
89
+ " vec2 uv = (vUv*2.0)-1.0;", // range from [0,1] to [-1,1]
90
+ " vec2 theta = (uv-lensCenter)*scaleIn;",
91
+ " float rSq = theta.x*theta.x + theta.y*theta.y;",
92
+ " vec2 rvector = theta*(hmdWarpParam.x + hmdWarpParam.y*rSq + hmdWarpParam.z*rSq*rSq + hmdWarpParam.w*rSq*rSq*rSq);",
93
+ ' vec2 rBlue = rvector * (chromAbParam.z + chromAbParam.w * rSq);',
94
+ " vec2 tcBlue = (lensCenter + scale * rBlue);",
95
+ " tcBlue = (tcBlue+1.0)/2.0;", // range from [-1,1] to [0,1]
96
+ " if (any(bvec2(clamp(tcBlue, vec2(0.0,0.0), vec2(1.0,1.0))-tcBlue))) {",
97
+ " gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);",
98
+ " return;}",
99
+ " vec2 tcGreen = lensCenter + scale * rvector;",
100
+ " tcGreen = (tcGreen+1.0)/2.0;", // range from [-1,1] to [0,1]
101
+ " vec2 rRed = rvector * (chromAbParam.x + chromAbParam.y * rSq);",
102
+ " vec2 tcRed = lensCenter + scale * rRed;",
103
+ " tcRed = (tcRed+1.0)/2.0;", // range from [-1,1] to [0,1]
104
+ " gl_FragColor = vec4(texture2D(texid, tcRed).r, texture2D(texid, tcGreen).g, texture2D(texid, tcBlue).b, 1);",
105
+ "}"
106
+ ].join("\n")
107
+ } );
108
+
109
+ var mesh = new THREE.Mesh( new THREE.PlaneGeometry( 1, 2 ), RTMaterial );
110
+ mesh.position.x = -.5;
111
+
112
+ // Final scene
113
+ var finalScene = new THREE.Scene();
114
+ finalScene.add( oCamera );
115
+ finalScene.add( mesh );
116
+
117
+ var left = {}, right = {};
118
+ var distScale = 1.0;
119
+
120
+ this.setHMD = function(v) {
121
+ HMD = v;
122
+ // Compute aspect ratio and FOV
123
+ var aspect = HMD.hResolution / (2*HMD.vResolution);
124
+
125
+ // Fov is normally computed with:
126
+ // THREE.Math.radToDeg( 2*Math.atan2(HMD.vScreenSize,2*HMD.eyeToScreenDistance) );
127
+ // But with lens distortion it is increased (see Oculus SDK Documentation)
128
+ var r = -1.0 - (4 * (HMD.hScreenSize/4 - HMD.lensSeparationDistance/2) / HMD.hScreenSize);
129
+ distScale = (HMD.distortionK[0] + HMD.distortionK[1] * Math.pow(r,2) + HMD.distortionK[2] * Math.pow(r,4) + HMD.distortionK[3] * Math.pow(r,6));
130
+ var fov = THREE.Math.radToDeg(2*Math.atan2(HMD.vScreenSize*distScale, 2*HMD.eyeToScreenDistance));
131
+ //var fov = 94;
132
+ //var aspect = 47 / 53;
133
+
134
+ // Compute camera projection matrices
135
+ var proj = (new THREE.Matrix4()).makePerspective( fov, aspect, 0.1, 10000 );
136
+ var h = 4 * (HMD.hScreenSize/4 - HMD.interpupillaryDistance/2) / HMD.hScreenSize;
137
+ left.proj = ((new THREE.Matrix4()).makeTranslation( h, 0.0, 0.0 )).multiply(proj);
138
+ right.proj = ((new THREE.Matrix4()).makeTranslation( -h, 0.0, 0.0 )).multiply(proj);
139
+
140
+ // Compute camera transformation matrices
141
+ left.tranform = (new THREE.Matrix4()).makeTranslation( -worldFactor * HMD.interpupillaryDistance/2, 0.0, 0.0 );
142
+ right.tranform = (new THREE.Matrix4()).makeTranslation( worldFactor * HMD.interpupillaryDistance/2, 0.0, 0.0 );
143
+
144
+ // Compute Viewport
145
+ left.viewport = [0, 0, HMD.hResolution/2, HMD.vResolution];
146
+ right.viewport = [HMD.hResolution/2, 0, HMD.hResolution/2, HMD.vResolution];
147
+
148
+ // Distortion shader parameters
149
+ var lensShift = 4 * (HMD.hScreenSize/4 - HMD.lensSeparationDistance/2) / HMD.hScreenSize;
150
+ left.lensCenter = new THREE.Vector2(lensShift, 0.0);
151
+ right.lensCenter = new THREE.Vector2(-lensShift, 0.0);
152
+
153
+ RTMaterial.uniforms['hmdWarpParam'].value = new THREE.Vector4(HMD.distortionK[0], HMD.distortionK[1], HMD.distortionK[2], HMD.distortionK[3]);
154
+ RTMaterial.uniforms['chromAbParam'].value = new THREE.Vector4(HMD.chromaAbParameter[0], HMD.chromaAbParameter[1], HMD.chromaAbParameter[2], HMD.chromaAbParameter[3]);
155
+ RTMaterial.uniforms['scaleIn'].value = new THREE.Vector2(1.0,1.0/aspect);
156
+ RTMaterial.uniforms['scale'].value = new THREE.Vector2(1.0/distScale, 1.0*aspect/distScale);
157
+
158
+ // Create render target
159
+ if ( this.renderTarget ) this.renderTarget.dispose();
160
+ //renderTarget = new THREE.WebGLRenderTarget( HMD.hResolution*distScale/2, HMD.vResolution*distScale, RTParams );
161
+ this.setRenderTarget(new THREE.WebGLRenderTarget( HMD.hResolution*distScale/2, HMD.vResolution*distScale, RTParams ));
162
+ this.setOutputTarget(options && options.renderTarget ? options.renderTarget : null);
163
+
164
+ }
165
+ this.getHMD = function() {return HMD};
166
+
167
+ this.setHMD(HMD);
168
+
169
+ this.setSize = function ( width, height ) {
170
+ left.viewport = [width/2 - HMD.hResolution/2, height/2 - HMD.vResolution/2, HMD.hResolution/2, HMD.vResolution];
171
+ right.viewport = [width/2, height/2 - HMD.vResolution/2, HMD.hResolution/2, HMD.vResolution];
172
+
173
+ renderer.setSize( width, height );
174
+ };
175
+
176
+ this.render = function ( scene, camera ) {
177
+ var cc = renderer.getClearColor().clone();
178
+
179
+ // Clear
180
+ //renderer.setClearColor(emptyColor);
181
+ //renderer.clear();
182
+ //renderer.setClearColor(cc);
183
+
184
+ // camera parameters
185
+ if (camera.matrixAutoUpdate) camera.updateMatrix();
186
+
187
+ // Render left
188
+ this.preLeftRender();
189
+ mesh.position.x = -.5;
190
+
191
+ pCamera.projectionMatrix.copy(left.proj);
192
+
193
+ pCamera.matrix.copy(camera.matrix).multiply(left.tranform);
194
+ pCamera.matrixWorldNeedsUpdate = true;
195
+
196
+ if (pCamera.parent && pCamera.parent != camera.parent) {
197
+ pCamera.parent.remove(pCamera);
198
+ }
199
+ if (camera.parent && camera.parent != pCamera.parent) {
200
+ camera.parent.add(pCamera);
201
+ }
202
+ pCamera.near = camera.near;
203
+ pCamera.far = camera.far;
204
+
205
+ renderer.setViewport(left.viewport[0], left.viewport[1], left.viewport[2], left.viewport[3]);
206
+
207
+ RTMaterial.uniforms['lensCenter'].value = left.lensCenter;
208
+ renderer.render( scene, pCamera, this.renderTarget, true );
209
+ renderer.render( finalScene, oCamera, this.outputTarget );
210
+
211
+ // Render right
212
+ this.preRightRender();
213
+ mesh.position.x = .5;
214
+
215
+ pCamera.projectionMatrix.copy(right.proj);
216
+
217
+ pCamera.matrix.copy(camera.matrix).multiply(right.tranform);
218
+ pCamera.matrixWorldNeedsUpdate = true;
219
+
220
+ renderer.setViewport(right.viewport[0], right.viewport[1], right.viewport[2], right.viewport[3]);
221
+
222
+ RTMaterial.uniforms['lensCenter'].value = right.lensCenter;
223
+
224
+ renderer.render( scene, pCamera, this.renderTarget, true );
225
+ renderer.render( finalScene, oCamera, this.outputTarget );
226
+
227
+ renderer.setViewport(left.viewport[0], left.viewport[1], left.viewport[2] * 2, left.viewport[3]);
228
+
229
+ };
230
+
231
+ this.dispose = function() {
232
+ if ( RTMaterial ) {
233
+ RTMaterial.dispose();
234
+ }
235
+ if ( this.renderTarget ) {
236
+ this.renderTarget.dispose();
237
+ }
238
+ };
239
+
240
+ };
@@ -0,0 +1,166 @@
1
+ /**
2
+ * @author James Baicoianu
3
+ */
4
+
5
+ THREE.PortalRenderPass = function ( camera ) {
6
+
7
+ THREE.Pass.call( this );
8
+
9
+ this.portals = [];
10
+ this.maincamera = camera;
11
+ this.clipscene = new THREE.Scene();
12
+ this.clipmesh = new THREE.Mesh();
13
+ this.clipmaterial = new THREE.MeshBasicMaterial({color: 0xff0000});
14
+ this.clipmesh.matrixAutoUpdate = false;
15
+ this.clipscene.add(this.clipmesh);
16
+
17
+ this.clear = false;
18
+ this.needsSwap = false;
19
+
20
+ };
21
+
22
+ THREE.PortalRenderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {
23
+
24
+ constructor: THREE.PortalRenderPass,
25
+
26
+ render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {
27
+ this.drawPortals(renderer, this.portals, writeBuffer, readBuffer);
28
+ this.drawPortalsStencil(renderer, this.portals, writeBuffer, readBuffer);
29
+ },
30
+ /*
31
+ drawPortal: function ( renderer, portal, writeBuffer, readBuffer ) {
32
+ this.drawPortalStencil(renderer, portal, writeBuffer, readBuffer);
33
+ this.drawPortalScene(renderer, portal, writeBuffer, readBuffer);
34
+ },
35
+ */
36
+
37
+ drawPortals: function(renderer, portals, writeBuffer, readBuffer) {
38
+ for (var i = 0; i < portals.length; i++) {
39
+ this.drawPortal(renderer, portals[i], writeBuffer, readBuffer);
40
+ }
41
+ },
42
+ drawPortalsStencil: function(renderer, portals, writeBuffer, readBuffer) {
43
+ var stencilscene = new THREE.Scene();
44
+ var context = renderer.context;
45
+ var state = renderer.state;
46
+ // Finally, we render the portal object into the depth buffer without touching the color buffer, to prevent what's behind it from being drawn
47
+ state.buffers.color.setLocked( false );
48
+ state.buffers.depth.setLocked( false );
49
+ state.buffers.stencil.setTest( false );
50
+ state.buffers.color.setMask( false );
51
+ state.buffers.depth.setMask( true );
52
+
53
+ state.buffers.color.setLocked( true );
54
+ state.buffers.depth.setLocked( true );
55
+ //state.buffers.depth.setClear(true);
56
+ renderer.clearDepth();
57
+ for (var i = 0; i < portals.length; i++) {
58
+ var portal = portals[i];
59
+
60
+ var mesh = this.clipmesh;
61
+ var portalmesh = portal.mesh;
62
+ mesh.geometry = portal.clipmesh.geometry;
63
+ mesh.material = new THREE.MeshBasicMaterial({color: 0xffffff * Math.random()});
64
+ mesh.matrix.copy(portal.mesh.matrixWorld);
65
+ mesh.matrixWorld.copy(portal.mesh.matrixWorld);
66
+ /*
67
+ mesh.matrixAutoUpdate = false;
68
+ mesh.matrixWorld.copy(portals[i].clipmesh.matrixWorld);
69
+ stencilscene.add(mesh);
70
+ */
71
+ renderer.render( this.clipscene, portal.camera, readBuffer, this.clear );
72
+ renderer.render( this.clipscene, portal.camera, writeBuffer, this.clear );
73
+ }
74
+
75
+
76
+ /*
77
+ var context = renderer.context;
78
+ var state = renderer.state;
79
+ state.buffers.stencil.setTest( false );
80
+ state.buffers.depth.setClear(true);
81
+ state.buffers.color.setMask( true );
82
+ state.buffers.depth.setMask( true );
83
+
84
+ console.log('clip cover', stencilscene, this.maincamera);
85
+ state.buffers.stencil.setTest( false );
86
+ renderer.render( stencilscene, this.maincamera, writeBuffer, this.clear );
87
+
88
+ //state.buffers.depth.setClear(false);
89
+ state.buffers.color.setMask( true );
90
+ state.buffers.depth.setMask( true );
91
+ */
92
+ },
93
+
94
+ drawPortal: function ( renderer, portal, writeBuffer, readBuffer ) {
95
+ var context = renderer.context;
96
+ var state = renderer.state;
97
+
98
+ var mesh = this.clipmesh;
99
+ var portalmesh = portal.mesh;
100
+ mesh.geometry = portal.clipmesh.geometry;
101
+ mesh.material = this.clipmaterial;
102
+ mesh.matrix.copy(portal.mesh.matrixWorld);
103
+ mesh.matrixWorld.copy(portal.mesh.matrixWorld);
104
+
105
+ // set up stencil
106
+
107
+ var writeValue, clearValue;
108
+
109
+ if ( this.inverse ) {
110
+
111
+ writeValue = 0;
112
+ clearValue = 1;
113
+
114
+ } else {
115
+
116
+ writeValue = 1;
117
+ clearValue = 0;
118
+
119
+ }
120
+
121
+ // First, we draw the stencil pattern
122
+ state.buffers.color.setLocked( false );
123
+ state.buffers.depth.setLocked( false );
124
+ state.buffers.color.setMask( false );
125
+ state.buffers.depth.setMask( false );
126
+ state.buffers.stencil.setTest( true );
127
+ state.buffers.stencil.setFunc( context.NEVER, 0, 0xffffffff ); // draw if == 1
128
+ state.buffers.stencil.setOp( context.INCR, context.KEEP, context.KEEP );
129
+ state.buffers.color.setLocked( true );
130
+ state.buffers.depth.setLocked( true );
131
+ renderer.render( this.clipscene, portal.camera, readBuffer, this.clear );
132
+ renderer.render( this.clipscene, portal.camera, writeBuffer, this.clear );
133
+
134
+
135
+ // Next, we render the scene inside of the portal, clipped to the stencil we set above
136
+ state.buffers.color.setLocked( false );
137
+ state.buffers.depth.setLocked( false );
138
+ state.buffers.color.setMask( true );
139
+ state.buffers.depth.setMask( true );
140
+
141
+ state.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1
142
+ state.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );
143
+
144
+ state.buffers.color.setLocked( true );
145
+ state.buffers.depth.setLocked( true );
146
+ renderer.render( portal.scene, portal.camera, this.renderToScreen ? null : readBuffer, this.clear );
147
+
148
+ /*
149
+ // Finally, we render the portal object into the depth buffer without touching the color buffer, to prevent what's behind it from being drawn
150
+ state.buffers.color.setLocked( false );
151
+ state.buffers.depth.setLocked( false );
152
+ state.buffers.stencil.setTest( false );
153
+ state.buffers.color.setMask( false );
154
+ state.buffers.depth.setMask( true );
155
+
156
+ state.buffers.color.setLocked( true );
157
+ state.buffers.depth.setLocked( true );
158
+ renderer.render( this.clipscene, portal.camera, readBuffer, this.clear );
159
+ renderer.render( this.clipscene, portal.camera, writeBuffer, this.clear );
160
+ */
161
+ },
162
+ drawPortalScene: function( renderer, portal, writeBuffer, readBuffer ) {
163
+
164
+ }
165
+ } );
166
+