@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.
- package/README.md +225 -0
- package/dist/examples/export-embedded-viewer-standalone.html +1 -1
- package/dist/examples/three-render-smoke-standalone.html +295 -231
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +1 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -0
- package/dist/model.js.map +1 -1
- package/dist/raw3d-animation.d.ts +63 -0
- package/dist/raw3d-animation.d.ts.map +1 -0
- package/dist/raw3d-animation.js +200 -0
- package/dist/raw3d-animation.js.map +1 -0
- package/dist/raw3d-effects.d.ts +66 -0
- package/dist/raw3d-effects.d.ts.map +1 -0
- package/dist/raw3d-effects.js +172 -0
- package/dist/raw3d-effects.js.map +1 -0
- package/dist/raw3d-skinning.d.ts +8 -0
- package/dist/raw3d-skinning.d.ts.map +1 -0
- package/dist/raw3d-skinning.js +37 -0
- package/dist/raw3d-skinning.js.map +1 -0
- package/dist/raw3d.d.ts +77 -2
- package/dist/raw3d.d.ts.map +1 -1
- package/dist/raw3d.js +103 -7
- package/dist/raw3d.js.map +1 -1
- package/dist/rigid-interpolation.d.ts +16 -0
- package/dist/rigid-interpolation.d.ts.map +1 -0
- package/dist/rigid-interpolation.js +52 -0
- package/dist/rigid-interpolation.js.map +1 -0
- package/dist/three/backend.d.ts +13 -0
- package/dist/three/backend.d.ts.map +1 -0
- package/dist/three/backend.js +9 -0
- package/dist/three/backend.js.map +1 -0
- package/dist/three/effects.d.ts +7 -0
- package/dist/three/effects.d.ts.map +1 -0
- package/dist/three/effects.js +127 -0
- package/dist/three/effects.js.map +1 -0
- package/dist/three/index.d.ts +2 -1
- package/dist/three/index.d.ts.map +1 -1
- package/dist/three/index.js +72 -14
- package/dist/three/index.js.map +1 -1
- package/dist/three/native-lighting.d.ts +5 -0
- package/dist/three/native-lighting.d.ts.map +1 -0
- package/dist/three/native-lighting.js +86 -0
- package/dist/three/native-lighting.js.map +1 -0
- package/dist/three/parallax.d.ts +5 -0
- package/dist/three/parallax.d.ts.map +1 -0
- package/dist/three/parallax.js +63 -0
- package/dist/three/parallax.js.map +1 -0
- package/dist/three/raw3d.d.ts +25 -0
- package/dist/three/raw3d.d.ts.map +1 -1
- package/dist/three/raw3d.js +404 -16
- package/dist/three/raw3d.js.map +1 -1
- package/dist/three/renderer.d.ts.map +1 -1
- package/dist/three/renderer.js +3 -0
- package/dist/three/renderer.js.map +1 -1
- package/dist/three/skinning.d.ts +11 -0
- package/dist/three/skinning.d.ts.map +1 -0
- package/dist/three/skinning.js +92 -0
- package/dist/three/skinning.js.map +1 -0
- package/dist/three/tsl.d.ts +60 -0
- package/dist/three/tsl.d.ts.map +1 -0
- package/dist/three/tsl.js +3 -0
- package/dist/three/tsl.js.map +1 -0
- package/dist/three/webgpu-native.d.ts +3 -0
- package/dist/three/webgpu-native.d.ts.map +1 -0
- package/dist/three/webgpu-native.js +58 -0
- package/dist/three/webgpu-native.js.map +1 -0
- package/dist/three/webgpu-relief.d.ts +3 -0
- package/dist/three/webgpu-relief.d.ts.map +1 -0
- package/dist/three/webgpu-relief.js +61 -0
- package/dist/three/webgpu-relief.js.map +1 -0
- package/package.json +1 -1
package/dist/three/index.js
CHANGED
|
@@ -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
|
|
2142
|
+
const textureReference = material?.textureReference;
|
|
2143
|
+
const normalTextureReference = material?.normalTextureReference;
|
|
2119
2144
|
const key = [
|
|
2120
2145
|
"material",
|
|
2121
|
-
String(material
|
|
2122
|
-
String(material
|
|
2123
|
-
String(material
|
|
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
|
|
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(
|
|
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;
|