@woosh/meep-engine 2.33.3 → 2.33.8
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/bvh2/LeafNode.js +6 -1
- package/core/bvh2/aabb3/AABB3.js +21 -1
- package/core/bvh2/aabb3/aabb3_intersects_frustum.js +10 -2
- package/core/collection/RingBuffer.js +40 -10
- package/core/collection/array/copyArray.js +2 -2
- package/core/collection/array/typed/typed_array_copy.js +2 -2
- package/core/collection/set/compute_set_difference.js +32 -0
- package/core/collection/set/compute_set_intersection.js +22 -0
- package/core/collection/set/set_remove.js +15 -0
- package/core/collection/table/RowFirstTableSpec.js +8 -0
- package/core/color/Color.js +1 -0
- package/core/color/ColorUtils.js +12 -3
- package/core/geom/3d/aabb/aabb3_compute_projected_area.js +6 -4
- package/core/geom/3d/aabb/aabb3_estimate_projected_area2.js +59 -0
- package/core/geom/3d/aabb/aabb3_from_min_max.js +15 -0
- package/core/geom/3d/aabb/aabb3_matrix4_project.js +33 -0
- package/core/geom/3d/aabb/aabb3_matrix4_project.spec.js +41 -0
- package/core/geom/3d/aabb/aabb3_matrix4_project_by_corners.js +96 -0
- package/{engine/graphics/micron/render/v1 → core/geom/3d}/apply_mat4_transform_to_v3_array.js +0 -0
- package/{engine/graphics/micron/build/bounds → core/geom/3d}/compute_bounding_cone_of_2_cones.js +3 -3
- package/{engine/graphics/micron/build/bounds → core/geom/3d}/compute_bounding_cone_of_2_cones.spec.js +1 -1
- package/{engine/graphics/micron/build/bounds → core/geom/3d}/compute_bounding_sphere_of_2_spheres.js +3 -3
- package/{engine/graphics/micron/util → core/geom/3d}/encode_unit3_hemioct.js +0 -0
- package/core/geom/3d/frustum/array_normalize_plane.js +25 -0
- package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +60 -0
- package/{engine/graphics/micron/util → core/geom/3d}/unit_hemioct.spec.js +1 -1
- package/{engine/graphics/micron/build → core}/graph/MultiNode.js +0 -0
- package/{engine/graphics/micron/build → core}/graph/SquareMatrix.js +2 -2
- package/{engine/graphics/micron/build → core}/graph/SquareMatrix.spec.js +1 -1
- package/{engine/graphics/micron/build → core}/graph/WeightedEdge.js +1 -1
- package/{engine/graphics/micron/build → core}/graph/build_face_graph_from_mesh.js +2 -2
- package/{engine/graphics/micron/build/clustering → core/graph}/cluster_mesh_metis.js +2 -6
- package/{engine/graphics/micron/build → core}/graph/coarsen_graph.js +1 -1
- package/{engine/graphics/micron/build → core}/graph/coarsen_graph.spec.js +1 -1
- package/{engine/graphics/micron/build → core}/graph/eigen/eigen.js +0 -0
- package/{engine/graphics/micron/build → core}/graph/eigen/eigen.spec.js +1 -1
- package/{engine/graphics/micron/build/hierarchy → core/graph/eigen}/eigen_values_find_spectral_gap.js +0 -0
- package/{engine/graphics/micron/build → core}/graph/graph_adjacency_matrix.js +0 -0
- package/{engine/graphics/micron/build → core}/graph/graph_compute_disconnected_clusters.js +0 -0
- package/{engine/graphics/micron/build → core}/graph/graph_degree_matrix.js +0 -0
- package/{engine/graphics/micron/build → core}/graph/graph_k_means_cluster.js +5 -5
- package/{engine/graphics/micron/build → core}/graph/graph_laplacian_matrix.js +1 -1
- package/{engine/graphics/micron/build → core}/graph/metis/metis.js +2 -2
- package/{engine/graphics/micron/build → core}/graph/metis/metis_options.js +0 -0
- package/{engine/graphics/micron/build → core}/graph/mn_graph_collapse_weighted_edge.js +0 -0
- package/core/process/undo/ActionProcessor.d.ts +2 -0
- package/core/process/undo/ActionProcessor.js +59 -1
- package/core/process/undo/ActionProcessor.spec.js +59 -0
- package/core/process/undo/Mark.js +2 -1
- package/engine/Engine.d.ts +2 -0
- package/engine/EngineHarness.js +4 -4
- package/engine/asset/loaders/material/bitmap2sampler_gl.js +19 -0
- package/engine/asset/loaders/material/computeImageBitmapEquality.js +7 -19
- package/engine/ecs/transform/Transform.js +2 -1
- package/engine/graphics/GraphicsEngine.js +9 -116
- package/engine/graphics/ecs/mesh/updateNodeByTransformAndBBB.js +22 -37
- package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +155 -0
- package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +68 -0
- package/engine/graphics/ecs/mesh-v2/prototypeShadedGeometry.js +31 -0
- package/engine/graphics/filter/FlipArrayInPlace.js +25 -0
- package/engine/graphics/filter/FlipArrayViaCanvas.js +13 -0
- package/engine/graphics/filter/ImageFilter.js +20 -51
- package/engine/graphics/{micron → geometry}/aabb3_to_buffer_geometry.js +0 -0
- package/engine/graphics/{micron/build → geometry/buffered}/compute_buffer_geometry_byte_size.js +0 -0
- package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +25 -16
- package/engine/graphics/material/SplatMaterial.js +4 -97
- package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +2 -6
- package/engine/graphics/micron/build/clustering/build_clustering_2.js +2 -2
- package/engine/graphics/micron/build/clustering/build_leaf_patches_metis.js +1 -1
- package/engine/graphics/micron/build/fill_patch_geometry_data.js +2 -0
- package/engine/graphics/micron/build/hierarchy/buildAbstractPatchHierarchy.js +3 -3
- package/engine/graphics/micron/build/hierarchy/build_intermediate_patch_topology.js +0 -72
- package/engine/graphics/micron/build/hierarchy/build_merge_graph.js +2 -2
- package/engine/graphics/micron/build/hierarchy/computePatchMergeScore.js +3 -3
- package/engine/graphics/micron/build/hierarchy/merge_patches.js +6 -3
- package/engine/graphics/micron/build/hierarchy/metis_cluster_clusters.js +1 -1
- package/engine/graphics/micron/build/hierarchy/optimize_graph_partitioning_balance.js +1 -1
- package/engine/graphics/micron/build/hierarchy/patch_combine.js +2 -2
- package/engine/graphics/micron/build/hierarchy/qvdr_build_simplified_clusters.js +2 -1
- package/engine/graphics/micron/format/MicronGeometryBufferAttributeSpec.js +1 -1
- package/engine/graphics/micron/format/MicronGeometryPatch.js +11 -3
- package/engine/graphics/micron/format/MicronVertexDataSpec.js +25 -3
- package/engine/graphics/micron/prototypeVirtualGeometry.js +4 -4
- package/engine/graphics/micron/render/VirtualGeometryBuilder.js +28 -26
- package/engine/graphics/micron/render/culling/{PathCullingSystem.js → PatchCullingSystem.js} +1 -1
- package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +2 -4
- package/engine/graphics/micron/render/refinement/ActivePatchList.js +40 -80
- package/engine/graphics/micron/render/refinement/ActivePatchRecord.js +4 -2
- package/engine/graphics/micron/render/refinement/RefinementSpec.js +98 -0
- package/engine/graphics/micron/render/v1/MaterialVertexSpec.js +21 -0
- package/engine/graphics/micron/render/v1/VGThreeRenderer.js +12 -9
- package/engine/graphics/micron/render/v1/getTransformedPositionsCached.js +1 -1
- package/engine/graphics/render/buffer/buffers/ColorAndDepthFrameBuffer.js +5 -3
- package/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +8 -10
- package/engine/graphics/render/forward_plus/LightManager.js +5 -7
- package/engine/graphics/render/forward_plus/data/NumericType.js +9 -0
- package/engine/graphics/render/forward_plus/{TextureBackedMemoryRegion.js → data/TextureBackedMemoryRegion.js} +11 -190
- package/engine/graphics/render/forward_plus/data/channelCountToThreIntegerTextureType.js +16 -0
- package/engine/graphics/render/forward_plus/data/computeDataType.js +36 -0
- package/engine/graphics/render/forward_plus/data/computeThreeTextureFormat.js +18 -0
- package/engine/graphics/render/forward_plus/data/computeThreeTextureInternalFormatFromDataType.js +63 -0
- package/engine/graphics/render/forward_plus/data/computeThreeTextureTypeFromDataType.js +41 -0
- package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +1 -1
- package/engine/graphics/render/forward_plus/prototypeLightManager.js +1 -1
- package/engine/graphics/render/visibility/hiz/buffer/HierarchicalZBuffer.js +198 -0
- package/engine/graphics/render/visibility/hiz/buffer/ReductionShader.js +51 -0
- package/engine/graphics/render/visibility/hiz/buildCanvasViewFromTexture.js +179 -0
- package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +435 -0
- package/engine/graphics/render/visibility/hiz/query/BatchOcclusionQuery.js +174 -0
- package/engine/graphics/render/visibility/hiz/query/QueryShader.js +173 -0
- package/engine/graphics/shadows/ShadowMapRenderer.js +12 -2
- package/engine/graphics/texture/cubemap/buildCubeURLs.js +13 -0
- package/engine/graphics/texture/cubemap/load_environment_map.d.ts +8 -0
- package/engine/graphics/texture/cubemap/load_environment_map.js +163 -0
- package/engine/graphics/texture/sampler/Sampler2D.js +18 -62
- package/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +3 -2
- package/engine/graphics/texture/sampler/debug/paintSamplerOnHTML.js +3 -2
- package/engine/graphics/texture/sampler/differenceSampler.js +31 -0
- package/engine/graphics/texture/sampler/typedArrayConstructorByInstance.js +25 -0
- package/engine/graphics/texture/sampler/util/drawSamplerHTML.js +3 -2
- package/engine/graphics/texture/virtual/v2/ShaderUsage.js +6 -5
- package/engine/graphics/texture/virtual/v2/prototype.js +16 -6
- package/engine/plugin/EnginePluginManager.d.ts +9 -0
- package/engine/reference/v2/Reference.d.ts +7 -0
- package/package.json +1 -1
- package/view/minimap/gl/MinimapMarkersGL.js +2 -2
- package/engine/graphics/micron/build/clustering/cluster_mesh_vertices.js +0 -3
- package/engine/graphics/micron/render/RefinementSpec.js +0 -159
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ClampToEdgeWrapping,
|
|
3
|
+
DataTexture,
|
|
4
|
+
FloatType,
|
|
5
|
+
NearestFilter,
|
|
6
|
+
RedFormat,
|
|
7
|
+
RGBAFormat,
|
|
8
|
+
UnsignedByteType,
|
|
9
|
+
WebGLRenderTarget
|
|
10
|
+
} from "three";
|
|
11
|
+
import { array_copy } from "../../../../../../core/collection/array/copyArray.js";
|
|
12
|
+
import { makeQueryShader } from "./QueryShader.js";
|
|
13
|
+
import { renderScreenSpace } from "../../../utils/renderScreenSpace.js";
|
|
14
|
+
import { assert } from "../../../../../../core/assert.js";
|
|
15
|
+
import { max2 } from "../../../../../../core/math/max2.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Query element contains following data:
|
|
19
|
+
* [AABB( x0,y0,z0, x1,y1,z1 ) :: Float32], [MATRIX4( ... x16 ) :: Float32]
|
|
20
|
+
* @type {number}
|
|
21
|
+
* @readonly
|
|
22
|
+
*/
|
|
23
|
+
const QUERY_ELEMENT_SIZE = 22;
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
export class BatchOcclusionQuery {
|
|
27
|
+
constructor() {
|
|
28
|
+
const input_texture = new DataTexture(new Float32Array(1), 1, 1);
|
|
29
|
+
|
|
30
|
+
input_texture.format = RedFormat;
|
|
31
|
+
input_texture.type = FloatType;
|
|
32
|
+
input_texture.internalFormat = 'R32F';
|
|
33
|
+
input_texture.generateMipmaps = false;
|
|
34
|
+
input_texture.wrapT = ClampToEdgeWrapping;
|
|
35
|
+
input_texture.wrapS = ClampToEdgeWrapping;
|
|
36
|
+
input_texture.minFilter = NearestFilter;
|
|
37
|
+
input_texture.magFilter = NearestFilter;
|
|
38
|
+
|
|
39
|
+
this.__input_data_texture = input_texture;
|
|
40
|
+
|
|
41
|
+
this.__output_data_texture = new WebGLRenderTarget(1, 1, {
|
|
42
|
+
minFilter: NearestFilter,
|
|
43
|
+
magFilter: NearestFilter,
|
|
44
|
+
format: RGBAFormat,
|
|
45
|
+
type: UnsignedByteType,
|
|
46
|
+
// internalFormat: 'R8',
|
|
47
|
+
depthBuffer: false,
|
|
48
|
+
stencilBuffer: false,
|
|
49
|
+
wrapS: ClampToEdgeWrapping,
|
|
50
|
+
wrapT: ClampToEdgeWrapping,
|
|
51
|
+
generateMipmaps: false
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
this.__size = -1;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
*
|
|
58
|
+
* @type {ShaderMaterial}
|
|
59
|
+
* @private
|
|
60
|
+
*/
|
|
61
|
+
this.__material = makeQueryShader();
|
|
62
|
+
this.__material.defines.ITEM_SIZE = QUERY_ELEMENT_SIZE;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
* @return {THREE.Texture}
|
|
68
|
+
*/
|
|
69
|
+
getResultTexture() {
|
|
70
|
+
return this.__output_data_texture.texture;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
*
|
|
75
|
+
* @return {number}
|
|
76
|
+
*/
|
|
77
|
+
getSize() {
|
|
78
|
+
return this.__size;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
* @param {number} count
|
|
84
|
+
*/
|
|
85
|
+
setSize(count) {
|
|
86
|
+
if (this.__size === count) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
this.__size = count;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* How many query elements are packed per texture row
|
|
94
|
+
* @type {number}
|
|
95
|
+
* @readonly
|
|
96
|
+
*/
|
|
97
|
+
const TEXTURE_COLUMN_COUNT = max2(
|
|
98
|
+
Math.ceil(Math.sqrt(count)),
|
|
99
|
+
4
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const input_texture = this.__input_data_texture;
|
|
103
|
+
|
|
104
|
+
input_texture.dispose();
|
|
105
|
+
|
|
106
|
+
const row_count = Math.ceil(count / TEXTURE_COLUMN_COUNT);
|
|
107
|
+
|
|
108
|
+
const input_image = input_texture.image;
|
|
109
|
+
|
|
110
|
+
input_image.width = TEXTURE_COLUMN_COUNT * QUERY_ELEMENT_SIZE;
|
|
111
|
+
input_image.height = row_count;
|
|
112
|
+
input_image.data = new Float32Array(input_image.width * input_image.height);
|
|
113
|
+
|
|
114
|
+
this.__output_data_texture.setSize(TEXTURE_COLUMN_COUNT, row_count);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
*
|
|
119
|
+
* @param {number} index
|
|
120
|
+
* @param {number[]|Float32Array} aabb bounding box of the queries region
|
|
121
|
+
* @param {number[]} transform 4x4 transform matrix
|
|
122
|
+
*/
|
|
123
|
+
setElement(index, aabb, transform) {
|
|
124
|
+
assert.lessThan(index, this.__size, 'index overflow');
|
|
125
|
+
assert.isNonNegativeInteger(index, 'index');
|
|
126
|
+
|
|
127
|
+
// write query element
|
|
128
|
+
const address = index * QUERY_ELEMENT_SIZE;
|
|
129
|
+
|
|
130
|
+
const input_texture = this.__input_data_texture;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
*
|
|
134
|
+
* @type {Uint8ClampedArray}
|
|
135
|
+
*/
|
|
136
|
+
const data = input_texture.image.data;
|
|
137
|
+
|
|
138
|
+
array_copy(aabb, 0, data, address, 6);
|
|
139
|
+
array_copy(transform, 0, data, address + 6, 16);
|
|
140
|
+
|
|
141
|
+
input_texture.needsUpdate = true;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
*
|
|
146
|
+
* @param {THREE.WebGLRenderer} renderer
|
|
147
|
+
* @param {Uint8Array} destination
|
|
148
|
+
*/
|
|
149
|
+
readResultTexture(renderer, destination) {
|
|
150
|
+
const rt = this.__output_data_texture;
|
|
151
|
+
|
|
152
|
+
renderer.readRenderTargetPixels(rt, 0, 0, rt.width, rt.height, destination);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
*
|
|
157
|
+
* @param {THREE.WebGLRenderer} renderer
|
|
158
|
+
* @param {HierarchicalZBuffer} hiz_buffer
|
|
159
|
+
*/
|
|
160
|
+
execute(renderer, hiz_buffer) {
|
|
161
|
+
const uniforms = this.__material.uniforms;
|
|
162
|
+
|
|
163
|
+
uniforms.utDepth.value = hiz_buffer.getTexture();
|
|
164
|
+
uniforms.utInput.value = this.__input_data_texture;
|
|
165
|
+
uniforms.uDepthMipLimits.value.set(hiz_buffer.mip_limits.x, hiz_buffer.mip_limits.y);
|
|
166
|
+
|
|
167
|
+
const __rt = renderer.getRenderTarget();
|
|
168
|
+
renderer.setRenderTarget(this.__output_data_texture);
|
|
169
|
+
|
|
170
|
+
renderScreenSpace(renderer, this.__material);
|
|
171
|
+
|
|
172
|
+
renderer.setRenderTarget(__rt);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { GLSL3, ShaderMaterial, Vector2 } from "three";
|
|
2
|
+
|
|
3
|
+
export function makeQueryShader() {
|
|
4
|
+
return new ShaderMaterial({
|
|
5
|
+
vertexShader: `
|
|
6
|
+
void main() {
|
|
7
|
+
gl_Position = vec4( position, 1.0 );
|
|
8
|
+
}
|
|
9
|
+
`,
|
|
10
|
+
fragmentShader: `
|
|
11
|
+
uniform sampler2D utDepth;
|
|
12
|
+
uniform sampler2D utInput;
|
|
13
|
+
|
|
14
|
+
uniform vec2 uDepthMipLimits;
|
|
15
|
+
|
|
16
|
+
out highp vec4 out_value;
|
|
17
|
+
|
|
18
|
+
float reduce(float a, float b, float c, float d){
|
|
19
|
+
return max( a, max( b, max( c, d ) ) );
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
vec3 read_input_v3(ivec2 start){
|
|
23
|
+
float x = texelFetch(utInput, start, 0).x;
|
|
24
|
+
float y = texelFetch(utInput, start + ivec2(1,0), 0).x;
|
|
25
|
+
float z = texelFetch(utInput, start + ivec2(2,0), 0).x;
|
|
26
|
+
|
|
27
|
+
return vec3(x,y,z);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
vec4 read_input_v4(ivec2 start){
|
|
31
|
+
return vec4(
|
|
32
|
+
read_input_v3(start),
|
|
33
|
+
texelFetch(utInput, start + ivec2(3,0) , 0).x
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
mat4 read_input_m4(ivec2 start){
|
|
38
|
+
return mat4(
|
|
39
|
+
read_input_v4(start),
|
|
40
|
+
read_input_v4(start + ivec2(4,0)),
|
|
41
|
+
read_input_v4(start + ivec2(8,0)),
|
|
42
|
+
read_input_v4(start + ivec2(12,0))
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
vec3 project_vec3(vec3 value, mat4 transform){
|
|
47
|
+
vec4 v1 = transform * vec4( value, 1.0 );
|
|
48
|
+
v1.xyz /= abs(v1.w);
|
|
49
|
+
|
|
50
|
+
return v1.xyz;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
void project_aabb(out vec3 pb_min, out vec3 pb_max, in vec3 bb_min, in vec3 bb_max, in mat4 transform){
|
|
54
|
+
vec3 p0 = project_vec3( bb_min, transform );
|
|
55
|
+
vec3 p1 = project_vec3( vec3(bb_min.xy, bb_max.z), transform );
|
|
56
|
+
|
|
57
|
+
pb_min = min( p0, p1 );
|
|
58
|
+
pb_max = max( p0, p1 );
|
|
59
|
+
|
|
60
|
+
vec3 p2 = project_vec3( vec3(bb_min.x, bb_max.y, bb_min.z), transform );
|
|
61
|
+
|
|
62
|
+
pb_min = min( pb_min, p2 );
|
|
63
|
+
pb_max = max( pb_max, p2 );
|
|
64
|
+
|
|
65
|
+
vec3 p3 = project_vec3( vec3( bb_min.x, bb_max.y, bb_max.z ), transform );
|
|
66
|
+
|
|
67
|
+
pb_min = min( pb_min, p3 );
|
|
68
|
+
pb_max = max( pb_max, p3 );
|
|
69
|
+
|
|
70
|
+
vec3 p4 = project_vec3( vec3( bb_max.x, bb_min.y, bb_min.z), transform );
|
|
71
|
+
|
|
72
|
+
pb_min = min( pb_min, p4 );
|
|
73
|
+
pb_max = max( pb_max, p4 );
|
|
74
|
+
|
|
75
|
+
vec3 p5 = project_vec3( vec3( bb_max.x, bb_min.y, bb_max.z ), transform );
|
|
76
|
+
|
|
77
|
+
pb_min = min( pb_min, p5 );
|
|
78
|
+
pb_max = max( pb_max, p5 );
|
|
79
|
+
|
|
80
|
+
vec3 p6 = project_vec3( vec3( bb_max.x, bb_max.y, bb_min.z ), transform );
|
|
81
|
+
|
|
82
|
+
pb_min = min( pb_min, p6 );
|
|
83
|
+
pb_max = max( pb_max, p6 );
|
|
84
|
+
|
|
85
|
+
vec3 p7 = project_vec3( vec3( bb_max.x, bb_max.y, bb_max.z ), transform );
|
|
86
|
+
|
|
87
|
+
pb_min = min( pb_min, p7 );
|
|
88
|
+
pb_max = max( pb_max, p7 );
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
int compute_mip_level_for_dimension(float mip_limit, float ndc_extents){
|
|
92
|
+
return max(0, int( floor( mip_limit - log2( 1.0 / ndc_extents) ) ) );
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
float query_depth_from_screen_space_bb(in vec3 pb_min, in vec3 pb_max){
|
|
96
|
+
vec3 n_min = clamp( (pb_min+1.0)*0.5, 0.0, 1.0);
|
|
97
|
+
vec3 n_max = clamp( (pb_max+1.0)*0.5, 0.0, 1.0);
|
|
98
|
+
|
|
99
|
+
float bb_width = ( n_max.x - n_min.x ) * 0.5;
|
|
100
|
+
float bb_height = ( n_max.y - n_min.y ) * 0.5 ;
|
|
101
|
+
|
|
102
|
+
// pick coarsest z-buffer mip to test 4x4 pixels of the bounding box against
|
|
103
|
+
int mip_level_x = compute_mip_level_for_dimension( uDepthMipLimits.x, bb_width );
|
|
104
|
+
int mip_level_y = compute_mip_level_for_dimension( uDepthMipLimits.y, bb_height );
|
|
105
|
+
|
|
106
|
+
// figure out which mip level to use
|
|
107
|
+
int mip_to_use = max(mip_level_x, mip_level_y);
|
|
108
|
+
|
|
109
|
+
// sample 4 pixels that cover AABB
|
|
110
|
+
float n0 = textureLod(utDepth, n_min.xy, float(mip_to_use)).x;
|
|
111
|
+
float n1 = textureLod(utDepth, vec2(n_min.x, n_max.y), float(mip_to_use)).x;
|
|
112
|
+
float n2 = textureLod(utDepth, vec2(n_max.y, n_min.y), float(mip_to_use)).x;
|
|
113
|
+
float n3 = textureLod(utDepth, n_max.xy, float(mip_to_use)).x;
|
|
114
|
+
|
|
115
|
+
float n = max(n0, max(n1, max(n2,n3)));
|
|
116
|
+
|
|
117
|
+
float depth_delta = n - n_min.z;
|
|
118
|
+
|
|
119
|
+
return depth_delta;
|
|
120
|
+
// return float( uDepthMipLimits.x );
|
|
121
|
+
// return float( depth_delta*255.0 );
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
uint query_bounds(vec3 bb_min, vec3 bb_max, mat4 transform){
|
|
125
|
+
vec3 pb_min;
|
|
126
|
+
vec3 pb_max;
|
|
127
|
+
|
|
128
|
+
// project bounds to screen space
|
|
129
|
+
project_aabb(pb_min, pb_max, bb_min, bb_max, transform);
|
|
130
|
+
|
|
131
|
+
if(
|
|
132
|
+
pb_max.x < -1.0 || pb_max.y < -1.0 || pb_max.z < -1.0
|
|
133
|
+
|| pb_min.x > 1.0 || pb_min.y > 1.0 || pb_min.z > 1.0
|
|
134
|
+
){
|
|
135
|
+
// outside of view frustum
|
|
136
|
+
return 0u;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
float n = query_depth_from_screen_space_bb( pb_min, pb_max );
|
|
140
|
+
|
|
141
|
+
if(n < 0.0){
|
|
142
|
+
return 0u;
|
|
143
|
+
}else{
|
|
144
|
+
return 255u;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
void main() {
|
|
149
|
+
ivec2 input_offset = ivec2( int(gl_FragCoord.x) * ITEM_SIZE, int(gl_FragCoord.y) );
|
|
150
|
+
|
|
151
|
+
vec3 bb_min = read_input_v3(input_offset);
|
|
152
|
+
vec3 bb_max = read_input_v3(input_offset + ivec2(3,0));
|
|
153
|
+
mat4 transform = read_input_m4(input_offset + ivec2(6,0));
|
|
154
|
+
|
|
155
|
+
out_value = vec4( float( query_bounds(bb_min, bb_max, transform) ) / 255.0, 0.0, 0.0, 1.0 );
|
|
156
|
+
}
|
|
157
|
+
`,
|
|
158
|
+
depthTest: false,
|
|
159
|
+
depthWrite: false,
|
|
160
|
+
uniforms: {
|
|
161
|
+
utDepth: {
|
|
162
|
+
value: null
|
|
163
|
+
},
|
|
164
|
+
utInput: {
|
|
165
|
+
value: null
|
|
166
|
+
},
|
|
167
|
+
uDepthMipLimits: {
|
|
168
|
+
value: new Vector2(1, 1)
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
glslVersion: GLSL3
|
|
172
|
+
});
|
|
173
|
+
}
|
|
@@ -64,7 +64,6 @@ export class ShadowMapRenderer {
|
|
|
64
64
|
this.__renderer = renderer;
|
|
65
65
|
|
|
66
66
|
this.__ensure_map(shadow, renderer);
|
|
67
|
-
shadow_camera.updateProjectionMatrix();
|
|
68
67
|
|
|
69
68
|
// draw scene from perspective of shadow camera into the render texture
|
|
70
69
|
|
|
@@ -92,7 +91,7 @@ export class ShadowMapRenderer {
|
|
|
92
91
|
|
|
93
92
|
renderer.clear(true, true, false);
|
|
94
93
|
|
|
95
|
-
shadow.updateMatrices(light);
|
|
94
|
+
shadow.updateMatrices(light, 0);
|
|
96
95
|
|
|
97
96
|
this.onBeforeRender.send3(renderer, shadow_camera, scene);
|
|
98
97
|
|
|
@@ -123,6 +122,16 @@ export class ShadowMapRenderer {
|
|
|
123
122
|
__do_vsm_pass(shadow) {
|
|
124
123
|
const _renderer = this.__renderer;
|
|
125
124
|
|
|
125
|
+
if (shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples) {
|
|
126
|
+
|
|
127
|
+
shadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;
|
|
128
|
+
shadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;
|
|
129
|
+
|
|
130
|
+
shadowMaterialVertical.needsUpdate = true;
|
|
131
|
+
shadowMaterialHorizontal.needsUpdate = true;
|
|
132
|
+
|
|
133
|
+
}
|
|
134
|
+
|
|
126
135
|
// vertical pass
|
|
127
136
|
|
|
128
137
|
const vertical = shadowMaterialVertical.uniforms;
|
|
@@ -181,6 +190,7 @@ export class ShadowMapRenderer {
|
|
|
181
190
|
shadow.map = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, pars);
|
|
182
191
|
shadow.map.texture.name = '.shadowMap';
|
|
183
192
|
|
|
193
|
+
shadow.camera.updateProjectionMatrix();
|
|
184
194
|
}
|
|
185
195
|
}
|
|
186
196
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param {String} path
|
|
4
|
+
* @param {String} format
|
|
5
|
+
* @returns {String[]}
|
|
6
|
+
*/
|
|
7
|
+
export function buildCubeURLs(path, format) {
|
|
8
|
+
return [
|
|
9
|
+
path + "posx" + format, path + "negx" + format,
|
|
10
|
+
path + "posy" + format, path + "negy" + format,
|
|
11
|
+
path + "posz" + format, path + "negz" + format
|
|
12
|
+
];
|
|
13
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { EXRLoader } from "three/examples/jsm/loaders/EXRLoader.js";
|
|
2
|
+
import { CubeTextureLoader, LinearFilter, PMREMGenerator, sRGBEncoding, TextureLoader, UnsignedByteType } from "three";
|
|
3
|
+
import { noop } from "../../../../core/function/Functions.js";
|
|
4
|
+
import { computeFileExtension } from "../../../../core/FilePath.js";
|
|
5
|
+
import { HDRCubeTextureLoader } from "three/examples/jsm/loaders/HDRCubeTextureLoader.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @param {string[]|string} paths
|
|
10
|
+
* @return {Promise<THREE.CubeTexture>}
|
|
11
|
+
*/
|
|
12
|
+
function load_cube_texture(paths) {
|
|
13
|
+
// piece-wise cubemap, a collection of images for each face
|
|
14
|
+
const cubeTextureLoader = new CubeTextureLoader();
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
cubeTextureLoader.load(
|
|
17
|
+
paths,
|
|
18
|
+
texture => {
|
|
19
|
+
texture.magFilter = LinearFilter;
|
|
20
|
+
texture.encoding = sRGBEncoding;
|
|
21
|
+
resolve(texture);
|
|
22
|
+
},
|
|
23
|
+
noop,
|
|
24
|
+
reject
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
*
|
|
31
|
+
* @param {string[]|string} paths
|
|
32
|
+
* @return {Promise<THREE.CubeTexture>}
|
|
33
|
+
*/
|
|
34
|
+
function load_hdr_cube_texture(paths) {
|
|
35
|
+
// piece-wise cubemap, a collection of images for each face
|
|
36
|
+
const cubeTextureLoader = new HDRCubeTextureLoader();
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
cubeTextureLoader.load(
|
|
39
|
+
paths,
|
|
40
|
+
texture => {
|
|
41
|
+
resolve(texture);
|
|
42
|
+
},
|
|
43
|
+
noop,
|
|
44
|
+
reject
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
* @param {string} path
|
|
52
|
+
* @return {Promise<THREE.Texture>}
|
|
53
|
+
*/
|
|
54
|
+
function load_exr_texture(path) {
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
new EXRLoader()
|
|
57
|
+
.setDataType(UnsignedByteType)
|
|
58
|
+
.load(path, texture => {
|
|
59
|
+
resolve(texture);
|
|
60
|
+
}, noop, reject);
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
*
|
|
66
|
+
* @param {string} path
|
|
67
|
+
* @return {Promise<THREE.Texture>}
|
|
68
|
+
*/
|
|
69
|
+
function load_standard_texture(path) {
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
new TextureLoader()
|
|
72
|
+
.load(path, texture => {
|
|
73
|
+
texture.encoding = sRGBEncoding;
|
|
74
|
+
resolve(texture);
|
|
75
|
+
}, noop, reject);
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
*
|
|
81
|
+
* @param {string|string[]} path
|
|
82
|
+
* @param {THREE.WebGLRenderer} [renderer]
|
|
83
|
+
* @param {boolean} [original]
|
|
84
|
+
* @param {boolean} [filtered]
|
|
85
|
+
* @returns {{original?:THREE.CubeTexture, filtered?: THREE.CubeTexture}}
|
|
86
|
+
*/
|
|
87
|
+
export async function load_environment_map({ path, renderer, original = false, filtered = true }) {
|
|
88
|
+
/**
|
|
89
|
+
* @type {string} 'e' or 'c'
|
|
90
|
+
*/
|
|
91
|
+
let type;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @type {THREE.WebGLCubeRenderTarget}
|
|
95
|
+
*/
|
|
96
|
+
let cube_rt;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @type {THREE.Texture|THREE.CubeTexture}
|
|
100
|
+
*/
|
|
101
|
+
let texture;
|
|
102
|
+
|
|
103
|
+
if (Array.isArray(path)) {
|
|
104
|
+
const ext = computeFileExtension(path[0]);
|
|
105
|
+
|
|
106
|
+
if (ext === 'hdr') {
|
|
107
|
+
texture = await load_hdr_cube_texture(path);
|
|
108
|
+
} else {
|
|
109
|
+
texture = await load_cube_texture(path);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
type = 'c';
|
|
113
|
+
|
|
114
|
+
} else if (typeof path === 'string') {
|
|
115
|
+
// single cubemap
|
|
116
|
+
const extension = computeFileExtension(path).toLowerCase();
|
|
117
|
+
if (extension === 'exr') {
|
|
118
|
+
texture = await load_exr_texture(path);
|
|
119
|
+
} else if (extension === 'jpg') {
|
|
120
|
+
texture = await load_standard_texture(path);
|
|
121
|
+
} else {
|
|
122
|
+
// unsupported extension
|
|
123
|
+
throw new Error(`Unsupported cube map texture extension '${extension}'`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
type = 'e';
|
|
127
|
+
|
|
128
|
+
} else {
|
|
129
|
+
throw new Error(`Unsupported parameter format: '${path}'`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const result = {};
|
|
133
|
+
|
|
134
|
+
if (filtered) {
|
|
135
|
+
|
|
136
|
+
if (renderer === undefined) {
|
|
137
|
+
throw new Error('renderer argument not supplied, expected a WebGLRenderer');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const pmremGenerator = new PMREMGenerator(renderer);
|
|
141
|
+
|
|
142
|
+
if (type === 'c') {
|
|
143
|
+
cube_rt = pmremGenerator.fromCubemap(texture);
|
|
144
|
+
} else if (type === 'e') {
|
|
145
|
+
cube_rt = pmremGenerator.fromEquirectangular(texture);
|
|
146
|
+
} else {
|
|
147
|
+
throw new Error(`Unsupported cubemap type '${type}'`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
pmremGenerator.dispose();
|
|
151
|
+
|
|
152
|
+
result.filtered = cube_rt.texture;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (original) {
|
|
156
|
+
result.original = texture;
|
|
157
|
+
} else {
|
|
158
|
+
// cleanup
|
|
159
|
+
texture.dispose();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return result;
|
|
163
|
+
}
|