///@brief Called from the UI to indicate whether the user is holding and dragging /// the quad around in world space. void HudQuad::SetHoldingFlag(ovrPosef pose, bool f) { if (f == false) { m_holding = false; return; } glm::vec3 ro, rd; GetHMDEyeRayPosAndDir(pose, ro, rd); const glm::mat4 quadposeMatrix = makeMatrixFromPose(GetPose()); glm::vec2 planePt; float tParam; const bool hit = GetPaneRayIntersectionCoordinates(quadposeMatrix, ro, rd, planePt, tParam); if (hit == true) { if ((f == true) && (m_holding == false)) { // Just grabbed; store quad's pose at start m_holding = true; m_hitPtTParam = tParam; const ovrVector3f& tx = m_QuadPoseCenter.Position; m_planePositionAtGrab = glm::vec3(tx.x, tx.y, tx.z); m_hitPtPositionAtGrab = ro + m_hitPtTParam*rd; } } }
void AnimationPlayer::Update(const GameTime& gameTime) { if (mIsPlayingClip) { assert(mCurrentClip != nullptr); mCurrentTime += (static_cast<float>(gameTime.ElapsedGameTime().count()) / 1000.0f) * mCurrentClip->TicksPerSecond(); if (mCurrentTime >= mCurrentClip->Duration()) { if (mIsClipLooped) { mCurrentTime = 0.0f; } else { mIsPlayingClip = false; return; } } if (mInterpolationEnabled) { GetInterpolatedPose(mCurrentTime, *(mModel->RootNode())); } else { GetPose(mCurrentTime, *(mModel->RootNode())); } } }
void AnimationPlayer::GetPose(float time, SceneNode& sceneNode) { XMFLOAT4X4 toParentTransform; Bone* bone = sceneNode.As<Bone>(); if (bone != nullptr) { mCurrentKeyframe = mCurrentClip->GetTransform(time, *bone, toParentTransform); } else { toParentTransform = sceneNode.Transform(); } XMMATRIX toRootTransform = (sceneNode.GetParent() != nullptr ? XMLoadFloat4x4(&toParentTransform) * XMLoadFloat4x4(&(mToRootTransforms.at(sceneNode.GetParent()))) : XMLoadFloat4x4(&toParentTransform)); XMStoreFloat4x4(&(mToRootTransforms[&sceneNode]), toRootTransform); if (bone != nullptr) { XMStoreFloat4x4(&(mFinalTransforms[bone->Index()]), bone->OffsetTransformMatrix() * toRootTransform * XMLoadFloat4x4(&mInverseRootTransform)); } for (auto& childNode : sceneNode.Children()) { GetPose(time, *childNode); } }
void DebugEmitterComponent::Render(const UpdateContext& updateContext) { if (!_model) return; auto parent = GetParentEntity(); vec3f center = GetModelCenter(); vec3f desiredPos = parent->GetPosition(); vec3f desiredScale = parent->GetScale(); mat4f desiredPose = parent->GetPose(); enableZTest(); changeZTest(GL_LEQUAL); mat4f ident, NT, T, S, R, x, y, z; ident.loadIdentity(); _matrixStack.PushMatrix(ident); //NT.loadTranslation(-center.x, -center.y, -center.z); T.loadTranslation(desiredPos.x, desiredPos.y, desiredPos.z); S.loadScale(desiredScale.x, desiredScale.y, desiredScale.z); R = desiredPose; R.m[12] = 0.0f; R.m[13] = 0.0f; R.m[14] = 0.0f; R.m[15] = 1.0f; _matrixStack.MultiplyMatrix(T); _matrixStack.MultiplyMatrix(S); _matrixStack.MultiplyMatrix(R); //_matrixStack.MultiplyMatrix(NT); // _matrixStack.MultiplyMatrix(parent->GetTransform()); /*vec3f rot = parent->GetDirection(); mat4f xRot, yRot, zRot; xRot.loadXRotation(rot.x); yRot.loadYRotation(rot.y); zRot.loadZRotation(rot.z); xRot *= yRot; xRot *= zRot; _matrixStack.MultiplyMatrix(xRot);*/ mat4f MV; MV = getMatrix(MATRIX_MODEL); _RenderNode(_model->RootNode, updateContext); _matrixStack.PopMatrix(); setMatrix(MATRIX_MODEL, MV); }
void CameraControllerBase::UpdateCameraPose( float dt ) { if( !m_Active ) return; float forward=0, right=0, up=0, spd; // Matrix33 matRot; if( (GetAsyncKeyState(VK_SHIFT) & 0x8000) ) spd = m_fTranslationSpeed * 2.0f; else spd = m_fTranslationSpeed * 1.0f; int *kb = m_CameraControlCode; if( IsKeyPressed(kb[CameraControl::Forward]) ) forward = spd * dt; if( IsKeyPressed(kb[CameraControl::Backward]) ) forward = -spd * dt; if( IsKeyPressed(kb[CameraControl::Right]) ) right = spd * dt; if( IsKeyPressed(kb[CameraControl::Left]) ) right = -spd * dt; if( IsKeyPressed(kb[CameraControl::Up]) ) up = spd * dt * 3.0f; if( IsKeyPressed(kb[CameraControl::Down]) ) up = -spd * dt * 3.0f; /* // if( GetAsyncKeyState('X') & 0x8000 ) m_fYaw += 3.141592f * dt; // if( GetAsyncKeyState('Z') & 0x8000 ) m_fYaw -= 3.141592f * dt; // if( GetAsyncKeyState('Q') & 0x8000 ) m_fPitch += 3.141592f * dt; // if( GetAsyncKeyState('A') & 0x8000 ) m_fPitch -= 3.141592f * dt; // if( GetAsyncKeyState('Q') & 0x8000 ) m_vCameraPosition.y += 2.0f * dt; // if( GetAsyncKeyState('A') & 0x8000 ) m_vCameraPosition.y -= 2.0f * dt; */ Matrix34 pose = GetPose(); pose.matOrient = Matrix33RotationY(m_fYaw) * Matrix33RotationX(m_fPitch); pose.vPosition += pose.matOrient.GetColumn(2) * forward + pose.matOrient.GetColumn(0) * right + pose.matOrient.GetColumn(1) * up; SetPose( pose ); // m_Pose.vPosition += m_vRight * m_fMouseMoveRight + m_vUp * m_fMouseMoveUp; // m_fMouseMoveRight = 0; m_fMouseMoveUp = 0; }
inline Matrix34 GetPose() const { Matrix34 pose; GetPose(pose); return pose; }