void Lua_V2::WorldToScreen() { lua_Object xObj = lua_getparam(1); lua_Object yObj = lua_getparam(2); lua_Object zObj = lua_getparam(3); if (!lua_isnumber(xObj) || !lua_isnumber(yObj) || !lua_isnumber(zObj)) { lua_pushnumber(0.0); lua_pushnumber(0.0); return; } float x = lua_getnumber(xObj); float y = lua_getnumber(yObj); float z = lua_getnumber(zObj); Math::Vector3d pos = Math::Vector3d(x, y, z); const Set::Setup *setup = g_emi->getCurrSet()->getCurrSetup(); const Math::Vector3d interest = setup->_interest; const float roll = setup->_roll; const Math::Quaternion quat = Math::Quaternion(interest.x(), interest.y(), interest.z(), roll); Math::Matrix4 view = quat.toMatrix(); view.transpose(); pos -= setup->_pos; pos = view.getRotation() * pos; pos.z() = -pos.z(); Math::Matrix4 proj = GfxBase::makeProjMatrix(setup->_fov, setup->_nclip, setup->_fclip); proj.transpose(); Math::Vector4d screen = proj * Math::Vector4d(pos.x(), pos.y(), pos.z(), 1.0); screen /= screen.w(); lua_pushnumber((screen.x() + 1) * 320); lua_pushnumber((1 - screen.y()) * 240); }
void AnimationEmi::animate(Skeleton *skel, float delta) { _time += delta; if (_time > _duration) { _time = _duration; } for (int bone = 0; bone < _numBones; ++bone) { Bone &curBone = _bones[bone]; if (!curBone._target) curBone._target = skel->getJointNamed(curBone._boneName); Math::Matrix4 &relFinal = curBone._target->_finalMatrix; Math::Quaternion &quatFinal = curBone._target->_finalQuat; if (curBone._rotations) { int keyfIdx = 0; Math::Quaternion quat; Math::Vector3d relPos = relFinal.getPosition(); for (int curKeyFrame = 0; curKeyFrame < curBone._count; curKeyFrame++) { if (curBone._rotations[curKeyFrame]._time >= _time) { keyfIdx = curKeyFrame; break; } } if (keyfIdx == 0) { quat = curBone._rotations[keyfIdx]._quat; } else if (keyfIdx == curBone._count - 1) { quat = curBone._rotations[keyfIdx - 1]._quat; } else { float timeDelta = curBone._rotations[keyfIdx - 1]._time - curBone._rotations[keyfIdx]._time; float interpVal = (_time - curBone._rotations[keyfIdx]._time) / timeDelta; // Might be the other way around (keyfIdx - 1 slerped against keyfIdx) quat = curBone._rotations[keyfIdx]._quat.slerpQuat(curBone._rotations[keyfIdx - 1]._quat, interpVal); } quat.toMatrix(relFinal); quatFinal = quat; relFinal.setPosition(relPos); } if (curBone._translations) { int keyfIdx = 0; Math::Vector3d vec; for (int curKeyFrame = 0; curKeyFrame < curBone._count; curKeyFrame++) { if (curBone._translations[curKeyFrame]._time >= _time) { keyfIdx = curKeyFrame; break; } } if (keyfIdx == 0) { vec = curBone._translations[keyfIdx]._vec; } else if (keyfIdx == curBone._count - 1) { vec = curBone._translations[keyfIdx - 1]._vec; } else { float timeDelta = curBone._translations[keyfIdx - 1]._time - curBone._translations[keyfIdx]._time; float interpVal = (_time - curBone._translations[keyfIdx]._time) / timeDelta; vec.x() = curBone._translations[keyfIdx - 1]._vec.x() + (curBone._translations[keyfIdx]._vec.x() - curBone._translations[keyfIdx - 1]._vec.x()) * interpVal; vec.y() = curBone._translations[keyfIdx - 1]._vec.y() + (curBone._translations[keyfIdx]._vec.y() - curBone._translations[keyfIdx - 1]._vec.y()) * interpVal; vec.z() = curBone._translations[keyfIdx - 1]._vec.z() + (curBone._translations[keyfIdx]._vec.z() - curBone._translations[keyfIdx - 1]._vec.z()) * interpVal; } relFinal.setPosition(vec); } } }