@woosh/meep-engine 3.36.0 → 3.38.0
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/package.json +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +2 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_PLACED.d.ts +11 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_PLACED.d.ts.map +1 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_PLACED.js +10 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +16 -0
- package/src/engine/graphics/ecs/water/Water.d.ts +30 -0
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +125 -104
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +13 -1
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts +6 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_1_2.js +18 -0
- package/src/engine/graphics3/WaterSystem.d.ts +22 -6
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +314 -293
- package/src/engine/input/devices/XRInputDevice.d.ts +51 -23
- package/src/engine/input/devices/XRInputDevice.d.ts.map +1 -1
- package/src/engine/input/devices/XRInputDevice.js +145 -52
- package/src/engine/input/devices/xr/XRGamepadMapping.d.ts +14 -0
- package/src/engine/input/devices/xr/XRGamepadMapping.d.ts.map +1 -0
- package/src/engine/input/devices/xr/XRGamepadMapping.js +9 -0
- package/src/engine/input/devices/xr/XRHandedness.d.ts +15 -0
- package/src/engine/input/devices/xr/XRHandedness.d.ts.map +1 -0
- package/src/engine/input/devices/xr/XRHandedness.js +10 -0
- package/src/engine/input/devices/xr/XRInputAction.d.ts +24 -11
- package/src/engine/input/devices/xr/XRInputAction.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputAction.js +55 -24
- package/src/engine/input/devices/xr/XRInputButton.d.ts +7 -9
- package/src/engine/input/devices/xr/XRInputButton.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputButton.js +18 -8
- package/src/engine/input/devices/xr/XRInputCoordinates.d.ts +11 -3
- package/src/engine/input/devices/xr/XRInputCoordinates.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputCoordinates.js +17 -3
- package/src/engine/input/devices/xr/XRInputHandle.d.ts +41 -11
- package/src/engine/input/devices/xr/XRInputHandle.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputHandle.js +129 -32
- package/src/engine/input/devices/xr/XRInputPose.d.ts +41 -5
- package/src/engine/input/devices/xr/XRInputPose.d.ts.map +1 -1
- package/src/engine/input/devices/xr/XRInputPose.js +57 -16
- package/src/engine/input/devices/xr/XRInputTypes.d.ts +18 -18
- package/src/engine/input/devices/xr/XRInputTypes.js +3 -3
- package/src/engine/input/devices/xr/XRTargetRayMode.d.ts +17 -0
- package/src/engine/input/devices/xr/XRTargetRayMode.d.ts.map +1 -0
- package/src/engine/input/devices/xr/XRTargetRayMode.js +12 -0
- package/src/engine/input/devices/xr/XRVisibilityState.d.ts +15 -0
- package/src/engine/input/devices/xr/XRVisibilityState.d.ts.map +1 -0
- package/src/engine/input/devices/xr/XRVisibilityState.js +10 -0
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.d.ts +3 -1
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.d.ts.map +1 -1
- package/src/engine/input/ecs/ism/coordinate/InputCoordinateDevice.js +5 -1
- package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.d.ts +19 -5
- package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.d.ts.map +1 -1
- package/src/engine/input/ecs/ism/device/XRInputDeviceAdapter.js +42 -9
- package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.d.ts +8 -2
- package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.d.ts.map +1 -1
- package/src/engine/input/ecs/ism/device/XR_INPUT_DEVICE_IDS.js +19 -9
- package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.d.ts +10 -2
- package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.d.ts.map +1 -1
- package/src/engine/input/ecs/ism/trigger/InputTriggerXRButton.js +12 -2
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +13 -14
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/ClothColliderIndex.js +137 -36
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts +30 -0
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +33 -0
- package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +2 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +10 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +36 -14
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +15 -2
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +17 -2
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +19 -6
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +18 -20
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +139 -89
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +32 -16
- package/src/shade/playground/water_refraction/README.md +149 -0
- package/src/shade/playground/water_refraction/index.html +42 -0
- package/src/shade/playground/water_refraction/main.d.ts +2 -0
- package/src/shade/playground/water_refraction/main.d.ts.map +1 -0
- package/src/shade/playground/water_refraction/main.js +201 -0
- package/src/shade/playground/water_refraction/world.d.ts +37 -0
- package/src/shade/playground/water_refraction/world.d.ts.map +1 -0
- package/src/shade/playground/water_refraction/world.js +137 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +4 -0
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts +2 -3
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
- package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -24
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +16 -15
- package/src/shade/renderer/deferred/indirect/chunk_lpv_sample_light.js +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +1123 -1122
- package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +202 -201
- package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.d.ts +8 -0
- package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/chunk_roughness_to_mip_ratio.js +24 -0
- package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.d.ts +0 -6
- package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/chunk_sphere_probe_roughness_to_lod.js +2 -25
- package/src/shade/renderer/light/environment/shader_project_environment_sh.d.ts +2 -2
- package/src/shade/renderer/light/environment/shader_project_environment_sh.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/shader_project_environment_sh.js +50 -19
- package/src/shade/renderer/particles/DESIGN.md +1 -1
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts +1 -1
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.d.ts.map +1 -1
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +10 -9
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +17 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +7 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.d.ts +4 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_renormalization.js +11 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.d.ts +4 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_rgb_contribution.js +19 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +5 -3
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.d.ts +4 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_split_counts.js +8 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +21 -2
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +4 -8
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
- package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +10 -8
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_add_f32_storage.js +25 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_max_f32_storage.js +28 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atomic/chunk_atomic_min_f32_storage.js +28 -0
- package/src/shade/renderer/shader/chunk/geometry/plane/{plane_ray_raycast.d.ts → chunk_plane_ray_raycast.d.ts} +2 -2
- package/src/shade/renderer/shader/chunk/geometry/plane/chunk_plane_ray_raycast.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/plane/{plane_ray_raycast.js → chunk_plane_ray_raycast.js} +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts +4 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_newton_ray.js +101 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +3 -3
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +62 -29
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +235 -147
- package/src/shade/renderer/water/chunk_water_transport.d.ts +5 -0
- package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -0
- package/src/shade/renderer/water/chunk_water_transport.js +94 -0
- package/src/shade/renderer/water/shader_water.d.ts +9 -26
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +384 -246
- package/src/shade/renderer/water/shader_water_avboit.d.ts +12 -0
- package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -0
- package/src/shade/renderer/water/shader_water_avboit.js +258 -0
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +13 -0
- package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.d.ts +0 -29
- package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.d.ts.map +0 -1
- package/src/shade/renderer/animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.js +0 -59
- package/src/shade/renderer/shader/chunk/geometry/plane/plane_ray_raycast.d.ts.map +0 -1
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Color } from "../../../core/color/Color.js";
|
|
2
|
+
import Quaternion from "../../../core/geom/Quaternion.js";
|
|
3
|
+
import Vector3 from "../../../core/geom/Vector3.js";
|
|
4
|
+
import { Entity } from "../../../engine/ecs/Entity.js";
|
|
5
|
+
import Terrain from "../../../engine/ecs/terrain/ecs/Terrain.js";
|
|
6
|
+
import { Transform64 } from "../../../engine/ecs/transform/Transform64.js";
|
|
7
|
+
import { t64_announce_change } from "../../../engine/ecs/transform/t64_announce_change.js";
|
|
8
|
+
import { ShadedGeometry } from "../../../engine/graphics/ecs/mesh-v2/ShadedGeometry.js";
|
|
9
|
+
import Water from "../../../engine/graphics/ecs/water/Water.js";
|
|
10
|
+
import { ParticleEffect } from "../../../engine/graphics/ecs/particles/ParticleEffect.js";
|
|
11
|
+
import { Sampler2D } from "../../../engine/graphics/texture/sampler/Sampler2D.js";
|
|
12
|
+
import { MeshoptClusterizer } from "../../renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js";
|
|
13
|
+
import { meshlet_geometry_build_from_geometry } from "../../renderer/geometry/meshlet_geometry_build_from_geometry.js";
|
|
14
|
+
import { MeshletGeometry } from "../../renderer/geometry/MeshletGeometry.js";
|
|
15
|
+
import { make_box_geometry } from "../../renderer/geometry/primitives/make_box_geometry.js";
|
|
16
|
+
import { make_plane_geometry } from "../../renderer/geometry/primitives/make_plane_geometry.js";
|
|
17
|
+
import { StandardAttributes } from "../../renderer/geometry/StandardAttributes.js";
|
|
18
|
+
import { ShadeDrawSide } from "../../renderer/material/ShadeDrawSide.js";
|
|
19
|
+
import { StandardShadeMaterial } from "../../renderer/material/StandardShadeMaterial.js";
|
|
20
|
+
import { TransparencyMode } from "../../renderer/material/TransparencyMode.js";
|
|
21
|
+
import { DynamicMesh } from "../../renderer/scene/DynamicMesh.js";
|
|
22
|
+
import { DynamicMeshBatch } from "../../renderer/scene/DynamicMeshBatch.js";
|
|
23
|
+
import { ColorSpace } from "../../renderer/texture/ColorSpace.js";
|
|
24
|
+
import { ShadeTexture } from "../../renderer/texture/ShadeTexture.js";
|
|
25
|
+
import { ShadeImage } from "../../renderer/texture/source/ShadeImage.js";
|
|
26
|
+
import { bonfire_effects } from "../particle_ecs/bonfire_effects.js";
|
|
27
|
+
import { bonfire_sprites } from "../particle_ecs/bonfire_sprites.js";
|
|
28
|
+
|
|
29
|
+
export const height_at = (x,z,offset=0) => -2 + Math.max(0,z-18)*0.5 + offset;
|
|
30
|
+
|
|
31
|
+
function pose(x,y,z,rotation=Quaternion.identity) {
|
|
32
|
+
const transform = new Transform64();
|
|
33
|
+
transform.setTranslation(x,y,z);
|
|
34
|
+
if (rotation !== undefined) { transform.setRotation(rotation.x,rotation.y,rotation.z,rotation.w); }
|
|
35
|
+
transform.updateMatrix(); return transform;
|
|
36
|
+
}
|
|
37
|
+
function material(rgb,alpha=1) {
|
|
38
|
+
const m=new StandardShadeMaterial(); m.diffuse_color.copy(new Color(...rgb,alpha));
|
|
39
|
+
m.metallic_factor=0; m.roughness_factor=0.55; m.draw_side=ShadeDrawSide.Double;
|
|
40
|
+
m.transparency_mode=alpha<1?TransparencyMode.Transparent:TransparencyMode.Opaque;
|
|
41
|
+
return m;
|
|
42
|
+
}
|
|
43
|
+
function meshlets(geometry) {
|
|
44
|
+
const result=new MeshletGeometry(); meshlet_geometry_build_from_geometry(geometry,result); return result;
|
|
45
|
+
}
|
|
46
|
+
function shaded(geometry,material) { const s=new ShadedGeometry(); s.geometry=geometry; s.material=material; return s; }
|
|
47
|
+
function checker() {
|
|
48
|
+
// A four-texel-wide square blurred under ordinary bilinear filtering even with
|
|
49
|
+
// water disabled. Keep the same world-space pattern with a sharp source image.
|
|
50
|
+
const size=1024, data=Sampler2D.uint8(4,size,size);
|
|
51
|
+
for(let y=0;y<size;y++) for(let x=0;x<size;x++) {
|
|
52
|
+
const bright=((x>>6)+(y>>6))%2===0;
|
|
53
|
+
const n=bright?215:42; data.data.set([n,bright?220:66,bright?200:84,255],(y*size+x)*4);
|
|
54
|
+
}
|
|
55
|
+
const image=ShadeImage.fromSampler2D(data); image.color_space=ColorSpace.SRGB;
|
|
56
|
+
return ShadeTexture.from(image);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** All visible static content uses ordinary ECS meshlets; water owns no demo-specific pass. */
|
|
60
|
+
export async function build_world(dataset) {
|
|
61
|
+
await MeshoptClusterizer.ready;
|
|
62
|
+
const entities=[];
|
|
63
|
+
const build=builder=>{builder.build(dataset);entities.push(builder.id);return builder.id;};
|
|
64
|
+
const terrain=new Terrain(); terrain.size.set(32,32); terrain.gridScale=1;
|
|
65
|
+
function sampler(offset=0) {
|
|
66
|
+
const s=Sampler2D.float32(1,65,65);
|
|
67
|
+
for(let y=0;y<65;y++) for(let x=0;x<65;x++) s.data[y*65+x]=height_at(x/64*32,y/64*32,offset);
|
|
68
|
+
return s;
|
|
69
|
+
}
|
|
70
|
+
terrain.samplerHeight=sampler(); build(new Entity().add(terrain).add(pose(0,0,0)));
|
|
71
|
+
const floor_geo=make_plane_geometry(32,32,32,32);
|
|
72
|
+
const positions=floor_geo.getAttribute(StandardAttributes.Position).data;
|
|
73
|
+
const normals=floor_geo.getAttribute(StandardAttributes.Normal).data;
|
|
74
|
+
for(let i=0;i<positions.length;i+=3) {
|
|
75
|
+
const x=positions[i]+16,z=16-positions[i+1];
|
|
76
|
+
positions[i]=x; positions[i+1]=height_at(x,z); positions[i+2]=z;
|
|
77
|
+
const slope=z>18?0.5:0,n=Math.hypot(1,slope);
|
|
78
|
+
normals[i]=0; normals[i+1]=1/n; normals[i+2]=-slope/n;
|
|
79
|
+
}
|
|
80
|
+
const floor_material=material([1,1,1]); floor_material.texture_albedo=checker();
|
|
81
|
+
const floor_transform=pose(0,0,0);
|
|
82
|
+
const floor_entity=build(new Entity().add(floor_transform).add(shaded(meshlets(floor_geo),floor_material)));
|
|
83
|
+
const water=new Water(); water.level.set(0); water.scattering.set(0.6);
|
|
84
|
+
const water_entity=build(new Entity().add(water));
|
|
85
|
+
const add_mesh=(geo,m,x,y,z,rotation)=>{
|
|
86
|
+
const t=pose(x,y,z,rotation);const component=shaded(meshlets(geo),m);
|
|
87
|
+
const entity=build(new Entity().add(t).add(component)); return {transform:t,component,entity};
|
|
88
|
+
};
|
|
89
|
+
add_mesh(make_box_geometry(4,1.5,2),material([0.48,0.23,0.08]),16,0.15,14);
|
|
90
|
+
for(let i=0;i<5;i++) add_mesh(make_box_geometry(0.12,3.5,0.12),material([0.9,0.5,0.13]),9+i*0.45,-0.25,14);
|
|
91
|
+
const card=add_mesh(make_plane_geometry(2,2),material([0.2,0.65,0.9],0.5),12,0,12);
|
|
92
|
+
const submerged=add_mesh(make_box_geometry(1.2,0.8,1.2),material([0.8,0.14,0.1]),15,-1.4,11);
|
|
93
|
+
const effects=bonfire_effects(bonfire_sprites());
|
|
94
|
+
const live_effects=[effects.smoke,effects.embers];
|
|
95
|
+
const particle_transforms=[];
|
|
96
|
+
for(const [i,effect] of [effects.smoke,effects.embers].entries()) {
|
|
97
|
+
effect.spawn_rate=80; const t=pose(11+i*2,-0.5,10);
|
|
98
|
+
const entity=build(new Entity().add(t).add(effect)); particle_transforms.push({transform:t,entity});
|
|
99
|
+
}
|
|
100
|
+
const ribbon=DynamicMesh.from(make_plane_geometry(6,0.14,16,1),[0.75,0.12,0.9,0.55]);
|
|
101
|
+
const ribbon_base=ribbon.geometry.getAttribute(StandardAttributes.Position).data.slice();
|
|
102
|
+
const batch=new DynamicMeshBatch(); batch.add(ribbon);
|
|
103
|
+
let secondary=null;
|
|
104
|
+
let last_update=null;
|
|
105
|
+
return {terrain,water,water_entity,card,submerged,batch,ribbon,effects:live_effects,entities,
|
|
106
|
+
reset_particles() {
|
|
107
|
+
particle_transforms.forEach(({entity},i)=>{
|
|
108
|
+
const replacement=live_effects[i].clone();
|
|
109
|
+
dataset.removeComponentFromEntity(entity,ParticleEffect);
|
|
110
|
+
dataset.addComponentToEntity(entity,replacement);live_effects[i]=replacement;
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
update(time,{layer_height=0,animate=false}={}) {
|
|
114
|
+
if(last_update!==null&&last_update[0]===time&&last_update[1]===layer_height&&last_update[2]===animate)return;
|
|
115
|
+
last_update=[time,layer_height,animate];
|
|
116
|
+
card.transform.setTranslation(12,layer_height,12); t64_announce_change(dataset,card.entity);
|
|
117
|
+
particle_transforms.forEach(({transform:t,entity},i)=>{t.setTranslation(11+i*2,layer_height-0.7,10);t64_announce_change(dataset,entity);});
|
|
118
|
+
submerged.transform.setTranslation(15+(animate?Math.sin(time)*2:0),-1.4,11);
|
|
119
|
+
t64_announce_change(dataset,submerged.entity);
|
|
120
|
+
const p=ribbon.geometry.getAttribute(StandardAttributes.Position).data;
|
|
121
|
+
for(let i=0;i<p.length;i+=3) {
|
|
122
|
+
p[i]=13+ribbon_base[i]; p[i+1]=layer_height+ribbon_base[i+1]+Math.sin(ribbon_base[i]+time)*0.6;
|
|
123
|
+
p[i+2]=9+Math.cos(ribbon_base[i]*0.5)*0.7;
|
|
124
|
+
}
|
|
125
|
+
ribbon.geometry.needsUpdate=true;
|
|
126
|
+
},
|
|
127
|
+
replace_terrain(offset=-0.25) {
|
|
128
|
+
terrain.samplerHeight=sampler(offset); floor_transform.setTranslation(0,offset,0);t64_announce_change(dataset,floor_entity);
|
|
129
|
+
},
|
|
130
|
+
overlap(enabled) {
|
|
131
|
+
if(enabled&&secondary===null) {const other=new Water();other.level.set(water.level.getValue()-0.4);
|
|
132
|
+
other.color.setRGB(0.65,0.1,0.25);secondary=build(new Entity().add(other));}
|
|
133
|
+
if(!enabled&&secondary!==null) {dataset.removeEntity(secondary);secondary=null;}
|
|
134
|
+
},
|
|
135
|
+
dispose() {entities.forEach(id=>{if(dataset.entityExists(id)) dataset.removeEntity(id);});batch.clear();},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
|
|
@@ -2678,6 +2678,10 @@ export class Renderer {
|
|
|
2678
2678
|
color_texture: current_color_out,
|
|
2679
2679
|
depth_texture: gr_texture_depth_current,
|
|
2680
2680
|
|
|
2681
|
+
normal_texture: gr_texture_normal,
|
|
2682
|
+
hzb_texture: gr_texture_hzb,
|
|
2683
|
+
environment_texture: gr_texture_environment,
|
|
2684
|
+
|
|
2681
2685
|
limits: this.graphics.collection_limits,
|
|
2682
2686
|
|
|
2683
2687
|
light_cluster_data: light_clusters.data,
|
|
@@ -4,9 +4,8 @@
|
|
|
4
4
|
* The importing shader binds:
|
|
5
5
|
* `var<storage, read_write> pose_accumulator: array<atomic<u32>>;`
|
|
6
6
|
*
|
|
7
|
-
* f32 atomic-add isn't native to WGSL.
|
|
8
|
-
*
|
|
9
|
-
* f32, add the contribution, reinterpret back, CAS. Contention is
|
|
7
|
+
* f32 atomic-add isn't native to WGSL. The shared `atomic_add_f32_storage`
|
|
8
|
+
* helper uses a compare-exchange retry loop over plain f32 bits. Contention is
|
|
10
9
|
* typically low (each `(row, channel)` has 1–2 contributors in a
|
|
11
10
|
* normalised blend), so the spin rarely loops more than once.
|
|
12
11
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_pose_accumulator.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/chunk_pose_accumulator.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunk_pose_accumulator.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/chunk_pose_accumulator.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;GAgBG;AACH,qCAFU,SAAS,CA4FgB;0BA5HT,iCAAiC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CodeChunk } from "../shader/compiler/CodeChunk.js";
|
|
2
|
+
import { chunk_atomic_add_f32_storage } from "../shader/chunk/atomic/chunk_atomic_add_f32_storage.js";
|
|
2
3
|
import {
|
|
3
4
|
POSE_ACCUMULATOR_OFFSET_DIRTY,
|
|
4
5
|
POSE_ACCUMULATOR_OFFSET_ROTATION,
|
|
@@ -20,9 +21,8 @@ import {
|
|
|
20
21
|
* The importing shader binds:
|
|
21
22
|
* `var<storage, read_write> pose_accumulator: array<atomic<u32>>;`
|
|
22
23
|
*
|
|
23
|
-
* f32 atomic-add isn't native to WGSL.
|
|
24
|
-
*
|
|
25
|
-
* f32, add the contribution, reinterpret back, CAS. Contention is
|
|
24
|
+
* f32 atomic-add isn't native to WGSL. The shared `atomic_add_f32_storage`
|
|
25
|
+
* helper uses a compare-exchange retry loop over plain f32 bits. Contention is
|
|
26
26
|
* typically low (each `(row, channel)` has 1–2 contributors in a
|
|
27
27
|
* normalised blend), so the spin rarely loops more than once.
|
|
28
28
|
*
|
|
@@ -55,29 +55,19 @@ fn pose_accumulator_slot_base(row: u32) -> u32 {
|
|
|
55
55
|
return row * POSE_ACCUMULATOR_STRIDE;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
fn pose_accumulator_atomic_add_f32(word_index: u32, value: f32) {
|
|
59
|
-
loop {
|
|
60
|
-
let old_u = atomicLoad(&pose_accumulator[word_index]);
|
|
61
|
-
let new_f = bitcast<f32>(old_u) + value;
|
|
62
|
-
let new_u = bitcast<u32>(new_f);
|
|
63
|
-
let result = atomicCompareExchangeWeak(&pose_accumulator[word_index], old_u, new_u);
|
|
64
|
-
if result.exchanged { break; }
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
58
|
fn pose_accumulator_add_translation(row: u32, value: vec3<f32>, mask: u32) {
|
|
69
59
|
let base = pose_accumulator_slot_base(row) + POSE_OFFSET_TRANSLATION;
|
|
70
60
|
var dirty_bits: u32 = 0u;
|
|
71
61
|
if (mask & 0x1u) != 0u {
|
|
72
|
-
|
|
62
|
+
atomic_add_f32_storage(&pose_accumulator[base + 0u], value.x);
|
|
73
63
|
dirty_bits |= POSE_DIRTY_TX;
|
|
74
64
|
}
|
|
75
65
|
if (mask & 0x2u) != 0u {
|
|
76
|
-
|
|
66
|
+
atomic_add_f32_storage(&pose_accumulator[base + 1u], value.y);
|
|
77
67
|
dirty_bits |= POSE_DIRTY_TY;
|
|
78
68
|
}
|
|
79
69
|
if (mask & 0x4u) != 0u {
|
|
80
|
-
|
|
70
|
+
atomic_add_f32_storage(&pose_accumulator[base + 2u], value.z);
|
|
81
71
|
dirty_bits |= POSE_DIRTY_TZ;
|
|
82
72
|
}
|
|
83
73
|
if dirty_bits != 0u {
|
|
@@ -106,10 +96,10 @@ fn pose_accumulator_add_rotation(row: u32, value: vec4<f32>, mask: u32, weight:
|
|
|
106
96
|
let w = select(weight, value.w, (mask & 0x8u) != 0u);
|
|
107
97
|
|
|
108
98
|
let base = pose_accumulator_slot_base(row) + POSE_OFFSET_ROTATION;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
99
|
+
atomic_add_f32_storage(&pose_accumulator[base + 0u], value.x);
|
|
100
|
+
atomic_add_f32_storage(&pose_accumulator[base + 1u], value.y);
|
|
101
|
+
atomic_add_f32_storage(&pose_accumulator[base + 2u], value.z);
|
|
102
|
+
atomic_add_f32_storage(&pose_accumulator[base + 3u], w);
|
|
113
103
|
atomicOr(&pose_accumulator[pose_accumulator_slot_base(row) + POSE_OFFSET_DIRTY], POSE_DIRTY_R);
|
|
114
104
|
}
|
|
115
105
|
|
|
@@ -117,19 +107,19 @@ fn pose_accumulator_add_scale(row: u32, value: vec3<f32>, mask: u32) {
|
|
|
117
107
|
let base = pose_accumulator_slot_base(row) + POSE_OFFSET_SCALE;
|
|
118
108
|
var dirty_bits: u32 = 0u;
|
|
119
109
|
if (mask & 0x1u) != 0u {
|
|
120
|
-
|
|
110
|
+
atomic_add_f32_storage(&pose_accumulator[base + 0u], value.x);
|
|
121
111
|
dirty_bits |= POSE_DIRTY_SX;
|
|
122
112
|
}
|
|
123
113
|
if (mask & 0x2u) != 0u {
|
|
124
|
-
|
|
114
|
+
atomic_add_f32_storage(&pose_accumulator[base + 1u], value.y);
|
|
125
115
|
dirty_bits |= POSE_DIRTY_SY;
|
|
126
116
|
}
|
|
127
117
|
if (mask & 0x4u) != 0u {
|
|
128
|
-
|
|
118
|
+
atomic_add_f32_storage(&pose_accumulator[base + 2u], value.z);
|
|
129
119
|
dirty_bits |= POSE_DIRTY_SZ;
|
|
130
120
|
}
|
|
131
121
|
if dirty_bits != 0u {
|
|
132
122
|
atomicOr(&pose_accumulator[pose_accumulator_slot_base(row) + POSE_OFFSET_DIRTY], dirty_bits);
|
|
133
123
|
}
|
|
134
124
|
}
|
|
135
|
-
|
|
125
|
+
`, [chunk_atomic_add_f32_storage]);
|
package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_meshlet_bounds_reduce.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_meshlet_bounds_reduce.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,gCAAiC;AAsKjC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,yDAIG;8BAlN2B,kCAAkC"}
|
package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js
CHANGED
|
@@ -6,7 +6,8 @@ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
|
6
6
|
import { ComputeShader } from "../../../shader/ComputeShader.js";
|
|
7
7
|
import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
8
8
|
import { SKINNING_BINDING_STRUCT } from "../SKINNING_BINDING_STRUCT.js";
|
|
9
|
-
import {
|
|
9
|
+
import { chunk_atomic_min_f32_storage } from "../../../shader/chunk/atomic/chunk_atomic_min_f32_storage.js";
|
|
10
|
+
import { chunk_atomic_max_f32_storage } from "../../../shader/chunk/atomic/chunk_atomic_max_f32_storage.js";
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Workgroup size — also the per-meshlet vertex stride. One thread per
|
|
@@ -113,7 +114,7 @@ fn main(
|
|
|
113
114
|
// Note that the storage sentinels in \`meshlet.bounds_box\` and
|
|
114
115
|
// \`geometry.bounding_box\` ARE true ±inf — the scatter pass
|
|
115
116
|
// writes the u32 bit pattern directly via \`atomicStore\`, no
|
|
116
|
-
// const-fold involved, and \`
|
|
117
|
+
// const-fold involved, and \`atomic_min_f32_storage\` bitcasts
|
|
117
118
|
// back to f32 at runtime where ±inf is a valid value.
|
|
118
119
|
var thread_min = vec3<f32>( 3.4028234e38);
|
|
119
120
|
var thread_max = vec3<f32>(-3.4028234e38);
|
|
@@ -164,23 +165,23 @@ fn main(
|
|
|
164
165
|
let final_max = wg_max[0];
|
|
165
166
|
|
|
166
167
|
let m_bounds_base = m_base_words + MESHLET_BOUNDS_OFFSET;
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
168
|
+
atomic_min_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 0u], final_min.x);
|
|
169
|
+
atomic_min_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 1u], final_min.y);
|
|
170
|
+
atomic_min_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 2u], final_min.z);
|
|
171
|
+
atomic_max_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 3u], final_max.x);
|
|
172
|
+
atomic_max_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 4u], final_max.y);
|
|
173
|
+
atomic_max_f32_storage(&meshlet_metadata_atomic[m_bounds_base + 5u], final_max.z);
|
|
173
174
|
|
|
174
175
|
let g_base = binding.clone_geometry_index * GEOMETRY_STRIDE + GEOMETRY_BBOX_OFFSET;
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
176
|
+
atomic_min_f32_storage(&geometry_metadata_atomic[g_base + 0u], final_min.x);
|
|
177
|
+
atomic_min_f32_storage(&geometry_metadata_atomic[g_base + 1u], final_min.y);
|
|
178
|
+
atomic_min_f32_storage(&geometry_metadata_atomic[g_base + 2u], final_min.z);
|
|
179
|
+
atomic_max_f32_storage(&geometry_metadata_atomic[g_base + 3u], final_max.x);
|
|
180
|
+
atomic_max_f32_storage(&geometry_metadata_atomic[g_base + 4u], final_max.y);
|
|
181
|
+
atomic_max_f32_storage(&geometry_metadata_atomic[g_base + 5u], final_max.z);
|
|
181
182
|
}
|
|
182
183
|
}
|
|
183
|
-
`, [
|
|
184
|
+
`, [chunk_atomic_min_f32_storage, chunk_atomic_max_f32_storage]);
|
|
184
185
|
|
|
185
186
|
/**
|
|
186
187
|
* Compute shader that reduces a clone meshlet's deformed vertex
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
chunk_lpv_mesh_interpolate_radiance_via_atlas
|
|
3
3
|
} from "../../global_illumination/probe/octahedral/sample/chunk_lpv_mesh_interpolate_radiance_via_atlas.js";
|
|
4
|
-
import { chunk_roughness_to_mip_ratio } from "../../light/environment/
|
|
4
|
+
import { chunk_roughness_to_mip_ratio } from "../../light/environment/chunk_roughness_to_mip_ratio.js";
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
7
|
chunk_lpv_mesh_interpolate_probe_irradiance_pre
|