// // Created by Bram on 25/12/2024. // #include "DioramaScene.h" #include "../Utils.h" #include "../Effects/Effect.h" #include "../Effects/FireEffect.h" #include void DioramaScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) { std::vector> materialMeshes; Utils::LoadObjWithMaterials("resources/scene.obj", materialMeshes, true, DevicePtr); for (const auto &mesh: materialMeshes) { if (!mesh->vertices.empty()) { std::shared_ptr material = std::make_shared(); std::unique_ptr effect{}; if (!mesh->opacity_map.empty()) { effect = std::make_unique(DevicePtr, L"resources/Fire.fx"); material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr); } else { material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr); effect = std::make_unique(DevicePtr, L"resources/SimpleDiffuse.fx"); } auto newMesh = std::make_unique(DevicePtr, mesh->vertices, mesh->indices, material, std::move(effect)); m_meshes.push_back(std::move(newMesh)); Matrix worldMatrix = m_meshes.back()->GetWorldMatrix(); worldMatrix *= Matrix::CreateScale(2.f, 2.f, 2.f); worldMatrix *= Matrix::CreateScale(-1.f, 1.f, 1.f); // Mirror the model (Possible loading fault) m_meshes.back()->SetWorldMatrix(worldMatrix); } } //Load brok materialMeshes.clear(); Utils::LoadObjWithMaterials("resources/brok/brok.obj", materialMeshes, true, DevicePtr); for (const auto &mesh: materialMeshes) { if (!mesh->vertices.empty()) { std::shared_ptr material = std::make_shared(); auto effect = std::make_unique(DevicePtr, L"resources/SimpleDiffuse.fx"); material->diffuseTexturePtr = Texture::LoadFromFile("./resources/brok/" + mesh->diffuse_texture, DevicePtr); auto brokMesh = std::make_unique(DevicePtr, mesh->vertices, mesh->indices, material, std::move(effect)); m_brokMeshses.push_back(brokMesh.get()); m_meshes.push_back(std::move(brokMesh)); Matrix worldMatrix = m_meshes.back()->GetWorldMatrix(); worldMatrix *= Matrix::CreateRotationY(3.14f / 2.f); worldMatrix *= Matrix::CreateScale(0.021f, 0.021f, 0.021f); worldMatrix *= Matrix::CreateScale(-1.f, 1.f, 1.f); worldMatrix *= Matrix::CreateTranslation(-8.55f, 12.33f, 0.69f); m_meshes.back()->SetWorldMatrix(worldMatrix); } } } void DioramaScene::Update() { m_brokTimer += 0.01f; for(auto* mesh : m_brokMeshses){ if(mesh == nullptr) continue; Matrix worldMatrix = mesh->GetWorldMatrix(); float YOffset = sin(m_brokTimer) / 2000.f; worldMatrix *= Matrix::CreateTranslation(0.f, YOffset, 0.f); mesh->SetWorldMatrix(worldMatrix); } } void DioramaScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, ID3D11DepthStencilView *depthStencilViewPtr, const Camera &camera) { } std::vector> &DioramaScene::GetMeshes() { return m_meshes; } std::vector> &DioramaScene::GetMaterials() { return m_materials; } void DioramaScene::Cleanup() { m_meshes.clear(); m_materials.clear(); }