@jfk-solutions/demo3d-file-format 1.8.0 → 1.10.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 (75) hide show
  1. package/README.md +225 -0
  2. package/dist/examples/export-embedded-viewer-standalone.html +1 -1
  3. package/dist/examples/three-render-smoke-standalone.html +295 -231
  4. package/dist/index.d.ts +8 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +7 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/model.d.ts +1 -0
  9. package/dist/model.d.ts.map +1 -1
  10. package/dist/model.js +6 -0
  11. package/dist/model.js.map +1 -1
  12. package/dist/raw3d-animation.d.ts +63 -0
  13. package/dist/raw3d-animation.d.ts.map +1 -0
  14. package/dist/raw3d-animation.js +200 -0
  15. package/dist/raw3d-animation.js.map +1 -0
  16. package/dist/raw3d-effects.d.ts +66 -0
  17. package/dist/raw3d-effects.d.ts.map +1 -0
  18. package/dist/raw3d-effects.js +172 -0
  19. package/dist/raw3d-effects.js.map +1 -0
  20. package/dist/raw3d-skinning.d.ts +8 -0
  21. package/dist/raw3d-skinning.d.ts.map +1 -0
  22. package/dist/raw3d-skinning.js +37 -0
  23. package/dist/raw3d-skinning.js.map +1 -0
  24. package/dist/raw3d.d.ts +77 -2
  25. package/dist/raw3d.d.ts.map +1 -1
  26. package/dist/raw3d.js +103 -7
  27. package/dist/raw3d.js.map +1 -1
  28. package/dist/rigid-interpolation.d.ts +16 -0
  29. package/dist/rigid-interpolation.d.ts.map +1 -0
  30. package/dist/rigid-interpolation.js +52 -0
  31. package/dist/rigid-interpolation.js.map +1 -0
  32. package/dist/three/backend.d.ts +13 -0
  33. package/dist/three/backend.d.ts.map +1 -0
  34. package/dist/three/backend.js +9 -0
  35. package/dist/three/backend.js.map +1 -0
  36. package/dist/three/effects.d.ts +7 -0
  37. package/dist/three/effects.d.ts.map +1 -0
  38. package/dist/three/effects.js +127 -0
  39. package/dist/three/effects.js.map +1 -0
  40. package/dist/three/index.d.ts +2 -1
  41. package/dist/three/index.d.ts.map +1 -1
  42. package/dist/three/index.js +72 -14
  43. package/dist/three/index.js.map +1 -1
  44. package/dist/three/native-lighting.d.ts +5 -0
  45. package/dist/three/native-lighting.d.ts.map +1 -0
  46. package/dist/three/native-lighting.js +86 -0
  47. package/dist/three/native-lighting.js.map +1 -0
  48. package/dist/three/parallax.d.ts +5 -0
  49. package/dist/three/parallax.d.ts.map +1 -0
  50. package/dist/three/parallax.js +63 -0
  51. package/dist/three/parallax.js.map +1 -0
  52. package/dist/three/raw3d.d.ts +25 -0
  53. package/dist/three/raw3d.d.ts.map +1 -1
  54. package/dist/three/raw3d.js +404 -16
  55. package/dist/three/raw3d.js.map +1 -1
  56. package/dist/three/renderer.d.ts.map +1 -1
  57. package/dist/three/renderer.js +3 -0
  58. package/dist/three/renderer.js.map +1 -1
  59. package/dist/three/skinning.d.ts +11 -0
  60. package/dist/three/skinning.d.ts.map +1 -0
  61. package/dist/three/skinning.js +92 -0
  62. package/dist/three/skinning.js.map +1 -0
  63. package/dist/three/tsl.d.ts +60 -0
  64. package/dist/three/tsl.d.ts.map +1 -0
  65. package/dist/three/tsl.js +3 -0
  66. package/dist/three/tsl.js.map +1 -0
  67. package/dist/three/webgpu-native.d.ts +3 -0
  68. package/dist/three/webgpu-native.d.ts.map +1 -0
  69. package/dist/three/webgpu-native.js +58 -0
  70. package/dist/three/webgpu-native.js.map +1 -0
  71. package/dist/three/webgpu-relief.d.ts +3 -0
  72. package/dist/three/webgpu-relief.d.ts.map +1 -0
  73. package/dist/three/webgpu-relief.js +61 -0
  74. package/dist/three/webgpu-relief.js.map +1 -0
  75. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
