lecodes-gl-lite 2.0.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 +27 -0
- package/package.json +33 -0
- package/src/assets/decoders/README.md +13 -0
- package/src/assets/decoders/basis_transcoder.js +19 -0
- package/src/assets/decoders/basis_transcoder.wasm +0 -0
- package/src/assets/decoders/draco_decoder.wasm +0 -0
- package/src/assets/decoders/draco_wasm_wrapper.js +117 -0
- package/src/assets/neutral_ibl128.ktx +0 -0
- package/src/core/animBridge.ts +51 -0
- package/src/core/boneNames.ts +22 -0
- package/src/core/frame.ts +230 -0
- package/src/core/glbStructure.ts +100 -0
- package/src/core/headlessBridge.ts +92 -0
- package/src/core/mapView.ts +195 -0
- package/src/core/math3d.ts +275 -0
- package/src/core/particleBridge.ts +154 -0
- package/src/core/physicsBridge.ts +305 -0
- package/src/core/recording.ts +59 -0
- package/src/core/sceneCore.ts +833 -0
- package/src/core/serialize.ts +144 -0
- package/src/gen/unsupported.gen.ts +212 -0
- package/src/index.ts +5 -0
- package/src/vendor/creator-anim/dist/creatorAnim.d.ts +123 -0
- package/src/vendor/creator-anim/dist/creatorAnim.js +14 -0
- package/src/vendor/creator-anim/js/index.ts +656 -0
- package/src/vendor/creator-nav/dist/creatorNav.d.ts +56 -0
- package/src/vendor/creator-nav/dist/creatorNav.js +14 -0
- package/src/vendor/creator-nav/js/index.ts +400 -0
- package/src/vendor/creator-particles/dist/creatorParticles.d.ts +43 -0
- package/src/vendor/creator-particles/dist/creatorParticles.js +14 -0
- package/src/vendor/creator-particles/js/index.ts +137 -0
- package/src/vendor/creator-physics/dist/creatorPhysics.d.ts +107 -0
- package/src/vendor/creator-physics/dist/creatorPhysics.js +14 -0
- package/src/vendor/creator-physics/js/index.ts +515 -0
- package/src/vite-env.d.ts +1 -0
- package/src/webgl/batching.ts +453 -0
- package/src/webgl/createViewerLite.ts +1627 -0
- package/src/webgl/customMaterial.ts +228 -0
- package/src/webgl/decoders/basis.ts +123 -0
- package/src/webgl/decoders/draco.ts +110 -0
- package/src/webgl/decoders/index.ts +68 -0
- package/src/webgl/decoders/worker.ts +45 -0
- package/src/webgl/editor.ts +1297 -0
- package/src/webgl/glb.ts +593 -0
- package/src/webgl/ibl.ts +137 -0
- package/src/webgl/shaders.ts +779 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// scene3d JSON serializer for the lite 3D scene core. Reads ONLY core state (entities, scenes,
|
|
2
|
+
// materials, textures + the animation clock) and the headless physics config, and produces the
|
|
3
|
+
// semantic tree `lecodes render` emits as `scene3d`. Additive changes vs. the old Scene3dRecorder
|
|
4
|
+
// serializer: the camera fov is the core's real value (60, not 45), and a playing animation reports
|
|
5
|
+
// its clock `time` alongside `clip`/`speed`. Everything else in the shape is preserved
|
|
6
|
+
// (tests/frame.test.ts pins the `frame` section; the whole-shape spec went with runtime/headless's
|
|
7
|
+
// JS-tree tests).
|
|
8
|
+
|
|
9
|
+
import { getEulerYXZDeg, getScale } from "./math3d"
|
|
10
|
+
import { computeFrame } from "./frame"
|
|
11
|
+
import type { SceneCore, SceneRec, UniformRec } from "./sceneCore"
|
|
12
|
+
|
|
13
|
+
const round = (v: number, digits = 4): number => {
|
|
14
|
+
const f = 10 ** digits
|
|
15
|
+
const r = Math.round(v * f) / f
|
|
16
|
+
return r === 0 ? 0 : r // normalize -0
|
|
17
|
+
}
|
|
18
|
+
const roundVec = (v: ArrayLike<number>, digits = 4): number[] => Array.from(v, (x) => round(x, digits))
|
|
19
|
+
|
|
20
|
+
const hex = (packed: number, alpha: boolean): string =>
|
|
21
|
+
"#" + (packed >>> 0).toString(16).padStart(alpha ? 8 : 6, "0")
|
|
22
|
+
|
|
23
|
+
export function serialize(core: SceneCore, physicsConfig?: Record<string, unknown>): unknown {
|
|
24
|
+
const { entities, scenes, materials, textures, worldMatrixF } = core
|
|
25
|
+
|
|
26
|
+
const uniformValue = (u: UniformRec): unknown => {
|
|
27
|
+
switch (u.kind) {
|
|
28
|
+
case "rgb": return hex(u.v, false)
|
|
29
|
+
case "rgba": return hex(u.v, true)
|
|
30
|
+
case "texture": return textures.get(u.v)?.source ?? `texture#${u.v}`
|
|
31
|
+
case "null": return null
|
|
32
|
+
default: return u.v
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const serializeMaterial = (id: number): Record<string, unknown> | undefined => {
|
|
37
|
+
const m = materials.get(id)
|
|
38
|
+
if (!m) return undefined
|
|
39
|
+
const out: Record<string, unknown> = { shader: m.shader.replace(/\.filamat$/, "") }
|
|
40
|
+
for (const [k, u] of Object.entries(m.uniforms)) out[k] = uniformValue(u)
|
|
41
|
+
return out
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const serializeNode = (id: number): Record<string, unknown> => {
|
|
45
|
+
const e = core.ent(id)
|
|
46
|
+
const w = e.m
|
|
47
|
+
const pos = roundVec([w[12], w[13], w[14]])
|
|
48
|
+
const rot = getEulerYXZDeg(w).map((v) => round(v, 2))
|
|
49
|
+
const scl = getScale(w).map((v) => round(v, 4))
|
|
50
|
+
const kind = e.light ? "light" : e.model ? "model" : e.mesh ? "mesh" : e.particles ? "particles" : e.anchor ? "anchor" : "node"
|
|
51
|
+
|
|
52
|
+
const out: Record<string, unknown> = {}
|
|
53
|
+
if (e.name) out.name = e.name
|
|
54
|
+
out.kind = kind
|
|
55
|
+
if (pos.some((v) => v !== 0)) out.position = pos
|
|
56
|
+
if (rot.some((v) => v !== 0)) out.rotation = rot
|
|
57
|
+
if (scl.some((v) => v !== 1)) out.scale = scl
|
|
58
|
+
if (!e.visible) out.visible = false
|
|
59
|
+
|
|
60
|
+
if (e.mesh) {
|
|
61
|
+
const mesh: Record<string, unknown> = { type: e.mesh.kind === 1 ? "edges" : e.mesh.kind === 2 ? "vertices" : "triangles" }
|
|
62
|
+
if (e.mesh.size) mesh.size = roundVec(e.mesh.size)
|
|
63
|
+
if (e.mesh.center?.some((v) => round(v) !== 0)) mesh.center = roundVec(e.mesh.center)
|
|
64
|
+
out.mesh = mesh
|
|
65
|
+
const mat = serializeMaterial(e.materials[0])
|
|
66
|
+
if (mat) out.material = mat
|
|
67
|
+
}
|
|
68
|
+
if (e.model) {
|
|
69
|
+
out.model = {
|
|
70
|
+
...(e.model.source && { source: e.model.source }),
|
|
71
|
+
...(!e.model.loaded && { loaded: false }),
|
|
72
|
+
animations: e.model.animations.map((a) => ({ name: a.name, duration: round(a.duration, 2) })),
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (e.light) {
|
|
76
|
+
out.light = {
|
|
77
|
+
type: "sun",
|
|
78
|
+
direction: roundVec(e.light.direction),
|
|
79
|
+
intensity: e.light.intensity,
|
|
80
|
+
color: hex(e.light.color, false),
|
|
81
|
+
shadows: e.light.shadowsQuality,
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (e.particles) out.particles = e.particles
|
|
85
|
+
if (e.physics) out.physics = e.physics
|
|
86
|
+
if (e.ragdoll) out.ragdoll = e.ragdoll
|
|
87
|
+
if (e.collider) out.collider = e.collider
|
|
88
|
+
if (e.castShadows !== undefined) out.castShadows = e.castShadows
|
|
89
|
+
if (e.receiveShadows !== undefined) out.receiveShadows = e.receiveShadows
|
|
90
|
+
if (e.anchor) out.anchor = e.anchor
|
|
91
|
+
|
|
92
|
+
if (e.children.length > 0) out.children = e.children.map(serializeNode)
|
|
93
|
+
return out
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const serializeScene = (s: SceneRec): Record<string, unknown> => {
|
|
97
|
+
// Roots: scene members that don't sit under another member (those appear as children).
|
|
98
|
+
const isUnderMember = (id: number): boolean => {
|
|
99
|
+
for (let p = core.ent(id).parent; p !== 0; p = core.ent(p).parent) if (s.entities.has(p)) return true
|
|
100
|
+
return false
|
|
101
|
+
}
|
|
102
|
+
const roots = [...s.entities].filter((id) => entities.has(id) && !isUnderMember(id))
|
|
103
|
+
|
|
104
|
+
const out: Record<string, unknown> = {}
|
|
105
|
+
if (s.arMode) out.ar = { mode: s.arMode }
|
|
106
|
+
if (s.skybox !== undefined) out.skybox = hex(s.skybox, false)
|
|
107
|
+
if (s.ibl !== undefined) out.environment = { intensity: s.ibl }
|
|
108
|
+
if (s.bloom) out.bloom = s.bloom
|
|
109
|
+
const override = core.cameraOverride()
|
|
110
|
+
if (override) {
|
|
111
|
+
// An inspection camera (host tooling) owns the reported view; the app's camera entity is
|
|
112
|
+
// untouched, so say so — a reader must not take these numbers for the app's camera.
|
|
113
|
+
out.camera = {
|
|
114
|
+
position: roundVec(override.eye),
|
|
115
|
+
lookAt: roundVec(override.target),
|
|
116
|
+
fov: override.fov ?? core.projectionOf(s.id).fov,
|
|
117
|
+
inspection: true,
|
|
118
|
+
}
|
|
119
|
+
} else if (s.camera !== undefined && entities.has(s.camera)) {
|
|
120
|
+
const w = worldMatrixF(s.camera)
|
|
121
|
+
const rot = getEulerYXZDeg(w).map((v) => round(v, 2))
|
|
122
|
+
out.camera = {
|
|
123
|
+
position: roundVec([w[12], w[13], w[14]]),
|
|
124
|
+
...(rot.some((v) => v !== 0) && { rotation: rot }),
|
|
125
|
+
fov: core.projectionOf(s.id).fov,
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (physicsConfig) out.physics = physicsConfig
|
|
129
|
+
out.nodes = roots.map(serializeNode)
|
|
130
|
+
if (s.overlays.length > 0) {
|
|
131
|
+
out.overlays = s.overlays.map((id) => scenes.get(id)).filter(Boolean).map((o) => serializeScene(o!))
|
|
132
|
+
}
|
|
133
|
+
return out
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const scene = scenes.get(core.activeSceneId()) ?? [...scenes.values()].find((s) => s.overlayOf === undefined)
|
|
137
|
+
if (!scene) return null
|
|
138
|
+
const result = serializeScene(scene)
|
|
139
|
+
// Screen-space view (active scene + overlays) — present only when the scene has a camera to project
|
|
140
|
+
// through. Deliberately additive: makes the world-space tree *evaluable* without re-doing camera math.
|
|
141
|
+
const frame = computeFrame(core, scene)
|
|
142
|
+
if (frame) result.frame = frame
|
|
143
|
+
return result
|
|
144
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// GENERATED by scripts/gen-bridges.ts from sdk/src/bridges/gl.d.ts — do not edit.
|
|
2
|
+
// The completeness layer of the lite 3D engine (gl-lite): a warn-once stub for each of the 190 required
|
|
3
|
+
// methods of _creator. The engine spreads `...unsupported` UNDER its own methods and checks the result
|
|
4
|
+
// `satisfies typeof _creator`: a contract method it does not implement is an honest stub (a warning,
|
|
5
|
+
// then the type's zero), a method it implements with the wrong signature is a type error.
|
|
6
|
+
import type { ClipInfo } from "lecodes-sdk/bridges/gl"
|
|
7
|
+
|
|
8
|
+
const $warned = new Set<string>()
|
|
9
|
+
const $warn = (name: string) => {
|
|
10
|
+
if ($warned.has(name)) return
|
|
11
|
+
$warned.add(name)
|
|
12
|
+
console.warn(`[gl-lite] ${name}: not supported by the lite 3D engine`)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const unsupported = {
|
|
16
|
+
createEngine(): void { $warn("createEngine") },
|
|
17
|
+
createScene(): number { $warn("createScene"); return 0 },
|
|
18
|
+
createOverlayScene(): number { $warn("createOverlayScene"); return 0 },
|
|
19
|
+
createGLView(): void { $warn("createGLView") },
|
|
20
|
+
openScene(): void { $warn("openScene") },
|
|
21
|
+
closeScene(): void { $warn("closeScene") },
|
|
22
|
+
launchAR(): void { $warn("launchAR") },
|
|
23
|
+
stopAR(): void { $warn("stopAR") },
|
|
24
|
+
launchVR(): void { $warn("launchVR") },
|
|
25
|
+
stopVR(): void { $warn("stopVR") },
|
|
26
|
+
addEntityToScene(): void { $warn("addEntityToScene") },
|
|
27
|
+
removeEntityFromScene(): void { $warn("removeEntityFromScene") },
|
|
28
|
+
warmRender(): void { $warn("warmRender") },
|
|
29
|
+
createEntity(): { id: number } { $warn("createEntity"); return { id: 0 } },
|
|
30
|
+
cloneEntity(): { id: number } { $warn("cloneEntity"); return { id: 0 } },
|
|
31
|
+
destroyEntity(): void { $warn("destroyEntity") },
|
|
32
|
+
entityIsOwned(): boolean { $warn("entityIsOwned"); return false },
|
|
33
|
+
setMatrix(): void { $warn("setMatrix") },
|
|
34
|
+
setWorldMatrix(): void { $warn("setWorldMatrix") },
|
|
35
|
+
getChildCount(): number { $warn("getChildCount"); return 0 },
|
|
36
|
+
getChild(): number { $warn("getChild"); return 0 },
|
|
37
|
+
setPosition(): void { $warn("setPosition") },
|
|
38
|
+
setQuaternion(): void { $warn("setQuaternion") },
|
|
39
|
+
setEulerAngles(): void { $warn("setEulerAngles") },
|
|
40
|
+
setScale(): void { $warn("setScale") },
|
|
41
|
+
setParent(): void { $warn("setParent") },
|
|
42
|
+
setParentNull(): void { $warn("setParentNull") },
|
|
43
|
+
getParent(): number { $warn("getParent"); return 0 },
|
|
44
|
+
traverse(): void { $warn("traverse") },
|
|
45
|
+
createSunLight(): void { $warn("createSunLight") },
|
|
46
|
+
setDefaultIbl(): void { $warn("setDefaultIbl") },
|
|
47
|
+
setBloomOptions(): void { $warn("setBloomOptions") },
|
|
48
|
+
setSkybox(): void { $warn("setSkybox") },
|
|
49
|
+
setSceneMultiSampleAntiAliasing(): void { $warn("setSceneMultiSampleAntiAliasing") },
|
|
50
|
+
setMaterialGlobalParameter(): void { $warn("setMaterialGlobalParameter") },
|
|
51
|
+
getCameraFov(): number { $warn("getCameraFov"); return 0 },
|
|
52
|
+
getMatrix(): void { $warn("getMatrix") },
|
|
53
|
+
getWorldMatrix(): void { $warn("getWorldMatrix") },
|
|
54
|
+
getWorldPosition(): void { $warn("getWorldPosition") },
|
|
55
|
+
getWorldDirection(): void { $warn("getWorldDirection") },
|
|
56
|
+
getWorldMatrixInverse(): void { $warn("getWorldMatrixInverse") },
|
|
57
|
+
getCameraViewDirection(): void { $warn("getCameraViewDirection") },
|
|
58
|
+
setMesh(): void { $warn("setMesh") },
|
|
59
|
+
createInstancedMesh(): void { $warn("createInstancedMesh") },
|
|
60
|
+
setInstanceTransforms(): void { $warn("setInstanceTransforms") },
|
|
61
|
+
setInstancedMeshMaterial(): void { $warn("setInstancedMeshMaterial") },
|
|
62
|
+
setInstancedMeshShadows(): void { $warn("setInstancedMeshShadows") },
|
|
63
|
+
setCulling(): void { $warn("setCulling") },
|
|
64
|
+
setCastShadows(): void { $warn("setCastShadows") },
|
|
65
|
+
setReceiveShadows(): void { $warn("setReceiveShadows") },
|
|
66
|
+
createTexture(): void { $warn("createTexture") },
|
|
67
|
+
createTextureFromCanvas(): number { $warn("createTextureFromCanvas"); return 0 },
|
|
68
|
+
updateTextureFromCanvas(): void { $warn("updateTextureFromCanvas") },
|
|
69
|
+
createMaterial(): { id: number } { $warn("createMaterial"); return { id: 0 } },
|
|
70
|
+
builtinMaterial(): { id: number } | null { $warn("builtinMaterial"); return null },
|
|
71
|
+
setMaterial(): void { $warn("setMaterial") },
|
|
72
|
+
getMaterial(): number { $warn("getMaterial"); return 0 },
|
|
73
|
+
setUniformRgb(): void { $warn("setUniformRgb") },
|
|
74
|
+
setUniformRgba(): void { $warn("setUniformRgba") },
|
|
75
|
+
setUniformFloat(): void { $warn("setUniformFloat") },
|
|
76
|
+
setUniformBoolean(): void { $warn("setUniformBoolean") },
|
|
77
|
+
setUniformTexture(): void { $warn("setUniformTexture") },
|
|
78
|
+
setUniformArray(): void { $warn("setUniformArray") },
|
|
79
|
+
setUniformNull(): void { $warn("setUniformNull") },
|
|
80
|
+
attachCameraToAR(): void { $warn("attachCameraToAR") },
|
|
81
|
+
getDisplaySize(): Float32Array { $warn("getDisplaySize"); return new Float32Array(0) },
|
|
82
|
+
setVisible(): void { $warn("setVisible") },
|
|
83
|
+
isVisible(): boolean { $warn("isVisible"); return false },
|
|
84
|
+
createGlb(): void { $warn("createGlb") },
|
|
85
|
+
setGlbCulling(): void { $warn("setGlbCulling") },
|
|
86
|
+
setEarlyUpdate(): void { $warn("setEarlyUpdate") },
|
|
87
|
+
setLateUpdate(): void { $warn("setLateUpdate") },
|
|
88
|
+
setOnPhysicsEvent(): void { $warn("setOnPhysicsEvent") },
|
|
89
|
+
loadClips(): void { $warn("loadClips") },
|
|
90
|
+
createClipFromTracks(): number { $warn("createClipFromTracks"); return 0 },
|
|
91
|
+
getClipSetInfo(): ClipInfo[] { $warn("getClipSetInfo"); return [] },
|
|
92
|
+
deriveClip(): number { $warn("deriveClip"); return 0 },
|
|
93
|
+
setClipEvents(): void { $warn("setClipEvents") },
|
|
94
|
+
getGlbClipSet(): number { $warn("getGlbClipSet"); return 0 },
|
|
95
|
+
destroyClipSet(): void { $warn("destroyClipSet") },
|
|
96
|
+
animatorCreate(): number { $warn("animatorCreate"); return 0 },
|
|
97
|
+
animatorDestroy(): void { $warn("animatorDestroy") },
|
|
98
|
+
animatorBind(): number { $warn("animatorBind"); return 0 },
|
|
99
|
+
animatorBoundTracks(): number { $warn("animatorBoundTracks"); return 0 },
|
|
100
|
+
animatorSetBlend(): void { $warn("animatorSetBlend") },
|
|
101
|
+
animatorSetBlendValue(): void { $warn("animatorSetBlendValue") },
|
|
102
|
+
animatorPlay(): void { $warn("animatorPlay") },
|
|
103
|
+
animatorStop(): void { $warn("animatorStop") },
|
|
104
|
+
animatorSeek(): void { $warn("animatorSeek") },
|
|
105
|
+
animatorGetSlotTime(): number { $warn("animatorGetSlotTime"); return 0 },
|
|
106
|
+
animatorGetSlotWeight(): number { $warn("animatorGetSlotWeight"); return 0 },
|
|
107
|
+
animatorSetLayer(): void { $warn("animatorSetLayer") },
|
|
108
|
+
animatorSetGlobal(): void { $warn("animatorSetGlobal") },
|
|
109
|
+
animatorSetRootMotion(): void { $warn("animatorSetRootMotion") },
|
|
110
|
+
animatorGetRootMotion(): void { $warn("animatorGetRootMotion") },
|
|
111
|
+
setOnAnimatorEvent(): void { $warn("setOnAnimatorEvent") },
|
|
112
|
+
animatorSetFeet(): void { $warn("animatorSetFeet") },
|
|
113
|
+
animatorSlotCurveAt(): number { $warn("animatorSlotCurveAt"); return 0 },
|
|
114
|
+
animatorSlotCurveInfo(): boolean { $warn("animatorSlotCurveInfo"); return false },
|
|
115
|
+
animatorSlotTurn(): number { $warn("animatorSlotTurn"); return 0 },
|
|
116
|
+
animatorSlotTimeAtTurn(): number { $warn("animatorSlotTimeAtTurn"); return 0 },
|
|
117
|
+
animatorLayerPhase(): number { $warn("animatorLayerPhase"); return 0 },
|
|
118
|
+
animatorSeekPhase(): void { $warn("animatorSeekPhase") },
|
|
119
|
+
animatorSlotFit(): number { $warn("animatorSlotFit"); return 0 },
|
|
120
|
+
animatorSlotExit(): number { $warn("animatorSlotExit"); return 0 },
|
|
121
|
+
animatorSlotAlign(): number { $warn("animatorSlotAlign"); return 0 },
|
|
122
|
+
animatorSlotContacts(): number { $warn("animatorSlotContacts"); return 0 },
|
|
123
|
+
animatorSlotTreads(): number { $warn("animatorSlotTreads"); return 0 },
|
|
124
|
+
animatorSlotPhysics(): number { $warn("animatorSlotPhysics"); return 0 },
|
|
125
|
+
animatorSlotFeatures(): number { $warn("animatorSlotFeatures"); return 0 },
|
|
126
|
+
animatorKneeAxis(): number { $warn("animatorKneeAxis"); return 0 },
|
|
127
|
+
animatorSlotKneePole(): number { $warn("animatorSlotKneePole"); return 0 },
|
|
128
|
+
animatorSetStepWarp(): void { $warn("animatorSetStepWarp") },
|
|
129
|
+
setOnAnimatorStep(): void { $warn("setOnAnimatorStep") },
|
|
130
|
+
animatorSetMotion(): void { $warn("animatorSetMotion") },
|
|
131
|
+
animatorSetDriveInput(): void { $warn("animatorSetDriveInput") },
|
|
132
|
+
animatorSetSlotDrive(): void { $warn("animatorSetSlotDrive") },
|
|
133
|
+
animatorSetWarpParams(): void { $warn("animatorSetWarpParams") },
|
|
134
|
+
locoCreate(): number { $warn("locoCreate"); return 0 },
|
|
135
|
+
locoDestroy(): void { $warn("locoDestroy") },
|
|
136
|
+
locoSetParams(): void { $warn("locoSetParams") },
|
|
137
|
+
locoDefaults(): void { $warn("locoDefaults") },
|
|
138
|
+
locoSetEntry(): void { $warn("locoSetEntry") },
|
|
139
|
+
locoClearSet(): void { $warn("locoClearSet") },
|
|
140
|
+
locoSetInput(): void { $warn("locoSetInput") },
|
|
141
|
+
locoStep(): void { $warn("locoStep") },
|
|
142
|
+
locoUpdate(): void { $warn("locoUpdate") },
|
|
143
|
+
locoRead(): void { $warn("locoRead") },
|
|
144
|
+
locoBuildDatabase(): number { $warn("locoBuildDatabase"); return 0 },
|
|
145
|
+
setColliderFromMesh(): void { $warn("setColliderFromMesh") },
|
|
146
|
+
setColliderBox(): void { $warn("setColliderBox") },
|
|
147
|
+
setColliderSphere(): void { $warn("setColliderSphere") },
|
|
148
|
+
physicsHasSupport(): boolean { $warn("physicsHasSupport"); return false },
|
|
149
|
+
physicsConfigure(): void { $warn("physicsConfigure") },
|
|
150
|
+
setInterpolation(): void { $warn("setInterpolation") },
|
|
151
|
+
physicsBuildBox(): number { $warn("physicsBuildBox"); return 0 },
|
|
152
|
+
physicsBuildSphere(): number { $warn("physicsBuildSphere"); return 0 },
|
|
153
|
+
physicsBuildCylinder(): number { $warn("physicsBuildCylinder"); return 0 },
|
|
154
|
+
physicsBuildCapsule(): number { $warn("physicsBuildCapsule"); return 0 },
|
|
155
|
+
physicsBuildMesh(): number { $warn("physicsBuildMesh"); return 0 },
|
|
156
|
+
physicsBuildMeshFromEntity(): number { $warn("physicsBuildMeshFromEntity"); return 0 },
|
|
157
|
+
physicsDestroyShape(): void { $warn("physicsDestroyShape") },
|
|
158
|
+
physicsCreateBody(): number { $warn("physicsCreateBody"); return 0 },
|
|
159
|
+
physicsSetPickable(): void { $warn("physicsSetPickable") },
|
|
160
|
+
physicsSetFriction(): void { $warn("physicsSetFriction") },
|
|
161
|
+
physicsGetFriction(): number { $warn("physicsGetFriction"); return 0 },
|
|
162
|
+
physicsRaycast(): number { $warn("physicsRaycast"); return 0 },
|
|
163
|
+
characterCreate(): number { $warn("characterCreate"); return 0 },
|
|
164
|
+
characterDestroy(): void { $warn("characterDestroy") },
|
|
165
|
+
characterMove(): void { $warn("characterMove") },
|
|
166
|
+
characterMoveFree(): void { $warn("characterMoveFree") },
|
|
167
|
+
characterSetVerticalVelocity(): void { $warn("characterSetVerticalVelocity") },
|
|
168
|
+
characterSetVelocity(): void { $warn("characterSetVelocity") },
|
|
169
|
+
characterSetGravityScale(): void { $warn("characterSetGravityScale") },
|
|
170
|
+
characterSetMaxSlope(): void { $warn("characterSetMaxSlope") },
|
|
171
|
+
characterGetVelocity(): void { $warn("characterGetVelocity") },
|
|
172
|
+
characterGetGroundState(): number { $warn("characterGetGroundState"); return 0 },
|
|
173
|
+
characterSetPosition(): void { $warn("characterSetPosition") },
|
|
174
|
+
vehicleCreate(): number { $warn("vehicleCreate"); return 0 },
|
|
175
|
+
vehicleDestroy(): void { $warn("vehicleDestroy") },
|
|
176
|
+
vehicleSetInput(): void { $warn("vehicleSetInput") },
|
|
177
|
+
vehicleGetState(): void { $warn("vehicleGetState") },
|
|
178
|
+
vehicleReset(): void { $warn("vehicleReset") },
|
|
179
|
+
vehicleBodyId(): number { $warn("vehicleBodyId"); return 0 },
|
|
180
|
+
physicsCreateBox(): number { $warn("physicsCreateBox"); return 0 },
|
|
181
|
+
physicsCreateSphere(): number { $warn("physicsCreateSphere"); return 0 },
|
|
182
|
+
physicsCreateCylinder(): number { $warn("physicsCreateCylinder"); return 0 },
|
|
183
|
+
physicsSetLinearVelocity(): void { $warn("physicsSetLinearVelocity") },
|
|
184
|
+
physicsGetLinearVelocity(): void { $warn("physicsGetLinearVelocity") },
|
|
185
|
+
physicsApplyImpulse(): void { $warn("physicsApplyImpulse") },
|
|
186
|
+
physicsSetBodyPosition(): void { $warn("physicsSetBodyPosition") },
|
|
187
|
+
physicsRemoveBody(): void { $warn("physicsRemoveBody") },
|
|
188
|
+
createMediaPlayerTexture(): number { $warn("createMediaPlayerTexture"); return 0 },
|
|
189
|
+
getName(): string { $warn("getName"); return "" },
|
|
190
|
+
setName(): void { $warn("setName") },
|
|
191
|
+
hasMesh(): boolean { $warn("hasMesh"); return false },
|
|
192
|
+
createARController(): void { $warn("createARController") },
|
|
193
|
+
createRootAnchor(): number { $warn("createRootAnchor"); return 0 },
|
|
194
|
+
createAnchor(): number { $warn("createAnchor"); return 0 },
|
|
195
|
+
createParticleSystem(): void { $warn("createParticleSystem") },
|
|
196
|
+
spawnParticles(): void { $warn("spawnParticles") },
|
|
197
|
+
setParticleSystemConfig(): void { $warn("setParticleSystemConfig") },
|
|
198
|
+
createNoise(): number { $warn("createNoise"); return 0 },
|
|
199
|
+
setNoiseFrequency(): void { $warn("setNoiseFrequency") },
|
|
200
|
+
setNoiseOctaves(): void { $warn("setNoiseOctaves") },
|
|
201
|
+
setNoiseFractalLunacrity(): void { $warn("setNoiseFractalLunacrity") },
|
|
202
|
+
setNoiseFractalGain(): void { $warn("setNoiseFractalGain") },
|
|
203
|
+
getNoise2D(): number { $warn("getNoise2D"); return 0 },
|
|
204
|
+
getNoise3D(): number { $warn("getNoise3D"); return 0 },
|
|
205
|
+
captureImage(): void { $warn("captureImage") },
|
|
206
|
+
} satisfies Partial<typeof _creator>
|
|
207
|
+
|
|
208
|
+
/** The stubbed names — an engine reports its gap as the names its bridge still maps to these. */
|
|
209
|
+
export const unsupportedNames = ["createEngine", "createScene", "createOverlayScene", "createGLView", "openScene", "closeScene", "launchAR", "stopAR", "launchVR", "stopVR", "addEntityToScene", "removeEntityFromScene", "warmRender", "createEntity", "cloneEntity", "destroyEntity", "entityIsOwned", "setMatrix", "setWorldMatrix", "getChildCount", "getChild", "setPosition", "setQuaternion", "setEulerAngles", "setScale", "setParent", "setParentNull", "getParent", "traverse", "createSunLight", "setDefaultIbl", "setBloomOptions", "setSkybox", "setSceneMultiSampleAntiAliasing", "setMaterialGlobalParameter", "getCameraFov", "getMatrix", "getWorldMatrix", "getWorldPosition", "getWorldDirection", "getWorldMatrixInverse", "getCameraViewDirection", "setMesh", "createInstancedMesh", "setInstanceTransforms", "setInstancedMeshMaterial", "setInstancedMeshShadows", "setCulling", "setCastShadows", "setReceiveShadows", "createTexture", "createTextureFromCanvas", "updateTextureFromCanvas", "createMaterial", "builtinMaterial", "setMaterial", "getMaterial", "setUniformRgb", "setUniformRgba", "setUniformFloat", "setUniformBoolean", "setUniformTexture", "setUniformArray", "setUniformNull", "attachCameraToAR", "getDisplaySize", "setVisible", "isVisible", "createGlb", "setGlbCulling", "setEarlyUpdate", "setLateUpdate", "setOnPhysicsEvent", "loadClips", "createClipFromTracks", "getClipSetInfo", "deriveClip", "setClipEvents", "getGlbClipSet", "destroyClipSet", "animatorCreate", "animatorDestroy", "animatorBind", "animatorBoundTracks", "animatorSetBlend", "animatorSetBlendValue", "animatorPlay", "animatorStop", "animatorSeek", "animatorGetSlotTime", "animatorGetSlotWeight", "animatorSetLayer", "animatorSetGlobal", "animatorSetRootMotion", "animatorGetRootMotion", "setOnAnimatorEvent", "animatorSetFeet", "animatorSlotCurveAt", "animatorSlotCurveInfo", "animatorSlotTurn", "animatorSlotTimeAtTurn", "animatorLayerPhase", "animatorSeekPhase", "animatorSlotFit", "animatorSlotExit", "animatorSlotAlign", "animatorSlotContacts", "animatorSlotTreads", "animatorSlotPhysics", "animatorSlotFeatures", "animatorKneeAxis", "animatorSlotKneePole", "animatorSetStepWarp", "setOnAnimatorStep", "animatorSetMotion", "animatorSetDriveInput", "animatorSetSlotDrive", "animatorSetWarpParams", "locoCreate", "locoDestroy", "locoSetParams", "locoDefaults", "locoSetEntry", "locoClearSet", "locoSetInput", "locoStep", "locoUpdate", "locoRead", "locoBuildDatabase", "setColliderFromMesh", "setColliderBox", "setColliderSphere", "physicsHasSupport", "physicsConfigure", "setInterpolation", "physicsBuildBox", "physicsBuildSphere", "physicsBuildCylinder", "physicsBuildCapsule", "physicsBuildMesh", "physicsBuildMeshFromEntity", "physicsDestroyShape", "physicsCreateBody", "physicsSetPickable", "physicsSetFriction", "physicsGetFriction", "physicsRaycast", "characterCreate", "characterDestroy", "characterMove", "characterMoveFree", "characterSetVerticalVelocity", "characterSetVelocity", "characterSetGravityScale", "characterSetMaxSlope", "characterGetVelocity", "characterGetGroundState", "characterSetPosition", "vehicleCreate", "vehicleDestroy", "vehicleSetInput", "vehicleGetState", "vehicleReset", "vehicleBodyId", "physicsCreateBox", "physicsCreateSphere", "physicsCreateCylinder", "physicsSetLinearVelocity", "physicsGetLinearVelocity", "physicsApplyImpulse", "physicsSetBodyPosition", "physicsRemoveBody", "createMediaPlayerTexture", "getName", "setName", "hasMesh", "createARController", "createRootAnchor", "createAnchor", "createParticleSystem", "spawnParticles", "setParticleSystemConfig", "createNoise", "setNoiseFrequency", "setNoiseOctaves", "setNoiseFractalLunacrity", "setNoiseFractalGain", "getNoise2D", "getNoise3D", "captureImage"] as const
|
|
210
|
+
/** The contract methods `bridge` still answers with a stub. */
|
|
211
|
+
export const stubbedIn = (bridge: Record<string, unknown>): string[] =>
|
|
212
|
+
unsupportedNames.filter((n) => bridge[n] === (unsupported as Record<string, unknown>)[n])
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// lecodes-gl-lite: the LITE 3D engine — the GL-free scene core (src/core, shared with the headless
|
|
2
|
+
// recorder) + its WebGL2 renderer over ogl. No wasm, no Filament. An embedder takes it as a
|
|
3
|
+
// library (an editor's viewport); the web host runs Filament, not this.
|
|
4
|
+
export { createViewerLite, basePropsLite } from './webgl/createViewerLite'
|
|
5
|
+
export type { ViewerOptions } from './webgl/createViewerLite'
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Type surface of the single-file Emscripten module build-wasm.sh emits next to this file.
|
|
2
|
+
// The exported C functions take heap pointers; use js/index.ts rather than this directly.
|
|
3
|
+
|
|
4
|
+
export interface CreatorAnimModule {
|
|
5
|
+
HEAPU8: Uint8Array
|
|
6
|
+
HEAPU16: Uint16Array
|
|
7
|
+
HEAP32: Int32Array
|
|
8
|
+
HEAPU32: Uint32Array
|
|
9
|
+
HEAPF32: Float32Array
|
|
10
|
+
_malloc(bytes: number): number
|
|
11
|
+
_free(ptr: number): void
|
|
12
|
+
UTF8ToString(ptr: number): string
|
|
13
|
+
stringToUTF8(str: string, ptr: number, maxBytes: number): void
|
|
14
|
+
lengthBytesUTF8(str: string): number
|
|
15
|
+
|
|
16
|
+
_canimClipsLoad(glb: number, size: number): number
|
|
17
|
+
_canimClipsFromTracks(names: number, data: number, length: number): number
|
|
18
|
+
_canimClipsSlice(set: number, clip: number, start: number, end: number): number
|
|
19
|
+
_canimClipsMirror(set: number, clip: number): number
|
|
20
|
+
_canimClipsSetRig(set: number, jointCount: number, parents: number, names: number, rest: number): void
|
|
21
|
+
_canimClipsDerive(set: number, clip: number, mirror: number, start: number, end: number): number
|
|
22
|
+
_canimClipsCount(set: number): number
|
|
23
|
+
_canimClipName(set: number, clip: number): number
|
|
24
|
+
_canimClipDuration(set: number, clip: number): number
|
|
25
|
+
_canimClipTrackCount(set: number, clip: number): number
|
|
26
|
+
_canimClipsSetEvents(set: number, clip: number, times: number, count: number): void
|
|
27
|
+
_canimClipsDestroy(set: number): void
|
|
28
|
+
_canimAnimatorCreate(jointCount: number, parents: number, names: number, rest: number, skin: number, tag: number): number
|
|
29
|
+
_canimAnimatorDestroy(id: number): void
|
|
30
|
+
_canimAnimatorsDestroyTagged(tag: number): void
|
|
31
|
+
_canimAnimatorCount(): number
|
|
32
|
+
_canimAnimatorJointCount(id: number): number
|
|
33
|
+
_canimAnimatorShadowedNames(id: number): number
|
|
34
|
+
_canimAnimatorRest(id: number, outTRS: number, outWrite: number): void
|
|
35
|
+
_canimAnimatorBind(id: number, set: number, clip: number, layer: number): number
|
|
36
|
+
/** since 0.20: the clip mirrored on the skeleton (absent on an older wasm build) */
|
|
37
|
+
_canimAnimatorBindMirror?(id: number, set: number, clip: number, layer: number): number
|
|
38
|
+
_canimAnimatorBoundTracks(id: number, slot: number): number
|
|
39
|
+
_canimAnimatorSetBlend(id: number, layer: number, dims: number, slots: number, positions: number, phases: number, count: number, fade: number, speed: number): void
|
|
40
|
+
_canimAnimatorSetBlendValue(id: number, layer: number, x: number, y: number): void
|
|
41
|
+
_canimAnimatorPlay(id: number, slot: number, loop: number, speed: number, fadeIn: number, fadeOut: number, restart: number): void
|
|
42
|
+
_canimAnimatorSlotSetTurn(id: number, slot: number, radians: number, enabled: number): void
|
|
43
|
+
_canimAnimatorStop(id: number, layer: number, slot: number, fade: number): void
|
|
44
|
+
_canimAnimatorSeek(id: number, slot: number, time: number): void
|
|
45
|
+
_canimAnimatorSlotTime(id: number, slot: number): number
|
|
46
|
+
_canimAnimatorSlotWeight(id: number, slot: number): number
|
|
47
|
+
_canimAnimatorSetLayer(id: number, layer: number, weight: number, additive: number, maskRoots: number): void
|
|
48
|
+
_canimAnimatorSetLayerAnticipation(id: number, layer: number, amount: number): void
|
|
49
|
+
_canimAnimatorSetGlobal(id: number, speed: number, paused: number): void
|
|
50
|
+
_canimAnimatorSeedPose(id: number, trs: number, blend: number): void
|
|
51
|
+
_canimAnimatorJointRanges(id: number, pairs: number, count: number, frames: number, out: number): number
|
|
52
|
+
_canimAnimatorSetRootMotion(id: number, bone: number, apply: number): void
|
|
53
|
+
_canimAnimatorRootMotion(id: number, out3: number): void
|
|
54
|
+
_canimAnimatorEvaluate(id: number, dt: number, lodMaskOn: number, outTRS: number, outWrite: number): number
|
|
55
|
+
_canimAnimatorEvents(id: number, outPairs: number, maxPairs: number): number
|
|
56
|
+
_canimAnimatorRootMotionFrame(id: number, out4: number): number
|
|
57
|
+
_canimAnimatorMorphCount(id: number): number
|
|
58
|
+
_canimAnimatorMorph(id: number, index: number, outJoint: number, outCount: number): number
|
|
59
|
+
_canimAnimatorSetFeet(id: number, leftChain: number, rightChain: number): void
|
|
60
|
+
_canimAnimatorFootJoint(id: number, side: number, toe: number): number
|
|
61
|
+
_canimAnimatorSlotPhase(id: number, slot: number): number
|
|
62
|
+
_canimAnimatorLayerPhase(id: number, layer: number): number
|
|
63
|
+
_canimAnimatorSeekPhase(id: number, slot: number, phase: number): void
|
|
64
|
+
_canimAnimatorSlotCurve(id: number, slot: number, which: number, out: number, max: number): number
|
|
65
|
+
_canimAnimatorSlotCurveAt(id: number, slot: number, which: number, time: number): number
|
|
66
|
+
_canimAnimatorSlotCurveInfo(id: number, slot: number, out4: number): number
|
|
67
|
+
_canimAnimatorSlotFit(id: number, slot: number, target: number, align: number, out: number, max: number): number
|
|
68
|
+
_canimAnimatorSlotExit(id: number, slot: number, target: number, tolerance: number, atContact: number, align: number): number
|
|
69
|
+
_canimAnimatorSlotAlign(id: number, a: number, b: number, offA: number, cyclesA: number, out4: number): number
|
|
70
|
+
_canimAnimatorSlotContacts(id: number, slot: number, out: number, maxSpans: number): number
|
|
71
|
+
_canimAnimatorSlotTreads(id: number, slot: number, out: number, max: number): number
|
|
72
|
+
_canimAnimatorSlotPhysics(id: number, slot: number, time: number, out11: number): number
|
|
73
|
+
_canimAnimatorSlotFeatures(id: number, slot: number, time: number, out37: number): number
|
|
74
|
+
_canimAnimatorKneeAxis(id: number, side: number, out8: number): number
|
|
75
|
+
_canimAnimatorSlotKneePole(id: number, slot: number, side: number, time: number, out6: number): number
|
|
76
|
+
_canimAnimatorSetStepWarp(id: number, on: number, stride: number, lift: number, pitchDeg: number, slopeDeg: number): void
|
|
77
|
+
_canimAnimatorStepCount(id: number): number
|
|
78
|
+
_canimAnimatorStep(id: number, index: number, out3: number): number
|
|
79
|
+
_canimAnimatorSetWorld(id: number, m16: number): void
|
|
80
|
+
_canimAnimatorSetGrounded(id: number, grounded: number): void
|
|
81
|
+
_canimAnimatorSetFeetParams(id: number, params: number, count: number): void
|
|
82
|
+
_canimAnimatorFeetDefaults(params: number): void
|
|
83
|
+
_canimAnimatorFootProbe(id: number, side: number, outFrom3: number, outTo3: number): number
|
|
84
|
+
_canimAnimatorSetGround(id: number, side: number, hit: number, x: number, y: number, z: number, nx: number, ny: number, nz: number): void
|
|
85
|
+
_canimAnimatorFootState(id: number, side: number, out8: number): number
|
|
86
|
+
_canimAnimatorJointPosition(id: number, joint: number, out3: number): number
|
|
87
|
+
_canimAnimatorIkCreate(id: number, kind: number, chain: number): number
|
|
88
|
+
_canimAnimatorIkSet(id: number, ik: number, params: number, count: number): void
|
|
89
|
+
_canimAnimatorIkDestroy(id: number, ik: number): void
|
|
90
|
+
_canimAnimatorIkCreateJoints(id: number, kind: number, root: number, mid: number, end: number): number
|
|
91
|
+
_canimAnimatorIkGet(id: number, ik: number, out: number, count: number): number
|
|
92
|
+
_canimAnimatorIkAnchor(id: number, ik: number, socket: number): void
|
|
93
|
+
_canimAnimatorIkState(id: number, ik: number, out4: number): number
|
|
94
|
+
_canimAnimatorSetSocket(id: number, set: number, name: number, joint: number, trs7: number): void
|
|
95
|
+
_canimAnimatorSocketSetWorld(id: number, set: number, name: number, m16: number): void
|
|
96
|
+
_canimAnimatorLateSolve(id: number, world16: number, localTRS: number, outWrite: number): number
|
|
97
|
+
_canimClipsSetAnchors(set: number, clip: number, bone: number, donor: number, sockets: number, spans: number, count: number): void
|
|
98
|
+
_canimAnimatorSetMotion(id: number, vx: number, vy: number, vz: number): void
|
|
99
|
+
_canimAnimatorSetDriveInput(id: number, distance: number, angle: number): void
|
|
100
|
+
_canimAnimatorSetSlotDrive(id: number, slot: number, mode: number, entry: number): void
|
|
101
|
+
_canimAnimatorSlotTurn(id: number, slot: number): number
|
|
102
|
+
_canimAnimatorSlotTimeAtTurn(id: number, slot: number, yaw: number): number
|
|
103
|
+
_canimAnimatorSetWarpParams(id: number, params: number, count: number): void
|
|
104
|
+
_canimAnimatorWarpDefaults(params: number): void
|
|
105
|
+
_canimLocoCreate(animator: number): number
|
|
106
|
+
_canimLocoDestroy(loco: number): void
|
|
107
|
+
_canimLocoDefaults(params: number): void
|
|
108
|
+
_canimLocoSetParams(loco: number, params: number, count: number): void
|
|
109
|
+
_canimLocoSetEntry(loco: number, slot: number, kind: number, angle: number, speed: number): void
|
|
110
|
+
_canimLocoClearSet(loco: number): void
|
|
111
|
+
_canimLocoSetInput(loco: number, input: number, count: number): void
|
|
112
|
+
_canimLocoStep(loco: number, dt: number, px: number, py: number, pz: number): void
|
|
113
|
+
_canimLocoUpdate(loco: number, dt: number): void
|
|
114
|
+
_canimLocoRead(loco: number, out: number, count: number): void
|
|
115
|
+
_canimLocoBuildDatabase(loco: number): number
|
|
116
|
+
_canimLocoMatchSlot(loco: number): number
|
|
117
|
+
_canimLocoMatchTime(loco: number): number
|
|
118
|
+
_canimReset(): void
|
|
119
|
+
_canimVersion(): number
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
declare const createCreatorAnim: (options?: Record<string, unknown>) => Promise<CreatorAnimModule>
|
|
123
|
+
export default createCreatorAnim
|