updates
This commit is contained in:
+13
-29
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
+29
-29
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
+15
-7
@@ -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;
|
||||
|
||||
+1
-8
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
+1
-8
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!
|
||||
|
||||
|
||||
+39
-17
@@ -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<Component>& 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<Component> 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<Entity> entities;
|
||||
// This is a lookup table for entities:
|
||||
// This is a lookup table for entities
|
||||
std::unordered_map<Entity, size_t> lookup;
|
||||
|
||||
// Disallow this to be copied by mistake:
|
||||
// Disallow this to be copied by mistake
|
||||
ComponentManager(const ComponentManager&) = delete;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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.x<min.x) min.x = p.x;
|
||||
if (p.y<min.y) min.y = p.y;
|
||||
if (p.z<min.z) min.z = p.z;
|
||||
if (p.x < min.x) min.x = p.x;
|
||||
if (p.y < min.y) min.y = p.y;
|
||||
if (p.z < min.z) min.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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {}
|
||||
|
||||
+13
-27
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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<wiSprite*> 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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,9 +13,7 @@
|
||||
#include "wiSceneSystem_Decl.h"
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include <unordered_set>
|
||||
|
||||
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<wiECS::Entity> owned_entities;
|
||||
|
||||
wiECS::ComponentManager<NameComponent> names;
|
||||
wiECS::ComponentManager<LayerComponent> layers;
|
||||
wiECS::ComponentManager<TransformComponent> 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);
|
||||
|
||||
Reference in New Issue
Block a user