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.
Files changed (46) hide show
  1. package/README.md +27 -0
  2. package/package.json +33 -0
  3. package/src/assets/decoders/README.md +13 -0
  4. package/src/assets/decoders/basis_transcoder.js +19 -0
  5. package/src/assets/decoders/basis_transcoder.wasm +0 -0
  6. package/src/assets/decoders/draco_decoder.wasm +0 -0
  7. package/src/assets/decoders/draco_wasm_wrapper.js +117 -0
  8. package/src/assets/neutral_ibl128.ktx +0 -0
  9. package/src/core/animBridge.ts +51 -0
  10. package/src/core/boneNames.ts +22 -0
  11. package/src/core/frame.ts +230 -0
  12. package/src/core/glbStructure.ts +100 -0
  13. package/src/core/headlessBridge.ts +92 -0
  14. package/src/core/mapView.ts +195 -0
  15. package/src/core/math3d.ts +275 -0
  16. package/src/core/particleBridge.ts +154 -0
  17. package/src/core/physicsBridge.ts +305 -0
  18. package/src/core/recording.ts +59 -0
  19. package/src/core/sceneCore.ts +833 -0
  20. package/src/core/serialize.ts +144 -0
  21. package/src/gen/unsupported.gen.ts +212 -0
  22. package/src/index.ts +5 -0
  23. package/src/vendor/creator-anim/dist/creatorAnim.d.ts +123 -0
  24. package/src/vendor/creator-anim/dist/creatorAnim.js +14 -0
  25. package/src/vendor/creator-anim/js/index.ts +656 -0
  26. package/src/vendor/creator-nav/dist/creatorNav.d.ts +56 -0
  27. package/src/vendor/creator-nav/dist/creatorNav.js +14 -0
  28. package/src/vendor/creator-nav/js/index.ts +400 -0
  29. package/src/vendor/creator-particles/dist/creatorParticles.d.ts +43 -0
  30. package/src/vendor/creator-particles/dist/creatorParticles.js +14 -0
  31. package/src/vendor/creator-particles/js/index.ts +137 -0
  32. package/src/vendor/creator-physics/dist/creatorPhysics.d.ts +107 -0
  33. package/src/vendor/creator-physics/dist/creatorPhysics.js +14 -0
  34. package/src/vendor/creator-physics/js/index.ts +515 -0
  35. package/src/vite-env.d.ts +1 -0
  36. package/src/webgl/batching.ts +453 -0
  37. package/src/webgl/createViewerLite.ts +1627 -0
  38. package/src/webgl/customMaterial.ts +228 -0
  39. package/src/webgl/decoders/basis.ts +123 -0
  40. package/src/webgl/decoders/draco.ts +110 -0
  41. package/src/webgl/decoders/index.ts +68 -0
  42. package/src/webgl/decoders/worker.ts +45 -0
  43. package/src/webgl/editor.ts +1297 -0
  44. package/src/webgl/glb.ts +593 -0
  45. package/src/webgl/ibl.ts +137 -0
  46. 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