@woosh/meep-engine 2.33.24 → 2.33.28

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 (126) hide show
  1. package/core/binary/BitSet.js +151 -167
  2. package/core/binary/BitSet.spec.js +99 -1
  3. package/core/binary/ValidatingBitSetWrapper.js +81 -0
  4. package/core/bvh2/aabb3/AABB3.js +3 -10
  5. package/core/bvh2/binary/IndexedBinaryBVH.js +1 -1
  6. package/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
  7. package/core/bvh2/traversal/__detailed_box_volume_intersection.js +22 -5
  8. package/core/cache/Cache.d.ts +4 -2
  9. package/core/cache/Cache.js +5 -2
  10. package/core/collection/HashMap.d.ts +9 -2
  11. package/core/collection/HashSet.d.ts +7 -2
  12. package/core/collection/HashSet.js +7 -2
  13. package/core/collection/array/binarySearchHighIndex.js +1 -1
  14. package/core/collection/array/copyArray.js +2 -2
  15. package/core/collection/array/typed/typed_array_copy.js +1 -1
  16. package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +3 -3
  17. package/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
  18. package/core/geom/3d/shape/AbstractShape3D.js +37 -1
  19. package/core/geom/3d/shape/TransformedShape3D.js +121 -10
  20. package/core/geom/3d/shape/TransformedShape3D.spec.js +33 -0
  21. package/core/geom/3d/shape/UnionShape3D.js +255 -0
  22. package/core/geom/3d/shape/UnitCubeShape3D.js +88 -0
  23. package/core/geom/3d/shape/UnitCubeShape3D.spec.js +42 -0
  24. package/core/geom/3d/shape/UnitSphereShape3D.js +39 -0
  25. package/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +48 -0
  26. package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
  27. package/core/geom/random/randomPointInSphere.js +3 -2
  28. package/core/json/resolvePathByArray.js +2 -2
  29. package/core/model/ObservedBoolean.d.ts +2 -0
  30. package/core/parser/simple/Token.d.ts +13 -0
  31. package/core/parser/simple/Token.js +61 -27
  32. package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
  33. package/core/primitives/strings/insert_after_or_replace.js +27 -0
  34. package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
  35. package/editor/tools/FoliagePaintTool.js +4 -4
  36. package/editor/view/ecs/EntityEditor.js +2 -2
  37. package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
  38. package/engine/EngineHarness.js +1 -0
  39. package/engine/animation/AnimationUtils.js +5 -5
  40. package/engine/asset/loaders/GLTFAssetLoader.js +52 -1
  41. package/engine/asset/loaders/image/ImageDecoderWorker.js +4 -3
  42. package/engine/asset/loaders/image/ImageRGBADataAsset.js +3 -2
  43. package/engine/asset/loaders/image/ImageRGBADataLoader.js +3 -3
  44. package/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -1
  45. package/engine/asset/loaders/image/png/PNG.js +113 -6
  46. package/engine/asset/loaders/image/png/PNGReader.js +5 -0
  47. package/engine/asset/loaders/material/bitmap2sampler_gl.js +1 -1
  48. package/engine/asset/loaders/material/computeImageBitmapEquality.js +6 -1
  49. package/engine/asset/loaders/material/computeTextureEquality.js +40 -49
  50. package/engine/ecs/EntityBuilder.js +25 -5
  51. package/engine/ecs/EntityComponentDataset.js +1 -1
  52. package/engine/ecs/attachment/AttachmentBinding.js +8 -0
  53. package/engine/ecs/attachment/AttachmentSystem.js +4 -0
  54. package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
  55. package/engine/ecs/components/Tag.js +27 -6
  56. package/engine/ecs/foliage/InstancedFoliage.js +277 -266
  57. package/engine/ecs/foliage/ecs/Foliage2System.js +7 -7
  58. package/engine/ecs/foliage/ecs/InstancedMeshComponent.js +37 -0
  59. package/engine/ecs/foliage/ecs/{Foliage2.js → InstancedMeshLayer.js} +3 -45
  60. package/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +6 -5
  61. package/engine/ecs/foliage/ecs/InstancedMeshUtils.js +7 -6
  62. package/engine/ecs/fow/FogOfWar.js +4 -0
  63. package/engine/ecs/fow/FogOfWarSystem.js +2 -0
  64. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +2 -0
  65. package/engine/ecs/storage/binary/BinarySerializationRegistry.js +1 -1
  66. package/engine/ecs/system/AbstractContextSystem.js +1 -1
  67. package/engine/ecs/systems/TagSystem.js +17 -0
  68. package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +12 -16
  69. package/engine/ecs/transform/Transform.js +19 -6
  70. package/engine/graphics/GraphicsEngine.js +11 -6
  71. package/engine/graphics/composit/CompositLayer.js +17 -4
  72. package/engine/graphics/composit/CompositingStages.js +8 -0
  73. package/engine/graphics/composit/LayerCompositer.js +35 -6
  74. package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +11 -7
  75. package/engine/graphics/ecs/light/Light.js +2 -0
  76. package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
  77. package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
  78. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
  79. package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +14 -72
  80. package/engine/graphics/geometry/instancing/rewriteMaterial.js +70 -0
  81. package/engine/graphics/material/manager/MaterialManager.js +2 -1
  82. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +6 -4
  83. package/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +0 -2
  84. package/engine/graphics/particles/ParticleEmitterLibrary.js +3 -0
  85. package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
  86. package/engine/graphics/particles/particular/engine/ParticularEngine.js +8 -2
  87. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +14 -25
  88. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
  89. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +90 -2
  90. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +7 -7
  91. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +15 -12
  92. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -51
  93. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +81 -48
  94. package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
  95. package/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +141 -0
  96. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +148 -54
  97. package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
  98. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +544 -164
  99. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +15 -10
  100. package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
  101. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
  102. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
  103. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
  104. package/engine/graphics/render/forward_plus/materials/FPlusDebugMaterial.js +3 -3
  105. package/engine/graphics/render/forward_plus/materials/ForwardPlusThreeMaterial.js +1 -1
  106. package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
  107. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
  108. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
  109. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
  110. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +588 -53
  111. package/engine/graphics/render/forward_plus/prototypeLightManager.js +31 -6
  112. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +10 -9
  113. package/engine/graphics/shaders/TerrainShader.js +4 -5
  114. package/engine/graphics/shadows/ShadowMapRenderer.js +8 -2
  115. package/engine/graphics/texture/atlas/ManagedTextureAtlas.js +12 -1
  116. package/engine/graphics/texture/sampler/Sampler2D.js +3 -1
  117. package/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +1 -1
  118. package/engine/graphics/texture/sampler/copy_Sampler2D_channel_data.js +66 -0
  119. package/engine/graphics/util/composeMatrix4.js +33 -23
  120. package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
  121. package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
  122. package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
  123. package/engine/navigation/ecs/components/Path.js +0 -5
  124. package/package.json +1 -1
  125. package/view/minimap/gl/MinimapWorldGL.js +12 -5
  126. package/core/geom/3d/shape/CompositeShape.js +0 -60
