start systemizing
This commit is contained in:
+20
-3
@@ -115,7 +115,13 @@ namespace wiECS
|
||||
|
||||
}
|
||||
|
||||
// Retrieve a component specified by an entity (if it exists, otherwise nullptr):
|
||||
// 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):
|
||||
inline T* GetComponent(Entity entity)
|
||||
{
|
||||
auto it = lookup.find(entity);
|
||||
@@ -126,6 +132,17 @@ namespace wiECS
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Retrieve a [read only] component specified by an entity (if it exists, otherwise nullptr):
|
||||
inline const T* GetComponent(Entity entity) const
|
||||
{
|
||||
const auto it = lookup.find(entity);
|
||||
if (it != lookup.end())
|
||||
{
|
||||
return &components[it->second];
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Retrieve the number of existing entries:
|
||||
inline size_t GetCount() const { return components.size(); }
|
||||
|
||||
@@ -133,11 +150,11 @@ namespace wiECS
|
||||
// 0 <= index < GetCount()
|
||||
inline Entity GetEntity(size_t index) const { return entities[index]; }
|
||||
|
||||
// Directly index a specific component without indirection:
|
||||
// Directly index a specific [read/write] component without indirection:
|
||||
// 0 <= index < GetCount()
|
||||
inline T& operator[](size_t index) { return components[index]; }
|
||||
|
||||
// Directly index a specific component without indirection:
|
||||
// Directly index a specific [read only] component without indirection:
|
||||
// 0 <= index < GetCount()
|
||||
inline const T& operator[](size_t index) const { return components[index]; }
|
||||
|
||||
|
||||
@@ -3017,22 +3017,19 @@ void wiRenderer::UpdatePerFrameData(float dt)
|
||||
}
|
||||
else if (camera == getCamera()) // the following cullings will be only for the main camera:
|
||||
{
|
||||
const LightComponent* light = scene.lights.GetComponent(entity);
|
||||
if (light != nullptr)
|
||||
if (scene.lights.Contains(entity))
|
||||
{
|
||||
culling.culledLights.push_back(entity);
|
||||
continue;
|
||||
}
|
||||
|
||||
const DecalComponent* decal = scene.decals.GetComponent(entity);
|
||||
if (decal != nullptr)
|
||||
if (scene.decals.Contains(entity))
|
||||
{
|
||||
culling.culledDecals.push_back(entity);
|
||||
continue;
|
||||
}
|
||||
|
||||
const EnvironmentProbeComponent* probe = scene.probes.GetComponent(entity);
|
||||
if (probe != nullptr)
|
||||
if (scene.probes.Contains(entity))
|
||||
{
|
||||
culling.culledEnvProbes.push_back(entity);
|
||||
continue;
|
||||
|
||||
+180
-146
@@ -695,67 +695,11 @@ namespace wiSceneSystem
|
||||
|
||||
void Scene::Update(float dt)
|
||||
{
|
||||
// Update Transform components:
|
||||
for (size_t i = 0; i < transforms.GetCount(); ++i)
|
||||
{
|
||||
TransformComponent& transform = transforms[i];
|
||||
transform.UpdateTransform();
|
||||
}
|
||||
RunTransformUpdateSystem(transforms);
|
||||
|
||||
// Update Hierarchy:
|
||||
for (size_t i = 0; i < parents.GetCount(); ++i)
|
||||
{
|
||||
const ParentComponent& parentcomponent = parents[i];
|
||||
Entity entity = parents.GetEntity(i);
|
||||
RunHierarchyUpdateSystem(parents, transforms, layers);
|
||||
|
||||
TransformComponent* transform_child = transforms.GetComponent(entity);
|
||||
TransformComponent* transform_parent = transforms.GetComponent(parentcomponent.parentID);
|
||||
if (transform_child != nullptr && transform_parent != nullptr)
|
||||
{
|
||||
XMVECTOR S_local = XMLoadFloat3(&transform_child->scale_local);
|
||||
XMVECTOR R_local = XMLoadFloat4(&transform_child->rotation_local);
|
||||
XMVECTOR T_local = XMLoadFloat3(&transform_child->translation_local);
|
||||
XMMATRIX W =
|
||||
XMMatrixScalingFromVector(S_local) *
|
||||
XMMatrixRotationQuaternion(R_local) *
|
||||
XMMatrixTranslationFromVector(T_local);
|
||||
|
||||
XMMATRIX W_parent = XMLoadFloat4x4(&transform_parent->world);
|
||||
XMMATRIX B = XMLoadFloat4x4(&parentcomponent.world_parent_inverse_bind);
|
||||
W = W * B * W_parent;
|
||||
|
||||
XMVECTOR S, R, T;
|
||||
XMMatrixDecompose(&S, &R, &T, W);
|
||||
XMStoreFloat3(&transform_child->scale, S);
|
||||
XMStoreFloat4(&transform_child->rotation, R);
|
||||
XMStoreFloat3(&transform_child->translation, T);
|
||||
|
||||
transform_child->world_prev = transform_child->world;
|
||||
XMStoreFloat4x4(&transform_child->world, W);
|
||||
}
|
||||
|
||||
|
||||
LayerComponent* layer_child = layers.GetComponent(entity);
|
||||
LayerComponent* layer_parent = layers.GetComponent(parentcomponent.parentID);
|
||||
if (layer_child != nullptr && layer_parent != nullptr)
|
||||
{
|
||||
layer_child->layerMask = parentcomponent.layerMask_bind & layer_parent->GetLayerMask();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Update Bone components:
|
||||
for (size_t i = 0; i < bones.GetCount(); ++i)
|
||||
{
|
||||
BoneComponent& bone = bones[i];
|
||||
Entity entity = bones.GetEntity(i);
|
||||
const TransformComponent& transform = *transforms.GetComponent(entity);
|
||||
|
||||
XMMATRIX inverseBindPoseMatrix = XMLoadFloat4x4(&bone.inverseBindPoseMatrix);
|
||||
XMMATRIX world = XMLoadFloat4x4(&transform.world);
|
||||
XMMATRIX skinningMatrix = inverseBindPoseMatrix * world;
|
||||
XMStoreFloat4x4(&bone.skinningMatrix, skinningMatrix);
|
||||
}
|
||||
RunBoneUpdateSystem(transforms, bones);
|
||||
|
||||
// Update Physics components:
|
||||
for (size_t i = 0; i < physicscomponents.GetCount(); ++i)
|
||||
@@ -770,84 +714,9 @@ namespace wiSceneSystem
|
||||
}
|
||||
}
|
||||
|
||||
// Update Material components:
|
||||
for (size_t i = 0; i < materials.GetCount(); ++i)
|
||||
{
|
||||
MaterialComponent& material = materials[i];
|
||||
RunMaterialUpdateSystem(materials, dt);
|
||||
|
||||
material.texAnimSleep -= dt * material.texAnimFrameRate;
|
||||
if (material.texAnimSleep <= 0)
|
||||
{
|
||||
material.texMulAdd.z = fmodf(material.texMulAdd.z + material.texAnimDirection.x, 1);
|
||||
material.texMulAdd.w = fmodf(material.texMulAdd.w + material.texAnimDirection.y, 1);
|
||||
material.texAnimSleep = 1.0f;
|
||||
|
||||
material.dirty = true; // will trigger constant buffer update!
|
||||
}
|
||||
|
||||
material.engineStencilRef = STENCILREF_DEFAULT;
|
||||
if (material.subsurfaceScattering > 0)
|
||||
{
|
||||
material.engineStencilRef = STENCILREF_SKIN;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Update Object components:
|
||||
for (size_t i = 0; i < objects.GetCount(); ++i)
|
||||
{
|
||||
ObjectComponent& object = objects[i];
|
||||
Entity entity = objects.GetEntity(i);
|
||||
CullableComponent& cullable = *cullables.GetComponent(entity);
|
||||
|
||||
cullable.aabb.createFromHalfWidth(XMFLOAT3(0, 0, 0), XMFLOAT3(0, 0, 0));
|
||||
object.rendertypeMask = 0;
|
||||
object.dynamic = false;
|
||||
object.cast_shadow = false;
|
||||
|
||||
if (object.meshID != INVALID_ENTITY)
|
||||
{
|
||||
const TransformComponent* transform = transforms.GetComponent(entity);
|
||||
const MeshComponent* mesh = meshes.GetComponent(object.meshID);
|
||||
|
||||
if (mesh != nullptr && transform != nullptr)
|
||||
{
|
||||
cullable.aabb = mesh->aabb.get(transform->world);
|
||||
|
||||
if (mesh->IsSkinned() || mesh->IsDynamicVB())
|
||||
{
|
||||
object.dynamic = true;
|
||||
}
|
||||
|
||||
for (auto& subset : mesh->subsets)
|
||||
{
|
||||
const MaterialComponent* material = materials.GetComponent(subset.materialID);
|
||||
|
||||
if (material != nullptr)
|
||||
{
|
||||
if (material->IsTransparent())
|
||||
{
|
||||
object.rendertypeMask |= RENDERTYPE_TRANSPARENT;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.rendertypeMask |= RENDERTYPE_OPAQUE;
|
||||
}
|
||||
|
||||
if (material->IsWater())
|
||||
{
|
||||
object.rendertypeMask |= RENDERTYPE_TRANSPARENT | RENDERTYPE_WATER;
|
||||
|
||||
XMVECTOR _refPlane = XMPlaneFromPointNormal(XMLoadFloat3(&transform->translation), XMVectorSet(0, 1, 0, 0));
|
||||
XMStoreFloat4(&waterPlane, _refPlane);
|
||||
}
|
||||
|
||||
object.cast_shadow |= material->cast_shadow;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RunObjectUpdateSystem(transforms, meshes, materials, objects, cullables, waterPlane);
|
||||
|
||||
// Update Camera components:
|
||||
for (size_t i = 0; i < cameras.GetCount(); ++i)
|
||||
@@ -1106,7 +975,7 @@ namespace wiSceneSystem
|
||||
}
|
||||
return INVALID_ENTITY;
|
||||
}
|
||||
wiECS::Entity Scene::Entity_CreateModel(
|
||||
Entity Scene::Entity_CreateModel(
|
||||
const std::string& name
|
||||
)
|
||||
{
|
||||
@@ -1124,7 +993,7 @@ namespace wiSceneSystem
|
||||
|
||||
return entity;
|
||||
}
|
||||
wiECS::Entity Scene::Entity_CreateMaterial(
|
||||
Entity Scene::Entity_CreateMaterial(
|
||||
const std::string& name
|
||||
)
|
||||
{
|
||||
@@ -1138,7 +1007,7 @@ namespace wiSceneSystem
|
||||
|
||||
return entity;
|
||||
}
|
||||
wiECS::Entity Scene::Entity_CreateObject(
|
||||
Entity Scene::Entity_CreateObject(
|
||||
const std::string& name
|
||||
)
|
||||
{
|
||||
@@ -1158,7 +1027,7 @@ namespace wiSceneSystem
|
||||
|
||||
return entity;
|
||||
}
|
||||
wiECS::Entity Scene::Entity_CreateMesh(
|
||||
Entity Scene::Entity_CreateMesh(
|
||||
const std::string& name
|
||||
)
|
||||
{
|
||||
@@ -1200,7 +1069,7 @@ namespace wiSceneSystem
|
||||
|
||||
return entity;
|
||||
}
|
||||
wiECS::Entity Scene::Entity_CreateForce(
|
||||
Entity Scene::Entity_CreateForce(
|
||||
const std::string& name,
|
||||
const XMFLOAT3& position
|
||||
)
|
||||
@@ -1222,7 +1091,7 @@ namespace wiSceneSystem
|
||||
|
||||
return entity;
|
||||
}
|
||||
wiECS::Entity Scene::Entity_CreateEnvironmentProbe(
|
||||
Entity Scene::Entity_CreateEnvironmentProbe(
|
||||
const std::string& name,
|
||||
const XMFLOAT3& position
|
||||
)
|
||||
@@ -1246,7 +1115,7 @@ namespace wiSceneSystem
|
||||
|
||||
return entity;
|
||||
}
|
||||
wiECS::Entity Scene::Entity_CreateDecal(
|
||||
Entity Scene::Entity_CreateDecal(
|
||||
const std::string& name,
|
||||
const std::string& textureName,
|
||||
const std::string& normalMapName
|
||||
@@ -1279,7 +1148,7 @@ namespace wiSceneSystem
|
||||
|
||||
return entity;
|
||||
}
|
||||
wiECS::Entity Scene::Entity_CreateCamera(
|
||||
Entity Scene::Entity_CreateCamera(
|
||||
const std::string& name,
|
||||
float width, float height, float nearPlane, float farPlane, float fov
|
||||
)
|
||||
@@ -1326,7 +1195,7 @@ namespace wiSceneSystem
|
||||
parentcomponent->layerMask_bind = layer_child->GetLayerMask();
|
||||
}
|
||||
}
|
||||
void Scene::Component_Detach(wiECS::Entity entity)
|
||||
void Scene::Component_Detach(Entity entity)
|
||||
{
|
||||
const ParentComponent* parent = parents.GetComponent(entity);
|
||||
|
||||
@@ -1347,7 +1216,7 @@ namespace wiSceneSystem
|
||||
parents.Remove(entity);
|
||||
}
|
||||
}
|
||||
void Scene::Component_DetachChildren(wiECS::Entity parent)
|
||||
void Scene::Component_DetachChildren(Entity parent)
|
||||
{
|
||||
for (size_t i = 0; i < parents.GetCount(); )
|
||||
{
|
||||
@@ -1363,4 +1232,169 @@ namespace wiSceneSystem
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void RunTransformUpdateSystem(ComponentManager<TransformComponent>& transforms)
|
||||
{
|
||||
for (size_t i = 0; i < transforms.GetCount(); ++i)
|
||||
{
|
||||
TransformComponent& transform = transforms[i];
|
||||
transform.UpdateTransform();
|
||||
}
|
||||
}
|
||||
void RunHierarchyUpdateSystem(
|
||||
const ComponentManager<ParentComponent> parents,
|
||||
ComponentManager<TransformComponent>& transforms,
|
||||
ComponentManager<LayerComponent>& layers
|
||||
)
|
||||
{
|
||||
for (size_t i = 0; i < parents.GetCount(); ++i)
|
||||
{
|
||||
const ParentComponent& parentcomponent = parents[i];
|
||||
Entity entity = parents.GetEntity(i);
|
||||
|
||||
TransformComponent* transform_child = transforms.GetComponent(entity);
|
||||
TransformComponent* transform_parent = transforms.GetComponent(parentcomponent.parentID);
|
||||
if (transform_child != nullptr && transform_parent != nullptr)
|
||||
{
|
||||
XMVECTOR S_local = XMLoadFloat3(&transform_child->scale_local);
|
||||
XMVECTOR R_local = XMLoadFloat4(&transform_child->rotation_local);
|
||||
XMVECTOR T_local = XMLoadFloat3(&transform_child->translation_local);
|
||||
XMMATRIX W =
|
||||
XMMatrixScalingFromVector(S_local) *
|
||||
XMMatrixRotationQuaternion(R_local) *
|
||||
XMMatrixTranslationFromVector(T_local);
|
||||
|
||||
XMMATRIX W_parent = XMLoadFloat4x4(&transform_parent->world);
|
||||
XMMATRIX B = XMLoadFloat4x4(&parentcomponent.world_parent_inverse_bind);
|
||||
W = W * B * W_parent;
|
||||
|
||||
XMVECTOR S, R, T;
|
||||
XMMatrixDecompose(&S, &R, &T, W);
|
||||
XMStoreFloat3(&transform_child->scale, S);
|
||||
XMStoreFloat4(&transform_child->rotation, R);
|
||||
XMStoreFloat3(&transform_child->translation, T);
|
||||
|
||||
transform_child->world_prev = transform_child->world;
|
||||
XMStoreFloat4x4(&transform_child->world, W);
|
||||
}
|
||||
|
||||
|
||||
LayerComponent* layer_child = layers.GetComponent(entity);
|
||||
LayerComponent* layer_parent = layers.GetComponent(parentcomponent.parentID);
|
||||
if (layer_child != nullptr && layer_parent != nullptr)
|
||||
{
|
||||
layer_child->layerMask = parentcomponent.layerMask_bind & layer_parent->GetLayerMask();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
void RunBoneUpdateSystem(
|
||||
const ComponentManager<TransformComponent>& transforms,
|
||||
ComponentManager<BoneComponent>& bones
|
||||
)
|
||||
{
|
||||
for (size_t i = 0; i < bones.GetCount(); ++i)
|
||||
{
|
||||
BoneComponent& bone = bones[i];
|
||||
Entity entity = bones.GetEntity(i);
|
||||
const TransformComponent& transform = *transforms.GetComponent(entity);
|
||||
|
||||
XMMATRIX inverseBindPoseMatrix = XMLoadFloat4x4(&bone.inverseBindPoseMatrix);
|
||||
XMMATRIX world = XMLoadFloat4x4(&transform.world);
|
||||
XMMATRIX skinningMatrix = inverseBindPoseMatrix * world;
|
||||
XMStoreFloat4x4(&bone.skinningMatrix, skinningMatrix);
|
||||
}
|
||||
}
|
||||
void RunMaterialUpdateSystem(ComponentManager<MaterialComponent>& materials, float dt)
|
||||
{
|
||||
for (size_t i = 0; i < materials.GetCount(); ++i)
|
||||
{
|
||||
MaterialComponent& material = materials[i];
|
||||
|
||||
material.texAnimSleep -= dt * material.texAnimFrameRate;
|
||||
if (material.texAnimSleep <= 0)
|
||||
{
|
||||
material.texMulAdd.z = fmodf(material.texMulAdd.z + material.texAnimDirection.x, 1);
|
||||
material.texMulAdd.w = fmodf(material.texMulAdd.w + material.texAnimDirection.y, 1);
|
||||
material.texAnimSleep = 1.0f;
|
||||
|
||||
material.dirty = true; // will trigger constant buffer update!
|
||||
}
|
||||
|
||||
material.engineStencilRef = STENCILREF_DEFAULT;
|
||||
if (material.subsurfaceScattering > 0)
|
||||
{
|
||||
material.engineStencilRef = STENCILREF_SKIN;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
void RunObjectUpdateSystem(
|
||||
const ComponentManager<TransformComponent>& transforms,
|
||||
const ComponentManager<MeshComponent>& meshes,
|
||||
const ComponentManager<MaterialComponent>& materials,
|
||||
ComponentManager<ObjectComponent>& objects,
|
||||
ComponentManager<CullableComponent>& cullables,
|
||||
XMFLOAT4& waterPlane
|
||||
)
|
||||
{
|
||||
for (size_t i = 0; i < objects.GetCount(); ++i)
|
||||
{
|
||||
ObjectComponent& object = objects[i];
|
||||
Entity entity = objects.GetEntity(i);
|
||||
CullableComponent& cullable = *cullables.GetComponent(entity);
|
||||
|
||||
cullable.aabb.createFromHalfWidth(XMFLOAT3(0, 0, 0), XMFLOAT3(0, 0, 0));
|
||||
object.rendertypeMask = 0;
|
||||
object.dynamic = false;
|
||||
object.cast_shadow = false;
|
||||
|
||||
if (object.meshID != INVALID_ENTITY)
|
||||
{
|
||||
const TransformComponent* transform = transforms.GetComponent(entity);
|
||||
const MeshComponent* mesh = meshes.GetComponent(object.meshID);
|
||||
|
||||
if (mesh != nullptr && transform != nullptr)
|
||||
{
|
||||
cullable.aabb = mesh->aabb.get(transform->world);
|
||||
|
||||
if (mesh->IsSkinned() || mesh->IsDynamicVB())
|
||||
{
|
||||
object.dynamic = true;
|
||||
}
|
||||
|
||||
for (auto& subset : mesh->subsets)
|
||||
{
|
||||
const MaterialComponent* material = materials.GetComponent(subset.materialID);
|
||||
|
||||
if (material != nullptr)
|
||||
{
|
||||
if (material->IsTransparent())
|
||||
{
|
||||
object.rendertypeMask |= RENDERTYPE_TRANSPARENT;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.rendertypeMask |= RENDERTYPE_OPAQUE;
|
||||
}
|
||||
|
||||
if (material->IsWater())
|
||||
{
|
||||
object.rendertypeMask |= RENDERTYPE_TRANSPARENT | RENDERTYPE_WATER;
|
||||
|
||||
XMVECTOR _refPlane = XMPlaneFromPointNormal(XMLoadFloat3(&transform->translation), XMVectorSet(0, 1, 0, 0));
|
||||
XMStoreFloat4(&waterPlane, _refPlane);
|
||||
}
|
||||
|
||||
object.cast_shadow |= material->cast_shadow;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -736,5 +736,25 @@ namespace wiSceneSystem
|
||||
void Component_DetachChildren(wiECS::Entity parent);
|
||||
};
|
||||
|
||||
void RunTransformUpdateSystem(wiECS::ComponentManager<TransformComponent>& transforms);
|
||||
void RunHierarchyUpdateSystem(
|
||||
const wiECS::ComponentManager<ParentComponent> parents,
|
||||
wiECS::ComponentManager<TransformComponent>& transforms,
|
||||
wiECS::ComponentManager<LayerComponent>& layers
|
||||
);
|
||||
void RunBoneUpdateSystem(
|
||||
const wiECS::ComponentManager<TransformComponent>& transforms,
|
||||
wiECS::ComponentManager<BoneComponent>& bones
|
||||
);
|
||||
void RunMaterialUpdateSystem(wiECS::ComponentManager<MaterialComponent>& materials, float dt);
|
||||
void RunObjectUpdateSystem(
|
||||
const wiECS::ComponentManager<TransformComponent>& transforms,
|
||||
const wiECS::ComponentManager<MeshComponent>& meshes,
|
||||
const wiECS::ComponentManager<MaterialComponent>& materials,
|
||||
wiECS::ComponentManager<ObjectComponent>& objects,
|
||||
wiECS::ComponentManager<CullableComponent>& cullables,
|
||||
XMFLOAT4& waterPlane
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user