void EMIModel::setSkeleton(Skeleton *skel) { if (_skeleton == skel) { return; } _skeleton = skel; if (!skel || !_numBoneInfos) { return; } int boneVert = 0; delete[] _vertexBoneInfo; _vertexBoneInfo = NULL; delete[] _vertexBone; _vertexBone = NULL; _vertexBoneInfo = new int[_numBoneInfos]; _vertexBone = new int[_numBoneInfos]; // Oversized, but yeah. for (int i = 0; i < _numBoneInfos; i++) { _vertexBoneInfo[i] = _skeleton->findJointIndex(_boneNames[_boneInfos[i]._joint], _skeleton->_numJoints); if (_boneInfos[i]._incFac == 1) { _vertexBone[boneVert] = i; boneVert++; } } Math::Vector3d vertex; Math::Matrix4 mat; for (int i = 0; i < _numVertices; i++) { vertex = _vertices[i]; if (_vertexBoneInfo[_vertexBone[i]] != -1) { mat = _skeleton->_joints[_vertexBoneInfo[_vertexBone[i]]]._absMatrix; mat.inverseTranslate(&vertex); mat.inverseRotate(&vertex); } _vertices[i] = vertex; } }
void SoundTrack::updatePosition() { if (!_positioned) return; Set *set = g_grim->getCurrSet(); Set::Setup *setup = set->getCurrSetup(); Math::Vector3d cameraPos = setup->_pos; Math::Vector3d vector = _pos - cameraPos; float distance = vector.getMagnitude(); _attenuation = MAX(0.0f, 1.0f - distance / (_volume * 100.0f / Audio::Mixer::kMaxChannelVolume)); if (!isfinite(_attenuation)) { _attenuation = 0.0f; } Math::Matrix4 worldRot = setup->_rot; Math::Vector3d relPos = (_pos - setup->_pos); Math::Vector3d p(relPos); worldRot.inverseRotate(&p); float angle = atan2(p.x(), p.z()); float pan = sin(angle); _balance = (int)(pan * 127.0f); if (_handle) { g_system->getMixer()->setChannelBalance(*_handle, _balance); g_system->getMixer()->setChannelVolume(*_handle, (byte)getEffectiveVolume()); } }