#include "defines.h" #include "Environment.h" #include "shader.h" #include "globals.h" #include "intrin.h" void Environment::Init() { } void Environment::Update(const D3DXMATRIX &mView /*, const D3DXMATRIX &mProj*/ ) { D3DXVECTOR3 vViewPos; // Extract view position vViewPos.x = -(mView._41 * mView._11 + mView._42 * mView._12 + mView._43 * mView._13); vViewPos.y = -(mView._41 * mView._21 + mView._42 * mView._22 + mView._43 * mView._23); vViewPos.z = -(mView._41 * mView._31 + mView._42 * mView._32 + mView._43 * mView._33); // Extract orientation D3DXVECTOR3 vRight(1.0f, 0.0f, 0.0f); // (mView._11, mView._21, mView._31); D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f); // (mView._12, mView._22, mView._32); D3DXVECTOR3 vLook(0.0f, 0.0f, 1.0f); // (mView._13, mView._23, mView._33); // Cube face orientations const D3DXVECTOR3 aFaceOrientations[MaxFaceCount][3] = { { -vLook, vUp, vRight }, { vLook, vUp, -vRight }, { vRight, -vLook, vUp }, { vRight, vLook, -vUp }, { vRight, vUp, vLook }, { -vRight, vUp, -vLook } }; // Copy projection for(int i = 0; i < MaxFaceCount; i++) { // Get orientation const D3DXVECTOR3 *pFaceOrientation = aFaceOrientations[i]; const D3DXVECTOR3 &vFaceRight = pFaceOrientation[0]; const D3DXVECTOR3 &vFaceUp = pFaceOrientation[1]; const D3DXVECTOR3 &vFaceLook = pFaceOrientation[2]; D3DXMATRIX &mEnvLocal = m_LocalMatrix[i]; // Compose local matrix D3DXMatrixIdentity(&mEnvLocal); memcpy(mEnvLocal.m[0], &vFaceRight, sizeof(float) * 3); memcpy(mEnvLocal.m[1], &vFaceUp, sizeof(float) * 3); memcpy(mEnvLocal.m[2], &vFaceLook, sizeof(float) * 3); D3DXMATRIX &mEnvView = m_ViewMatrix[i]; // Compose view matrix D3DXMatrixIdentity(&mEnvView); mEnvView._11 = vFaceRight.x; mEnvView._21 = vFaceRight.y; mEnvView._31 = vFaceRight.z; mEnvView._12 = vFaceUp.x; mEnvView._22 = vFaceUp.y; mEnvView._32 = vFaceUp.z; mEnvView._13 = vFaceLook.x; mEnvView._23 = vFaceLook.y; mEnvView._33 = vFaceLook.z; mEnvView._41 = -D3DXVec3Dot(&vViewPos, &vFaceRight); mEnvView._42 = -D3DXVec3Dot(&vViewPos, &vFaceUp); mEnvView._43 = -D3DXVec3Dot(&vViewPos, &vFaceLook); D3DXMATRIX &mEnvProj = m_ProjMatrix[i]; // 90° D3DXMatrixPerspectiveFovLH(&mEnvProj, c_PI / 2.0f, 1.0f, 0.1f, 10000.0f); // mEnvProj._33 = mProj._33; // mEnvProj._34 = mProj._34; // mEnvProj._43 = mProj._43; // mEnvProj._44 = mProj._44; // Copy remaining data memcpy(&m_ViewPos[i], &vViewPos, sizeof(D3DXVECTOR3)); memcpy(&m_ViewDir[i], &vFaceLook, sizeof(D3DXVECTOR3)); } }