This commit is contained in:
turanszkij
2018-09-18 21:37:20 +01:00
parent 471103686d
commit 9a2e810e2a
19 changed files with 256 additions and 286 deletions
+13 -29
View File
@@ -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);
+3 -2
View File
@@ -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
View File
@@ -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)
{
-3
View File
@@ -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
View File
@@ -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
View File
@@ -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;
+1 -8
View File
@@ -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
View File
@@ -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;
+2
View File
@@ -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
+2 -2
View File
@@ -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
View File
@@ -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;
};
}
+3 -2
View File
@@ -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;
-1
View File
@@ -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();
+35 -61
View File
@@ -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;
}
}
+39 -10
View File
@@ -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
View File
@@ -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)
{
+1 -6
View File
@@ -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();
+55 -60
View File
@@ -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);
}
}
+4 -6
View File
@@ -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);