void RasNormalMap::DoPerVertexLighting( VertexBuffer& workingVB, FaceList& workingFaces, RenderObject& obj ) { const VEC3& camPos = g_env.renderer->m_camera.GetPos().GetVec3(); MAT44 matInvWorld = obj.m_matWorld.Inverse(); for (size_t iVert=0; iVert<obj.m_verts.size(); ++iVert) { SVertex& vert = obj.m_verts[iVert]; // Get the matrix which transforms vector from object space to tangent space MAT44 matTBN; matTBN.SetRow(0, VEC4(vert.tangent, 0)); matTBN.SetRow(1, VEC4(vert.binormal, 0)); matTBN.SetRow(2, VEC4(vert.normal, 0)); // Calc light dir in object space const VEC3& lightDir = g_env.renderer->m_testLight.neg_dir; vert.lightDirTS = Common::Transform_Vec3_By_Mat44(lightDir, matInvWorld, false).GetVec3(); // Transform! vert.lightDirTS = Common::Transform_Vec3_By_Mat44(vert.lightDirTS, matTBN, false).GetVec3(); // Half-angle vector VEC3 eyeDir = Common::Sub_Vec3_By_Vec3(camPos, vert.pos.GetVec3()); eyeDir.Normalize(); Common::Add_Vec3_By_Vec3(vert.halfAngleTS, eyeDir, lightDir); vert.halfAngleTS.Normalize(); vert.halfAngleTS = Common::Transform_Vec3_By_Mat44(vert.halfAngleTS, matTBN, false).GetVec3(); } }
void Camera::Yaw( float angle ) { MAT44 rot; rot.FromAxisAngle(VEC3::UNIT_Y, angle); if(m_fixYawAxis) m_matRot = Common::Multiply_Mat44_By_Mat44(m_matRot, rot); else m_matRot = Common::Multiply_Mat44_By_Mat44(rot, m_matRot); }
void Camera::Update() { //更新输入 POINT curCursorPos; GetCursorPos(&curCursorPos); static POINT lastCursorPos = curCursorPos; long dx = curCursorPos.x - lastCursorPos.x; long dy = curCursorPos.y - lastCursorPos.y; float yawDelta = 0, pitchDelta = 0; if(dx) yawDelta = -dx/5.0f; if(dy) pitchDelta = -dy/5.0f; lastCursorPos = curCursorPos; if(!m_bActive) return; //相机旋转 if(dx) { Yaw(yawDelta); } if(dy) { MAT44 rotX; rotX.FromAxisAngle(VEC3::UNIT_X, pitchDelta); //pitch m_matRot = Common::Multiply_Mat44_By_Mat44(m_matRot, rotX); } //相机移动 VEC4 forward = GetDirection(); VEC4 right = GetRight(); forward = Common::Multiply_Vec4_By_K(forward, m_moveSpeed); right = Common::Multiply_Vec4_By_K(right, m_moveSpeed); if(GetAsyncKeyState('W') < 0) m_viewPt = Add_Vec4_By_Vec4(m_viewPt, forward); else if(GetAsyncKeyState('S') < 0) m_viewPt = Sub_Vec4_By_Vec4(m_viewPt, forward); if(GetAsyncKeyState('A') < 0) m_viewPt = Sub_Vec4_By_Vec4(m_viewPt, right); else if(GetAsyncKeyState('D') < 0) m_viewPt = Add_Vec4_By_Vec4(m_viewPt, right); m_viewPt.w = 1; _BuildViewMatrix(); _BuildProjMatrix(); }