+ export { configureRaw3DWebGPURenderer } from "./backend.js";
1
2
  import { Demo3DConveyorSideProperties, Demo3DDimensionAspect, Demo3DDimensionPoint, Demo3DExtrusionPolygon, Demo3DExtrusionProfile, Demo3DMaterial, Demo3DMesh, Demo3DPackage, Demo3DPointCloud, Demo3DProject, Demo3DPhotoEye, Demo3DResource, Demo3DSupportStand, Demo3DVisual } from "../model.js";
2
3
  import { Demo3DBinaryBlock, Demo3DXmlElement } from "../xml.js";
3
- export { createRaw3DThreeGroup, createRaw3DThreeScene, decodeRaw3DThreeGeometry } from "./raw3d.js";
4
+ export { createRaw3DThreeGroup, createRaw3DThreePlayback, createRaw3DThreeScene, decodeRaw3DThreeGeometry } from "./raw3d.js";
4
5
  export { createDemo3DThreeRenderer } from "./renderer.js";
5
6
  export { applyDemo3DThreeRenderMode } from "./presentation.js";
6
7
  export async function createDemo3DThreeScene(parsed, options = {}) {
@@ -96,6 +97,8 @@ export function decodeDemo3DThreeGeometry(mesh, three) {
96
97
  const positions = new Float32Array(vertexCount * 3);
97
98
  const normals = layout.normalOffset === undefined ? undefined : new Float32Array(vertexCount * 3);
98
99
  const uvs = layout.uvOffset === undefined ? undefined : new Float32Array(vertexCount * 2);
100
+ const tangents = layout.tangentOffset === undefined ? undefined : new Float32Array(vertexCount * 4);
101
+ const colors = layout.colorOffset === undefined ? undefined : new Float32Array(vertexCount * 4);
99
102
  for (let vertexIndex = 0; vertexIndex < vertexCount; vertexIndex += 1) {
100
103
  const base = vertexIndex * layout.stride;
101
104
  positions[vertexIndex * 3] = view.getFloat32(base, true);
@@ -110,6 +113,17 @@ export function decodeDemo3DThreeGeometry(mesh, three) {
110
113
  uvs[vertexIndex * 2] = view.getFloat32(base + layout.uvOffset, true);
111
114
  uvs[vertexIndex * 2 + 1] = view.getFloat32(base + layout.uvOffset + 4, true);
112
115
  }
116
+ if (tangents && layout.tangentOffset !== undefined) {
117
+ for (let component = 0; component < 4; component++) {
118
+ tangents[vertexIndex * 4 + component] = view.getFloat32(base + layout.tangentOffset + component * 4, true);
119
+ }
120
+ }
121
+ if (colors && layout.colorOffset !== undefined) {
122
+ const argb = view.getUint32(base + layout.colorOffset, true);
123
+ for (let component = 0; component < 4; component++) {
124
+ colors[vertexIndex * 4 + component] = ((argb >>> [16, 8, 0, 24][component]) & 255) / 255;
125
+ }
126
+ }
113
127
  }
114
128
  const geometry = new three.BufferGeometry();
115
129
  geometry.setAttribute("position", new three.BufferAttribute(positions, 3));
@@ -119,6 +133,10 @@ export function decodeDemo3DThreeGeometry(mesh, three) {
119
133
  if (uvs) {
120
134
  geometry.setAttribute("uv", new three.BufferAttribute(uvs, 2));
121
135
  }
136
+ if (tangents)
137
+ geometry.setAttribute("tangent", new three.BufferAttribute(tangents, 4));
138
+ if (colors)
139
+ geometry.setAttribute("color", new three.BufferAttribute(colors, 4));
122
140
  if (mesh.indices) {
123
141
  geometry.setIndex(new three.BufferAttribute(readIndexBuffer(mesh.indices, mesh.indexFormat), 1));
124
142
  }
@@ -1942,9 +1960,15 @@ function createMeshObject(meshId, source, materialSelection, state) {
1942
1960
  ? createPlaceholderMesh(sourceId ?? meshId, meshId, primaryMaterial, state)
1943
1961
  : undefined;
1944
1962
  }
1963
+ const colors = geometry.getAttribute("color");
1964
+ let vertexAlpha = false;
1965
+ if (colors?.itemSize === 4) {
1966
+ for (let index = 0; index < colors.count; index++)
1967
+ vertexAlpha ||= colors.getW(index) < 1;
1968
+ }
1945
1969
  const threeMaterial = materials.length > 1
1946
- ? materials.map((material) => getMaterial(material, state))
1947
- : getMaterial(primaryMaterial, state);
1970
+ ? materials.map((material) => getMaterial(material, state, !!colors, vertexAlpha))
1971
+ : getMaterial(primaryMaterial, state, !!colors, vertexAlpha);
1948
1972
  const object = new state.three.Mesh(geometry, threeMaterial);
1949
1973
  object.name = source instanceof Demo3DVisual ? source.displayName ?? meshId : meshId;
1950
1974
  object.userData.demo3d = {
@@ -2111,23 +2135,37 @@ function primitiveGeometryKey(type, renderable) {
2111
2135
  ];
2112
2136
  return `primitive:${type ?? "unknown"}:${fields.map((field) => renderable.textOf(field) ?? "").join("|")}`;
2113
2137
  }
2114
- function getMaterial(material, state) {
2115
- if (!material) {
2138
+ function getMaterial(material, state, vertexColors = false, vertexAlpha = false) {
2139
+ if (!material && !vertexColors) {
2116
2140
  return state.defaultMaterial;
2117
2141
  }
2118
- const textureReference = material.textureReference;
2142
+ const textureReference = material?.textureReference;
2143
+ const normalTextureReference = material?.normalTextureReference;
2119
2144
  const key = [
2120
2145
  "material",
2121
- String(material.diffuse ?? "default"),
2122
- String(material.transparency ?? 0),
2123
- String(material.reflectivity ?? 0),
2124
- textureReference ?? ""
2146
+ String(material?.diffuse ?? "default"),
2147
+ String(material?.transparency ?? 0),
2148
+ String(material?.reflectivity ?? 0),
2149
+ textureReference ?? "",
2150
+ normalTextureReference ?? "",
2151
+ String(vertexColors),
2152
+ String(vertexAlpha)
2125
2153
  ].join(":");
2126
2154
  const cached = state.materialCache.get(key);
2127
2155
  if (cached) {
2128
2156
  return cached;
2129
2157
  }
2130
2158
  const created = createDemo3DThreeMaterial(material, state.three);
2159
+ if (vertexColors) {
2160
+ const standard = created;
2161
+ standard.vertexColors = true;
2162
+ if (material?.diffuse === undefined)
2163
+ standard.color.setHex(0xffffff);
2164
+ if (vertexAlpha) {
2165
+ standard.transparent = true;
2166
+ standard.depthWrite = false;
2167
+ }
2168
+ }
2131
2169
  const texture = textureReference ? getTexture(textureReference, state) : undefined;
2132
2170
  if (texture && "map" in created) {
2133
2171
  const standard = created;
@@ -2138,6 +2176,11 @@ function getMaterial(material, state) {
2138
2176
  }
2139
2177
  created.needsUpdate = true;
2140
2178
  }
2179
+ const normalMap = normalTextureReference ? getTexture(normalTextureReference, state, true) : undefined;
2180
+ if (normalMap && "normalMap" in created) {
2181
+ created.normalMap = normalMap;
2182
+ created.needsUpdate = true;
2183
+ }
2141
2184
  state.materialCache.set(key, created);
2142
2185
  state.stats.materials += 1;
2143
2186
  return created;
@@ -2197,8 +2240,9 @@ function primaryMaterial(visual) {
2197
2240
  visual.xml;
2198
2241
  return firstMaterial(materialNode) ?? visual.materials[0];
2199
2242
  }
2200
- function getTexture(textureReference, state) {
2201
- const cached = state.textureCache.get(textureReference);
2243
+ function getTexture(textureReference, state, normalMap = false) {
2244
+ const key = `${normalMap ? "normal" : "color"}:${textureReference}`;
2245
+ const cached = state.textureCache.get(key);
2202
2246
  if (cached) {
2203
2247
  return cached;
2204
2248
  }
@@ -2208,13 +2252,13 @@ function getTexture(textureReference, state) {
2208
2252
  }
2209
2253
  const texture = new state.three.TextureLoader().load(`data:${image.mimeType};base64,${image.base64}`);
2210
2254
  if ("SRGBColorSpace" in state.three) {
2211
- texture.colorSpace = state.three.SRGBColorSpace;
2255
+ texture.colorSpace = normalMap ? state.three.NoColorSpace : state.three.SRGBColorSpace;
2212
2256
  }
2213
2257
  texture.name = image.name ?? image.id;
2214
2258
  // Demo3D's generated primitive UVs use the conventional bottom-left texture
2215
2259
  // origin expected by Three's TextureLoader.
2216
2260
  texture.flipY = true;
2217
- state.textureCache.set(textureReference, texture);
2261
+ state.textureCache.set(key, texture);
2218
2262
  state.stats.textures += 1;
2219
2263
  return texture;
2220
2264
  }
@@ -2691,10 +2735,18 @@ function vertexLayout(vertexFormat) {
2691
2735
  switch (vertexFormat) {
2692
2736
  case "Position":
2693
2737
  return { stride: 12 };
2738
+ case "PositionColor":
2739
+ return { stride: 16, colorOffset: 12 };
2740
+ case "PositionTexture":
2741
+ return { stride: 20, uvOffset: 12 };
2694
2742
  case "PositionNormal":
2695
2743
  return { stride: 24, normalOffset: 12 };
2744
+ case "PositionNormalColor":
2745
+ return { stride: 28, normalOffset: 12, colorOffset: 24 };
2696
2746
  case "PositionNormalTexture":
2697
2747
  return { stride: 32, normalOffset: 12, uvOffset: 24 };
2748
+ case "PositionNormalTextureTangent":
2749
+ return { stride: 48, normalOffset: 12, uvOffset: 24, tangentOffset: 32 };
2698
2750
  default:
2699
2751
  throw new Error(`Unsupported Demo3D vertex format: ${vertexFormat}`);
2700
2752
  }
@@ -2754,6 +2806,12 @@ function applyDemo3DTransform(object, transformText) {
2754
2806
  }
2755
2807
  function convertTriangleGeometryToThreeCoordinates(geometry) {
2756
2808
  geometry.scale(1, 1, -1);
2809
+ // Reflection changes tangent-space handedness as well as the tangent direction.
2810
+ const tangent = geometry.getAttribute("tangent");
2811
+ if (tangent?.itemSize === 4) {
2812
+ for (let index = 0; index < tangent.count; index++)
2813
+ tangent.setW(index, -tangent.getW(index));
2814
+ }
2757
2815
  const index = geometry.getIndex();
2758
2816
  if (index) {
2759
2817
  const values = index.array;