@dcl-regenesislabs/opendcl 0.1.5-23569259243.commit-df8937b → 0.1.5-24375036645.commit-2b2c754
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/dist/scene-context.d.ts +2 -0
- package/dist/scene-context.d.ts.map +1 -1
- package/dist/scene-context.js +6 -0
- package/dist/scene-context.js.map +1 -1
- package/extensions/dcl-context.ts +19 -1
- package/extensions/dcl-init.ts +11 -0
- package/package.json +2 -2
- package/prompts/system.md +3 -3
- package/skills/add-3d-models/SKILL.md +60 -24
- package/skills/add-3d-models/references/model-catalog.md +5794 -0
- package/skills/create-scene/SKILL.md +8 -5
- package/context/asset-packs-catalog.md +0 -2856
- package/context/open-source-3d-assets.md +0 -714
package/dist/scene-context.d.ts
CHANGED
|
@@ -77,6 +77,8 @@ export interface SceneContext {
|
|
|
77
77
|
parseError?: string;
|
|
78
78
|
/** Whether this appears to be an SDK6 (legacy) scene */
|
|
79
79
|
isLegacySdk6?: boolean;
|
|
80
|
+
/** Whether this scene was created/edited with OpenDCL */
|
|
81
|
+
isOpenDcl?: boolean;
|
|
80
82
|
}
|
|
81
83
|
/**
|
|
82
84
|
* Calculate scene dimensions from parcels.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-context.d.ts","sourceRoot":"","sources":["../src/scene-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;YAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;YAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;SAAE,CAAC;QAChF,YAAY,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACpD,CAAC,CAAC;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,CAAC,EAAE;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,YAAY,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"scene-context.d.ts","sourceRoot":"","sources":["../src/scene-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;YAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;YAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;SAAE,CAAC;QAChF,YAAY,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACpD,CAAC,CAAC;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,CAAC,EAAE;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAoBtF;AAsED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAuE3E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAiD5D"}
|
package/dist/scene-context.js
CHANGED
|
@@ -131,6 +131,8 @@ export async function detectSceneContext(cwd) {
|
|
|
131
131
|
// Check for World configuration
|
|
132
132
|
const isWorld = !!sceneJson.worldConfiguration;
|
|
133
133
|
const worldName = sceneJson.worldConfiguration?.name;
|
|
134
|
+
// Check for OpenDCL stamp
|
|
135
|
+
const isOpenDcl = sceneJson.opendcl === true;
|
|
134
136
|
return {
|
|
135
137
|
hasScene: true,
|
|
136
138
|
sceneRoot,
|
|
@@ -148,6 +150,7 @@ export async function detectSceneContext(cwd) {
|
|
|
148
150
|
isWorld,
|
|
149
151
|
worldName,
|
|
150
152
|
isLegacySdk6,
|
|
153
|
+
isOpenDcl,
|
|
151
154
|
};
|
|
152
155
|
}
|
|
153
156
|
/**
|
|
@@ -194,6 +197,9 @@ Migration guide: https://docs.decentraland.org/creator/sdk7/sdk7-migration-guide
|
|
|
194
197
|
if (ctx.isWorld) {
|
|
195
198
|
lines.push(`- **Deployment**: Decentraland World${ctx.worldName ? ` (${ctx.worldName})` : ""}`);
|
|
196
199
|
}
|
|
200
|
+
if (ctx.isOpenDcl) {
|
|
201
|
+
lines.push(`- **Created with**: OpenDCL`);
|
|
202
|
+
}
|
|
197
203
|
if (ctx.needsInstall) {
|
|
198
204
|
lines.push("");
|
|
199
205
|
lines.push("**Warning**: `node_modules/` not found. The user needs to run `npm install` before building.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-context.js","sourceRoot":"","sources":["../src/scene-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"scene-context.js","sourceRoot":"","sources":["../src/scene-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import type { ExtensionFactory } from "@mariozechner/pi-coding-agent";
|
|
9
|
-
import { readFile } from "node:fs/promises";
|
|
9
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
10
10
|
import { join } from "node:path";
|
|
11
11
|
import { fileExists, findSceneRoot } from "./scene-utils.js";
|
|
12
12
|
|
|
@@ -17,6 +17,7 @@ interface SceneJson {
|
|
|
17
17
|
scene?: { parcels?: string[]; base?: string };
|
|
18
18
|
main?: string;
|
|
19
19
|
worldConfiguration?: { name?: string; [key: string]: unknown };
|
|
20
|
+
opendcl?: boolean;
|
|
20
21
|
[key: string]: unknown;
|
|
21
22
|
}
|
|
22
23
|
|
|
@@ -59,6 +60,19 @@ After \`/init\`, customize scene.json and src/index.ts based on what the user wa
|
|
|
59
60
|
OpenDCL supports SDK7 only. Suggest the user migrate to SDK7.
|
|
60
61
|
Migration guide: https://docs.decentraland.org/creator/sdk7/sdk7-migration-guide/\n`;
|
|
61
62
|
} else {
|
|
63
|
+
// Stamp scene.json with opendcl: true if not already present
|
|
64
|
+
if (!sceneJson.opendcl) {
|
|
65
|
+
try {
|
|
66
|
+
sceneJson.opendcl = true;
|
|
67
|
+
await writeFile(
|
|
68
|
+
join(sceneRoot, "scene.json"),
|
|
69
|
+
JSON.stringify(sceneJson, null, 2) + "\n"
|
|
70
|
+
);
|
|
71
|
+
} catch {
|
|
72
|
+
// Non-fatal: don't block context injection if write fails
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
62
76
|
const lines: string[] = ["\n## Current Project"];
|
|
63
77
|
|
|
64
78
|
if (sceneJson.display?.title) lines.push(`- **Title**: ${sceneJson.display.title}`);
|
|
@@ -98,6 +112,10 @@ Migration guide: https://docs.decentraland.org/creator/sdk7/sdk7-migration-guide
|
|
|
98
112
|
lines.push(`- **Deployment**: Decentraland World${worldName ? ` (${worldName})` : ""}`);
|
|
99
113
|
}
|
|
100
114
|
|
|
115
|
+
if (sceneJson.opendcl) {
|
|
116
|
+
lines.push(`- **Created with**: OpenDCL`);
|
|
117
|
+
}
|
|
118
|
+
|
|
101
119
|
// Check node_modules
|
|
102
120
|
if (!(await fileExists(join(sceneRoot, "node_modules")))) {
|
|
103
121
|
lines.push("");
|
package/extensions/dcl-init.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import type { ExtensionFactory } from "@mariozechner/pi-coding-agent";
|
|
9
9
|
import { Type } from "@sinclair/typebox";
|
|
10
10
|
import { join } from "node:path";
|
|
11
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
11
12
|
import { fileExists } from "./scene-utils.js";
|
|
12
13
|
|
|
13
14
|
async function initScene(
|
|
@@ -25,6 +26,16 @@ async function initScene(
|
|
|
25
26
|
});
|
|
26
27
|
|
|
27
28
|
if (result.code === 0) {
|
|
29
|
+
// Stamp scene.json with opendcl: true so scenes created with OpenDCL can be identified
|
|
30
|
+
try {
|
|
31
|
+
const sceneJsonPath = join(cwd, "scene.json");
|
|
32
|
+
const content = await readFile(sceneJsonPath, "utf-8");
|
|
33
|
+
const sceneJson = JSON.parse(content);
|
|
34
|
+
sceneJson.opendcl = true;
|
|
35
|
+
await writeFile(sceneJsonPath, JSON.stringify(sceneJson, null, 2) + "\n");
|
|
36
|
+
} catch {
|
|
37
|
+
// Non-fatal: scene was still initialized successfully
|
|
38
|
+
}
|
|
28
39
|
return { message: "Scene initialized and dependencies installed! Use the preview tool to start." };
|
|
29
40
|
} else {
|
|
30
41
|
return { message: `Init failed (exit code ${result.code}): ${result.stderr || result.stdout}`, isError: true };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl-regenesislabs/opendcl",
|
|
3
|
-
"version": "0.1.5-
|
|
3
|
+
"version": "0.1.5-24375036645.commit-2b2c754",
|
|
4
4
|
"description": "AI coding assistant for Decentraland SDK7 scene development",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"prompts/",
|
|
68
68
|
"context/"
|
|
69
69
|
],
|
|
70
|
-
"commit": "
|
|
70
|
+
"commit": "2b2c754949150e253a0314653d1817ed4b647a2b"
|
|
71
71
|
}
|
package/prompts/system.md
CHANGED
|
@@ -110,9 +110,9 @@ scene-project/
|
|
|
110
110
|
- `GltfContainer` only works with **local files** — never use external URLs for the `src` field. Always download models into the scene's `models/` directory first.
|
|
111
111
|
- Place `.glb` files in a `models/` directory, textures in `images/`.
|
|
112
112
|
- Don't start the preview server automatically after writing code. The user will type `/preview` when ready.
|
|
113
|
-
- **Proactively suggest 3D assets**: When building a scene,
|
|
114
|
-
- `
|
|
115
|
-
- `
|
|
113
|
+
- **Proactively suggest 3D assets**: When building a scene, search the model catalog for free models that match the user's theme:
|
|
114
|
+
- `skills/add-3d-models/references/model-catalog.md` — 5,700+ optimized 3D models (characters, structures, props, nature, vehicles, effects, etc.)
|
|
115
|
+
- Search with `grep -i "keyword" skills/add-3d-models/references/model-catalog.md`, fetch the preview thumbnail to confirm, then download with curl.
|
|
116
116
|
- Download matching models with `curl -o models/filename.glb "URL"` before referencing them in code.
|
|
117
117
|
|
|
118
118
|
### Visual Iteration Workflow
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: add-3d-models
|
|
3
|
-
description: Add 3D models (.glb/.gltf) to a Decentraland scene using GltfContainer. Covers loading, positioning, scaling, colliders, parenting, and browsing
|
|
3
|
+
description: Add 3D models (.glb/.gltf) to a Decentraland scene using GltfContainer. Covers loading, positioning, scaling, colliders, parenting, and browsing 5,700+ free assets from the OpenDCL catalog. Use when the user wants to add models, import GLB files, find free 3D assets, or set up model colliders. Do NOT use for materials/textures (see advanced-rendering) or model animations (see animations-tweens).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Adding 3D Models to Decentraland Scenes
|
|
@@ -10,7 +10,7 @@ description: Add 3D models (.glb/.gltf) to a Decentraland scene using GltfContai
|
|
|
10
10
|
Use `GltfContainer` to load `.glb` or `.gltf` files:
|
|
11
11
|
|
|
12
12
|
```typescript
|
|
13
|
-
import { engine, Transform, GltfContainer } from '@dcl/sdk/ecs'
|
|
13
|
+
import { engine, Transform, GltfContainer, ColliderLayer } from '@dcl/sdk/ecs'
|
|
14
14
|
import { Vector3, Quaternion } from '@dcl/sdk/math'
|
|
15
15
|
|
|
16
16
|
const model = engine.addEntity()
|
|
@@ -20,10 +20,13 @@ Transform.create(model, {
|
|
|
20
20
|
scale: Vector3.create(1, 1, 1)
|
|
21
21
|
})
|
|
22
22
|
GltfContainer.create(model, {
|
|
23
|
-
src: 'models/myModel.glb'
|
|
23
|
+
src: 'models/myModel.glb',
|
|
24
|
+
visibleMeshesCollisionMask: ColliderLayer.CL_PHYSICS | ColliderLayer.CL_POINTER
|
|
24
25
|
})
|
|
25
26
|
```
|
|
26
27
|
|
|
28
|
+
> **Always set `visibleMeshesCollisionMask`** when loading models. Catalog models don't include separate collider meshes — using the visible mesh as the collider ensures the model is solid and clickable.
|
|
29
|
+
|
|
27
30
|
## File Organization
|
|
28
31
|
|
|
29
32
|
Place model files in a `models/` directory at the project root:
|
|
@@ -91,42 +94,75 @@ Transform.create(child, {
|
|
|
91
94
|
GltfContainer.create(child, { src: 'models/hat.glb' })
|
|
92
95
|
```
|
|
93
96
|
|
|
94
|
-
## Free 3D Models
|
|
97
|
+
## Free 3D Models — OpenDCL Catalog (5,700+ models)
|
|
98
|
+
|
|
99
|
+
The catalog file is at `{baseDir}/references/model-catalog.md`. Each line has this format:
|
|
100
|
+
```
|
|
101
|
+
slug | dims | tris | size | category/sub | description [tags] [anim: clips] | curl command | preview: thumbnail_url
|
|
102
|
+
```
|
|
95
103
|
|
|
96
|
-
|
|
104
|
+
### How to search
|
|
97
105
|
|
|
98
|
-
|
|
106
|
+
Search with one keyword at a time — try the most specific word first:
|
|
107
|
+
```bash
|
|
108
|
+
grep -i "zombie" {baseDir}/references/model-catalog.md
|
|
109
|
+
```
|
|
99
110
|
|
|
100
|
-
|
|
111
|
+
If no results, try synonyms, broader terms, or related words:
|
|
112
|
+
- "sofa" → "couch" → "seat" → "furniture"
|
|
113
|
+
- "car" → "vehicle" → "truck" → "van"
|
|
114
|
+
- "wall" → "fence" → "barrier" → "structure"
|
|
101
115
|
|
|
102
|
-
|
|
116
|
+
Browse all categories to discover what's available:
|
|
103
117
|
```bash
|
|
104
|
-
|
|
105
|
-
mkdir -p models
|
|
106
|
-
curl -o models/arcade_machine.glb "https://builder-items.decentraland.org/contents/bafybei..."
|
|
118
|
+
grep "^##" {baseDir}/references/model-catalog.md
|
|
107
119
|
```
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
120
|
+
|
|
121
|
+
Search within a specific category:
|
|
122
|
+
```bash
|
|
123
|
+
grep "^##\|chair" {baseDir}/references/model-catalog.md
|
|
111
124
|
```
|
|
112
125
|
|
|
113
|
-
###
|
|
126
|
+
### How to use models
|
|
114
127
|
|
|
115
|
-
|
|
128
|
+
1. Search the catalog with different keywords until you find matching models
|
|
129
|
+
2. Review the results — check dimensions, triangle count, animations, and description
|
|
130
|
+
3. Download the model with the curl command into `models/`
|
|
131
|
+
4. Reference in code with `GltfContainer.create(entity, { src: 'models/{slug}.glb' })`
|
|
132
|
+
5. If the model has animations (listed in `[anim: ...]`), use the `Animator` component to play them
|
|
133
|
+
6. After placing the model, you can fetch its **preview thumbnail** (`preview:` URL) to see what it looks like
|
|
116
134
|
|
|
135
|
+
### Example workflow
|
|
117
136
|
```bash
|
|
118
|
-
|
|
119
|
-
|
|
137
|
+
# Search for zombie models
|
|
138
|
+
grep -i "zombie" {baseDir}/references/model-catalog.md
|
|
120
139
|
|
|
121
|
-
|
|
140
|
+
# Found: zombie-purple | 2.8×2.9×0.5m | 1472 tri | 271KB | character/zombie | ...
|
|
141
|
+
# [anim: Tpose, ZombieAttack, ZombieUP, ZombieWalk]
|
|
142
|
+
# preview: https://models.dclregenesislabs.xyz/blobs/bafkrei...
|
|
143
|
+
|
|
144
|
+
# Download the model
|
|
145
|
+
curl -o models/zombie-purple.glb "https://models.dclregenesislabs.xyz/blobs/bafybeiffc..."
|
|
146
|
+
```
|
|
122
147
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
148
|
+
```typescript
|
|
149
|
+
// Use in code with animations
|
|
150
|
+
import { engine, Transform, GltfContainer, Animator } from '@dcl/sdk/ecs'
|
|
151
|
+
import { Vector3 } from '@dcl/sdk/math'
|
|
152
|
+
|
|
153
|
+
const zombie = engine.addEntity()
|
|
154
|
+
Transform.create(zombie, { position: Vector3.create(8, 0, 8) })
|
|
155
|
+
GltfContainer.create(zombie, { src: 'models/zombie-purple.glb' })
|
|
156
|
+
Animator.create(zombie, {
|
|
157
|
+
states: [
|
|
158
|
+
{ clip: 'ZombieWalk', playing: true, loop: true },
|
|
159
|
+
{ clip: 'ZombieAttack', playing: false, loop: false }
|
|
160
|
+
]
|
|
161
|
+
})
|
|
162
|
+
```
|
|
128
163
|
|
|
129
164
|
> **Important**: `GltfContainer` only works with **local files**. Never use external URLs for the model `src` field. Always download models into `models/` first.
|
|
165
|
+
> **Never `cd` into the models directory**. Always run curl from the project root with `curl -o models/slug.glb "URL"`. Do NOT use `cd models && curl -o slug.glb`.
|
|
130
166
|
|
|
131
167
|
### Checking Model Load State
|
|
132
168
|
|