Skip to content

Commit 6c5e86a

Browse files
feat(editors/model): add support for fbx (#29)
1 parent 3ff3e63 commit 6c5e86a

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed
4.43 MB
Binary file not shown.

packages/editors/model/src/ModelRenderer.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export interface ModelRendererOptions {
1313
}
1414

1515
export class ModelRenderer extends ActorComponent {
16-
asset: Systems.LazyAsset<THREE.Group<THREE.Object3DEventMap>>;
16+
assets: Systems.LazyAsset<THREE.Group<THREE.Object3DEventMap>>[];
1717
model: THREE.Group<THREE.Object3DEventMap>;
1818

1919
constructor(
@@ -25,11 +25,19 @@ export class ModelRenderer extends ActorComponent {
2525
typeName: "ModelRenderer"
2626
});
2727

28-
this.asset = modelLoader("models/Tiny_Witch.obj");
28+
this.assets = [
29+
modelLoader("models/Tiny_Witch.obj"),
30+
modelLoader("models/Tree.fbx")
31+
];
2932
}
3033

3134
awake() {
32-
this.model = this.asset.get();
33-
this.actor.threeObject.add(this.model);
35+
for (const asset of this.assets) {
36+
const model = asset.get();
37+
if (model.name === "Tree") {
38+
model.position.set(2, 0, 0);
39+
}
40+
this.actor.threeObject.add(model);
41+
}
3442
}
3543
}

packages/editors/model/src/loaders.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,19 @@ import {
55
import * as THREE from "three";
66
import { OBJLoader } from "three/addons/loaders/OBJLoader.js";
77
import { MTLLoader } from "three/addons/loaders/MTLLoader.js";
8+
import { FBXLoader } from "three/addons/loaders/FBXLoader.js";
89

910
export const modelLoader = Systems.Assets.registerLoader<THREE.Group<THREE.Object3DEventMap>>(
1011
{
11-
extensions: [".obj"],
12+
extensions: [".obj", ".fbx"],
1213
type: "model"
1314
},
1415
(asset, context) => {
1516
switch (asset.ext) {
1617
case ".obj":
1718
return objectLoader(asset, context);
19+
case ".fbx":
20+
return fbxLoader(asset, context);
1821
default:
1922
throw new Error(`Unsupported model type: ${asset.ext}`);
2023
}
@@ -68,3 +71,25 @@ function isMaterialWithMap(
6871
material instanceof THREE.MeshPhongMaterial
6972
);
7073
}
74+
75+
function fbxLoader(
76+
asset: Systems.Asset,
77+
context: Systems.AssetLoaderContext
78+
): Promise<THREE.Group<THREE.Object3DEventMap>> {
79+
const { manager } = context;
80+
81+
const loader = new FBXLoader(manager)
82+
.setPath(asset.path);
83+
84+
return new Promise((resolve, reject) => {
85+
loader.load(
86+
asset.basename,
87+
(object) => {
88+
object.name = asset.name;
89+
resolve(object);
90+
},
91+
void 0,
92+
(error) => reject(error)
93+
);
94+
});
95+
}

0 commit comments

Comments
 (0)