Implémentation d'un ciel en cube avec DirectX
En raison des problèmes d'utilisation de DxTex, une approche alternative a été adoptée en modifiant directement les noms de fichires du projet. Il est crucial de charger les six textures carrées dans l'ordre spécifique suivant : +X, -X, +Y, -Y, +Z, -Z.
Les texutres ont été générées à partir de l'outil en ligne suivant : Panorama to Cubemap. L'ordre de chargement est illustré dans la documentation associée.
Gestion du placement et de la destruction de blocs
Placement de blocs
Initialisatino des ressources nécessaires :
GameObject m_TerrainBlocks[10]; // Blocs de terrain
size_t m_BlockCount; // Nombre total de blocs
Configuration initiale :
m_BlockCount = 10; // Défini dans GameApp::InitResource()
static size_t currentBlockIndex = 0; // Géré dans GameApp::UpdateScene()
Logique de placement :
if (ImGui::IsMouseClicked(ImGuiMouseButton_Right) && ImGui::IsKeyDown(ImGuiKey_LeftShift) && currentBlockIndex < m_BlockCount) {
// Création du modèle
Model* pModel = m_ModelManager.CreateFromGeometry("Terrain", Geometry::CreateBox(2.0f, 2.0f, 2.0f));
pModel->SetDebugObjectName("Terrain");
// Chargement de la texture
m_TextureManager.CreateFromFile("..\\Texture\\Terrain.jpg");
pModel->materials[0].Set<std::string>("$Diffuse", "..\\Texture\\Terrain.jpg");
pModel->materials[0].Set<XMFLOAT4>("$AmbientColor", XMFLOAT4(0.1f, 0.1f, 0.1f, 1.0f));
pModel->materials[0].Set<XMFLOAT4>("$DiffuseColor", XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f));
pModel->materials[0].Set<XMFLOAT4>("$SpecularColor", XMFLOAT4(0.1f, 0.1f, 0.1f, 1.0f));
pModel->materials[0].Set<float>("$SpecularPower", 16.0f);
// Positionnement du bloc
DirectX::XMFLOAT3 camPos = m_pCamera->GetPosition();
DirectX::XMFLOAT3 camDir = m_pCamera->GetLookAxis();
m_TerrainBlocks[currentBlockIndex].GetTransform().SetPosition(
camPos.x + camDir.x * 5,
camPos.y + camDir.y * 5,
camPos.z + camDir.z * 5
);
m_TerrainBlocks[currentBlockIndex].SetModel(pModel);
++currentBlockIndex;
}
Destruction de blocs
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
for (size_t i = 0; i < m_BlockCount; i++) {
if (ray.Hit(m_TerrainBlocks[i].GetBoundingBox(), nullptr, 6.0f)) {
m_TerrainBlocks[i].SetModel(nullptr);
currentBlockIndex = i;
}
}
// Vérification des positions libres
for (size_t i = 0; i < m_BlockCount && m_TerrainBlocks[currentBlockIndex].GetModel(); i++) {
if (!m_TerrainBlocks[i].GetModel()) {
currentBlockIndex = i;
break;
}
}
}
Rendu des blocs :
for (size_t i = 0; i < m_BlockCount; i++) {
if (m_TerrainBlocks[i].GetModel()) {
m_TerrainBlocks[i].Draw(m_pd3dImmediateContext.Get(), m_BasicEffect);
}
}