@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.
- package/core/binary/BitSet.js +151 -167
- package/core/binary/BitSet.spec.js +99 -1
- package/core/binary/ValidatingBitSetWrapper.js +81 -0
- package/core/bvh2/aabb3/AABB3.js +3 -10
- package/core/bvh2/binary/IndexedBinaryBVH.js +1 -1
- package/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
- package/core/bvh2/traversal/__detailed_box_volume_intersection.js +22 -5
- package/core/cache/Cache.d.ts +4 -2
- package/core/cache/Cache.js +5 -2
- package/core/collection/HashMap.d.ts +9 -2
- package/core/collection/HashSet.d.ts +7 -2
- package/core/collection/HashSet.js +7 -2
- package/core/collection/array/binarySearchHighIndex.js +1 -1
- package/core/collection/array/copyArray.js +2 -2
- package/core/collection/array/typed/typed_array_copy.js +1 -1
- package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +3 -3
- package/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
- package/core/geom/3d/shape/AbstractShape3D.js +37 -1
- package/core/geom/3d/shape/TransformedShape3D.js +121 -10
- package/core/geom/3d/shape/TransformedShape3D.spec.js +33 -0
- package/core/geom/3d/shape/UnionShape3D.js +255 -0
- package/core/geom/3d/shape/UnitCubeShape3D.js +88 -0
- package/core/geom/3d/shape/UnitCubeShape3D.spec.js +42 -0
- package/core/geom/3d/shape/UnitSphereShape3D.js +39 -0
- package/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +48 -0
- package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
- package/core/geom/random/randomPointInSphere.js +3 -2
- package/core/json/resolvePathByArray.js +2 -2
- package/core/model/ObservedBoolean.d.ts +2 -0
- package/core/parser/simple/Token.d.ts +13 -0
- package/core/parser/simple/Token.js +61 -27
- package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
- package/core/primitives/strings/insert_after_or_replace.js +27 -0
- package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
- package/editor/tools/FoliagePaintTool.js +4 -4
- package/editor/view/ecs/EntityEditor.js +2 -2
- package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
- package/engine/EngineHarness.js +1 -0
- package/engine/animation/AnimationUtils.js +5 -5
- package/engine/asset/loaders/GLTFAssetLoader.js +52 -1
- package/engine/asset/loaders/image/ImageDecoderWorker.js +4 -3
- package/engine/asset/loaders/image/ImageRGBADataAsset.js +3 -2
- package/engine/asset/loaders/image/ImageRGBADataLoader.js +3 -3
- package/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -1
- package/engine/asset/loaders/image/png/PNG.js +113 -6
- package/engine/asset/loaders/image/png/PNGReader.js +5 -0
- package/engine/asset/loaders/material/bitmap2sampler_gl.js +1 -1
- package/engine/asset/loaders/material/computeImageBitmapEquality.js +6 -1
- package/engine/asset/loaders/material/computeTextureEquality.js +40 -49
- package/engine/ecs/EntityBuilder.js +25 -5
- package/engine/ecs/EntityComponentDataset.js +1 -1
- package/engine/ecs/attachment/AttachmentBinding.js +8 -0
- package/engine/ecs/attachment/AttachmentSystem.js +4 -0
- package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
- package/engine/ecs/components/Tag.js +27 -6
- package/engine/ecs/foliage/InstancedFoliage.js +277 -266
- package/engine/ecs/foliage/ecs/Foliage2System.js +7 -7
- package/engine/ecs/foliage/ecs/InstancedMeshComponent.js +37 -0
- package/engine/ecs/foliage/ecs/{Foliage2.js → InstancedMeshLayer.js} +3 -45
- package/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +6 -5
- package/engine/ecs/foliage/ecs/InstancedMeshUtils.js +7 -6
- package/engine/ecs/fow/FogOfWar.js +4 -0
- package/engine/ecs/fow/FogOfWarSystem.js +2 -0
- package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +2 -0
- package/engine/ecs/storage/binary/BinarySerializationRegistry.js +1 -1
- package/engine/ecs/system/AbstractContextSystem.js +1 -1
- package/engine/ecs/systems/TagSystem.js +17 -0
- package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +12 -16
- package/engine/ecs/transform/Transform.js +19 -6
- package/engine/graphics/GraphicsEngine.js +11 -6
- package/engine/graphics/composit/CompositLayer.js +17 -4
- package/engine/graphics/composit/CompositingStages.js +8 -0
- package/engine/graphics/composit/LayerCompositer.js +35 -6
- package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +11 -7
- package/engine/graphics/ecs/light/Light.js +2 -0
- package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
- package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
- package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
- package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +14 -72
- package/engine/graphics/geometry/instancing/rewriteMaterial.js +70 -0
- package/engine/graphics/material/manager/MaterialManager.js +2 -1
- package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +6 -4
- package/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +0 -2
- package/engine/graphics/particles/ParticleEmitterLibrary.js +3 -0
- package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
- package/engine/graphics/particles/particular/engine/ParticularEngine.js +8 -2
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +14 -25
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +90 -2
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +7 -7
- package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +15 -12
- package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -51
- package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +81 -48
- package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
- package/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +141 -0
- package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +148 -54
- package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
- package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +544 -164
- package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +15 -10
- package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
- package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
- package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
- package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
- package/engine/graphics/render/forward_plus/materials/FPlusDebugMaterial.js +3 -3
- package/engine/graphics/render/forward_plus/materials/ForwardPlusThreeMaterial.js +1 -1
- package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
- package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
- package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
- package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
- package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +588 -53
- package/engine/graphics/render/forward_plus/prototypeLightManager.js +31 -6
- package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +10 -9
- package/engine/graphics/shaders/TerrainShader.js +4 -5
- package/engine/graphics/shadows/ShadowMapRenderer.js +8 -2
- package/engine/graphics/texture/atlas/ManagedTextureAtlas.js +12 -1
- package/engine/graphics/texture/sampler/Sampler2D.js +3 -1
- package/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +1 -1
- package/engine/graphics/texture/sampler/copy_Sampler2D_channel_data.js +66 -0
- package/engine/graphics/util/composeMatrix4.js +33 -23
- package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
- package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
- package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
- package/engine/navigation/ecs/components/Path.js +0 -5
- package/package.json +1 -1
- package/view/minimap/gl/MinimapWorldGL.js +12 -5
- 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
|
-
|
|
164
|
-
|
|
165
|
-
uniforms.scale.value =
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 /
|
|
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
|
-
|
|
122
|
+
fp_resolution: {
|
|
123
123
|
type: 'v2',
|
|
124
124
|
value: new Vector2()
|
|
125
125
|
},
|
|
@@ -1,4 +1,25 @@
|
|
|
1
|
-
import { insert_after } from "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
-
|
|
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
|
|
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 "
|
|
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(
|
|
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
|
-
|
|
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.
|
|
54
|
-
|
|
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
|
|