Création d'un ciel en cube avec DirectX et gestion de la destruction et du placement de blocs

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);
    }
}

Étiquettes: DirectX11 cube_mapping block_destruction ray_tracing ImGui

Publié le 17 septembre à 23h13