@woosh/meep-engine 2.138.3 → 2.138.5

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 (52) hide show
  1. package/package.json +1 -1
  2. package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.d.ts +13 -5
  3. package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.d.ts.map +1 -1
  4. package/src/core/bvh2/bvh3/ebvh_build_hierarchy_radix.js +253 -280
  5. package/src/core/bvh2/bvh3/ebvh_update_hierarchy_bounds.js +1 -1
  6. package/src/core/bvh2/bvh3/query/bvh_query_depth_range_in_frustum.d.ts +31 -0
  7. package/src/core/bvh2/bvh3/query/bvh_query_depth_range_in_frustum.d.ts.map +1 -0
  8. package/src/core/bvh2/bvh3/query/bvh_query_depth_range_in_frustum.js +101 -0
  9. package/src/core/cache/CacheV2.d.ts +6 -2
  10. package/src/core/cache/CacheV2.d.ts.map +1 -1
  11. package/src/core/cache/CacheV2.js +6 -2
  12. package/src/engine/EngineHarness.js +2 -2
  13. package/src/engine/ecs/renderable/RenderSystem.d.ts.map +1 -1
  14. package/src/engine/ecs/renderable/RenderSystem.js +6 -0
  15. package/src/engine/ecs/terrain/ecs/TerrainSystem.d.ts.map +1 -1
  16. package/src/engine/ecs/terrain/ecs/TerrainSystem.js +19 -0
  17. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.d.ts +4 -1
  18. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.d.ts.map +1 -1
  19. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.js +121 -12
  20. package/src/engine/graphics/ecs/light/LightSystem.d.ts.map +1 -1
  21. package/src/engine/graphics/ecs/light/LightSystem.js +80 -18
  22. package/src/engine/graphics/ecs/light/shadow/compute_view_frustum_aabb_in_space.d.ts +14 -0
  23. package/src/engine/graphics/ecs/light/shadow/compute_view_frustum_aabb_in_space.d.ts.map +1 -0
  24. package/src/engine/graphics/ecs/light/shadow/compute_view_frustum_aabb_in_space.js +62 -0
  25. package/src/engine/graphics/ecs/light/shadow/extend_shadow_camera_near_for_casters.d.ts +30 -0
  26. package/src/engine/graphics/ecs/light/shadow/extend_shadow_camera_near_for_casters.d.ts.map +1 -0
  27. package/src/engine/graphics/ecs/light/shadow/extend_shadow_camera_near_for_casters.js +97 -0
  28. package/src/engine/graphics/ecs/mesh/MeshSystem.d.ts.map +1 -1
  29. package/src/engine/graphics/ecs/mesh/MeshSystem.js +6 -0
  30. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts.map +1 -1
  31. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +6 -0
  32. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts.map +1 -1
  33. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.js +6 -0
  34. package/src/engine/graphics/ecs/water/WaterSystem.d.ts.map +1 -1
  35. package/src/engine/graphics/ecs/water/WaterSystem.js +6 -0
  36. package/src/engine/graphics/impostors/octahedral/prototypeBaker.js +7 -10
  37. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.d.ts.map +1 -1
  38. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.js +139 -57
  39. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderWireframeV0.d.ts.map +1 -1
  40. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderWireframeV0.js +123 -38
  41. package/src/engine/graphics/impostors/octahedral/util/makeImpostorAtlasPreview.d.ts +1 -1
  42. package/src/engine/graphics/impostors/octahedral/util/makeImpostorAtlasPreview.d.ts.map +1 -1
  43. package/src/engine/graphics/impostors/octahedral/util/makeImpostorAtlasPreview.js +7 -3
  44. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts.map +1 -1
  45. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.js +6 -0
  46. package/src/engine/graphics/render/layers/RenderLayer.d.ts +2 -0
  47. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
  48. package/src/engine/graphics/render/layers/RenderLayer.js +14 -0
  49. package/src/engine/intelligence/mcts/MonteCarlo.js +1 -1
  50. package/src/engine/graphics/ecs/camera/FrustumProjector.d.ts +0 -14
  51. package/src/engine/graphics/ecs/camera/FrustumProjector.d.ts.map +0 -1
  52. package/src/engine/graphics/ecs/camera/FrustumProjector.js +0 -86
@@ -8,54 +8,139 @@ import {
8
8
  Vector3
9
9
  } from "three";
