UNPKG

lingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

52 lines 2.23 kB
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