@jfk-solutions/demo3d-file-format 1.7.0 → 1.9.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.
Files changed (86) hide show
  1. package/README.md +289 -1
  2. package/dist/examples/export-embedded-viewer-standalone.html +193 -0
  3. package/dist/examples/three-render-smoke-standalone.html +4997 -0
  4. package/dist/index.d.ts +9 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +8 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/model.d.ts +20 -3
  9. package/dist/model.d.ts.map +1 -1
  10. package/dist/model.js +89 -11
  11. package/dist/model.js.map +1 -1
  12. package/dist/parser.d.ts.map +1 -1
  13. package/dist/parser.js +135 -9
  14. package/dist/parser.js.map +1 -1
  15. package/dist/raw3d-animation.d.ts +63 -0
  16. package/dist/raw3d-animation.d.ts.map +1 -0
  17. package/dist/raw3d-animation.js +200 -0
  18. package/dist/raw3d-animation.js.map +1 -0
  19. package/dist/raw3d-effects.d.ts +66 -0
  20. package/dist/raw3d-effects.d.ts.map +1 -0
  21. package/dist/raw3d-effects.js +172 -0
  22. package/dist/raw3d-effects.js.map +1 -0
  23. package/dist/raw3d-skinning.d.ts +8 -0
  24. package/dist/raw3d-skinning.d.ts.map +1 -0
  25. package/dist/raw3d-skinning.js +37 -0
  26. package/dist/raw3d-skinning.js.map +1 -0
  27. package/dist/raw3d.d.ts +84 -4
  28. package/dist/raw3d.d.ts.map +1 -1
  29. package/dist/raw3d.js +111 -9
  30. package/dist/raw3d.js.map +1 -1
  31. package/dist/rigid-interpolation.d.ts +16 -0
  32. package/dist/rigid-interpolation.d.ts.map +1 -0
  33. package/dist/rigid-interpolation.js +52 -0
  34. package/dist/rigid-interpolation.js.map +1 -0
  35. package/dist/three/backend.d.ts +13 -0
  36. package/dist/three/backend.d.ts.map +1 -0
  37. package/dist/three/backend.js +9 -0
  38. package/dist/three/backend.js.map +1 -0
  39. package/dist/three/effects.d.ts +7 -0
  40. package/dist/three/effects.d.ts.map +1 -0
  41. package/dist/three/effects.js +127 -0
  42. package/dist/three/effects.js.map +1 -0
  43. package/dist/three/index.d.ts +5 -1
  44. package/dist/three/index.d.ts.map +1 -1
  45. package/dist/three/index.js +35 -1
  46. package/dist/three/index.js.map +1 -1
  47. package/dist/three/native-lighting.d.ts +5 -0
  48. package/dist/three/native-lighting.d.ts.map +1 -0
  49. package/dist/three/native-lighting.js +86 -0
  50. package/dist/three/native-lighting.js.map +1 -0
  51. package/dist/three/parallax.d.ts +5 -0
  52. package/dist/three/parallax.d.ts.map +1 -0
  53. package/dist/three/parallax.js +63 -0
  54. package/dist/three/parallax.js.map +1 -0
  55. package/dist/three/presentation.d.ts +31 -0
  56. package/dist/three/presentation.d.ts.map +1 -0
  57. package/dist/three/presentation.js +137 -0
  58. package/dist/three/presentation.js.map +1 -0
  59. package/dist/three/raw3d.d.ts +27 -0
  60. package/dist/three/raw3d.d.ts.map +1 -1
  61. package/dist/three/raw3d.js +536 -25
  62. package/dist/three/raw3d.js.map +1 -1
  63. package/dist/three/renderer.d.ts.map +1 -1
  64. package/dist/three/renderer.js +3 -0
  65. package/dist/three/renderer.js.map +1 -1
  66. package/dist/three/skinning.d.ts +11 -0
  67. package/dist/three/skinning.d.ts.map +1 -0
  68. package/dist/three/skinning.js +92 -0
  69. package/dist/three/skinning.js.map +1 -0
  70. package/dist/three/tsl.d.ts +60 -0
  71. package/dist/three/tsl.d.ts.map +1 -0
  72. package/dist/three/tsl.js +3 -0
  73. package/dist/three/tsl.js.map +1 -0
  74. package/dist/three/webgpu-native.d.ts +3 -0
  75. package/dist/three/webgpu-native.d.ts.map +1 -0
  76. package/dist/three/webgpu-native.js +58 -0
  77. package/dist/three/webgpu-native.js.map +1 -0
  78. package/dist/three/webgpu-relief.d.ts +3 -0
  79. package/dist/three/webgpu-relief.d.ts.map +1 -0
  80. package/dist/three/webgpu-relief.js +61 -0
  81. package/dist/three/webgpu-relief.js.map +1 -0
  82. package/dist/xml.d.ts +4 -1
  83. package/dist/xml.d.ts.map +1 -1
  84. package/dist/xml.js +14 -3
  85. package/dist/xml.js.map +1 -1
  86. package/package.json +6 -2