10
10
 
11
- /*
12
- *
13
- * For ray projection using projection matrix : https://encreative.blogspot.com/2019/05/computing-ray-origin-and-direction-from.html
14
- */
11
+ // The wireframe must trace the SAME card geometry that ImpostorShaderV0
12
+ // produces, otherwise the red outline lies about where the impostor surface
13
+ // actually is. So this vertex shader is the geometry half of the main V0
14
+ // vertex shader, minus everything the fragment shader doesn't read (no
15
+ // vUv, vViewPos, vTangent/vBinormal/vNormal, no per-frame xforms, no
16
+ // atlas lookup).
15
17
  const shader_vx = `
16
-
18
+
17
19
  in vec3 position;
18
-
20
+
19
21
  uniform mat4 modelViewMatrix;
20
22
  uniform mat4 projectionMatrix;
21
- uniform mat3 normalMatrix;
22
-
23
+
23
24
  uniform vec3 uOffset;
24
25
  uniform float uRadius;
25
26
  uniform float uFrames;
26
-
27
+ uniform bool uIsFullSphere;
28
+
29
+ // ----- direction -> octahedral grid coord (range -1..+1) -----
30
+
31
+ vec2 VecToSphereOct(vec3 pivotToCamera)
32
+ {
33
+ vec3 octant = sign(pivotToCamera);
34
+ float sum = dot(pivotToCamera, octant);
35
+ vec3 octahedron = pivotToCamera / sum;
36
+ if (octahedron.y < 0.0) {
37
+ vec3 absolute = abs(octahedron);
38
+ octahedron.xz = octant.xz * vec2(1.0 - absolute.z, 1.0 - absolute.x);
39
+ }
40
+ return octahedron.xz;
41
+ }
42
+
43
+ vec2 VecToHemiSphereOct(vec3 v)
44
+ {
45
+ v.y = max(v.y, 0.001);
46
+ v = normalize(v);
47
+ vec3 octant = sign(v);
48
+ float sum = dot(v, octant);
49
+ vec3 octahedron = v / sum;
50
+ return vec2(
51
+ octahedron.x + octahedron.z,
52
+ octahedron.z - octahedron.x
53
+ );
54
+ }
55
+
56
+ vec2 VectorToGrid(vec3 v)
57
+ {
58
+ return uIsFullSphere ? VecToSphereOct(v) : VecToHemiSphereOct(v);
59
+ }
60
+
61
+ // ----- octahedral grid coord (range 0..1) -> direction -----
62
+
63
+ vec3 OctaSphereDec(vec2 coord)
64
+ {
65
+ coord = (coord - 0.5) * 2.0;
66
+ vec3 p = vec3(coord.x, 0.0, coord.y);
67
+ vec2 a = abs(p.xz);
68
+ p.y = 1.0 - a.x - a.y;
69
+ if (p.y < 0.0) {
70
+ p.xz = sign(p.xz) * vec2(1.0 - a.y, 1.0 - a.x);
71
+ }
72
+ return p;
73
+ }
74
+
75
+ vec3 OctaHemiSphereDec(vec2 coord)
76
+ {
77
+ vec3 p = vec3(coord.x - coord.y, 0.0, -1.0 + coord.x + coord.y);
78
+ vec2 a = abs(p.xz);
79
+ p.y = 1.0 - a.x - a.y;
80
+ return p;
81
+ }
82
+
83
+ vec3 GridToVector(vec2 coord)
84
+ {
85
+ return uIsFullSphere ? OctaSphereDec(coord) : OctaHemiSphereDec(coord);
86
+ }
87
+
88
+ vec3 FrameToRay(vec2 frame, vec2 framesMinusOne)
89
+ {
90
+ vec2 f = clamp(frame / framesMinusOne, 0.0, 1.0);
91
+ return normalize(GridToVector(f));
92
+ }
93
+
94
+ vec4 BilinearWeights(vec2 frac_uv)
95
+ {
96
+ vec2 omuv = vec2(1.0) - frac_uv;
97
+ return vec4(
98
+ omuv.x * omuv.y,
99
+ frac_uv.x * omuv.y,
100
+ omuv.x * frac_uv.y,
101
+ frac_uv.x * frac_uv.y
102
+ );
103
+ }
104
+
27
105
  void main() {
28
-
29
- vec2 framesMinusOne = uFrames - vec2(1.0);
30
-
31
- mat4 m4 = modelViewMatrix;
32
-
33
- m4[0][0] = 1.0;
34
- m4[0][1] = 0.0;
35
- m4[0][2] = 0.0;
106
+ // Pivot-to-camera direction in object-local space; same as V0.
107
+ vec3 cameraPos_OS = (inverse(modelViewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
108
+ vec3 pivotToCameraRay = normalize(cameraPos_OS);
36
109
 
37
- m4[1][0] = 0.0;
38
- m4[1][1] = 1.0;
39
- m4[1][2] = 0.0;
110
+ // Pick the cell and its 4-corner bilinear weights, then blend the
111
+ // four corner rays into the "effective" bake direction the card is
112
+ // showing. Mirrors V0.
113
+ vec2 framesMinusOne = vec2(uFrames - 1.0);
114
+ vec2 octahedral_uv = clamp(VectorToGrid(pivotToCameraRay) * 0.5 + 0.5, 0.0, 1.0);
115
+ vec2 grid = octahedral_uv * framesMinusOne;
116
+ vec2 gridFloor = min(floor(grid), framesMinusOne - 1.0);
117
+ vec4 weights = BilinearWeights(grid - gridFloor);
40
118
 
41
- m4[2][0] = 0.0;
42
- m4[2][1] = 0.0;
43
- m4[2][2] = 1.0;
44
-
45
- vec3 object_scale = vec3(
46
- length(modelViewMatrix[0].xyz),
47
- length(modelViewMatrix[1].xyz),
48
- length(modelViewMatrix[2].xyz)
49
- );
50
-
51
- // scale by object's baking bounding sphere's radius
52
- float card_diameter = uRadius*2.0;
53
- object_scale *= card_diameter;
54
-
55
- vec4 mvPosition = m4 * vec4( object_scale*(position+uOffset/card_diameter), 1.0 );
56
-
57
- gl_Position = projectionMatrix * mvPosition;
58
-
119
+ vec3 ray00 = FrameToRay(gridFloor + vec2(0.0, 0.0), framesMinusOne);
120
+ vec3 ray10 = FrameToRay(gridFloor + vec2(1.0, 0.0), framesMinusOne);
121
+ vec3 ray01 = FrameToRay(gridFloor + vec2(0.0, 1.0), framesMinusOne);
122
+ vec3 ray11 = FrameToRay(gridFloor + vec2(1.0, 1.0), framesMinusOne);
123
+ vec3 projectedRay = normalize(
124
+ ray00 * weights.x +
125
+ ray10 * weights.y +
126
+ ray01 * weights.z +
127
+ ray11 * weights.w
128
+ );
129
+
130
+ // TBN construction identical to V0 so the card spans the same plane.
131
+ vec3 normal_OS = projectedRay;
132
+ vec3 up_OS = abs(normal_OS.y) > 0.999
133
+ ? vec3(0.0, 0.0, -1.0)
134
+ : vec3(0.0, 1.0, 0.0);
135
+ vec3 tangent_OS = normalize(cross(up_OS, normal_OS));
136
+ vec3 binormal_OS = cross(normal_OS, tangent_OS);
137
+
138
+ float card_diameter = uRadius * 2.0;
139
+ vec3 pos_OS = uOffset
140
+ + position.x * card_diameter * tangent_OS
141
+ + position.y * card_diameter * binormal_OS;
142
+
143
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(pos_OS, 1.0);
59
144
  }
60
145
  `;
