#include "applicationclass.h" ApplicationClass::ApplicationClass() { m_Direct3D = 0; m_Camera = 0; m_MultiTextureShader = 0; m_Model = 0; m_LightShader = 0; m_Light = 0; } ApplicationClass::ApplicationClass(const ApplicationClass& other) { } ApplicationClass::~ApplicationClass() { } bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd) { char modelFilename[128], textureFilename1[128], textureFilename2[128]; bool result; // Create the Direct3D object. m_Direct3D = new D3DClass; if (!m_Direct3D) { return false; } // Initialize the Direct3D object. result = m_Direct3D->Initialize(screenWidth, screenHeight, VSYNC_ENABLED, hwnd, FULL_SCREEN, SCREEN_DEPTH, SCREEN_NEAR); if (!result) { MessageBox(hwnd, L"Could not initialize Direct3D.", L"Error", MB_OK); return false; } // Create the camera object. m_Camera = new CameraClass; if (!m_Camera) { return false; } // Set the initial position of the camera. m_Camera->SetPosition(0.0f, 0.0f, -5.0f); m_Camera->SetRotation(0.0f, 0.0f, 10.0f); // Create and initialize the multitexture shader object. m_MultiTextureShader = new MultiTextureShaderClass; result = m_MultiTextureShader->Initialize(m_Direct3D->GetDevice(), hwnd); if (!result) { MessageBox(hwnd, L"Could not initialize the multitexture shader object.", L"Error", MB_OK); return false; } // Set the file name of the model. strcpy_s(modelFilename, "cube.txt"); // Set the file name of the textures. strcpy_s(textureFilename1, "stone01.tga"); strcpy_s(textureFilename2, "moss01.tga"); // Create and initialize the model object. m_Model = new ModelClass; result = m_Model->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textureFilename1, textureFilename2); if (!result) { MessageBox(hwnd, L"Could not initialize the model object.", L"Error", MB_OK); return false; } // Create and initialize the light shader object. m_LightShader = new LightShaderClass; result = m_LightShader->Initialize(m_Direct3D->GetDevice(), hwnd); if (!result) { MessageBox(hwnd, L"Could not initialize the light shader object.", L"Error", MB_OK); return false; } // Create and initialize the light object. m_Light = new LightClass; m_Light->SetAmbientColor(0.15f, 0.15f, 0.15f, 1.0f); m_Light->SetDiffuseColor(1.0f, 1.0f, 1.0f, 1.0f); m_Light->SetDirection(1.0f, 0.0f, 0.0f); return true; } void ApplicationClass::Shutdown() { // Release the light object. if (m_Light) { delete m_Light; m_Light = 0; } // Release the light shader object. if (m_LightShader) { m_LightShader->Shutdown(); delete m_LightShader; m_LightShader = 0; } // Release the model object. if (m_Model) { m_Model->Shutdown(); delete m_Model; m_Model = 0; } // Release the multitexture shader object. if (m_MultiTextureShader) { m_MultiTextureShader->Shutdown(); delete m_MultiTextureShader; m_MultiTextureShader = 0; } // Release the camera object. if (m_Camera) { delete m_Camera; m_Camera = 0; } // Release the D3D object. if (m_Direct3D) { m_Direct3D->Shutdown(); delete m_Direct3D; m_Direct3D = 0; } return; } bool ApplicationClass::Frame() { static float rotation = 0.0f; bool result; // Update the rotation variable each frame. rotation -= 0.0174532925f * 0.1f; if (rotation < 0.0f) { rotation += 360.0f; } // Render the graphics scene. result = Render(rotation); if (!result) { return false; } return true; } bool ApplicationClass::Render(float rotation) { XMMATRIX worldMatrix, viewMatrix, projectionMatrix; bool result; // Clear the buffers to begin the scene. m_Direct3D->BeginScene(0.0f, 0.0f, 0.0f, 1.0f); // Generate the view matrix based on the camera's position. m_Camera->Render(); // Get the world, view, and projection matrices from the camera and d3d objects. m_Direct3D->GetWorldMatrix(worldMatrix); m_Camera->GetViewMatrix(viewMatrix); m_Direct3D->GetProjectionMatrix(projectionMatrix); // Rotate the world matrix by the rotation value so that the triangle will spin. worldMatrix = XMMatrixRotationY(rotation); // Render the model using the multitexture shader. m_Model->Render(m_Direct3D->GetDeviceContext()); // Render the model using the light shader. result = m_LightShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(0), m_Light->GetDirection(), m_Light->GetAmbientColor(), m_Light->GetDiffuseColor()); if (!result) { return false; } // Render the model using the multitexture shader. result = m_MultiTextureShader->Render(m_Direct3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, m_Model->GetTexture(0), m_Model->GetTexture(1)); if (!result) { return false; } // Present the rendered scene to the screen. m_Direct3D->EndScene(); return true; }