lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
52 lines • 2.23 kB
JavaScript
import { onBeforeRender } from "../../events/onBeforeRender";
import { modelDefaults, modelSchema } from "../../interface/IModel";
import Bone from "../Bone";
import Model from "../Model";
import getWorldQuaternion from "../../memo/getWorldQuaternion";
import { complementQuaternion, diffQuaternions, worldToLocalQuaternion } from "../utils/quaternions";
import { ybotUrlPtr } from "../../pointers/assetsPathPointers";
class Character extends Model {
static componentName = "character";
static defaults = modelDefaults;
static schema = modelSchema;
constructor() {
super();
this.width = 20;
this.depth = 20;
this.scale = 1.7;
this.src = ybotUrlPtr[0];
this.$events.once("loaded", () => {
const arm = this.find("LeftArm")?.outerObject3d;
const foreArm = this.find("LeftForeArm")?.outerObject3d;
const hand = this.find("LeftHand")?.outerObject3d;
if (!arm || !foreArm || !hand)
return;
const data = [];
const boneMap = new WeakMap();
const attachBone = (arm, foreArm) => {
const bone = new Bone(arm, foreArm);
boneMap.set(foreArm, bone);
boneMap.get(arm)?.attach(bone);
//todo: change clone to vector3.copy
const from = arm.quaternion.clone();
arm.quaternion.copy(worldToLocalQuaternion(arm, getWorldQuaternion(bone.outerObject3d)));
const diff = diffQuaternions(from, arm.quaternion);
complementQuaternion(arm.quaternion, diff);
data.push([bone, arm, diff]);
};
attachBone(arm, foreArm);
attachBone(foreArm, hand);
const handle = onBeforeRender(() => {
for (const [bone, arm, diff] of data) {
arm.quaternion.copy(worldToLocalQuaternion(arm, getWorldQuaternion(bone.outerObject3d)));
complementQuaternion(arm.quaternion, diff);
}
});
return () => {
handle.cancel();
};
});
}
}
export default Character;
//# sourceMappingURL=index.js.map