61
146
  const shader_fg = `
@@ -2,7 +2,7 @@
2
2
  *
3
3
  * @param {ImpostorDescription} impostor
4
4
  * @param {THREE.WebGLRenderer} renderer
5
- * @param {'albedo'|'normal'|'depth'|'alpha'} [mode]
5
+ * @param {'albedo'|'normal'|'depth'|'alpha'|'orm'} [mode]
6
6
  * @param {boolean} [show_grid]
7
7
  * @return {View}
8
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"makeImpostorAtlasPreview.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/impostors/octahedral/util/makeImpostorAtlasPreview.js"],"names":[],"mappings":"AA4CA;;;;;;;GAOG;AACH,6GAsDC"}
1
+ {"version":3,"file":"makeImpostorAtlasPreview.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/impostors/octahedral/util/makeImpostorAtlasPreview.js"],"names":[],"mappings":"AA4CA;;;;;;;GAOG;AACH,6GA0DC"}
@@ -1,6 +1,6 @@
1
- import { buildCanvasViewFromTexture } from "../../../render/visibility/hiz/buildCanvasViewFromTexture.js";
2
- import EmptyView from "../../../../../view/elements/EmptyView.js";
3
1
  import { CanvasView } from "../../../../../view/elements/CanvasView.js";
2
+ import EmptyView from "../../../../../view/elements/EmptyView.js";
3
+ import { buildCanvasViewFromTexture } from "../../../render/visibility/hiz/buildCanvasViewFromTexture.js";
4
4
 
5
5
  /**
6
6
  * @param {ImpostorDescription} impostor
@@ -46,7 +46,7 @@ function makeGrid(impostor) {
46
46
  *
47
47
  * @param {ImpostorDescription} impostor
48
48
  * @param {THREE.WebGLRenderer} renderer
49
- * @param {'albedo'|'normal'|'depth'|'alpha'} [mode]
49
+ * @param {'albedo'|'normal'|'depth'|'alpha'|'orm'} [mode]
50
50
  * @param {boolean} [show_grid]
51
51
  * @return {View}
52
52
  */
@@ -73,6 +73,10 @@ export function makeImpostorAtlasPreview({
73
73
  options.swizzle = ['a', 'a', 'a', 1];
74
74
  options.texture = impostor.rt.texture[1]
75
75
  break;
76
+ case "orm":
77
+ options.swizzle = ['r', 'g', 'b', 1];
78
+ options.texture = impostor.rt.texture[2]
79
+ break;
76
80
  default:
77
81
  console.warn(`Unsupported mode '${mode}', defaulting to albedo`);
78
82
  //fall-through
@@ -1 +1 @@
1
- {"version":3,"file":"ParticleEmitterSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/particles/ecs/ParticleEmitterSystem.js"],"names":[],"mappings":"AAYA;IAeI;;;;;OAKG;IACH,4BAwBC;IA5CD,yCAA4C;IAE5C,uEAEE;IAEF;;;OAGG;IACH,aAFU,cAAY,IAAI,CAEP;IAEnB,kBAAgB;IAcZ;;;OAGG;IACH,+BAAqC;IAErC;;;OAGG;IACH,2BAAuC;IAEvC;;;OAGG;IACH,gBAFU,gBAAgB,CAE2E;IAIzG,2CAyHC;IAED,4CAEC;IAED;;;;;OAKG;IACH,cAJW,eAAe,aACf,SAAS,qBAoCnB;IAED;;;;;OAKG;IACH,gBAJW,eAAe,aACf,SAAS,qBAenB;IAED,6BAEC;CACJ;uBAtPsB,wBAAwB;gCAIf,iDAAiD;4CANrC,uDAAuD;iCAQlE,0CAA0C;0BALjD,qCAAqC"}
1
+ {"version":3,"file":"ParticleEmitterSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/particles/ecs/ParticleEmitterSystem.js"],"names":[],"mappings":"AAaA;IAeI;;;;;OAKG;IACH,4BAwBC;IA5CD,yCAA4C;IAE5C,uEAEE;IAEF;;;OAGG;IACH,aAFU,cAAY,IAAI,CAEP;IAEnB,kBAAgB;IAcZ;;;OAGG;IACH,+BAAqC;IAErC;;;OAGG;IACH,2BAAuC;IAEvC;;;OAGG;IACH,gBAFU,gBAAgB,CAE2E;IAIzG,2CA8HC;IAED,4CAEC;IAED;;;;;OAKG;IACH,cAJW,eAAe,aACf,SAAS,qBAoCnB;IAED;;;;;OAKG;IACH,gBAJW,eAAe,aACf,SAAS,qBAenB;IAED,6BAEC;CACJ;uBA3PsB,wBAAwB;gCAIf,iDAAiD;4CANrC,uDAAuD;iCAQlE,0CAA0C;0BALjD,qCAAqC"}
@@ -1,4 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
+ import { bvh_query_depth_range_in_frustum } from "../../../../core/bvh2/bvh3/query/bvh_query_depth_range_in_frustum.js";
2
3
  import { ResourceAccessKind } from "../../../../core/model/ResourceAccessKind.js";
3
4
  import { ResourceAccessSpecification } from "../../../../core/model/ResourceAccessSpecification.js";
4
5
  import { ImageRGBADataLoader } from "../../../asset/loaders/image/ImageRGBADataLoader.js";
@@ -85,6 +86,11 @@ export class ParticleEmitterSystem extends System {
85
86
  }
86
87
  );
87
88
 
89
+ const bvh = this.particleEngine.bvh;
90
+ renderLayer.compute_depth_range = (result, frustum, nx, ny, nz, c) => {
91
+ bvh_query_depth_range_in_frustum(result, bvh, frustum, nx, ny, nz, c);
92
+ };
93
+
88
94
  renderLayer.visibleSet.onAdded.add((points) => {
89
95
  /**
90
96
  *
@@ -17,4 +17,6 @@ export class RenderLayer {
17
17
  * @deprecated
18
18
  */
19
19
  visibleSet: IncrementalDeltaSet<Object3D>
20
+
21
+ compute_depth_range: ((result: { near: number; far: number }, frustum: ArrayLike<number>, plane_normal_x: number, plane_normal_y: number, plane_normal_z: number, plane_constant: number) => void) | null
20
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RenderLayer.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/render/layers/RenderLayer.js"],"names":[],"mappings":"AAKA;IAEI;;;OAGG;IACH,OAFU,gBAAgB,CAEK;IAE/B;;;OAGG;IACH,MAFU,SAAO,IAAI,CAET;IAEZ;;;;OAIG;IACH,SAFU,OAAO,CAED;IAEhB;;;OAGG;IACH,2CAAgC;IAEhC;;;;;OAKG;IACH,YAFU,oBAAoB,MAAM,QAAQ,CAAC,CAEe;IAU5D;;;OAGG;IACH,0BAEC;IAdD;;;OAGG;IACH,uBAEC;IAUD;;;;;;;;;OASG;IACH,qDALW,MAAM,OACN,MAAM,sCAMhB;IAED;;;;;;OAMG;IACH,6BALW,MAAM,QAAQ,EAAE,sBAChB,MAAM,qBAEJ,MAAM,CAIlB;CACJ;iCA7EgC,uBAAuB;oCADpB,sCAAsC"}
1
+ {"version":3,"file":"RenderLayer.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/render/layers/RenderLayer.js"],"names":[],"mappings":"AAKA;IAEI;;;OAGG;IACH,OAFU,gBAAgB,CAEK;IAE/B;;;OAGG;IACH,MAFU,SAAO,IAAI,CAET;IAEZ;;;;OAIG;IACH,SAFU,OAAO,CAED;IAEhB;;;OAGG;IACH,2CAAgC;IAEhC;;;;;OAKG;IACH,YAFU,oBAAoB,MAAM,QAAQ,CAAC,CAEe;IAU5D;;;OAGG;IACH,0BAEC;IAdD;;;OAGG;IACH,uBAEC;IAUD;;;;;;;;;OASG;IACH,qDALW,MAAM,OACN,MAAM,sCAMhB;IAED;;;;;;OAMG;IACH,6BALW,MAAM,QAAQ,EAAE,sBAChB,MAAM,qBAEJ,MAAM,CAIlB;IAED;;;;;;;;;;;OAWG;IACH,8BAFmB;QAAC,IAAI,EAAC,MAAM,CAAC;QAAA,GAAG,EAAC,MAAM,CAAA;KAAC,WAAU,UAAU,MAAM,CAAC,kBAAiB,MAAM,kBAAiB,MAAM,kBAAiB,MAAM,kBAAiB,MAAM,KAAK,IAAI,CAEhJ;CAC9B;iCA3FgC,uBAAuB;oCADpB,sCAAsC"}
@@ -78,4 +78,18 @@ export class RenderLayer {
78
78
  buildVisibleSet(destination, destination_offset, view) {
79
79
  throw new Error('deprecated');
80
80
  }
81
+
82
+ /**
83
+ * Expand a (near, far) depth range to cover this layer's content that
84
+ * intersects a frustum. Driven by the camera's autoClip path; defaults to
85
+ * a no-op for layers that don't own a BVH or don't participate in depth
86
+ * fitting (e.g. screen-space overlays).
87
+ *
88
+ * Systems with a BVH wire this from their `startup` alongside
89
+ * `buildVisibleSet` — typically using
90
+ * {@link bvh_query_depth_range_in_frustum} against their own BVH.
91
+ *
92
+ * @type {((result:{near:number,far:number}, frustum:ArrayLike<number>, plane_normal_x:number, plane_normal_y:number, plane_normal_z:number, plane_constant:number) => void) | null}
93
+ */
94
+ compute_depth_range = null;
81
95
  }
@@ -152,7 +152,7 @@ export class MonteCarloTreeSearch {
152
152
  assert.notNaN(s, 'computed Node score');
153
153
  assert.isFinite(s, `computed Node score`);
154
154
 
155
- score = s + randomRoll;
155
+ score = s + randomRoll * 1e-5;
156
156
  } else {
157
157
 
158
158
  //use a constant value for unexplored nodes
@@ -1,14 +0,0 @@
1
- declare namespace _default {
2
- export { project };
3
- }
4
- export default _default;
5
- /**
6
- *
7
- * @param {Number} nearZ
8
- * @param {Number} farZ
9
- * @param {THREE.Camera} camera
10
- * @param {THREE.Matrix4} matrixWorldInverse
11
- * @param {AABB3} result
12
- */
13
- declare function project(nearZ: number, farZ: number, camera: THREE.Camera, matrixWorldInverse: THREE.Matrix4, result: AABB3): void;
14
- //# sourceMappingURL=FrustumProjector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FrustumProjector.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/ecs/camera/FrustumProjector.js"],"names":[],"mappings":";;;;AAkBA;;;;;;;GAOG;AACH,8DAJW,MAAM,MAAM,sBACZ,MAAM,OAAO,uBAsDvB"}
@@ -1,86 +0,0 @@
1
- import { Vector3 as ThreeVector3 } from 'three';
2
-
3
-
4
- const corners = [
5
- new ThreeVector3(-1, -1, 0),
6
- new ThreeVector3(-1, -1, 0),
7
-
8
- new ThreeVector3(-1, 1, 0),
9
- new ThreeVector3(-1, 1, 0),
10
-
11
- new ThreeVector3(1, -1, 0),
12
- new ThreeVector3(1, -1, 0),
13
-
14
- new ThreeVector3(1, 1, 0),
15
- new ThreeVector3(1, 1, 0)
16
- ];
17
-
18
-
19
- /**
20
- *
21
- * @param {Number} nearZ
22
- * @param {Number} farZ
23
- * @param {THREE.Camera} camera
24
- * @param {THREE.Matrix4} matrixWorldInverse
25
- * @param {AABB3} result
26
- */
27
- function project(nearZ, farZ, camera, matrixWorldInverse, result) {
28
- corners[0].set(-1, -1, nearZ);
29
- corners[1].set(-1, -1, farZ);
30
-
31
- corners[2].set(-1, 1, nearZ);
32
- corners[3].set(-1, 1, farZ);
33
-
34
- corners[4].set(1, -1, nearZ);
35
- corners[5].set(1, -1, farZ);
36
-
37
- corners[6].set(1, 1, nearZ);
38
- corners[7].set(1, 1, farZ);
39
-
40
- //compute corners of view frustum in light space
41
- let x0 = Number.POSITIVE_INFINITY;
42
- let y0 = Number.POSITIVE_INFINITY;
43
- let z0 = Number.POSITIVE_INFINITY;
44
-
45
- let x1 = Number.NEGATIVE_INFINITY;
46
- let y1 = Number.NEGATIVE_INFINITY;
47
- let z1 = Number.NEGATIVE_INFINITY;
48
-
49
-
50
- for (let i = 0; i < 8; i++) {
51
- const corner = corners[i];
52
- corner.unproject(camera);
53
- corner.applyMatrix4(matrixWorldInverse);
54
-
55
- if (corner.x < x0) {
56
- x0 = corner.x;
57
- }
58
- if (corner.x > x1) {
59
- x1 = corner.x;
60
- }
61
-
62
- if (corner.y < y0) {
63
- y0 = corner.y;
64
- }
65
- if (corner.y > y1) {
66
- y1 = corner.y;
67
- }
68
-
69
- if (corner.z < z0) {
70
- z0 = corner.z;
71
- }
72
- if (corner.z > z1) {
73
- z1 = corner.z;
74
- }
75
- }
76
-
77
- result.setBounds(x0, y0, z0, x1, y1, z1);
78
- }
79
-
80
-
81
- export default {
82
- /**
83
- * @deprecated use non-threejs specific code
84
- */
85
- project,
86
- };