Initial work for pre-caching resources in render system

This commit is contained in:
2014-04-13 01:25:21 +02:00
parent 04cb1f1204
commit 14feb3659b
13 changed files with 64 additions and 35 deletions
+6 -5
View File
@@ -5,6 +5,12 @@ void GameWorld::Initialize()
{ {
World::Initialize(); World::Initialize();
m_ResourceManager.RegisterResource("Model", "Models/Placeholders/PhysicsTest/Plane.obj");
m_ResourceManager.RegisterResource("Model", "Models/Placeholders/PhysicsTest/ArrowCube.obj");
m_ResourceManager.PreCache();
RegisterComponents();
{ {
auto camera = CreateEntity(); auto camera = CreateEntity();
auto transform = AddComponent<Components::Transform>(camera, "Transform"); auto transform = AddComponent<Components::Transform>(camera, "Transform");
@@ -113,14 +119,9 @@ void GameWorld::Update(double dt)
void GameWorld::RegisterComponents() void GameWorld::RegisterComponents()
{ {
m_ComponentFactory.Register("Camera", []() { return new Components::Camera(); });
m_ComponentFactory.Register("DirectionalLight", []() { return new Components::DirectionalLight(); });
m_ComponentFactory.Register("Input", []() { return new Components::Input(); }); m_ComponentFactory.Register("Input", []() { return new Components::Input(); });
m_ComponentFactory.Register("Model", []() { return new Components::Model(); });
m_ComponentFactory.Register("ParticleEmitter", []() { return new Components::ParticleEmitter(); }); m_ComponentFactory.Register("ParticleEmitter", []() { return new Components::ParticleEmitter(); });
m_ComponentFactory.Register("PointLight", []() { return new Components::PointLight(); });
m_ComponentFactory.Register("SoundEmitter", []() { return new Components::SoundEmitter(); }); m_ComponentFactory.Register("SoundEmitter", []() { return new Components::SoundEmitter(); });
m_ComponentFactory.Register("Sprite", []() { return new Components::Sprite(); });
m_ComponentFactory.Register("Template", []() { return new Components::Template(); }); m_ComponentFactory.Register("Template", []() { return new Components::Template(); });
m_ComponentFactory.Register("Transform", []() { return new Components::Transform(); }); m_ComponentFactory.Register("Transform", []() { return new Components::Transform(); });
m_ComponentFactory.Register("FreeSteering", []() { return new Components::FreeSteering(); }); m_ComponentFactory.Register("FreeSteering", []() { return new Components::FreeSteering(); });
+2 -1
View File
@@ -10,10 +10,11 @@
#include <cstdlib> #include <cstdlib>
#include <stack> #include <stack>
#include "ResourceManager.h"
#include "Texture.h" #include "Texture.h"
#include "OBJ.h" #include "OBJ.h"
class Model class Model : public Resource
{ {
public: public:
Model(OBJ &obj); Model(OBJ &obj);
+2 -2
View File
@@ -369,11 +369,11 @@ void Renderer::AddTextToDraw()
//Add to draw shit vector //Add to draw shit vector
} }
void Renderer::AddModelToDraw(std::shared_ptr<Model> model, glm::vec3 position, glm::quat orientation, glm::vec3 scale, bool visible, bool shadowCaster) void Renderer::AddModelToDraw(Model* model, glm::vec3 position, glm::quat orientation, glm::vec3 scale, bool visible, bool shadowCaster)
{ {
glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale); glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale);
// You can now use ModelMatrix to build the MVP matrix // You can now use ModelMatrix to build the MVP matrix
ModelsToRender.push_back(std::make_tuple(model.get(), modelMatrix, visible, shadowCaster)); ModelsToRender.push_back(std::make_tuple(model, modelMatrix, visible, shadowCaster));
} }
void Renderer::AddPointLightToDraw( void Renderer::AddPointLightToDraw(
+1 -1
View File
@@ -39,7 +39,7 @@ public:
void Draw(double dt); void Draw(double dt);
void DrawText(); void DrawText();
void AddModelToDraw(std::shared_ptr<Model> model, glm::vec3 position, glm::quat orientation, glm::vec3 scale, bool visible, bool shadowCaster); void AddModelToDraw(Model* model, glm::vec3 position, glm::quat orientation, glm::vec3 scale, bool visible, bool shadowCaster);
void AddTextToDraw(); void AddTextToDraw();
void AddPointLightToDraw( void AddPointLightToDraw(
glm::vec3 _position, glm::vec3 _position,
+5 -5
View File
@@ -1,7 +1,7 @@
#include "PrecompiledHeader.h" #include "PrecompiledHeader.h"
#include "ContentManager.h" #include "ResourceManager.h"
Resource* ContentManager::CreateResource(std::string resourceType, std::string resourceName) Resource* ResourceManager::CreateResource(std::string resourceType, std::string resourceName)
{ {
auto it = m_FactoryFunctions.find(resourceType); auto it = m_FactoryFunctions.find(resourceType);
if (it != m_FactoryFunctions.end()) if (it != m_FactoryFunctions.end())
@@ -14,7 +14,7 @@ Resource* ContentManager::CreateResource(std::string resourceType, std::string r
} }
} }
void ContentManager::PreCache() void ResourceManager::PreCache()
{ {
LOG_INFO("Pre-caching resources..."); LOG_INFO("Pre-caching resources...");
for (auto pair : m_RegisteredResources) for (auto pair : m_RegisteredResources)
@@ -39,13 +39,13 @@ void ContentManager::PreCache()
} }
} }
void ContentManager::RegisterResource(std::string resourceType, std::string resourceName) void ResourceManager::RegisterResource(std::string resourceType, std::string resourceName)
{ {
m_RegisteredResources[resourceName] = resourceType; m_RegisteredResources[resourceName] = resourceType;
m_ResourceTypeIDs[resourceName] = m_ResourceTypeCount++; m_ResourceTypeIDs[resourceName] = m_ResourceTypeCount++;
} }
void ContentManager::RegisterType(std::string resourceType, std::function<Resource*(std::string)> factoryFunction) void ResourceManager::RegisterType(std::string resourceType, std::function<Resource*(std::string)> factoryFunction)
{ {
m_FactoryFunctions[resourceType] = factoryFunction; m_FactoryFunctions[resourceType] = factoryFunction;
} }
+6 -11
View File
@@ -1,5 +1,5 @@
#ifndef ContentManager_h__ #ifndef ResourceManager_h__
#define ContentManager_h__ #define ResourceManager_h__
#include <string> #include <string>
#include <functional> #include <functional>
@@ -13,11 +13,6 @@ class Resource
public: public:
unsigned int TypeID; unsigned int TypeID;
unsigned int ResourceID; unsigned int ResourceID;
std::string ResourceName;
protected:
Resource(std::string resourceName)
: ResourceName(resourceName) {}
}; };
class ResourceManager class ResourceManager
@@ -33,7 +28,7 @@ public:
void PreCache(); void PreCache();
template <typename T> template <typename T>
T* Fetch(std::string resourceName); T* Fetch(std::string resourceName) const;
private: private:
unsigned int m_ResourceTypeCount = 0; unsigned int m_ResourceTypeCount = 0;
@@ -49,7 +44,7 @@ private:
}; };
template <typename T> template <typename T>
T* ContentManager::Fetch(std::string resourceName) T* ResourceManager::Fetch(std::string resourceName) const
{ {
if (m_ResourceCache.find(resourceName) == m_ResourceCache.end()) if (m_ResourceCache.find(resourceName) == m_ResourceCache.end())
{ {
@@ -58,8 +53,8 @@ T* ContentManager::Fetch(std::string resourceName)
} }
else else
{ {
return static_cast<T*>(m_ResourceCache[resourceName]); return static_cast<T*>(m_ResourceCache.at(resourceName));
} }
} }
#endif // ContentManager_h__ #endif // ResourceManager_h__
+4
View File
@@ -4,6 +4,7 @@
#include "Factory.h" #include "Factory.h"
#include "Entity.h" #include "Entity.h"
#include "Component.h" #include "Component.h"
#include "ResourceManager.h"
class World; class World;
@@ -13,6 +14,9 @@ public:
System(World* world) : m_World(world) { } System(World* world) : m_World(world) { }
virtual ~System() { } virtual ~System() { }
virtual void RegisterComponents(ComponentFactory* cf) { } // TODO: Make abstract
virtual void RegisterResourceTypes(ResourceManager* rm) { } // TODO: Make abstract
virtual void Initialize() { } virtual void Initialize() { }
// Called once per system every tick // Called once per system every tick
+16 -1
View File
@@ -25,7 +25,7 @@ void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID pa
m_CachedModels[modelComponent->ModelFile] = std::make_shared<Model>(OBJ(modelComponent->ModelFile)); m_CachedModels[modelComponent->ModelFile] = std::make_shared<Model>(OBJ(modelComponent->ModelFile));
} }
auto model = m_CachedModels[modelComponent->ModelFile]; auto model = m_World->GetResourceManager()->Fetch<Model>(modelComponent->ModelFile);
glm::vec3 position = m_TransformSystem->AbsolutePosition(entity); glm::vec3 position = m_TransformSystem->AbsolutePosition(entity);
glm::quat orientation = m_TransformSystem->AbsoluteOrientation(entity); glm::quat orientation = m_TransformSystem->AbsoluteOrientation(entity);
glm::vec3 scale = m_TransformSystem->AbsoluteScale(entity); glm::vec3 scale = m_TransformSystem->AbsoluteScale(entity);
@@ -63,6 +63,21 @@ void Systems::RenderSystem::Initialize()
m_TransformSystem = m_World->GetSystem<Systems::TransformSystem>("TransformSystem"); m_TransformSystem = m_World->GetSystem<Systems::TransformSystem>("TransformSystem");
} }
void Systems::RenderSystem::RegisterComponents(ComponentFactory* cf)
{
cf->Register("Camera", []() { return new Components::Camera(); });
cf->Register("Model", []() { return new Components::Model(); });
cf->Register("Sprite", []() { return new Components::Sprite(); });
cf->Register("PointLight", []() { return new Components::PointLight(); });
cf->Register("DirectionalLight", []() { return new Components::DirectionalLight(); });
}
void Systems::RenderSystem::RegisterResourceTypes(ResourceManager* rm)
{
rm->RegisterType("Texture", [](std::string resourceName) { return new Texture(resourceName); });
rm->RegisterType("Model", [](std::string resourceName) { return new Model(OBJ(resourceName)); });
}
+12 -1
View File
@@ -7,9 +7,15 @@
#include "Systems/TransformSystem.h" #include "Systems/TransformSystem.h"
#include "Model.h" #include "Model.h"
#include "Texture.h" #include "Texture.h"
#include "Components/Model.h"
#include "Components/Transform.h" #include "Components/Transform.h"
#include "Components/Camera.h" #include "Components/Camera.h"
#include "Components/Model.h"
#include "Components/Sprite.h"
#include "Components/PointLight.h"
#include "Components/DirectionalLight.h"
#include "Components/Template.h"
#include "Components/Transform.h"
#include "Renderer.h" #include "Renderer.h"
namespace Systems namespace Systems
@@ -21,6 +27,8 @@ public:
RenderSystem(World* world, std::shared_ptr<Renderer> renderer) RenderSystem(World* world, std::shared_ptr<Renderer> renderer)
: System(world), m_Renderer(renderer) { } : System(world), m_Renderer(renderer) { }
void RegisterComponents(ComponentFactory* cf) override;
void RegisterResourceTypes(ResourceManager* rm) override;
void Initialize() override; void Initialize() override;
std::unordered_map<std::string, std::shared_ptr<Model>> m_CachedModels; std::unordered_map<std::string, std::shared_ptr<Model>> m_CachedModels;
@@ -28,6 +36,9 @@ public:
void OnComponentCreated(std::string type, std:: shared_ptr<Component> component) override; void OnComponentCreated(std::string type, std:: shared_ptr<Component> component) override;
void UpdateEntity(double dt, EntityID entity, EntityID parent) override; void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
private: private:
std::shared_ptr<Renderer> m_Renderer; std::shared_ptr<Renderer> m_Renderer;
std::shared_ptr<Systems::TransformSystem> m_TransformSystem; std::shared_ptr<Systems::TransformSystem> m_TransformSystem;
-1
View File
@@ -2,7 +2,6 @@
#include "Texture.h" #include "Texture.h"
Texture::Texture(std::string path) Texture::Texture(std::string path)
: Resource(path)
{ {
Load(path); Load(path);
} }
+1 -1
View File
@@ -6,7 +6,7 @@
#include <SOIL.h> #include <SOIL.h>
#include "ContentManager.h" #include "ResourceManager.h"
class Texture : public Resource class Texture : public Resource
{ {
+5 -4
View File
@@ -134,12 +134,13 @@ void World::Initialize()
{ {
RegisterSystems(); RegisterSystems();
AddSystems(); AddSystems();
for (auto system : m_Systems) for (auto pair : m_Systems)
{ {
system.second->Initialize(); auto system = pair.second;
system->RegisterComponents(&m_ComponentFactory);
system->RegisterResourceTypes(&m_ResourceManager);
system->Initialize();
} }
RegisterComponents();
} }
std::shared_ptr<Component> World::AddComponent(EntityID entity, std::string componentType) std::shared_ptr<Component> World::AddComponent(EntityID entity, std::string componentType)
+4 -2
View File
@@ -10,12 +10,11 @@
#include <boost/any.hpp> #include <boost/any.hpp>
#include "Util/logging.h"
#include "Factory.h" #include "Factory.h"
#include "Entity.h" #include "Entity.h"
#include "Component.h" #include "Component.h"
#include "System.h" #include "System.h"
#include "ResourceManager.h"
class World class World
{ {
@@ -73,9 +72,12 @@ public:
std::unordered_map<EntityID, EntityID>* GetEntities() { return &m_EntityParents; } std::unordered_map<EntityID, EntityID>* GetEntities() { return &m_EntityParents; }
const ResourceManager* GetResourceManager() const { return &m_ResourceManager; }
protected: protected:
SystemFactory m_SystemFactory; SystemFactory m_SystemFactory;
ComponentFactory m_ComponentFactory; ComponentFactory m_ComponentFactory;
ResourceManager m_ResourceManager;
std::unordered_map<std::string, std::shared_ptr<System>> m_Systems; std::unordered_map<std::string, std::shared_ptr<System>> m_Systems;