UNPKG

three-stdlib

Version:

stand-alone library of threejs examples

1 lines 20.9 kB
{"version":3,"file":"MD2CharacterComplex.cjs","sources":["../../src/misc/MD2CharacterComplex.js"],"sourcesContent":["import { Box3, MathUtils, MeshLambertMaterial, Object3D, TextureLoader, UVMapping } from 'three'\nimport { MD2Loader } from '../loaders/MD2Loader'\nimport { MorphBlendMesh } from '../misc/MorphBlendMesh'\n\nclass MD2CharacterComplex {\n constructor() {\n this.scale = 1\n\n // animation parameters\n\n this.animationFPS = 6\n this.transitionFrames = 15\n\n // movement model parameters\n\n this.maxSpeed = 275\n this.maxReverseSpeed = -275\n\n this.frontAcceleration = 600\n this.backAcceleration = 600\n\n this.frontDecceleration = 600\n\n this.angularSpeed = 2.5\n\n // rig\n\n this.root = new Object3D()\n\n this.meshBody = null\n this.meshWeapon = null\n\n this.controls = null\n\n // skins\n\n this.skinsBody = []\n this.skinsWeapon = []\n\n this.weapons = []\n\n this.currentSkin = undefined\n\n //\n\n this.onLoadComplete = function () {}\n\n // internals\n\n this.meshes = []\n this.animations = {}\n\n this.loadCounter = 0\n\n // internal movement control variables\n\n this.speed = 0\n this.bodyOrientation = 0\n\n this.walkSpeed = this.maxSpeed\n this.crouchSpeed = this.maxSpeed * 0.5\n\n // internal animation parameters\n\n this.activeAnimation = null\n this.oldAnimation = null\n\n // API\n }\n\n enableShadows(enable) {\n for (let i = 0; i < this.meshes.length; i++) {\n this.meshes[i].castShadow = enable\n this.meshes[i].receiveShadow = enable\n }\n }\n\n setVisible(enable) {\n for (let i = 0; i < this.meshes.length; i++) {\n this.meshes[i].visible = enable\n this.meshes[i].visible = enable\n }\n }\n\n shareParts(original) {\n this.animations = original.animations\n this.walkSpeed = original.walkSpeed\n this.crouchSpeed = original.crouchSpeed\n\n this.skinsBody = original.skinsBody\n this.skinsWeapon = original.skinsWeapon\n\n // BODY\n\n const mesh = this._createPart(original.meshBody.geometry, this.skinsBody[0])\n mesh.scale.set(this.scale, this.scale, this.scale)\n\n this.root.position.y = original.root.position.y\n this.root.add(mesh)\n\n this.meshBody = mesh\n\n this.meshes.push(mesh)\n\n // WEAPONS\n\n for (let i = 0; i < original.weapons.length; i++) {\n const meshWeapon = this._createPart(original.weapons[i].geometry, this.skinsWeapon[i])\n meshWeapon.scale.set(this.scale, this.scale, this.scale)\n meshWeapon.visible = false\n\n meshWeapon.name = original.weapons[i].name\n\n this.root.add(meshWeapon)\n\n this.weapons[i] = meshWeapon\n this.meshWeapon = meshWeapon\n\n this.meshes.push(meshWeapon)\n }\n }\n\n loadParts(config) {\n const scope = this\n\n function loadTextures(baseUrl, textureUrls) {\n const textureLoader = new TextureLoader()\n const textures = []\n\n for (let i = 0; i < textureUrls.length; i++) {\n textures[i] = textureLoader.load(baseUrl + textureUrls[i], checkLoadingComplete)\n textures[i].mapping = UVMapping\n textures[i].name = textureUrls[i]\n if ('colorSpace' in textures[i]) textures[i].colorSpace = 'srgb'\n else textures[i].encoding = 3001 // sRGBEncoding\n }\n\n return textures\n }\n\n function checkLoadingComplete() {\n scope.loadCounter -= 1\n if (scope.loadCounter === 0) scope.onLoadComplete()\n }\n\n this.animations = config.animations\n this.walkSpeed = config.walkSpeed\n this.crouchSpeed = config.crouchSpeed\n\n this.loadCounter = config.weapons.length * 2 + config.skins.length + 1\n\n const weaponsTextures = []\n for (let i = 0; i < config.weapons.length; i++) weaponsTextures[i] = config.weapons[i][1]\n\n // SKINS\n\n this.skinsBody = loadTextures(config.baseUrl + 'skins/', config.skins)\n this.skinsWeapon = loadTextures(config.baseUrl + 'skins/', weaponsTextures)\n\n // BODY\n\n const loader = new MD2Loader()\n\n loader.load(config.baseUrl + config.body, function (geo) {\n const boundingBox = new Box3()\n boundingBox.setFromBufferAttribute(geo.attributes.position)\n\n scope.root.position.y = -scope.scale * boundingBox.min.y\n\n const mesh = scope._createPart(geo, scope.skinsBody[0])\n mesh.scale.set(scope.scale, scope.scale, scope.scale)\n\n scope.root.add(mesh)\n\n scope.meshBody = mesh\n scope.meshes.push(mesh)\n\n checkLoadingComplete()\n })\n\n // WEAPONS\n\n const generateCallback = function (index, name) {\n return function (geo) {\n const mesh = scope._createPart(geo, scope.skinsWeapon[index])\n mesh.scale.set(scope.scale, scope.scale, scope.scale)\n mesh.visible = false\n\n mesh.name = name\n\n scope.root.add(mesh)\n\n scope.weapons[index] = mesh\n scope.meshWeapon = mesh\n scope.meshes.push(mesh)\n\n checkLoadingComplete()\n }\n }\n\n for (let i = 0; i < config.weapons.length; i++) {\n loader.load(config.baseUrl + config.weapons[i][0], generateCallback(i, config.weapons[i][0]))\n }\n }\n\n setPlaybackRate(rate) {\n if (this.meshBody) this.meshBody.duration = this.meshBody.baseDuration / rate\n if (this.meshWeapon) this.meshWeapon.duration = this.meshWeapon.baseDuration / rate\n }\n\n setWireframe(wireframeEnabled) {\n if (wireframeEnabled) {\n if (this.meshBody) this.meshBody.material = this.meshBody.materialWireframe\n if (this.meshWeapon) this.meshWeapon.material = this.meshWeapon.materialWireframe\n } else {\n if (this.meshBody) this.meshBody.material = this.meshBody.materialTexture\n if (this.meshWeapon) this.meshWeapon.material = this.meshWeapon.materialTexture\n }\n }\n\n setSkin(index) {\n if (this.meshBody && this.meshBody.material.wireframe === false) {\n this.meshBody.material.map = this.skinsBody[index]\n this.currentSkin = index\n }\n }\n\n setWeapon(index) {\n for (let i = 0; i < this.weapons.length; i++) this.weapons[i].visible = false\n\n const activeWeapon = this.weapons[index]\n\n if (activeWeapon) {\n activeWeapon.visible = true\n this.meshWeapon = activeWeapon\n\n if (this.activeAnimation) {\n activeWeapon.playAnimation(this.activeAnimation)\n this.meshWeapon.setAnimationTime(this.activeAnimation, this.meshBody.getAnimationTime(this.activeAnimation))\n }\n }\n }\n\n setAnimation(animationName) {\n if (animationName === this.activeAnimation || !animationName) return\n\n if (this.meshBody) {\n this.meshBody.setAnimationWeight(animationName, 0)\n this.meshBody.playAnimation(animationName)\n\n this.oldAnimation = this.activeAnimation\n this.activeAnimation = animationName\n\n this.blendCounter = this.transitionFrames\n }\n\n if (this.meshWeapon) {\n this.meshWeapon.setAnimationWeight(animationName, 0)\n this.meshWeapon.playAnimation(animationName)\n }\n }\n\n update(delta) {\n if (this.controls) this.updateMovementModel(delta)\n\n if (this.animations) {\n this.updateBehaviors()\n this.updateAnimations(delta)\n }\n }\n\n updateAnimations(delta) {\n let mix = 1\n\n if (this.blendCounter > 0) {\n mix = (this.transitionFrames - this.blendCounter) / this.transitionFrames\n this.blendCounter -= 1\n }\n\n if (this.meshBody) {\n this.meshBody.update(delta)\n\n this.meshBody.setAnimationWeight(this.activeAnimation, mix)\n this.meshBody.setAnimationWeight(this.oldAnimation, 1 - mix)\n }\n\n if (this.meshWeapon) {\n this.meshWeapon.update(delta)\n\n this.meshWeapon.setAnimationWeight(this.activeAnimation, mix)\n this.meshWeapon.setAnimationWeight(this.oldAnimation, 1 - mix)\n }\n }\n\n updateBehaviors() {\n const controls = this.controls\n const animations = this.animations\n\n let moveAnimation, idleAnimation\n\n // crouch vs stand\n\n if (controls.crouch) {\n moveAnimation = animations['crouchMove']\n idleAnimation = animations['crouchIdle']\n } else {\n moveAnimation = animations['move']\n idleAnimation = animations['idle']\n }\n\n // actions\n\n if (controls.jump) {\n moveAnimation = animations['jump']\n idleAnimation = animations['jump']\n }\n\n if (controls.attack) {\n if (controls.crouch) {\n moveAnimation = animations['crouchAttack']\n idleAnimation = animations['crouchAttack']\n } else {\n moveAnimation = animations['attack']\n idleAnimation = animations['attack']\n }\n }\n\n // set animations\n\n if (controls.moveForward || controls.moveBackward || controls.moveLeft || controls.moveRight) {\n if (this.activeAnimation !== moveAnimation) {\n this.setAnimation(moveAnimation)\n }\n }\n\n if (\n Math.abs(this.speed) < 0.2 * this.maxSpeed &&\n !(controls.moveLeft || controls.moveRight || controls.moveForward || controls.moveBackward)\n ) {\n if (this.activeAnimation !== idleAnimation) {\n this.setAnimation(idleAnimation)\n }\n }\n\n // set animation direction\n\n if (controls.moveForward) {\n if (this.meshBody) {\n this.meshBody.setAnimationDirectionForward(this.activeAnimation)\n this.meshBody.setAnimationDirectionForward(this.oldAnimation)\n }\n\n if (this.meshWeapon) {\n this.meshWeapon.setAnimationDirectionForward(this.activeAnimation)\n this.meshWeapon.setAnimationDirectionForward(this.oldAnimation)\n }\n }\n\n if (controls.moveBackward) {\n if (this.meshBody) {\n this.meshBody.setAnimationDirectionBackward(this.activeAnimation)\n this.meshBody.setAnimationDirectionBackward(this.oldAnimation)\n }\n\n if (this.meshWeapon) {\n this.meshWeapon.setAnimationDirectionBackward(this.activeAnimation)\n this.meshWeapon.setAnimationDirectionBackward(this.oldAnimation)\n }\n }\n }\n\n updateMovementModel(delta) {\n function exponentialEaseOut(k) {\n return k === 1 ? 1 : -Math.pow(2, -10 * k) + 1\n }\n\n const controls = this.controls\n\n // speed based on controls\n\n if (controls.crouch) this.maxSpeed = this.crouchSpeed\n else this.maxSpeed = this.walkSpeed\n\n this.maxReverseSpeed = -this.maxSpeed\n\n if (controls.moveForward)\n this.speed = MathUtils.clamp(this.speed + delta * this.frontAcceleration, this.maxReverseSpeed, this.maxSpeed)\n if (controls.moveBackward)\n this.speed = MathUtils.clamp(this.speed - delta * this.backAcceleration, this.maxReverseSpeed, this.maxSpeed)\n\n // orientation based on controls\n // (don't just stand while turning)\n\n const dir = 1\n\n if (controls.moveLeft) {\n this.bodyOrientation += delta * this.angularSpeed\n this.speed = MathUtils.clamp(\n this.speed + dir * delta * this.frontAcceleration,\n this.maxReverseSpeed,\n this.maxSpeed,\n )\n }\n\n if (controls.moveRight) {\n this.bodyOrientation -= delta * this.angularSpeed\n this.speed = MathUtils.clamp(\n this.speed + dir * delta * this.frontAcceleration,\n this.maxReverseSpeed,\n this.maxSpeed,\n )\n }\n\n // speed decay\n\n if (!(controls.moveForward || controls.moveBackward)) {\n if (this.speed > 0) {\n const k = exponentialEaseOut(this.speed / this.maxSpeed)\n this.speed = MathUtils.clamp(this.speed - k * delta * this.frontDecceleration, 0, this.maxSpeed)\n } else {\n const k = exponentialEaseOut(this.speed / this.maxReverseSpeed)\n this.speed = MathUtils.clamp(this.speed + k * delta * this.backAcceleration, this.maxReverseSpeed, 0)\n }\n }\n\n // displacement\n\n const forwardDelta = this.speed * delta\n\n this.root.position.x += Math.sin(this.bodyOrientation) * forwardDelta\n this.root.position.z += Math.cos(this.bodyOrientation) * forwardDelta\n\n // steering\n\n this.root.rotation.y = this.bodyOrientation\n }\n\n // internal\n\n _createPart(geometry, skinMap) {\n const materialWireframe = new MeshLambertMaterial({\n color: 0xffaa00,\n wireframe: true,\n morphTargets: true,\n morphNormals: true,\n })\n const materialTexture = new MeshLambertMaterial({\n color: 0xffffff,\n wireframe: false,\n map: skinMap,\n morphTargets: true,\n morphNormals: true,\n })\n\n //\n\n const mesh = new MorphBlendMesh(geometry, materialTexture)\n mesh.rotation.y = -Math.PI / 2\n\n //\n\n mesh.materialTexture = materialTexture\n mesh.materialWireframe = materialWireframe\n\n //\n\n mesh.autoCreateAnimations(this.animationFPS)\n\n return mesh\n }\n}\n\nexport { MD2CharacterComplex }\n"],"names":["Object3D","TextureLoader","UVMapping","MD2Loader","Box3","MathUtils","MeshLambertMaterial","MorphBlendMesh"],"mappings":"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"}