@@ -1,4 +1,3 @@
1
- import { max2 } from "../../../../../../core/math/max2.js";
2
1
  import { EnginePlugin } from "../../../../../plugin/EnginePlugin.js";
3
2
  import {
4
3
  LinearFilter,
@@ -14,6 +13,7 @@ import { BlendingType } from "../../../../texture/sampler/BlendingType.js";
14
13
  import { DepthLimitedBlur } from "../DepthLimitedBlur.js";
15
14
  import { renderScreenSpace } from "../../../utils/renderScreenSpace.js";
16
15
  import { StandardFrameBuffers } from "../../../../StandardFrameBuffers.js";
16
+ import { CompositingStages } from "../../../../composit/CompositingStages.js";
17
17
 
18
18
  export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
19
19
  constructor() {
@@ -160,9 +160,9 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
160
160
  uniforms.bias.value = 0.5;
161
161
  uniforms.intensity.value = 0.18;
162
162
 
163
- const depth_range = far - near;
164
-
165
- uniforms.scale.value = 5 * max2(1, depth_range / 30);
163
+ // scale is divided by camera far in the shader, we unbias it here
164
+ // TODO remove this term from the shader
165
+ uniforms.scale.value = far * 0.25;
166
166
 
167
167
  uniforms.kernelRadius.value = 30;
168
168
  uniforms.minResolution.value = 0;
@@ -184,12 +184,14 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
184
184
 
185
185
  /**
186
186
  *
187
- * @param {WebGLRenderer} renderer
188
- * @param {Camera} camera
189
- * @param {Scene} scene
190
187
  * @private
191
188
  */
192
- __render(renderer, camera, scene) {
189
+ __render() {
190
+ const engine = this.engine;
191
+ const graphics = engine.graphics;
192
+
193
+ const renderer = graphics.renderer;
194
+
193
195
  this.__prepare_draw();
194
196
 
195
197
  const __old_state_rt = renderer.getRenderTarget();
@@ -295,6 +297,9 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
295
297
  this.__composit_layer = graphics.layerComposer.createLayer({}, BlendingType.Multiply);
296
298
  this.__composit_layer.name = 'Ambient Occlusion';
297
299
 
300
+ // apply ambient occlusion on opaque pass, otherwise it would occlude transparent geometry
301
+ this.__composit_layer.stage = CompositingStages.POST_OPAQUE;
302
+
298
303
  const material = this.__material;
299
304
  const uniforms = material.uniforms;
300
305
 
@@ -309,7 +314,7 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
309
314
  this.setNormalBufferUsage(true);
310
315
  }
311
316
 
312
- graphics.on.preComposite.add(this.__render, this);
317
+ this.__composit_layer.on.preRender.add(this.__render, this);
313
318
  graphics.viewport.size.onChanged.add(this.__update_render_target_size, this);
314
319
 
315
320
  this.__update_render_target_size();
@@ -330,7 +335,7 @@ export class AmbientOcclusionPostProcessEffect extends EnginePlugin {
330
335
  // remove the layer
331
336
  graphics.layerComposer.remove(this.__composit_layer);
332
337
 
333
- graphics.on.preComposite.remove(this.__render, this);
338
+ this.__composit_layer.on.preRender.remove(this.__render, this);
334
339
  graphics.viewport.size.onChanged.add(this.__update_render_target_size, this);
335
340
 
336
341
  return super.shutdown();
@@ -0,0 +1 @@
1
+ export const FP_INJECTION_POINT_ACCUMULATION = '//@injection_point FORWARD_PLUS:accumulation';
@@ -0,0 +1,32 @@
1
+ export const FP_SHADER_CHUNK_ACCUMULATION = `
2
+ ivec3 v3_cluster_resolution = textureSize(fp_t_light_tiles, 0);
3
+ ivec3 v3_cluster_position = ivec3( clip_v.x * float(v3_cluster_resolution.x), clip_v.y*float(v3_cluster_resolution.y), (clip_v.z)*float(v3_cluster_resolution.z) );
4
+
5
+ uvec3 cluster_metadata = texelFetch(fp_t_light_tiles, v3_cluster_position , 0).rgb;
6
+
7
+ // read light data
8
+ for(uint i=0u; i < cluster_metadata.y; i++){
9
+ uint lookup_index = cluster_metadata.x + i;
10
+
11
+ uint light_address = texelFetch(fp_t_light_lookup, address_to_data_texture_coordinates(lookup_index), 0 ).r;
12
+
13
+ vec4 light_data_0 = texelFetch(fp_t_light_data, address_to_data_texture_coordinates(light_address), 0);
14
+ vec4 light_data_1 = texelFetch(fp_t_light_data, address_to_data_texture_coordinates(light_address+1u), 0);
15
+
16
+ vec3 light_position = light_data_0.xyz;
17
+ float light_radius = light_data_0.w;
18
+
19
+ vec3 light_color = light_data_1.xyz;
20
+ float light_intensity = light_data_1.w;
21
+
22
+ PointLight pointlight;
23
+
24
+ pointlight.position = light_position;
25
+ pointlight.distance = light_radius;
26
+ pointlight.color = light_color*light_intensity;
27
+ pointlight.decay = 1.0;
28
+
29
+ fp_getPointDirectLightIrradiance( pointlight, directLight, vViewPosition );
30
+ RE_Direct( directLight, geometry, material, reflectedLight );
31
+ }
32
+ `;
@@ -0,0 +1,51 @@
1
+ export const FP_SHADER_CHUNK_DECODE_PARS = `
2
+ // don't rely on three.js light number define to ensure that point light calculations are available
3
+ #if NUM_POINT_LIGHTS < 1
4
+ struct PointLight {
5
+ vec3 position;
6
+ vec3 color;
7
+ float distance;
8
+ float decay;
9
+ };
10
+ #endif
11
+
12
+ // directLight is an out parameter as having it as a return value caused compiler errors on some devices
13
+ void fp_getPointDirectLightIrradiance( const in PointLight pointLight, out IncidentLight directLight, vec3 viewPosition ) {
14
+
15
+ // TODO consider moving light position transformation to view-space over to CPU
16
+ vec3 lVector = (viewMatrix*vec4(pointLight.position,1.0)).xyz + viewPosition;
17
+
18
+ directLight.direction = normalize( lVector );
19
+
20
+ float lightDistance = length( lVector );
21
+
22
+ directLight.color = pointLight.color;
23
+ directLight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );
24
+ directLight.visible = ( directLight.color != vec3( 0.0 ) );
25
+ }
26
+
27
+ float convert_depth_to_linear(in float d){
28
+ float d_n = 2.0*d - 1.0;
29
+
30
+ float f = fp_f_camera_far;
31
+ float n = fp_f_camera_near;
32
+
33
+ float fn = f*n;
34
+
35
+ float z_diff = f - n;
36
+
37
+ float denominator = (f + n - d_n * z_diff );
38
+
39
+ float z_view = (2.0*fn) / denominator;
40
+
41
+ return (z_view - n) / z_diff;
42
+ }
43
+
44
+ ivec2 address_to_data_texture_coordinates(uint address){
45
+ // Lookup texture has 128 width
46
+ uint lookup_index_x = address % 128u;
47
+ uint lookup_index_y = address >> 7;
48
+
49
+ return ivec2(int(lookup_index_x),int(lookup_index_y));
50
+ }
51
+ `;
@@ -0,0 +1,25 @@
1
+ export const FP_SHADER_CHUNK_PREAMBLE = `precision mediump usampler3D;
2
+ precision mediump usampler2D;
3
+
4
+ uniform usampler3D fp_t_light_tiles;
5
+
6
+ uniform usampler2D fp_t_light_lookup;
7
+ uniform sampler2D fp_t_light_data;
8
+
9
+ uniform vec3 fp_v3_light_cluster_resolution;
10
+
11
+ uniform float fp_f_camera_near;
12
+ uniform float fp_f_camera_far;
13
+
14
+ #define gl_FragDepthEXT gl_FragDepth
15
+ #define texture2D texture
16
+ #define textureCube texture
17
+ #define texture2DProj textureProj
18
+ #define texture2DLodEXT textureLod
19
+ #define texture2DProjLodEXT textureProjLod
20
+ #define textureCubeLodEXT textureLod
21
+ #define texture2DGradEXT textureGrad
22
+ #define texture2DProjGradEXT textureProjGrad
23
+ #define textureCubeGradEXT textureGrad
24
+
25
+ uniform vec2 fp_resolution;`;
@@ -36,7 +36,7 @@ const f_shader = `
36
36
 
37
37
  uniform sampler2D t_heatmap_lookup;
38
38
 
39
- uniform vec2 resolution;
39
+ uniform vec2 fp_resolution;
40
40
 
41
41
  uniform mat4 projectionMatrix;
42
42
 
@@ -79,7 +79,7 @@ const f_shader = `
79
79
 
80
80
  void main(){
81
81
 
82
- vec3 clip_v = vec3(gl_FragCoord.xy / resolution, convert_depth_to_linear( gl_FragCoord.z));
82
+ vec3 clip_v = vec3(gl_FragCoord.xy / fp_resolution, convert_depth_to_linear( gl_FragCoord.z));
83
83
 
84
84
  ivec3 v3_cluster_resolution = textureSize(fp_t_light_tiles, 0);
85
85
  ivec3 v3_cluster_position = ivec3( ( 1.0 - clip_v.x) * float(v3_cluster_resolution.x), clip_v.y*float(v3_cluster_resolution.y), (clip_v.z)*float(v3_cluster_resolution.z) );
@@ -119,7 +119,7 @@ export class FPlusDebugMaterial extends ShaderMaterial {
119
119
  type: 'f',
120
120
  value: 0
121
121
  },
122
- resolution: {
122
+ fp_resolution: {
123
123
  type: 'v2',
124
124
  value: new Vector2()
125
125
  },
@@ -29,7 +29,7 @@ export class ForwardPlusThreeMaterial extends ShaderMaterial {
29
29
  type: 'f',
30
30
  value: 0
31
31
  },
32
- resolution: {
32
+ fp_resolution: {
33
33
  type: 'v2',
34
34
  value: new Vector2()
35
35
  }
@@ -1,4 +1,25 @@
1
- import { insert_after } from "./insert_after.js";
1
+ import { insert_after } from "../../../../../core/primitives/strings/insert_after.js";
2
+ import { insert_after_or_replace } from "../../../../../core/primitives/strings/insert_after_or_replace.js";
3
+ import { FP_SHADER_CHUNK_ACCUMULATION } from "./FP_SHADER_CHUNK_ACCUMULATION.js";
4
+ import { FP_SHADER_CHUNK_DECODE_PARS } from "./FP_SHADER_CHUNK_DECODE_PARS.js";
5
+ import { FP_INJECTION_POINT_ACCUMULATION } from "./FP_INJECTION_POINT_ACCUMULATION.js";
6
+ import { FP_SHADER_CHUNK_PREAMBLE } from "./FP_SHADER_CHUNK_PREAMBLE.js";
7
+
8
+ const three_chunk_accummulation_mark = '#include <lights_fragment_end>';
9
+
10
+ const accumulation_pars = `
11
+ vec3 clip_v = vec3( vec2(gl_FragCoord.x, gl_FragCoord.y) / fp_resolution, convert_depth_to_linear(gl_FragCoord.z));
12
+ ${FP_SHADER_CHUNK_ACCUMULATION}
13
+ `;
14
+
15
+ const preamble = `
16
+ ${FP_SHADER_CHUNK_PREAMBLE}
17
+
18
+ varying vec3 v_world_position;
19
+
20
+ out highp vec4 pc_fragColor;
21
+ #define gl_FragColor pc_fragColor
22
+ `;
2
23
 
3
24
  /**
4
25
  *
@@ -6,126 +27,16 @@ import { insert_after } from "./insert_after.js";
6
27
  * @returns {string}
7
28
  */
8
29
  export function fp_build_fragment_shader(base) {
9
- const v0 = `
10
- precision mediump usampler3D;
11
- precision mediump usampler2D;
12
-
13
- uniform usampler3D fp_t_light_tiles;
14
-
15
- uniform usampler2D fp_t_light_lookup;
16
- uniform sampler2D fp_t_light_data;
17
-
18
- uniform vec3 fp_v3_light_cluster_resolution;
19
-
20
- uniform float fp_f_camera_near;
21
- uniform float fp_f_camera_far;
22
-
23
- uniform vec2 resolution;
24
-
25
- varying vec3 v_world_position;
26
-
27
- out highp vec4 pc_fragColor;
28
- #define gl_FragColor pc_fragColor
29
-
30
- #define gl_FragDepthEXT gl_FragDepth
31
- #define texture2D texture
32
- #define textureCube texture
33
- #define texture2DProj textureProj
34
- #define texture2DLodEXT textureLod
35
- #define texture2DProjLodEXT textureProjLod
36
- #define textureCubeLodEXT textureLod
37
- #define texture2DGradEXT textureGrad
38
- #define texture2DProjGradEXT textureProjGrad
39
- #define textureCubeGradEXT textureGrad
40
- ` + base;
41
-
42
- const v1 = insert_after(v0, '#include <lights_pars_begin>', `
43
- // don't rely on three.js light number define to ensure that point light calculations are available
44
- #if NUM_POINT_LIGHTS < 1
45
- struct PointLight {
46
- vec3 position;
47
- vec3 color;
48
- float distance;
49
- float decay;
50
- };
51
- #endif
52
-
53
- // directLight is an out parameter as having it as a return value caused compiler errors on some devices
54
- void fp_getPointDirectLightIrradiance( const in PointLight pointLight, out IncidentLight directLight ) {
55
-
56
- // TODO consider moving light position transformation to view-space over to CPU
57
- vec3 lVector = (viewMatrix*vec4(pointLight.position,1.0)).xyz + vViewPosition;
58
-
59
- directLight.direction = normalize( lVector );
60
-
61
- float lightDistance = length( lVector );
62
-
63
- directLight.color = pointLight.color;
64
- directLight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );
65
- directLight.visible = ( directLight.color != vec3( 0.0 ) );
66
- }
67
-
68
- float convert_depth_to_linear(in float d){
69
- float d_n = 2.0*d - 1.0;
70
-
71
- float f = fp_f_camera_far;
72
- float n = fp_f_camera_near;
73
-
74
- float fn = f*n;
75
-
76
- float z_diff = f - n;
77
-
78
- float denominator = (f + n - d_n * z_diff );
79
-
80
- float z_view = (2.0*fn) / denominator;
81
-
82
- return (z_view - n) / z_diff;
83
- }
84
-
85
- ivec2 address_to_data_texture_coordinates(uint address){
86
- // Lookup texture has 128 width
87
- uint lookup_index_x = address % 128u;
88
- uint lookup_index_y = address >> 7;
89
-
90
- return ivec2(int(lookup_index_x),int(lookup_index_y));
91
- }
92
- `);
93
-
94
- const v2 = insert_after(v1, '#include <lights_fragment_end>', `
95
- vec3 clip_v = vec3( vec2(gl_FragCoord.x, gl_FragCoord.y) / resolution, convert_depth_to_linear(gl_FragCoord.z));
96
-
97
- ivec3 v3_cluster_resolution = textureSize(fp_t_light_tiles, 0);
98
- ivec3 v3_cluster_position = ivec3( clip_v.x * float(v3_cluster_resolution.x), clip_v.y*float(v3_cluster_resolution.y), (clip_v.z)*float(v3_cluster_resolution.z) );
99
-
100
- uvec3 cluster_metadata = texelFetch(fp_t_light_tiles, v3_cluster_position , 0).rgb;
101
-
102
- // read light data
103
- for(uint i=0u; i < cluster_metadata.y; i++){
104
- uint lookup_index = cluster_metadata.x + i;
105
-
106
- uint light_address = texelFetch(fp_t_light_lookup, address_to_data_texture_coordinates(lookup_index), 0 ).r;
107
-
108
- vec4 light_data_0 = texelFetch(fp_t_light_data, address_to_data_texture_coordinates(light_address), 0);
109
- vec4 light_data_1 = texelFetch(fp_t_light_data, address_to_data_texture_coordinates(light_address+1u), 0);
110
-
111
- vec3 light_position = light_data_0.xyz;
112
- float light_radius = light_data_0.w;
113
-
114
- vec3 light_color = light_data_1.xyz;
115
- float light_intensity = light_data_1.w;
116
-
117
- PointLight pointlight;
30
+ let result = preamble + base;
118
31
 
119
- pointlight.position = light_position;
120
- pointlight.distance = light_radius;
121
- pointlight.color = light_color*light_intensity;
122
- pointlight.decay = 1.0;
32
+ result = insert_after(result, '#include <lights_pars_begin>', FP_SHADER_CHUNK_DECODE_PARS);
123
33
 
124
- fp_getPointDirectLightIrradiance( pointlight, directLight );
125
- RE_Direct( directLight, geometry, material, reflectedLight );
126
- }
127
-
128
- `);
34
+ result = insert_after_or_replace(
35
+ result,
36
+ three_chunk_accummulation_mark,
37
+ FP_INJECTION_POINT_ACCUMULATION,
38
+ accumulation_pars
39
+ );
129
40
 
130
- return v2;
41
+ return result;
131
42
  }
@@ -0,0 +1,35 @@
1
+ import { insert_after } from "../../../../../core/primitives/strings/insert_after.js";
2
+ import { insert_after_or_replace } from "../../../../../core/primitives/strings/insert_after_or_replace.js";
3
+ import { FP_INJECTION_POINT_ACCUMULATION } from "./FP_INJECTION_POINT_ACCUMULATION.js";
4
+ import { FP_SHADER_CHUNK_ACCUMULATION } from "./FP_SHADER_CHUNK_ACCUMULATION.js";
5
+ import { FP_SHADER_CHUNK_PREAMBLE } from "./FP_SHADER_CHUNK_PREAMBLE.js";
6
+ import { FP_SHADER_CHUNK_DECODE_PARS } from "./FP_SHADER_CHUNK_DECODE_PARS.js";
7
+
8
+ const accumulation_pars = `
9
+ vec3 fp_normalized_screen_position = ((gl_Position.xyz / gl_Position.w)+vec3(1.0))*0.5;
10
+ vec3 clip_v = vec3( vec2(fp_normalized_screen_position.x, fp_normalized_screen_position.y), convert_depth_to_linear(fp_normalized_screen_position.z));
11
+ ${FP_SHADER_CHUNK_ACCUMULATION}
12
+ `;
13
+
14
+ const three_chunk_accummulation_mark = '#include <lights_fragment_end>';
15
+
16
+ /**
17
+ *
18
+ * @param {string} base
19
+ * @returns {string}
20
+ */
21
+ export function fp_build_vertex_lighting_shared(base) {
22
+
23
+ let result = FP_SHADER_CHUNK_PREAMBLE + base;
24
+
25
+ result = insert_after(result, '#include <lights_pars_begin>', FP_SHADER_CHUNK_DECODE_PARS);
26
+
27
+ result = insert_after_or_replace(
28
+ result,
29
+ three_chunk_accummulation_mark,
30
+ FP_INJECTION_POINT_ACCUMULATION,
31
+ accumulation_pars
32
+ );
33
+
34
+ return result;
35
+ }
@@ -1,4 +1,4 @@
1
- import { insert_after } from "./insert_after.js";
1
+ import { insert_after } from "../../../../../core/primitives/strings/insert_after.js";
2
2
 
3
3
  /**
4
4
  *
@@ -12,13 +12,12 @@ export function fp_build_vertex_shader(base) {
12
12
  #define attribute in
13
13
  #define varying out
14
14
  #define texture2D texture
15
+
16
+ varying vec3 v_world_position;
15
17
  ` + base;
16
18
 
17
- const v0 = insert_after(a, '#include <clipping_planes_pars_vertex>', `
18
- varying vec3 v_world_position;
19
- `);
20
19
 
21
- const v1 = insert_after(v0, '#include <worldpos_vertex>', `
20
+ const v1 = insert_after(a, '#include <worldpos_vertex>', `
22
21
  #if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )
23
22
  // worldPosition comes from 'worldpos_vertex' shader chunk
24
23
  v_world_position = worldPosition.xyz;
@@ -4,6 +4,7 @@ import { GLSL3, Vector2 } from "three";
4
4
  import { isLitMaterial } from "./isLitMaterial.js";
5
5
  import { fp_build_fragment_shader } from "../materials/fp_build_fragment_shader.js";
6
6
  import { fp_build_vertex_shader } from "../materials/fp_build_vertex_shader.js";
7
+ import { fp_build_vertex_lighting_shared } from "../materials/fp_build_vertex_lighting_shared.js";
7
8
 
8
9
  export class MaterialTransformer extends AbstractMaterialTransformer {
9
10
 
@@ -39,7 +40,7 @@ export class MaterialTransformer extends AbstractMaterialTransformer {
39
40
  type: 'f',
40
41
  value: 0
41
42
  },
42
- resolution: {
43
+ fp_resolution: {
43
44
  type: 'v2',
44
45
  value: resolution
45
46
  }
@@ -50,8 +51,14 @@ export class MaterialTransformer extends AbstractMaterialTransformer {
50
51
 
51
52
  shader.glslVersion = GLSL3;
52
53
 
53
- shader.vertexShader = fp_build_vertex_shader(shader.vertexShader);
54
- shader.fragmentShader = fp_build_fragment_shader(shader.fragmentShader);
54
+ if (shader.defines.LIGHTING_VERTEX_ONLY === true) {
55
+ // Lambertial vertex-space lighting
56
+ shader.vertexShader = fp_build_vertex_lighting_shared(shader.vertexShader);
57
+ } else {
58
+
59
+ shader.vertexShader = fp_build_vertex_shader(shader.vertexShader);
60
+ shader.fragmentShader = fp_build_fragment_shader(shader.fragmentShader);
61
+ }
55
62
  };
56
63
  }
57
64