@@ -0,0 +1,5 @@
1
+ import type * as Three from "three";
2
+ import type { Raw3DThreeModule } from "./raw3d.js";
3
+ /** Public WebGL shader hooks adapt native constant/linear/quadratic attenuation. */
4
+ export declare function configureRaw3DLightMaterial(material: Three.Material, three: Raw3DThreeModule): void;
5
+ //# sourceMappingURL=native-lighting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-lighting.d.ts","sourceRoot":"","sources":["../../src/three/native-lighting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnD,oFAAoF;AACpF,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAiEnG"}
@@ -0,0 +1,86 @@
1
+ const configured = new WeakSet();
2
+ const frames = new WeakMap();
3
+ /** Public WebGL shader hooks adapt native constant/linear/quadratic attenuation. */
4
+ export function configureRaw3DLightMaterial(material, three) {
5
+ if (configured.has(material) || !(material instanceof three.MeshStandardMaterial))
6
+ return;
7
+ configured.add(material);
8
+ const point = { value: [] }, pointNative = { value: [] };
9
+ const spot = { value: [] }, cone = { value: [] };
10
+ const compile = material.onBeforeCompile, render = material.onBeforeRender;
11
+ material.customProgramCacheKey = () => "raw3d-native-lighting-v1";
12
+ material.onBeforeRender = function (...args) {
13
+ render.apply(this, args);
14
+ const [renderer, scene, camera] = args;
15
+ if ("isWebGPURenderer" in renderer)
16
+ return;
17
+ const cached = frames.get(renderer);
18
+ if (cached?.frame === renderer.info.render.frame && cached.scene === scene && cached.camera === camera) {
19
+ point.value = cached.points;
20
+ pointNative.value = cached.pointFlags;
21
+ spot.value = cached.spots;
22
+ cone.value = cached.cones;
23
+ return;
24
+ }
25
+ const lights = [];
26
+ scene.traverseVisible(object => {
27
+ if ((object instanceof three.PointLight || object instanceof three.SpotLight) && object.layers.test(camera.layers))
28
+ lights.push(object);
29
+ });
30
+ // Keep the same light order as Three.js, including shadow/map priorities.
31
+ const priority = (light) => (light.castShadow ? 2 : 0) + (light instanceof three.SpotLight && light.map ? 1 : 0);
32
+ lights.sort((a, b) => priority(b) - priority(a));
33
+ point.value = [];
34
+ pointNative.value = [];
35
+ spot.value = [];
36
+ cone.value = [];
37
+ for (const light of lights) {
38
+ const state = light.userData.raw3d?.parameters;
39
+ const vector = state ? new three.Vector4(state.attenuationConstant, state.attenuationLinear, state.attenuationQuadratic, state.attenuationRange) : new three.Vector4();
40
+ if (light instanceof three.PointLight) {
41
+ point.value.push(vector);
42
+ pointNative.value.push(state ? 1 : 0);
43
+ }
44
+ else {
45
+ spot.value.push(vector);
46
+ cone.value.push(state ? new three.Vector4(Math.cos(state.spotlightInnerAngle / 2), Math.cos(state.spotlightOuterAngle / 2), state.spotlightFalloff, 1) : new three.Vector4());
47
+ }
48
+ }
49
+ frames.set(renderer, { frame: renderer.info.render.frame, scene, camera, points: point.value, pointFlags: pointNative.value, spots: spot.value, cones: cone.value });
50
+ };
51
+ material.onBeforeCompile = function (shader, renderer) {
52
+ compile.call(this, shader, renderer);
53
+ Object.assign(shader.uniforms, { raw3DPoint: point, raw3DPointNative: pointNative, raw3DSpot: spot, raw3DCone: cone });
54
+ shader.fragmentShader = shader.fragmentShader.replace("#include <lights_pars_begin>", `#include <lights_pars_begin>
55
+ float raw3DFalloff(float distance, vec4 coefficients) {
56
+ if (coefficients.w > 0.0 && distance > coefficients.w) return 0.0;
57
+ return 1.0 / max(0.000001, coefficients.x + distance*coefficients.y + distance*distance*coefficients.z);
58
+ }
59
+ #if NUM_POINT_LIGHTS > 0
60
+ uniform vec4 raw3DPoint[NUM_POINT_LIGHTS];
61
+ uniform float raw3DPointNative[NUM_POINT_LIGHTS];
62
+ #endif
63
+ #if NUM_SPOT_LIGHTS > 0
64
+ uniform vec4 raw3DSpot[NUM_SPOT_LIGHTS];
65
+ uniform vec4 raw3DCone[NUM_SPOT_LIGHTS];
66
+ #endif
67
+ `);
68
+ let fragment = three.ShaderChunk.lights_fragment_begin;
69
+ fragment = fragment.replace("getPointLightInfo( pointLight, geometryPosition, directLight );", `getPointLightInfo( pointLight, geometryPosition, directLight );
70
+ if (raw3DPointNative[ i ] > 0.5) {
71
+ directLight.color = pointLight.color * raw3DFalloff(length(pointLight.position - geometryPosition), raw3DPoint[ i ]);
72
+ directLight.visible = any(greaterThan(directLight.color, vec3(0.0)));
73
+ }`);
74
+ fragment = fragment.replace("getSpotLightInfo( spotLight, geometryPosition, directLight );", `getSpotLightInfo( spotLight, geometryPosition, directLight );
75
+ if (raw3DCone[ i ].w > 0.5) {
76
+ float cosine = dot(directLight.direction, spotLight.direction);
77
+ float width = raw3DCone[ i ].x - raw3DCone[ i ].y;
78
+ float factor = width > 0.000001 ? clamp((cosine - raw3DCone[ i ].y)/width, 0.0, 1.0) : step(raw3DCone[ i ].y, cosine);
79
+ float angular = cosine < raw3DCone[ i ].y ? 0.0 : pow(factor, max(0.000001, raw3DCone[ i ].z));
80
+ directLight.color = spotLight.color * angular * raw3DFalloff(length(spotLight.position-geometryPosition), raw3DSpot[ i ]);
81
+ directLight.visible = any(greaterThan(directLight.color, vec3(0.0)));
82
+ }`);
83
+ shader.fragmentShader = shader.fragmentShader.replace("#include <lights_fragment_begin>", fragment);
84
+ };
85
+ }
86
+ //# sourceMappingURL=native-lighting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-lighting.js","sourceRoot":"","sources":["../../src/three/native-lighting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type * as Three from "three";
2
+ import type { Raw3DThreeModule } from "./raw3d.js";
3
+ /** Layered height ray-marching with binary refinement; height is packed in the normal image. */
4
+ export declare function configureRaw3DRelief(source: Three.Material, three: Raw3DThreeModule): void;
5
+ //# sourceMappingURL=parallax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallax.d.ts","sourceRoot":"","sources":["../../src/three/parallax.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAuD1F"}
@@ -0,0 +1,63 @@
1
+ const configured = new WeakSet();
2
+ /** Layered height ray-marching with binary refinement; height is packed in the normal image. */
3
+ export function configureRaw3DRelief(source, three) {
4
+ if (!(source instanceof three.MeshStandardMaterial) || configured.has(source) || !source.normalMap)
5
+ return;
6
+ const material = source;
7
+ configured.add(material);
8
+ const channel = String(material.userData.raw3DHeightChannel ?? "a");
9
+ if (!["r", "g", "b", "a"].includes(channel))
10
+ throw new Error("A relief height channel must be r, g, b or a.");
11
+ const depth = { value: Number(material.userData.raw3dNormalDepth ?? 0) };
12
+ const height = { value: material.normalMap };
13
+ const compile = material.onBeforeCompile, render = material.onBeforeRender, cacheKey = material.customProgramCacheKey;
14
+ const previousKey = cacheKey.call(material);
15
+ material.customProgramCacheKey = () => `${previousKey}:raw3d-relief-${channel}`;
16
+ material.onBeforeRender = function (...args) {
17
+ render.apply(this, args);
18
+ depth.value = Number(material.userData.raw3dNormalDepth ?? 0);
19
+ height.value = material.normalMap;
20
+ };
21
+ material.onBeforeCompile = function (shader, renderer) {
22
+ compile.call(this, shader, renderer);
23
+ Object.assign(shader.uniforms, { raw3DReliefDepth: depth, raw3DReliefHeight: height });
24
+ shader.fragmentShader = shader.fragmentShader.replace("#include <common>", `#include <common>
25
+ uniform float raw3DReliefDepth;
26
+ uniform sampler2D raw3DReliefHeight;
27
+ vec2 raw3DRelief(vec2 initial, vec3 viewDirection, vec3 position) {
28
+ if (abs(raw3DReliefDepth) < 0.000001) return initial;
29
+ vec3 dx = dFdx(position), dy = dFdy(position);
30
+ vec2 ux = dFdx(initial), uy = dFdy(initial);
31
+ vec3 tangent = normalize(dx * uy.y - dy * ux.y);
32
+ vec3 bitangent = normalize(dy * ux.x - dx * uy.x);
33
+ vec3 normal = normalize(cross(dx, dy));
34
+ vec3 ray = vec3(dot(viewDirection, tangent), dot(viewDirection, bitangent), dot(viewDirection, normal));
35
+ vec2 stepUV = ray.xy / max(abs(ray.z), 0.05) * raw3DReliefDepth / 32.0;
36
+ vec2 current = initial, previous = initial;
37
+ float layer = 0.0, prior = 0.0;
38
+ for (int layerIndex = 0; layerIndex < 32; layerIndex++) {
39
+ float surface = 1.0 - textureLod(raw3DReliefHeight, current, 0.0).${channel};
40
+ if (layer >= surface) break;
41
+ previous = current;prior = layer;current -= stepUV;layer += 1.0/32.0;
42
+ }
43
+ for (int refinement = 0; refinement < 5; refinement++) {
44
+ vec2 middle = (current+previous)*0.5;
45
+ float middleDepth = (layer+prior)*0.5;
46
+ float surface = 1.0 - textureLod(raw3DReliefHeight, middle, 0.0).${channel};
47
+ if (middleDepth < surface) { previous = middle;prior = middleDepth; }
48
+ else { current = middle;layer = middleDepth; }
49
+ }
50
+ return (current+previous)*0.5;
51
+ }
52
+ `);
53
+ let map = three.ShaderChunk.map_fragment.replace(/\bvMapUv\b/g, "( vMapUv + raw3DReliefOffset )");
54
+ map = `vec2 raw3DReliefOffset = vec2(0.0);
55
+ #ifdef USE_NORMALMAP
56
+ raw3DReliefOffset = raw3DRelief(vNormalMapUv, normalize(vViewPosition), -vViewPosition) - vNormalMapUv;
57
+ #endif
58
+ ${map}`;
59
+ shader.fragmentShader = shader.fragmentShader.replace("#include <map_fragment>", map);
60
+ shader.fragmentShader = shader.fragmentShader.replace("#include <normal_fragment_maps>", three.ShaderChunk.normal_fragment_maps.replace(/\bvNormalMapUv\b/g, "( vNormalMapUv + raw3DReliefOffset )"));
61
+ };
62
+ }
63
+ //# sourceMappingURL=parallax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallax.js","sourceRoot":"","sources":["../../src/three/parallax.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,GAAG,IAAI,OAAO,EAAkB,CAAC;AAEjD,gGAAgG;AAChG,MAAM,UAAU,oBAAoB,CAAC,MAAsB,EAAE,KAAuB;IAClF,IAAI,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC,oBAAoB,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO;IAC3G,MAAM,QAAQ,GAAG,MAAM,CAAC;IACxB,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,IAAI,GAAG,CAAC,CAAC;IACpE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC9G,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,QAAQ,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IACtH,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,QAAQ,CAAC,qBAAqB,GAAG,GAAG,EAAE,CAAC,GAAG,WAAW,iBAAiB,OAAO,EAAE,CAAC;IAChF,QAAQ,CAAC,cAAc,GAAG,UAAS,GAAG,IAAI;QACxC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;QAAA,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;IAC3H,CAAC,CAAC;IACF,QAAQ,CAAC,eAAe,GAAG,UAAS,MAAM,EAAE,QAAQ;QAClD,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,EAAE;;;;;;;;;;;;;;;8EAeD,OAAO;;;;;;;6EAOR,OAAO;;;;;;KAM/E,CAAC,CAAC;QACH,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,gCAAgC,CAAC,CAAC;QAClG,GAAG,GAAG;;;;QAIF,GAAG,EAAE,CAAC;QACV,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QACtF,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,iCAAiC,EAAE,KAAK,CAAC,WAAW,CAAC,oBAAoB,CAAC,OAAO,CAAC,mBAAmB,EAAE,sCAAsC,CAAC,CAAC,CAAC;IACxM,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type * as Three from "three";
2
+ import type { Demo3DThreeRendererInstance, Demo3DThreeModule } from "./renderer.js";
3
+ export type Demo3DThreeRenderMode = "standard" | "enhanced";
4
+ export interface Demo3DThreeRenderModeOptions {
5
+ readonly three: Demo3DThreeModule;
6
+ readonly renderer: Demo3DThreeRendererInstance;
7
+ readonly scene: Three.Scene;
8
+ readonly object: Three.Object3D;
9
+ readonly mode?: Demo3DThreeRenderMode;
10
+ /** Optional display bounds, useful when a scene contains distant outliers. */
11
+ readonly bounds?: Three.Box3;
12
+ /** Shadow texture size used by the enhanced mode. Defaults to 2048. */
13
+ readonly shadowMapSize?: number;
14
+ /** Adds a matte floor below the model in enhanced mode. Defaults to true. */
15
+ readonly ground?: boolean;
16
+ readonly groundColor?: Three.ColorRepresentation;
17
+ }
18
+ export interface Demo3DThreeRenderModeResult {
19
+ readonly mode: Demo3DThreeRenderMode;
20
+ readonly lighting: Three.Group;
21
+ readonly ground?: Three.Mesh;
22
+ /** Removes objects created by the mode and restores renderer/object settings. */
23
+ dispose(): void;
24
+ }
25
+ /**
26
+ * Applies a complete presentation preset to an already-created Demo3D or RAW3D
27
+ * Three.js object. The enhanced mode adds soft directional shadows, a contact
28
+ * floor, and more dimensional key/fill lighting.
29
+ */
30
+ export declare function applyDemo3DThreeRenderMode(options: Demo3DThreeRenderModeOptions): Demo3DThreeRenderModeResult;
31
+ //# sourceMappingURL=presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../src/three/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpF,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,qBAAqB,CAAC;IACtC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC;CAClD;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC;IAC7B,iFAAiF;IACjF,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,4BAA4B,GACpC,2BAA2B,CAwI7B"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Applies a complete presentation preset to an already-created Demo3D or RAW3D
3
+ * Three.js object. The enhanced mode adds soft directional shadows, a contact
4
+ * floor, and more dimensional key/fill lighting.
5
+ */
6
+ export function applyDemo3DThreeRenderMode(options) {
7
+ const { three, renderer, scene, object } = options;
8
+ const mode = options.mode ?? "standard";
9
+ const enhanced = mode === "enhanced";
10
+ const previousRenderer = {
11
+ outputColorSpace: renderer.outputColorSpace,
12
+ toneMapping: renderer.toneMapping,
13
+ toneMappingExposure: renderer.toneMappingExposure,
14
+ shadowMapEnabled: renderer.shadowMap.enabled,
15
+ shadowMapType: renderer.shadowMap.type
16
+ };
17
+ renderer.outputColorSpace = three.SRGBColorSpace;
18
+ renderer.toneMapping = three.ACESFilmicToneMapping;
19
+ renderer.toneMappingExposure = enhanced ? 1.15 : 1.1;
20
+ renderer.shadowMap.enabled = enhanced;
21
+ if (enhanced) {
22
+ renderer.shadowMap.type = three.PCFSoftShadowMap;
23
+ }
24
+ const bounds = presentationBounds(object, options.bounds, three);
25
+ const center = bounds.getCenter(new three.Vector3());
26
+ const size = bounds.getSize(new three.Vector3());
27
+ const radius = Math.max(size.length() * 0.5, 1);
28
+ const lighting = new three.Group();
29
+ lighting.name = `Demo3D ${enhanced ? "Enhanced" : "Standard"} Lighting`;
30
+ const hemisphere = new three.HemisphereLight(enhanced ? 0xeaf7ff : 0xeaf6ff, enhanced ? 0x17252b : 0x18272d, enhanced ? 1.25 : 1.65);
31
+ hemisphere.name = "Demo3D Hemisphere Light";
32
+ lighting.add(hemisphere);
33
+ const key = new three.DirectionalLight(0xffffff, enhanced ? 3.0 : 2.1);
34
+ key.name = "Demo3D Key Light";
35
+ key.position.copy(center).add(new three.Vector3(radius * 0.9, radius * 1.4, radius * 0.75));
36
+ key.target.position.copy(center);
37
+ lighting.add(key, key.target);
38
+ let ground;
39
+ const objectShadowStates = [];
40
+ if (enhanced) {
41
+ key.castShadow = true;
42
+ const shadowSpan = radius * 1.15;
43
+ const shadowMapSize = clampShadowMapSize(options.shadowMapSize);
44
+ key.shadow.camera.left = -shadowSpan;
45
+ key.shadow.camera.right = shadowSpan;
46
+ key.shadow.camera.top = shadowSpan;
47
+ key.shadow.camera.bottom = -shadowSpan;
48
+ key.shadow.camera.near = Math.max(radius * 0.02, 0.01);
49
+ key.shadow.camera.far = radius * 5;
50
+ key.shadow.mapSize.set(shadowMapSize, shadowMapSize);
51
+ key.shadow.bias = -0.0002;
52
+ key.shadow.normalBias = radius * 0.0004;
53
+ const fill = new three.DirectionalLight(0x9fc7e2, 0.65);
54
+ fill.name = "Demo3D Fill Light";
55
+ fill.position.copy(center).add(new three.Vector3(-radius, radius * 0.55, -radius * 0.8));
56
+ fill.target.position.copy(center);
57
+ lighting.add(fill, fill.target);
58
+ object.traverse((child) => {
59
+ const mesh = child;
60
+ if (!mesh.isMesh) {
61
+ return;
62
+ }
63
+ objectShadowStates.push({
64
+ object: child,
65
+ castShadow: child.castShadow,
66
+ receiveShadow: child.receiveShadow
67
+ });
68
+ const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];
69
+ const castsOpaqueShadow = materials.some((material) => material.visible && material.opacity >= 0.99);
70
+ child.castShadow = castsOpaqueShadow;
71
+ child.receiveShadow = castsOpaqueShadow;
72
+ });
73
+ if (options.ground !== false && !bounds.isEmpty()) {
74
+ const horizontalSize = Math.max(size.x, size.z, radius, 1) * 2.4;
75
+ const geometry = new three.PlaneGeometry(horizontalSize, horizontalSize);
76
+ const material = new three.MeshStandardMaterial({
77
+ color: options.groundColor ?? 0x294854,
78
+ roughness: 1,
79
+ metalness: 0
80
+ });
81
+ ground = new three.Mesh(geometry, material);
82
+ ground.name = "Demo3D Shadow Ground";
83
+ ground.rotation.x = -Math.PI / 2;
84
+ ground.position.set(center.x, bounds.min.y - Math.max(radius * 0.002, 0.002), center.z);
85
+ ground.receiveShadow = true;
86
+ scene.add(ground);
87
+ }
88
+ }
89
+ scene.add(lighting);
90
+ let disposed = false;
91
+ return {
92
+ mode,
93
+ lighting,
94
+ ground,
95
+ dispose() {
96
+ if (disposed) {
97
+ return;
98
+ }
99
+ disposed = true;
100
+ scene.remove(lighting);
101
+ if (enhanced) {
102
+ key.shadow.dispose();
103
+ }
104
+ if (ground) {
105
+ scene.remove(ground);
106
+ ground.geometry.dispose();
107
+ const materials = Array.isArray(ground.material) ? ground.material : [ground.material];
108
+ for (const material of materials) {
109
+ material.dispose();
110
+ }
111
+ }
112
+ for (const state of objectShadowStates) {
113
+ state.object.castShadow = state.castShadow;
114
+ state.object.receiveShadow = state.receiveShadow;
115
+ }
116
+ renderer.outputColorSpace = previousRenderer.outputColorSpace;
117
+ renderer.toneMapping = previousRenderer.toneMapping;
118
+ renderer.toneMappingExposure = previousRenderer.toneMappingExposure;
119
+ renderer.shadowMap.enabled = previousRenderer.shadowMapEnabled;
120
+ renderer.shadowMap.type = previousRenderer.shadowMapType;
121
+ }
122
+ };
123
+ }
124
+ function presentationBounds(object, supplied, three) {
125
+ const bounds = supplied?.clone() ?? new three.Box3().setFromObject(object);
126
+ if (!bounds.isEmpty()) {
127
+ return bounds;
128
+ }
129
+ return new three.Box3(new three.Vector3(-0.5, -0.5, -0.5), new three.Vector3(0.5, 0.5, 0.5));
130
+ }
131
+ function clampShadowMapSize(value) {
132
+ if (value === undefined || !Number.isFinite(value)) {
133
+ return 2048;
134
+ }
135
+ return Math.max(256, Math.min(4096, Math.round(value)));
136
+ }
137
+ //# sourceMappingURL=presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../src/three/presentation.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type * as Three from "three";
2
+ import type { Raw3DAnimation } from "../raw3d-animation.js";
2
3
  import { Raw3DMesh, Raw3DPackage, Raw3DProject } from "../raw3d.js";
