#include "applicationclass.h" ApplicationClass::ApplicationClass() { m_Direct3D = 0; m_Camera = 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]; char textureFilename[128]; bool result; // Create the Direct3D object. m_Direct3D = new D3DClass; if (!m_Direct3D) { return false; } 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, -10.0f); m_Camera->SetRotation(0.0f, 0.0f, 0.0f); // Set the file name of the model. strcpy_s(modelFilename, "cube.txt"); // Set the name of the texture file that we will be loading. strcpy_s(textureFilename, "stone01.tga"); // Create and initialize the model object. m_Model = new ModelClass; result = m_Model->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textureFilename); 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->SetDiffuseColor(1.0f, 1.0f, 1.0f, 1.0f); m_Light->SetDirection(0.0f, -1.0f, 1.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 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; } // Libérez la mémoire pour chaque cube for (auto cube : m_cubes) { cube->Shutdown(); delete cube; } m_cubes.clear(); return; } bool ApplicationClass::Frame() { static float rotation = 0.0f; bool result; // Update the rotation variable each frame. rotation -= 0.0174532925f * speed; 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, rotateMatrix, translateMatrix, scaleMatrix, srMatrix; 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); for (auto cube : m_cubes) { cube->Render(m_Direct3D->GetDeviceContext()); scaleMatrix = cube->GetScaleMatrix(); if (cube->m_demoSpinning) rotateMatrix = XMMatrixRotationY(rotation); else { rotateMatrix = cube->GetRotateMatrix(); } translateMatrix = cube->GetTranslateMatrix(); srMatrix = XMMatrixMultiply(scaleMatrix, rotateMatrix); worldMatrix = XMMatrixMultiply(srMatrix, translateMatrix); result = m_LightShader->Render(m_Direct3D->GetDeviceContext(), cube->GetIndexCount(), worldMatrix, m_Camera->GetViewMatrix(), m_Direct3D->GetProjectionMatrix(), cube->GetTexture(), m_Light->GetDirection(), m_Light->GetDiffuseColor()); if (!result) { return false; } } // Present the rendered scene to the screen. m_Direct3D->EndScene(); return true; } D3DClass* ApplicationClass::GetDirect3D() { return m_Direct3D; } int ApplicationClass::GetScreenWidth() const { return GetSystemMetrics(SM_CXSCREEN); } int ApplicationClass::GetScreenHeight() const { return GetSystemMetrics(SM_CYSCREEN); } void ApplicationClass::GenerateTerrain() { char modelFilename[128]; char textureFilename[128]; // Set the file name of the model. strcpy_s(modelFilename, "cube.txt"); // Set the name of the texture file that we will be loading. strcpy_s(textureFilename, "stone01.tga"); // Create cube objects to fill a 10x10 grid of cubes for (int i = -10; i < 10; i++) { for (int j = -10; j < 10; j++) { Object* newCube = new Object(); newCube->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textureFilename); newCube->SetTranslateMatrix(XMMatrixTranslation(i * 2.0f, -4.0f, j * 2.0f)); m_cubes.push_back(newCube); } } } void ApplicationClass::AddCube() { char modelFilename[128]; char textureFilename[128]; // Set the file name of the model. strcpy_s(modelFilename, "cube.txt"); // Set the name of the texture file that we will be loading. strcpy_s(textureFilename, "stone01.tga"); static int cubeCount = 0; float position = cubeCount * 2.0f; Object* newCube = new Object(); newCube->Initialize(m_Direct3D->GetDevice(), m_Direct3D->GetDeviceContext(), modelFilename, textureFilename); newCube->SetTranslateMatrix(XMMatrixTranslation(position, 0.0f, 0.0f)); m_cubes.push_back(newCube); } void ApplicationClass::DeleteCube(int index) { if (index < m_cubes.size()) { m_cubes[index]->Shutdown(); delete m_cubes[index]; m_cubes.erase(m_cubes.begin() + index); } }