Compare commits

..

1 Commits

Author SHA1 Message Date
Jace 3f9866b334 Crudely caching model matrix calculations, work in progress. 2016-03-11 01:28:22 +01:00
8 changed files with 63 additions and 48 deletions
+11 -1
View File
@@ -4,11 +4,11 @@
#include "../GLM.h" #include "../GLM.h"
#include "World.h" #include "World.h"
#include "EntityWrapper.h" #include "EntityWrapper.h"
#include "System.h"
namespace Transform namespace Transform
{ {
glm::mat4 AbsoluteTransformation(EntityWrapper entity);
glm::vec3 AbsolutePosition(EntityWrapper entity); glm::vec3 AbsolutePosition(EntityWrapper entity);
glm::vec3 AbsolutePosition(World* world, EntityID entity); glm::vec3 AbsolutePosition(World* world, EntityID entity);
glm::vec3 AbsoluteOrientationEuler(EntityWrapper entity); glm::vec3 AbsoluteOrientationEuler(EntityWrapper entity);
@@ -20,6 +20,16 @@ glm::mat4 ModelMatrix(EntityWrapper entity);
glm::mat4 ModelMatrix(EntityID entity, World* world); glm::mat4 ModelMatrix(EntityID entity, World* world);
glm::vec3 TransformPoint(const glm::vec3& point, const glm::mat4& matrix); glm::vec3 TransformPoint(const glm::vec3& point, const glm::mat4& matrix);
class ClearCache : public ImpureSystem
{
public:
ClearCache(SystemParams params)
: System(params)
{ }
virtual void Update(double dt) override;
};
} }
#endif #endif
+18 -1
View File
@@ -26,13 +26,24 @@ struct ModelJob : RenderJob
ModelID = model->ResourceID; ModelID = model->ResourceID;
Type = matProp.type; Type = matProp.type;
::RawModel::MaterialBasic* matGroup = matProp.material; ::RawModel::MaterialBasic* matGroup = matProp.material;
ShaderID = matProp.ShaderID;
switch(matProp.type){ switch(matProp.type){
case ::RawModel::MaterialType::Basic: case ::RawModel::MaterialType::Basic:
if (Model->IsSkinned()) {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
}
else {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
}
TextureID = 0; TextureID = 0;
break; break;
case ::RawModel::MaterialType::SingleTextures: case ::RawModel::MaterialType::SingleTextures:
{ {
if (Model->IsSkinned()) {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
}
else {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
}
::RawModel::MaterialSingleTextures* singleTextures = static_cast<::RawModel::MaterialSingleTextures*>(matProp.material); ::RawModel::MaterialSingleTextures* singleTextures = static_cast<::RawModel::MaterialSingleTextures*>(matProp.material);
TextureID = (singleTextures->ColorMap.Texture) ? singleTextures->ColorMap.Texture->ResourceID : 0; TextureID = (singleTextures->ColorMap.Texture) ? singleTextures->ColorMap.Texture->ResourceID : 0;
if (modelComponent["DiffuseTexture"]) { if (modelComponent["DiffuseTexture"]) {
@@ -54,6 +65,12 @@ struct ModelJob : RenderJob
break; break;
case ::RawModel::MaterialType::SplatMapping: case ::RawModel::MaterialType::SplatMapping:
{ {
if (Model->IsSkinned()) {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapSkinnedProgram")->ResourceID;
}
else {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapProgram")->ResourceID;
}
::RawModel::MaterialSplatMapping* SplatTextures = static_cast<::RawModel::MaterialSplatMapping*>(matProp.material); ::RawModel::MaterialSplatMapping* SplatTextures = static_cast<::RawModel::MaterialSplatMapping*>(matProp.material);
SplatMap = &SplatTextures->SplatMap; SplatMap = &SplatTextures->SplatMap;
@@ -18,7 +18,6 @@
#include "../Core/ResourceManager.h" #include "../Core/ResourceManager.h"
#include "Texture.h" #include "Texture.h"
#include "Skeleton.h" #include "Skeleton.h"
#include "ShaderProgram.h"
#include "boost\endian\buffers.hpp" #include "boost\endian\buffers.hpp"
@@ -88,7 +87,6 @@ public:
struct MaterialProperties { struct MaterialProperties {
MaterialType type; MaterialType type;
MaterialBasic* material; MaterialBasic* material;
unsigned int ShaderID = 0;
}; };
const Vertex* Vertices() const { const Vertex* Vertices() const {
+2 -2
View File
@@ -621,7 +621,7 @@ boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity, bool takeM
ComponentWrapper& cAABB = entity["AABB"]; ComponentWrapper& cAABB = entity["AABB"];
modelSpaceBox = EntityAABB::FromOriginSize((glm::vec3)cAABB["Origin"], (glm::vec3)cAABB["Size"]); modelSpaceBox = EntityAABB::FromOriginSize((glm::vec3)cAABB["Origin"], (glm::vec3)cAABB["Size"]);
} else if (entity.HasComponent("Model")) { } else if (entity.HasComponent("Model")) {
std::string res = entity["Model"]["Resource"]; const std::string& res = entity["Model"]["Resource"];
if (res.empty()) { if (res.empty()) {
return boost::none; return boost::none;
} }
@@ -638,7 +638,7 @@ boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity, bool takeM
return boost::none; return boost::none;
} }
glm::mat4 modelMat = Transform::AbsoluteTransformation(entity); glm::mat4 modelMat = Transform::ModelMatrix(entity);
glm::vec3 mini(INFINITY); glm::vec3 mini(INFINITY);
glm::vec3 maxi(-INFINITY); glm::vec3 maxi(-INFINITY);
glm::vec3 maxCorner = modelSpaceBox.MaxCorner(); glm::vec3 maxCorner = modelSpaceBox.MaxCorner();
+26 -24
View File
@@ -1,16 +1,6 @@
#include "Core/Transform.h" #include "Core/Transform.h"
glm::mat4 Transform::AbsoluteTransformation(EntityWrapper entity) static std::unordered_map<EntityWrapper, glm::mat4> MatrixCache;
{
glm::mat4 t = glm::mat4(1.f);
while (entity.Valid()) {
t = glm::translate((glm::vec3&)entity["Transform"]["Position"]) * glm::toMat4(glm::quat((glm::vec3&)entity["Transform"]["Orientation"])) * glm::scale((glm::vec3&)entity["Transform"]["Scale"]) * t;
entity = entity.Parent();
}
return t;
}
glm::vec3 Transform::AbsolutePosition(EntityWrapper entity) glm::vec3 Transform::AbsolutePosition(EntityWrapper entity)
{ {
@@ -80,24 +70,36 @@ glm::vec3 Transform::AbsoluteScale(World* world, EntityID entity)
return scale; return scale;
} }
glm::mat4 Transform::ModelMatrix(EntityWrapper entity)
{
return ModelMatrix(entity.ID, entity.World);
}
glm::mat4 Transform::ModelMatrix(EntityID entity, World* world) glm::mat4 Transform::ModelMatrix(EntityID entity, World* world)
{ {
return AbsoluteTransformation(EntityWrapper(world, entity)); return ModelMatrix(EntityWrapper(world, entity));
//glm::vec3 position = Transform::AbsolutePosition(world, entity);
//glm::quat orientation = Transform::AbsoluteOrientation(world, entity);
//glm::vec3 scale = Transform::AbsoluteScale(world, entity);
//glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale);
//return modelMatrix;
} }
glm::vec3 Transform::TransformPoint(const glm::vec3& point, const glm::mat4& matrix) glm::vec3 Transform::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
{ {
return glm::vec3(matrix * glm::vec4(point.x, point.y, point.z, 1)); return glm::vec3(matrix * glm::vec4(point.x, point.y, point.z, 1));
} }
glm::mat4 Transform::ModelMatrix(EntityWrapper entity)
{
auto cacheIt = MatrixCache.find(entity);
if (cacheIt != MatrixCache.end()) {
return cacheIt->second;
}
ComponentWrapper cTransform = entity["Transform"];
glm::mat4 t = glm::translate((const glm::vec3&)cTransform["Position"]) * glm::toMat4(glm::quat((const glm::vec3&)cTransform["Orientation"])) * glm::scale((const glm::vec3&)cTransform["Scale"]);
EntityWrapper parent = entity.Parent();
if (parent.Valid()) {
t = ModelMatrix(parent) * t;
}
MatrixCache[entity] = t;
return t;
}
void Transform::ClearCache::Update(double dt)
{
MatrixCache.clear();
}
-15
View File
@@ -148,29 +148,14 @@ void RawModelCustom::ReadMaterialSingle(std::size_t& offset, char* fileData, con
case MaterialType::Basic: case MaterialType::Basic:
newMaterialProperty.material = new MaterialBasic(); newMaterialProperty.material = new MaterialBasic();
ReadMaterialBasic(newMaterialProperty.material, offset, fileData, fileByteSize); ReadMaterialBasic(newMaterialProperty.material, offset, fileData, fileByteSize);
if(hasSkin){
newMaterialProperty.ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
} else {
newMaterialProperty.ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
}
break; break;
case MaterialType::SplatMapping: case MaterialType::SplatMapping:
newMaterialProperty.material = new MaterialSplatMapping(); newMaterialProperty.material = new MaterialSplatMapping();
ReadMaterialSplatMapping(static_cast<MaterialSplatMapping*>(newMaterialProperty.material), offset, fileData, fileByteSize); ReadMaterialSplatMapping(static_cast<MaterialSplatMapping*>(newMaterialProperty.material), offset, fileData, fileByteSize);
if (hasSkin){
newMaterialProperty.ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapSkinnedProgram")->ResourceID;
} else {
newMaterialProperty.ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapProgram")->ResourceID;
}
break; break;
case MaterialType::SingleTextures: case MaterialType::SingleTextures:
newMaterialProperty.material = new MaterialSingleTextures(); newMaterialProperty.material = new MaterialSingleTextures();
ReadMaterialSingleTexture(static_cast<MaterialSingleTextures*>(newMaterialProperty.material), offset, fileData, fileByteSize); ReadMaterialSingleTexture(static_cast<MaterialSingleTextures*>(newMaterialProperty.material), offset, fileData, fileByteSize);
if (hasSkin){
newMaterialProperty.ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
} else {
newMaterialProperty.ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
}
break; break;
default: default:
throw Resource::FailedLoadingException("Material contains an unknown MaterialType"); throw Resource::FailedLoadingException("Material contains an unknown MaterialType");
+1 -1
View File
@@ -184,7 +184,7 @@ bool RenderSystem::isEntityVisible(EntityWrapper& entity)
} }
// Hide things parented to local player if they have the HiddenFromLocalPlayer component // Hide things parented to local player if they have the HiddenFromLocalPlayer component
bool outOfBodyExperience = ResourceManager::Load<ConfigFile>("Config.ini")->Get<bool>("Debug.OutOfBodyExperience", false); bool outOfBodyExperience = false; // ResourceManager::Load<ConfigFile>("Config.ini")->Get<bool>("Debug.OutOfBodyExperience", false); // APPARENTLY THIS IS REALLY SLOW
if ( if (
(entity.HasComponent("HiddenForLocalPlayer") || entity.FirstParentWithComponent("HiddenForLocalPlayer").Valid()) (entity.HasComponent("HiddenForLocalPlayer") || entity.FirstParentWithComponent("HiddenForLocalPlayer").Valid())
&& (entity == m_LocalPlayer || entity.IsChildOf(m_LocalPlayer)) && (entity == m_LocalPlayer || entity.IsChildOf(m_LocalPlayer))
+4 -1
View File
@@ -42,7 +42,6 @@
#include "Game/Systems/StartSystem.h" #include "Game/Systems/StartSystem.h"
#include "Rendering/TextureSprite.h" #include "Rendering/TextureSprite.h"
Game::Game(int argc, char* argv[]) Game::Game(int argc, char* argv[])
{ {
parseArgs(argc, argv); parseArgs(argc, argv);
@@ -159,6 +158,8 @@ Game::Game(int argc, char* argv[])
m_SystemPipeline->AddSystem<StartSystem>(updateOrderLevel); m_SystemPipeline->AddSystem<StartSystem>(updateOrderLevel);
// Populate Octree with collidables // Populate Octree with collidables
++updateOrderLevel; ++updateOrderLevel;
m_SystemPipeline->AddSystem<Transform::ClearCache>(updateOrderLevel);
++updateOrderLevel;
m_SystemPipeline->AddSystem<FillOctreeSystem>(updateOrderLevel, m_OctreeCollision, "Collidable"); m_SystemPipeline->AddSystem<FillOctreeSystem>(updateOrderLevel, m_OctreeCollision, "Collidable");
m_SystemPipeline->AddSystem<FillOctreeSystem>(updateOrderLevel, m_OctreeTrigger, "Player"); m_SystemPipeline->AddSystem<FillOctreeSystem>(updateOrderLevel, m_OctreeTrigger, "Player");
m_SystemPipeline->AddSystem<AnimationSystem>(updateOrderLevel); m_SystemPipeline->AddSystem<AnimationSystem>(updateOrderLevel);
@@ -174,6 +175,8 @@ Game::Game(int argc, char* argv[])
++updateOrderLevel; ++updateOrderLevel;
m_SystemPipeline->AddSystem<FillFrustumOctreeSystem>(updateOrderLevel, m_OctreeFrustrumCulling); m_SystemPipeline->AddSystem<FillFrustumOctreeSystem>(updateOrderLevel, m_OctreeFrustrumCulling);
++updateOrderLevel; ++updateOrderLevel;
m_SystemPipeline->AddSystem<Transform::ClearCache>(updateOrderLevel);
++updateOrderLevel;
m_SystemPipeline->AddSystem<RenderSystem>(updateOrderLevel, m_Renderer, m_RenderFrame, m_OctreeFrustrumCulling); m_SystemPipeline->AddSystem<RenderSystem>(updateOrderLevel, m_Renderer, m_RenderFrame, m_OctreeFrustrumCulling);
++updateOrderLevel; ++updateOrderLevel;
m_SystemPipeline->AddSystem<EditorSystem>(updateOrderLevel, m_Renderer, m_RenderFrame); m_SystemPipeline->AddSystem<EditorSystem>(updateOrderLevel, m_Renderer, m_RenderFrame);