4
+ import type { Raw3DStreamableTexture } from "../raw3d.js";
3
5
  export type Raw3DThreeModule = typeof Three;
4
6
  export interface Raw3DThreeWarning {
5
7
  readonly code: string;
@@ -9,9 +11,20 @@ export interface Raw3DThreeWarning {
9
11
  readonly path?: string;
10
12
  }
11
13
  export interface Raw3DThreeOptions {
14
+ /** Returned textures remain caller-owned. Use seekAsync() for time-indexed frames. */
15
+ readonly resolveStreamTexture?: (request: {
16
+ readonly index: number;
17
+ readonly time: number;
18
+ readonly source?: Raw3DStreamableTexture;
19
+ readonly signal: AbortSignal;
20
+ }) => Three.Texture | undefined | Promise<Three.Texture | undefined>;
21
+ /** Packed height channel in normal textures; opaque alpha defaults to a flat top surface. */
22
+ readonly parallaxHeightChannel?: "r" | "g" | "b" | "a";
12
23
  readonly three?: Raw3DThreeModule;
13
24
  readonly loadThree?: () => Promise<Raw3DThreeModule>;
14
25
  readonly onWarning?: (warning: Raw3DThreeWarning) => void;
26
+ /** Render CAD drawing blocks and dimension annotations. Disabled by default. */
27
+ readonly showAnnotations?: boolean;
15
28
  }
16
29
  export interface Raw3DThreeStats {
17
30
  nodes: number;
@@ -32,5 +45,19 @@ export interface Raw3DThreeScene {
32
45
  }
33
46
  export declare function createRaw3DThreeScene(parsed: Raw3DPackage | Raw3DProject, options?: Raw3DThreeOptions): Promise<Raw3DThreeScene>;
34
47
  export declare function createRaw3DThreeGroup(parsed: Raw3DPackage | Raw3DProject, options?: Raw3DThreeOptions): Promise<Three.Group>;
48
+ export interface Raw3DThreePlayback {
49
+ readonly group: Three.Group;
50
+ readonly animation: Raw3DAnimation;
51
+ readonly duration: number;
52
+ readonly state: ReturnType<Raw3DAnimation["sampleFrame"]>;
53
+ /** Apply an absolute simulation time. The host owns play/pause and its clock. */
54
+ seek(time: number): void;
55
+ /** Resolve external frames before applying time; false means a newer seek superseded this one. */
56
+ seekAsync(time: number): Promise<boolean>;
57
+ /** Release this playback's resources. The caller may then remove the group. */
58
+ dispose(): void;
59
+ }
60
+ /** Optional Three.js binding. Animation data and interpolation live in the core. */
61
+ export declare function createRaw3DThreePlayback(parsed: Raw3DPackage | Raw3DProject, options?: Raw3DThreeOptions): Promise<Raw3DThreePlayback>;
35
62
  export declare function decodeRaw3DThreeGeometry(mesh: Raw3DMesh, project: Raw3DProject, three: Raw3DThreeModule): Three.BufferGeometry;
36
63
  //# sourceMappingURL=raw3d.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"raw3d.d.ts","sourceRoot":"","sources":["../../src/three/raw3d.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,EAEL,SAAS,EACT,YAAY,EACZ,YAAY,EAGb,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,gBAAgB,GAAG,OAAO,KAAK,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,YAAY,GAAG,YAAY,EACnC,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,YAAY,GAAG,YAAY,EACnC,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAuKtB;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,gBAAgB,GACtB,KAAK,CAAC,cAAc,CAuFtB"}
1
+ {"version":3,"file":"raw3d.d.ts","sourceRoot":"","sources":["../../src/three/raw3d.ts"],"names":[],"mappings":"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"}