From 9a2e810e2ae4f690eb4b487392195428fa8db6ad Mon Sep 17 00:00:00 2001 From: turanszkij Date: Tue, 18 Sep 2018 21:37:20 +0100 Subject: [PATCH] updates --- Editor/CameraWindow.cpp | 42 +++------ Editor/CameraWindow.h | 5 +- Editor/Editor.cpp | 58 ++++++------- Editor/ModelImporter_GLTF.cpp | 3 - Editor/Translator.cpp | 22 +++-- Editor/main.cpp | 9 +- Template_Windows/main.cpp | 9 +- Tests/main.cpp | 9 +- WickedEngine/ArchiveVersionHistory.txt | 2 + WickedEngine/wiArchive.cpp | 4 +- WickedEngine/wiECS.h | 56 ++++++++---- WickedEngine/wiFrustum.cpp | 5 +- WickedEngine/wiHairParticle.h | 1 - WickedEngine/wiIntersectables.cpp | 96 ++++++++------------- WickedEngine/wiIntersectables.h | 49 ++++++++--- WickedEngine/wiRenderer.cpp | 40 +++------ WickedEngine/wiRenderer.h | 7 +- WickedEngine/wiSceneSystem.cpp | 115 ++++++++++++------------- WickedEngine/wiSceneSystem.h | 10 +-- 19 files changed, 256 insertions(+), 286 deletions(-) diff --git a/Editor/CameraWindow.cpp b/Editor/CameraWindow.cpp index 03e2dfe6a..574d7b2de 100644 --- a/Editor/CameraWindow.cpp +++ b/Editor/CameraWindow.cpp @@ -8,18 +8,13 @@ void CameraWindow::ResetCam() { Scene& scene = wiRenderer::GetScene(); - TransformComponent* transform = scene.transforms.GetComponent(wiRenderer::getCameraID()); - if (transform != nullptr) - { - transform->ClearTransform(); - transform->Translate(XMFLOAT3(0, 2, -10)); - } + camera_transform.ClearTransform(); + camera_transform.Translate(XMFLOAT3(0, 2, -10)); + camera_transform.UpdateTransform(); + wiRenderer::getCamera()->UpdateCamera(&camera_transform); - TransformComponent* target_transform = scene.transforms.GetComponent(target); - if (target_transform != nullptr) - { - target_transform->ClearTransform(); - } + camera_target.ClearTransform(); + camera_target.UpdateTransform(); } CameraWindow::CameraWindow(wiGUI* gui) :GUI(gui) @@ -29,14 +24,6 @@ CameraWindow::CameraWindow(wiGUI* gui) :GUI(gui) float screenW = (float)wiRenderer::GetDevice()->GetScreenWidth(); float screenH = (float)wiRenderer::GetDevice()->GetScreenHeight(); - target = (Entity)wiHashString("__editorCameraTarget").GetHash(); - - Scene& scene = wiRenderer::GetScene(); - if (scene.transforms.GetComponent(target) == nullptr) - { - scene.transforms.Create(target); - } - cameraWindow = new wiWindow(GUI, "Camera Window"); cameraWindow->SetSize(XMFLOAT2(600, 420)); GUI->AddWidget(cameraWindow); @@ -51,7 +38,7 @@ CameraWindow::CameraWindow(wiGUI* gui) :GUI(gui) farPlaneSlider->SetValue(wiRenderer::getCamera()->zFarP); farPlaneSlider->OnSlide([&](wiEventArgs args) { Scene& scene = wiRenderer::GetScene(); - CameraComponent& camera = *scene.cameras.GetComponent(wiRenderer::getCameraID()); + CameraComponent& camera = *wiRenderer::getCamera(); camera.zFarP = args.fValue; camera.UpdateProjection(); }); @@ -63,7 +50,7 @@ CameraWindow::CameraWindow(wiGUI* gui) :GUI(gui) nearPlaneSlider->SetValue(wiRenderer::getCamera()->zNearP); nearPlaneSlider->OnSlide([&](wiEventArgs args) { Scene& scene = wiRenderer::GetScene(); - CameraComponent& camera = *scene.cameras.GetComponent(wiRenderer::getCameraID()); + CameraComponent& camera = *wiRenderer::getCamera(); camera.zNearP = args.fValue; camera.UpdateProjection(); }); @@ -74,7 +61,7 @@ CameraWindow::CameraWindow(wiGUI* gui) :GUI(gui) fovSlider->SetPos(XMFLOAT2(x, y += inc)); fovSlider->OnSlide([&](wiEventArgs args) { Scene& scene = wiRenderer::GetScene(); - CameraComponent& camera = *scene.cameras.GetComponent(wiRenderer::getCameraID()); + CameraComponent& camera = *wiRenderer::getCamera(); camera.fov = args.fValue / 180.f * XM_PI; camera.UpdateProjection(); }); @@ -111,16 +98,13 @@ CameraWindow::CameraWindow(wiGUI* gui) :GUI(gui) proxyButton->SetPos(XMFLOAT2(x, y += inc * 2)); proxyButton->OnClick([&](wiEventArgs args) { + CameraComponent& camera = *wiRenderer::getCamera(); + Scene& scene = wiRenderer::GetScene(); - Entity proxy = CreateEntity(); + Entity entity = scene.Entity_CreateCamera("cam", camera.width, camera.height, camera.zNearP, camera.zFarP, camera.fov); - auto& name = scene.names.Create(proxy); - auto& transform = scene.transforms.Create(proxy); - auto& camera = scene.cameras.Create(proxy); - - name = "cam"; - camera = *wiRenderer::getCamera(); + TransformComponent& transform = *scene.transforms.GetComponent(entity); transform.MatrixTransform(camera.InvView); }); cameraWindow->AddWidget(proxyButton); diff --git a/Editor/CameraWindow.h b/Editor/CameraWindow.h index c0997afdb..2e80df382 100644 --- a/Editor/CameraWindow.h +++ b/Editor/CameraWindow.h @@ -15,12 +15,13 @@ public: void ResetCam(); - wiECS::Entity target = wiECS::INVALID_ENTITY; - wiECS::Entity proxy = wiECS::INVALID_ENTITY; void SetEntity(wiECS::Entity entity); + wiSceneSystem::TransformComponent camera_transform; + wiSceneSystem::TransformComponent camera_target; + wiGUI* GUI; wiWindow* cameraWindow; diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index c81c1044e..1e15ced42 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -563,8 +563,11 @@ void EditorComponent::Load() if (!extension.compare("WISCENE")) // engine-serialized { wiArchive archive(fileName, true); - Scene& scene = wiRenderer::GetScene(); - scene.Serialize(archive); + if (archive.IsOpen()) + { + Scene& scene = wiRenderer::GetScene(); + scene.Serialize(archive); + } } else if (!extension.compare("OBJ")) // wavefront-obj { @@ -756,9 +759,7 @@ void EditorComponent::FixedUpdate() void EditorComponent::Update(float dt) { Scene& scene = wiRenderer::GetScene(); - CameraComponent* camera = wiRenderer::getCamera(); - TransformComponent* camera_transform = scene.transforms.GetComponent(wiRenderer::getCameraID()); - assert(camera_transform != nullptr); + CameraComponent& camera = *wiRenderer::getCamera(); // Follow camera proxy: if (cameraWnd->followCheckBox->IsEnabled() && cameraWnd->followCheckBox->GetCheck()) @@ -766,7 +767,7 @@ void EditorComponent::Update(float dt) TransformComponent* proxy = scene.transforms.GetComponent(cameraWnd->proxy); if (proxy != nullptr) { - camera_transform->Lerp(*camera_transform, *proxy, 1.0f - cameraWnd->followSlider->GetValue()); + cameraWnd->camera_transform.Lerp(cameraWnd->camera_transform, *proxy, 1.0f - cameraWnd->followSlider->GetValue()); } } @@ -860,41 +861,40 @@ void EditorComponent::Update(float dt) if (abs(xDif) + abs(yDif) > 0 || moveLength > 0.0001f) { - XMMATRIX camRot = XMMatrixRotationQuaternion(XMLoadFloat4(&camera_transform->rotation_local)); + XMMATRIX camRot = XMMatrixRotationQuaternion(XMLoadFloat4(&cameraWnd->camera_transform.rotation_local)); XMVECTOR move_rot = XMVector3TransformNormal(move, camRot); XMFLOAT3 _move; XMStoreFloat3(&_move, move_rot); - camera_transform->Translate(_move); - camera_transform->RotateRollPitchYaw(XMFLOAT3(yDif, xDif, 0)); + cameraWnd->camera_transform.Translate(_move); + cameraWnd->camera_transform.RotateRollPitchYaw(XMFLOAT3(yDif, xDif, 0)); } + + cameraWnd->camera_transform.UpdateTransform(); } else { // Orbital Camera - HierarchyComponent* parented = scene.hierarchy.GetComponent(wiRenderer::getCameraID()); - TransformComponent* target_transform = scene.transforms.GetComponent(cameraWnd->target); - if (parented == nullptr) - { - //cam->attachTo(cameraWnd->orbitalCamTarget); - scene.Component_Attach(wiRenderer::getCameraID(), cameraWnd->target); - } if (wiInputManager::GetInstance()->down(VK_LSHIFT)) { - XMVECTOR V = XMVectorAdd(camera->GetRight() * xDif, camera->GetUp() * yDif) * 10; + XMVECTOR V = XMVectorAdd(camera.GetRight() * xDif, camera.GetUp() * yDif) * 10; XMFLOAT3 vec; XMStoreFloat3(&vec, V); - target_transform->Translate(vec); + cameraWnd->camera_target.Translate(vec); } else if (wiInputManager::GetInstance()->down(VK_LCONTROL)) { - camera_transform->Translate(XMFLOAT3(0, 0, yDif * 4)); + cameraWnd->camera_transform.Translate(XMFLOAT3(0, 0, yDif * 4)); } else if(abs(xDif) + abs(yDif) > 0) { - target_transform->RotateRollPitchYaw(XMFLOAT3(yDif*2, xDif*2, 0)); + cameraWnd->camera_target.RotateRollPitchYaw(XMFLOAT3(yDif*2, xDif*2, 0)); } + + cameraWnd->camera_target.UpdateTransform(); + cameraWnd->camera_transform.UpdateParentedTransform(cameraWnd->camera_target); } + camera.UpdateCamera(&cameraWnd->camera_transform); // Begin picking: UINT pickMask = rendererWnd->GetPickType(); @@ -1023,10 +1023,6 @@ void EditorComponent::Update(float dt) for (size_t i = 0; i < scene.cameras.GetCount(); ++i) { Entity entity = scene.cameras.GetEntity(i); - if (entity == wiRenderer::getCameraID()) - { - continue; - } const TransformComponent& transform = *scene.transforms.GetComponent(entity); @@ -1120,8 +1116,10 @@ void EditorComponent::Update(float dt) selectAll = false; EndTranslate(); - for (Entity entity : scene.owned_entities) + for (size_t i = 0; i < scene.names.GetCount(); ++i) { + Entity entity = scene.names.GetEntity(i); + Picked picked; picked.entity = entity; AddSelected(picked); @@ -1694,10 +1692,6 @@ void EditorComponent::Compose() for (size_t i = 0; i < scene.cameras.GetCount(); ++i) { Entity entity = scene.cameras.GetEntity(i); - if (entity == wiRenderer::getCameraID()) - { - continue; - } const TransformComponent& transform = *scene.transforms.GetComponent(entity); @@ -1856,6 +1850,9 @@ void EditorComponent::BeginTranslate() Scene& scene = wiRenderer::GetScene(); + // Insert translator into scene: + scene.transforms.Create(translator.entityID); + // Begin translation, save scene hierarchy from before: savedHierarchy.Copy(scene.hierarchy); @@ -1901,6 +1898,9 @@ void EditorComponent::EndTranslate() Scene& scene = wiRenderer::GetScene(); + // Remove translator from scene: + scene.Entity_Remove(translator.entityID); + // Translation ended, apply all final transformations as local pose: for (size_t i = 0; i < scene.hierarchy.GetCount(); ++i) { diff --git a/Editor/ModelImporter_GLTF.cpp b/Editor/ModelImporter_GLTF.cpp index 58b36f3d3..9682e7f68 100644 --- a/Editor/ModelImporter_GLTF.cpp +++ b/Editor/ModelImporter_GLTF.cpp @@ -204,7 +204,6 @@ void LoadNode(tinygltf::Node* node, Entity parent, LoaderState& state) if (entity == INVALID_ENTITY) { entity = CreateEntity(); - scene.owned_entities.insert(entity); scene.transforms.Create(entity); } @@ -677,7 +676,6 @@ Entity ImportModel_GLTF(const std::string& fileName) for (auto& skin : state.gltfModel.skins) { Entity armatureEntity = CreateEntity(); - scene.owned_entities.insert(armatureEntity); scene.names.Create(armatureEntity) = skin.name; scene.layers.Create(armatureEntity); TransformComponent& transform = scene.transforms.Create(armatureEntity); @@ -738,7 +736,6 @@ Entity ImportModel_GLTF(const std::string& fileName) for (auto& anim : state.gltfModel.animations) { Entity entity = CreateEntity(); - scene.owned_entities.insert(entity); scene.names.Create(entity) = anim.name; AnimationComponent& animationcomponent = scene.animations.Create(entity); diff --git a/Editor/Translator.cpp b/Editor/Translator.cpp index 2988f779b..b10d003fa 100644 --- a/Editor/Translator.cpp +++ b/Editor/Translator.cpp @@ -58,11 +58,7 @@ void Translator::LoadShaders() Translator::Translator() { - Scene& scene = wiRenderer::GetScene(); - entityID = CreateEntity(); - scene.transforms.Create(entityID); - scene.names.Create(entityID) = "editorTranslator"; prevPointer = XMFLOAT4(0, 0, 0, 0); @@ -203,6 +199,12 @@ Translator::~Translator() void Translator::Update() { Scene& scene = wiRenderer::GetScene(); + + if (!scene.transforms.Contains(entityID)) + { + return; + } + TransformComponent& transform = *scene.transforms.GetComponent(entityID); dragStarted = false; @@ -433,13 +435,19 @@ void Translator::Update() } void Translator::Draw(CameraComponent* camera, GRAPHICSTHREAD threadID) { + Scene& scene = wiRenderer::GetScene(); + + if (!scene.transforms.Contains(entityID)) + { + return; + } + + TransformComponent& transform = *scene.transforms.GetComponent(entityID); + GraphicsDevice* device = wiRenderer::GetDevice(); device->EventBegin("Editor - Translator", threadID); - Scene& scene = wiRenderer::GetScene(); - TransformComponent& transform = *scene.transforms.GetComponent(entityID); - XMMATRIX VP = camera->GetViewProjection(); wiRenderer::MiscCB sb; diff --git a/Editor/main.cpp b/Editor/main.cpp index c34b71e7a..2112fef20 100644 --- a/Editor/main.cpp +++ b/Editor/main.cpp @@ -214,14 +214,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) int height = HIWORD(lParam); wiRenderer::GetDevice()->SetResolution(width, height); - - wiSceneSystem::Scene& scene = wiRenderer::GetScene(); - - wiSceneSystem::CameraComponent* camera = scene.cameras.GetComponent(wiRenderer::getCameraID()); - if (camera != nullptr) - { - camera->CreatePerspective((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y, 0.1f, 800); - } + wiRenderer::getCamera()->CreatePerspective((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y, 0.1f, 800); } } break; diff --git a/Template_Windows/main.cpp b/Template_Windows/main.cpp index 2d76f06d4..6a7919a9f 100644 --- a/Template_Windows/main.cpp +++ b/Template_Windows/main.cpp @@ -178,14 +178,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) int height = HIWORD(lParam); wiRenderer::GetDevice()->SetResolution(width, height); - - wiSceneSystem::Scene& scene = wiRenderer::GetScene(); - - wiSceneSystem::CameraComponent* camera = scene.cameras.GetComponent(wiRenderer::getCameraID()); - if (camera != nullptr) - { - camera->CreatePerspective((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y, 0.1f, 800); - } + wiRenderer::getCamera()->CreatePerspective((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y, 0.1f, 800); } } break; diff --git a/Tests/main.cpp b/Tests/main.cpp index 786439ccf..aff54c571 100644 --- a/Tests/main.cpp +++ b/Tests/main.cpp @@ -167,14 +167,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) int height = HIWORD(lParam); wiRenderer::GetDevice()->SetResolution(width, height); - - wiSceneSystem::Scene& scene = wiRenderer::GetScene(); - - wiSceneSystem::CameraComponent* camera = scene.cameras.GetComponent(wiRenderer::getCameraID()); - if (camera != nullptr) - { - camera->CreatePerspective((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y, 0.1f, 800); - } + wiRenderer::getCamera()->CreatePerspective((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y, 0.1f, 800); } } break; diff --git a/WickedEngine/ArchiveVersionHistory.txt b/WickedEngine/ArchiveVersionHistory.txt index d8290b160..d75b148ad 100644 --- a/WickedEngine/ArchiveVersionHistory.txt +++ b/WickedEngine/ArchiveVersionHistory.txt @@ -1,5 +1,7 @@ This file contains changelog of wiArchive versions +22: rewrite all systems +--VERSION_BARRIER------------------ 21: serialize armature skinningRemap matrix + remove redundant bone matrices 20: serialize cameras 19: serialized object cascade mask diff --git a/WickedEngine/wiArchive.cpp b/WickedEngine/wiArchive.cpp index bd685d02c..9afc24fdf 100644 --- a/WickedEngine/wiArchive.cpp +++ b/WickedEngine/wiArchive.cpp @@ -7,9 +7,9 @@ using namespace std; // this should always be only INCREMENTED and only if a new serialization is implemeted somewhere! -uint64_t __archiveVersion = 21; +uint64_t __archiveVersion = 22; // this is the version number of which below the archive is not compatible with the current version -uint64_t __archiveVersionBarrier = 1; +uint64_t __archiveVersionBarrier = 22; // version history is logged in ArchiveVersionHistory.txt file! diff --git a/WickedEngine/wiECS.h b/WickedEngine/wiECS.h index 029a0ee56..367a93ea9 100644 --- a/WickedEngine/wiECS.h +++ b/WickedEngine/wiECS.h @@ -10,7 +10,7 @@ namespace wiECS { - typedef uint64_t Entity; + typedef uint32_t Entity; static const Entity INVALID_ENTITY = 0; inline Entity CreateEntity() { @@ -48,6 +48,28 @@ namespace wiECS lookup = other.lookup; } + // Merge in an other component manager of the same type to this. + // The other component manager MUST NOT contain any of the same entities! + // The other component manager is not retained after this operation! + inline void Merge(ComponentManager& other) + { + components.reserve(GetCount() + other.GetCount()); + entities.reserve(GetCount() + other.GetCount()); + lookup.reserve(GetCount() + other.GetCount()); + + for (size_t i = 0; i < other.GetCount(); ++i) + { + Entity entity = other.entities[i]; + assert(Contains(entity)); + entities.push_back(entity); + lookup[entity] = components.size(); + components.push_back(std::move(other.components[i])); + } + + other.Clear(); + } + + // Read/Write everything to an archive depending on the archive state inline void Serialize(wiArchive& archive) { if (archive.IsReadMode()) @@ -96,7 +118,7 @@ namespace wiECS } } - // Create a new component and retrieve a reference to it: + // Create a new component and retrieve a reference to it inline Component& Create(Entity entity) { // Only one of this component type per entity is allowed! @@ -118,7 +140,7 @@ namespace wiECS return components.back(); } - // Remove a component of a certain entity if it exists: + // Remove a component of a certain entity if it exists inline void Remove(Entity entity) { auto it = lookup.find(entity); @@ -145,7 +167,7 @@ namespace wiECS } } - // Remove a component of a certain entity if it exists while keeping the current ordering: + // Remove a component of a certain entity if it exists while keeping the current ordering inline void Remove_KeepSorted(Entity entity) { auto it = lookup.find(entity); @@ -177,7 +199,7 @@ namespace wiECS } } - // Swap two components' data: + // Swap two components' data inline void Swap(Entity a, Entity b) { auto it_a = lookup.find(a); @@ -203,7 +225,7 @@ namespace wiECS } - // Place the last added entity-component to the specified index position while keeping the ordering intact: + // Place the last added entity-component to the specified index position while keeping the ordering intact inline void MoveLastTo(size_t index) { // No operation if less than two components, or the target index is already the last index: @@ -234,13 +256,13 @@ namespace wiECS lookup[entity] = index; } - // Check if a component exists for a given entity or not: + // Check if a component exists for a given entity or not inline bool Contains(Entity entity) const { return lookup.find(entity) != lookup.end(); } - // Retrieve a [read/write] component specified by an entity (if it exists, otherwise nullptr): + // Retrieve a [read/write] component specified by an entity (if it exists, otherwise nullptr) inline Component* GetComponent(Entity entity) { auto it = lookup.find(entity); @@ -251,7 +273,7 @@ namespace wiECS return nullptr; } - // Retrieve a [read only] component specified by an entity (if it exists, otherwise nullptr): + // Retrieve a [read only] component specified by an entity (if it exists, otherwise nullptr) inline const Component* GetComponent(Entity entity) const { const auto it = lookup.find(entity); @@ -262,30 +284,30 @@ namespace wiECS return nullptr; } - // Retrieve the number of existing entries: + // Retrieve the number of existing entries inline size_t GetCount() const { return components.size(); } - // Directly index a specific component without indirection: + // Directly index a specific component without indirection // 0 <= index < GetCount() inline Entity GetEntity(size_t index) const { return entities[index]; } - // Directly index a specific [read/write] component without indirection: + // Directly index a specific [read/write] component without indirection // 0 <= index < GetCount() inline Component& operator[](size_t index) { return components[index]; } - // Directly index a specific [read only] component without indirection: + // Directly index a specific [read only] component without indirection // 0 <= index < GetCount() inline const Component& operator[](size_t index) const { return components[index]; } private: - // This is a linear array of alive components: + // This is a linear array of alive components std::vector components; - // This is a linear array of entities corresponding to each alive component: + // This is a linear array of entities corresponding to each alive component std::vector entities; - // This is a lookup table for entities: + // This is a lookup table for entities std::unordered_map lookup; - // Disallow this to be copied by mistake: + // Disallow this to be copied by mistake ComponentManager(const ComponentManager&) = delete; }; } diff --git a/WickedEngine/wiFrustum.cpp b/WickedEngine/wiFrustum.cpp index 7cbda15fb..4bb1fdf93 100644 --- a/WickedEngine/wiFrustum.cpp +++ b/WickedEngine/wiFrustum.cpp @@ -105,8 +105,9 @@ int Frustum::CheckBox(const AABB& box) const int iInCount = 8; int iPtIn = 1; - for (int i = 0; i < 8; ++i) { - if (XMVectorGetX(XMPlaneDotCoord(XMLoadFloat4(&m_planesNorm[p]), XMLoadFloat3(&box.corners[i]))) < 0.0f) + for (int i = 0; i < 8; ++i) + { + if (XMVectorGetX(XMPlaneDotCoord(XMLoadFloat4(&m_planesNorm[p]), XMLoadFloat3(&box.corner(i)))) < 0.0f) { iPtIn = 0; --iInCount; diff --git a/WickedEngine/wiHairParticle.h b/WickedEngine/wiHairParticle.h index 795cf0452..f55a24cb8 100644 --- a/WickedEngine/wiHairParticle.h +++ b/WickedEngine/wiHairParticle.h @@ -28,7 +28,6 @@ private: static wiGraphicsTypes::GraphicsPSO PSO[SHADERTYPE_COUNT][2]; // shadertype * transparency static wiGraphicsTypes::GraphicsPSO PSO_wire; static wiGraphicsTypes::ComputePSO CPSO_simulate; - static int LOD[3]; public: static void LoadShaders(); diff --git a/WickedEngine/wiIntersectables.cpp b/WickedEngine/wiIntersectables.cpp index 98dcc39c6..e1365fb21 100644 --- a/WickedEngine/wiIntersectables.cpp +++ b/WickedEngine/wiIntersectables.cpp @@ -2,62 +2,47 @@ #include "wiMath.h" -AABB::AABB() { - for (int i = 0; i<8; ++i) corners[i] = XMFLOAT3(0, 0, 0); +void AABB::createFromHalfWidth(const XMFLOAT3& center, const XMFLOAT3& halfwidth) +{ + _min = XMFLOAT3(center.x - halfwidth.x, center.y - halfwidth.y, center.z - halfwidth.z); + _max = XMFLOAT3(center.x + halfwidth.x, center.y + halfwidth.y, center.z + halfwidth.z); } -AABB::AABB(const XMFLOAT3& min, const XMFLOAT3& max) { - create(min, max); -} -void AABB::createFromHalfWidth(const XMFLOAT3& center, const XMFLOAT3& halfwidth) { - XMFLOAT3 min = XMFLOAT3(center.x - halfwidth.x, center.y - halfwidth.y, center.z - halfwidth.z); - XMFLOAT3 max = XMFLOAT3(center.x + halfwidth.x, center.y + halfwidth.y, center.z + halfwidth.z); - create(min, max); -} -void AABB::create(const XMFLOAT3& min, const XMFLOAT3& max) { - corners[0] = min; - corners[1] = XMFLOAT3(min.x, max.y, min.z); - corners[2] = XMFLOAT3(min.x, max.y, max.z); - corners[3] = XMFLOAT3(min.x, min.y, max.z); - corners[4] = XMFLOAT3(max.x, min.y, min.z); - corners[5] = XMFLOAT3(max.x, max.y, min.z); - corners[6] = max; - corners[7] = XMFLOAT3(max.x, min.y, max.z); -} -AABB AABB::get(const XMMATRIX& mat) const { - AABB ret; - XMFLOAT3 min, max; - for (int i = 0; i<8; ++i) { - XMVECTOR point = XMVector3Transform(XMLoadFloat3(&corners[i]), mat); - XMStoreFloat3(&ret.corners[i], point); +AABB AABB::get(const XMMATRIX& mat) const +{ + XMFLOAT3 corners[8]; + for (int i = 0; i < 8; ++i) + { + XMVECTOR point = XMVector3Transform(XMLoadFloat3(&corner(i)), mat); + XMStoreFloat3(&corners[i], point); } - min = ret.corners[0]; - max = ret.corners[6]; - for (int i = 0; i<8; ++i) { - XMFLOAT3& p = ret.corners[i]; + XMFLOAT3 min = corners[0]; + XMFLOAT3 max = corners[6]; + for (int i = 0; i < 8; ++i) + { + const XMFLOAT3& p = corners[i]; - if (p.xmax.x) max.x = p.x; - if (p.y>max.y) max.y = p.y; - if (p.z>max.z) max.z = p.z; + if (p.x > max.x) max.x = p.x; + if (p.y > max.y) max.y = p.y; + if (p.z > max.z) max.z = p.z; } - ret.create(min, max); - - return ret; + return AABB(min, max); } -AABB AABB::get(const XMFLOAT4X4& mat) const { +AABB AABB::get(const XMFLOAT4X4& mat) const +{ return get(XMLoadFloat4x4(&mat)); } -XMFLOAT3 AABB::getMin()const { return corners[0]; } -XMFLOAT3 AABB::getMax() const { return corners[6]; } -XMFLOAT3 AABB::getCenter() const { +XMFLOAT3 AABB::getCenter() const +{ XMFLOAT3 min = getMin(), max = getMax(); return XMFLOAT3((min.x + max.x)*0.5f, (min.y + max.y)*0.5f, (min.z + max.z)*0.5f); } -XMFLOAT3 AABB::getHalfWidth() const { +XMFLOAT3 AABB::getHalfWidth() const +{ XMFLOAT3 max = getMax(), center = getCenter(); return XMFLOAT3(abs(max.x - center.x), abs(max.y - center.y), abs(max.z - center.z)); } @@ -70,7 +55,8 @@ XMMATRIX AABB::AABB::getAsBoxMatrix() const return sca*tra; } -float AABB::getArea() const { +float AABB::getArea() const +{ XMFLOAT3 _min = getMin(); XMFLOAT3 _max = getMax(); return (_max.x - _min.x)*(_max.y - _min.y)*(_max.z - _min.z); @@ -158,25 +144,13 @@ void AABB::Serialize(wiArchive& archive) { if (archive.IsReadMode()) { - archive >> corners[0]; - archive >> corners[1]; - archive >> corners[2]; - archive >> corners[3]; - archive >> corners[4]; - archive >> corners[5]; - archive >> corners[6]; - archive >> corners[7]; + archive >> _min; + archive >> _max; } else { - archive << corners[0]; - archive << corners[1]; - archive << corners[2]; - archive << corners[3]; - archive << corners[4]; - archive << corners[5]; - archive << corners[6]; - archive << corners[7]; + archive << _min; + archive << _max; } } diff --git a/WickedEngine/wiIntersectables.h b/WickedEngine/wiIntersectables.h index d70443572..3d81c1a83 100644 --- a/WickedEngine/wiIntersectables.h +++ b/WickedEngine/wiIntersectables.h @@ -8,23 +8,22 @@ struct RAY; struct AABB; -struct AABB { - enum INTERSECTION_TYPE { +struct AABB +{ + enum INTERSECTION_TYPE + { OUTSIDE, INTERSECTS, INSIDE, }; - XMFLOAT3 corners[8]; + XMFLOAT3 _min; + XMFLOAT3 _max; - AABB(); - AABB(const XMFLOAT3& min, const XMFLOAT3& max); - void create(const XMFLOAT3& min, const XMFLOAT3& max); + AABB(const XMFLOAT3& _min = XMFLOAT3(FLT_MAX, FLT_MAX, FLT_MAX), const XMFLOAT3& _max = XMFLOAT3(-FLT_MAX, -FLT_MAX, -FLT_MAX)) : _min(_min), _max(_max) {} void createFromHalfWidth(const XMFLOAT3& center, const XMFLOAT3& halfwidth); AABB get(const XMMATRIX& mat) const; AABB get(const XMFLOAT4X4& mat) const; - XMFLOAT3 getMin() const; - XMFLOAT3 getMax() const; XMFLOAT3 getCenter() const; XMFLOAT3 getHalfWidth() const; XMMATRIX getAsBoxMatrix() const; @@ -35,9 +34,38 @@ struct AABB { bool intersects(const RAY& ray) const; AABB operator* (float a); static AABB Merge(const AABB& a, const AABB& b); + + inline XMFLOAT3 getMin() const { return _min; } + inline XMFLOAT3 getMax() const { return _max; } + inline XMFLOAT3 corner(int index) const + { + switch (index) + { + case 0: return _min; + case 1: return XMFLOAT3(_min.x, _max.y, _min.z); + case 2: return XMFLOAT3(_min.x, _max.y, _max.z); + case 3: return XMFLOAT3(_min.x, _min.y, _max.z); + case 4: return XMFLOAT3(_max.x, _min.y, _min.z); + case 5: return XMFLOAT3(_max.x, _max.y, _min.z); + case 6: return _max; + case 7: return XMFLOAT3(_max.x, _min.y, _max.z); + } + assert(0); + return XMFLOAT3(0, 0, 0); + //corners[0] = min; + //corners[1] = XMFLOAT3(min.x, max.y, min.z); + //corners[2] = XMFLOAT3(min.x, max.y, max.z); + //corners[3] = XMFLOAT3(min.x, min.y, max.z); + //corners[4] = XMFLOAT3(max.x, min.y, min.z); + //corners[5] = XMFLOAT3(max.x, max.y, min.z); + //corners[6] = max; + //corners[7] = XMFLOAT3(max.x, min.y, max.z); + } + void Serialize(wiArchive& archive); }; -struct SPHERE { +struct SPHERE +{ float radius; XMFLOAT3 center; SPHERE() :center(XMFLOAT3(0, 0, 0)), radius(0) {} @@ -46,7 +74,8 @@ struct SPHERE { bool intersects(const SPHERE& b) const; bool intersects(const RAY& b) const; }; -struct RAY { +struct RAY +{ XMFLOAT3 origin, direction, direction_inverse; RAY(const XMFLOAT3& newOrigin = XMFLOAT3(0, 0, 0), const XMFLOAT3& newDirection = XMFLOAT3(0, 0, 1)) :origin(newOrigin), direction(newDirection) {} diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index b4bb9aafd..35791ad5e 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -63,7 +63,7 @@ int wiRenderer::SHADOWRES_2D = 1024, wiRenderer::SHADOWRES_CUBE = 256, wiRendere bool wiRenderer::HAIRPARTICLEENABLED=true,wiRenderer::EMITTERSENABLED=true; bool wiRenderer::TRANSPARENTSHADOWSENABLED = false; bool wiRenderer::ALPHACOMPOSITIONENABLED = false; -bool wiRenderer::wireRender = false, wiRenderer::debugSpheres = false, wiRenderer::debugBoneLines = false, wiRenderer::debugPartitionTree = false, wiRenderer::debugEmitters = false, wiRenderer::freezeCullingCamera = false +bool wiRenderer::wireRender = false, wiRenderer::debugBoneLines = false, wiRenderer::debugPartitionTree = false, wiRenderer::debugEmitters = false, wiRenderer::freezeCullingCamera = false , wiRenderer::debugEnvProbes = false, wiRenderer::debugForceFields = false, wiRenderer::debugCameras = false, wiRenderer::gridHelper = false, wiRenderer::voxelHelper = false, wiRenderer::requestReflectionRendering = false, wiRenderer::advancedLightCulling = true , wiRenderer::advancedRefractions = false; bool wiRenderer::ldsSkinningEnabled = true; @@ -77,8 +77,6 @@ UINT wiRenderer::entityArrayOffset_Decals = 0, wiRenderer::entityArrayCount_Deca UINT wiRenderer::entityArrayOffset_ForceFields = 0, wiRenderer::entityArrayCount_ForceFields = 0; UINT wiRenderer::entityArrayOffset_EnvProbes = 0, wiRenderer::entityArrayCount_EnvProbes = 0; -Entity wiRenderer::cameraID = INVALID_ENTITY; - Texture2D* wiRenderer::enviroMap = nullptr; float wiRenderer::GameSpeed=1; bool wiRenderer::debugLightCulling = false; @@ -313,10 +311,7 @@ void wiRenderer::SetUpStaticComponents() SAFE_INIT(customsamplers[i]); } - cameraID = CreateEntity(); - - wireRender=false; - debugSpheres=false; + getCamera()->CreatePerspective((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y, 0.1f, 800); SetUpStates(); LoadBuffers(); @@ -2914,7 +2909,6 @@ void wiRenderer::UpdatePerFrameData(float dt) scene.Update(dt * GetGameSpeed()); *getPrevCamera() = *getCamera(); - *getCamera() = *scene.cameras.GetComponent(cameraID); // Update Voxelization parameters: if (scene.objects.GetCount() > 0) @@ -4103,11 +4097,6 @@ void wiRenderer::DrawDebugWorld(CameraComponent* camera, GRAPHICSTHREAD threadID CameraComponent& cam = scene.cameras[i]; Entity entity = scene.cameras.GetEntity(i); - if (entity == getCameraID()) // avoid drawing the main camera... - { - continue; - } - sb.mTransform = XMMatrixTranspose(cam.GetInvView()*camera->GetViewProjection()); device->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID); @@ -7884,9 +7873,6 @@ Scene& wiRenderer::GetScene() if (scene == nullptr) { scene = new Scene; - - scene->transforms.Create(cameraID); - scene->cameras.Create(cameraID).CreatePerspective((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y, 0.1f, 800); } return *scene; } @@ -7987,8 +7973,8 @@ void wiRenderer::CreateImpostor(Entity entity, GRAPHICSTHREAD threadID) } - CameraComponent camera = *getCamera(); - TransformComponent camera_transform = *scene.transforms.GetComponent(getCameraID()); + CameraComponent impostorcamera; + TransformComponent camera_transform; BindPersistentState(threadID); @@ -8046,14 +8032,14 @@ void wiRenderer::CreateImpostor(Entity entity, GRAPHICSTHREAD threadID) { // front capture XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.y, extents.y, -extents.z, extents.z); - XMStoreFloat4x4(&camera.Projection, ortho); + XMStoreFloat4x4(&impostorcamera.Projection, ortho); } break; case 1: { // right capture XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.z, extents.z, -extents.y, extents.y, -extents.x, extents.x); - XMStoreFloat4x4(&camera.Projection, ortho); + XMStoreFloat4x4(&impostorcamera.Projection, ortho); camera_transform.RotateRollPitchYaw(XMFLOAT3(0, -XM_PIDIV2, 0)); } break; @@ -8061,7 +8047,7 @@ void wiRenderer::CreateImpostor(Entity entity, GRAPHICSTHREAD threadID) { // back capture XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.y, extents.y, -extents.z, extents.z); - XMStoreFloat4x4(&camera.Projection, ortho); + XMStoreFloat4x4(&impostorcamera.Projection, ortho); camera_transform.RotateRollPitchYaw(XMFLOAT3(0, -XM_PI, 0)); } break; @@ -8069,7 +8055,7 @@ void wiRenderer::CreateImpostor(Entity entity, GRAPHICSTHREAD threadID) { // left capture XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.z, extents.z, -extents.y, extents.y, -extents.x, extents.x); - XMStoreFloat4x4(&camera.Projection, ortho); + XMStoreFloat4x4(&impostorcamera.Projection, ortho); camera_transform.RotateRollPitchYaw(XMFLOAT3(0, XM_PIDIV2, 0)); } break; @@ -8077,7 +8063,7 @@ void wiRenderer::CreateImpostor(Entity entity, GRAPHICSTHREAD threadID) { // bottom capture XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.z, extents.z, -extents.y, extents.y); - XMStoreFloat4x4(&camera.Projection, ortho); + XMStoreFloat4x4(&impostorcamera.Projection, ortho); camera_transform.RotateRollPitchYaw(XMFLOAT3(-XM_PIDIV2, 0, 0)); } break; @@ -8085,7 +8071,7 @@ void wiRenderer::CreateImpostor(Entity entity, GRAPHICSTHREAD threadID) { // top capture XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.z, extents.z, -extents.y, extents.y); - XMStoreFloat4x4(&camera.Projection, ortho); + XMStoreFloat4x4(&impostorcamera.Projection, ortho); camera_transform.RotateRollPitchYaw(XMFLOAT3(XM_PIDIV2, 0, 0)); } break; @@ -8093,9 +8079,9 @@ void wiRenderer::CreateImpostor(Entity entity, GRAPHICSTHREAD threadID) break; } camera_transform.UpdateTransform(); - camera.UpdateCamera(&camera_transform); - camera.UpdateProjection(); - UpdateCameraCB(&camera, threadID); + impostorcamera.UpdateCamera(&camera_transform); + impostorcamera.UpdateProjection(); + UpdateCameraCB(&impostorcamera, threadID); for (MeshComponent::MeshSubset& subset : mesh.subsets) { diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index febb5e45f..cadab7e2d 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -223,7 +223,7 @@ public: protected: - static bool wireRender, debugSpheres, debugBoneLines, debugPartitionTree, debugEnvProbes, debugEmitters, debugForceFields, debugCameras, gridHelper, voxelHelper, advancedLightCulling, advancedRefractions; + static bool wireRender, debugBoneLines, debugPartitionTree, debugEnvProbes, debugEmitters, debugForceFields, debugCameras, gridHelper, voxelHelper, advancedLightCulling, advancedRefractions; static bool ldsSkinningEnabled; static bool requestReflectionRendering; @@ -298,9 +298,6 @@ public: static float GetGamma() { return GAMMA; } static void SetWireRender(bool value) { wireRender = value; } static bool IsWireRender() { return wireRender; } - static void ToggleDebugSpheres(){debugSpheres=!debugSpheres;} - static void SetToDrawDebugSpheres(bool param){debugSpheres=param;} - static bool GetToDrawDebugSpheres() { return debugSpheres; } static void SetToDrawDebugBoneLines(bool param) { debugBoneLines = param; } static bool GetToDrawDebugBoneLines() { return debugBoneLines; } static void SetToDrawDebugPartitionTree(bool param){debugPartitionTree=param;} @@ -439,8 +436,6 @@ public: static std::deque waterRipples; static void ClearWorld(); - static wiECS::Entity cameraID; - static wiECS::Entity getCameraID() { return cameraID; } static wiSceneSystem::CameraComponent* getCamera(); static wiSceneSystem::CameraComponent* getPrevCamera(); static wiSceneSystem::CameraComponent* getRefCamera(); diff --git a/WickedEngine/wiSceneSystem.cpp b/WickedEngine/wiSceneSystem.cpp index 9f2e38254..1324a7a3d 100644 --- a/WickedEngine/wiSceneSystem.cpp +++ b/WickedEngine/wiSceneSystem.cpp @@ -349,7 +349,7 @@ namespace wiSceneSystem assert(SUCCEEDED(hr)); } - aabb.create(_min, _max); + aabb = AABB(_min, _max); // skinning buffers: if (!vertex_boneindices.empty()) @@ -784,51 +784,68 @@ namespace wiSceneSystem RunForceUpdateSystem(transforms, forces); - RunLightUpdateSystem(*cameras.GetComponent(wiRenderer::getCameraID()), transforms, aabb_lights, lights, sunDirection, sunColor); + RunLightUpdateSystem(*wiRenderer::getCamera(), transforms, aabb_lights, lights, sunDirection, sunColor); RunParticleUpdateSystem(transforms, meshes, emitters, hairs, dt); } void Scene::Clear() { - // Preferrably, we wouldn't write all of this, just call clear on every container - // But: we want to only delete the owned entities, and there might be others - // Think about it, probably there is a better way... + names.Clear(); + layers.Clear(); + transforms.Clear(); + prev_transforms.Clear(); + hierarchy.Clear(); + materials.Clear(); + meshes.Clear(); + objects.Clear(); + aabb_objects.Clear(); + rigidbodies.Clear(); + softbodies.Clear(); + armatures.Clear(); + lights.Clear(); + aabb_lights.Clear(); + cameras.Clear(); + probes.Clear(); + aabb_probes.Clear(); + forces.Clear(); + decals.Clear(); + aabb_decals.Clear(); + animations.Clear(); + emitters.Clear(); + hairs.Clear(); + } + void Scene::Merge(Scene& other) + { + names.Merge(other.names); + layers.Merge(other.layers); + transforms.Merge(other.transforms); + prev_transforms.Merge(other.prev_transforms); + hierarchy.Merge(other.hierarchy); + materials.Merge(other.materials); + meshes.Merge(other.meshes); + objects.Merge(other.objects); + aabb_objects.Merge(other.aabb_objects); + rigidbodies.Merge(other.rigidbodies); + softbodies.Merge(other.softbodies); + armatures.Merge(other.armatures); + lights.Merge(other.lights); + aabb_lights.Merge(other.aabb_lights); + cameras.Merge(other.cameras); + probes.Merge(other.probes); + aabb_probes.Merge(other.aabb_probes); + forces.Merge(other.forces); + decals.Merge(other.decals); + aabb_decals.Merge(other.aabb_decals); + animations.Merge(other.animations); + emitters.Merge(other.emitters); + hairs.Merge(other.hairs); - for (Entity entity : owned_entities) - { - names.Remove(entity); - layers.Remove(entity); - transforms.Remove(entity); - prev_transforms.Remove(entity); - hierarchy.Remove(entity); - materials.Remove(entity); - meshes.Remove(entity); - objects.Remove(entity); - aabb_objects.Remove(entity); - rigidbodies.Remove(entity); - softbodies.Remove(entity); - armatures.Remove(entity); - lights.Remove(entity); - aabb_lights.Remove(entity); - cameras.Remove(entity); - probes.Remove(entity); - aabb_probes.Remove(entity); - forces.Remove(entity); - decals.Remove(entity); - aabb_decals.Remove(entity); - animations.Remove(entity); - emitters.Remove(entity); - hairs.Remove(entity); - } - - owned_entities.clear(); + bounds = AABB::Merge(bounds, other.bounds); } void Scene::Entity_Remove(Entity entity) { - owned_entities.erase(entity); - names.Remove(entity); layers.Remove(entity); transforms.Remove(entity); @@ -870,8 +887,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; layers.Create(entity); @@ -886,8 +901,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; materials.Create(entity); @@ -900,8 +913,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; layers.Create(entity); @@ -922,8 +933,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; meshes.Create(entity); @@ -939,8 +948,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; layers.Create(entity); @@ -967,8 +974,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; layers.Create(entity); @@ -991,8 +996,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; layers.Create(entity); @@ -1015,8 +1018,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; layers.Create(entity); @@ -1049,8 +1050,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; layers.Create(entity); @@ -1069,8 +1068,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; emitters.Create(entity); @@ -1090,8 +1087,6 @@ namespace wiSceneSystem { Entity entity = CreateEntity(); - owned_entities.insert(entity); - names.Create(entity) = name; hairs.Create(entity); @@ -1490,7 +1485,7 @@ namespace wiSceneSystem { assert(objects.GetCount() == aabb_objects.GetCount()); - sceneBounds.create(XMFLOAT3(FLT_MAX, FLT_MAX, FLT_MAX), XMFLOAT3(-FLT_MAX, -FLT_MAX, -FLT_MAX)); + sceneBounds = AABB(); for (size_t i = 0; i < objects.GetCount(); ++i) { @@ -1498,7 +1493,7 @@ namespace wiSceneSystem Entity entity = objects.GetEntity(i); AABB& aabb = aabb_objects[i]; - aabb.create(XMFLOAT3(FLT_MAX, FLT_MAX, FLT_MAX), XMFLOAT3(-FLT_MAX, -FLT_MAX, -FLT_MAX)); + aabb = AABB(); object.rendertypeMask = 0; object.SetDynamic(false); object.SetCastShadow(false); @@ -1844,7 +1839,7 @@ namespace wiSceneSystem min.y -= hair.length; min.z -= hair.length; - hair.aabb.create(min, max); + hair.aabb = AABB(min, max); hair.aabb = hair.aabb.get(hair.world); } } diff --git a/WickedEngine/wiSceneSystem.h b/WickedEngine/wiSceneSystem.h index ca1e19a78..84c21813a 100644 --- a/WickedEngine/wiSceneSystem.h +++ b/WickedEngine/wiSceneSystem.h @@ -13,9 +13,7 @@ #include "wiSceneSystem_Decl.h" #include -#include #include -#include class wiArchive; @@ -68,7 +66,7 @@ namespace wiSceneSystem XMVECTOR GetRotationV() const; XMVECTOR GetScaleV() const; void UpdateTransform(); - void UpdateParentedTransform(const TransformComponent& parent, const XMFLOAT4X4& inverseParentBindMatrix); + void UpdateParentedTransform(const TransformComponent& parent, const XMFLOAT4X4& inverseParentBindMatrix = IDENTITYMATRIX); void ApplyTransform(); void ClearTransform(); void Translate(const XMFLOAT3& value); @@ -837,8 +835,6 @@ namespace wiSceneSystem struct Scene { - std::unordered_set owned_entities; - wiECS::ComponentManager names; wiECS::ComponentManager layers; wiECS::ComponentManager transforms; @@ -866,7 +862,7 @@ namespace wiSceneSystem XMFLOAT3 sunDirection = XMFLOAT3(0, 1, 0); XMFLOAT3 sunColor = XMFLOAT3(0, 0, 0); XMFLOAT3 horizon = XMFLOAT3(0.0f, 0.0f, 0.0f); - XMFLOAT3 zenith = XMFLOAT3(0.00f, 0.00f, 0.0f); + XMFLOAT3 zenith = XMFLOAT3(0.0f, 0.0f, 0.0f); XMFLOAT3 ambient = XMFLOAT3(0.2f, 0.2f, 0.2f); float fogStart = 100; float fogEnd = 1000; @@ -886,6 +882,8 @@ namespace wiSceneSystem void Update(float dt); // Remove everything from the scene that it owns: void Clear(); + // Merge with an other scene (world properties like ambient, etc. are retained as-is). Other scene state is non-retained! + void Merge(Scene& other); // Removes a specific entity from the scene (if it exists): void Entity_Remove(wiECS::Entity entity);