First pass of new shader manager
This commit is contained in:
@ -14,4 +14,5 @@ target_sources(${DAWN_TARGET_NAME}
|
||||
# Subdirs
|
||||
add_subdirectory(animation)
|
||||
add_subdirectory(font)
|
||||
add_subdirectory(mesh)
|
||||
add_subdirectory(mesh)
|
||||
add_subdirectory(shader)
|
@ -18,7 +18,7 @@ RenderPipeline::RenderPipeline(RenderManager *renderManager) {
|
||||
}
|
||||
|
||||
void RenderPipeline::init() {
|
||||
|
||||
this->renderManager->getShaderManager()->lockShader<SimpleTexturedShader>();
|
||||
}
|
||||
|
||||
void RenderPipeline::render() {
|
||||
@ -160,7 +160,7 @@ void RenderPipeline::renderSceneCamera(Scene *scene, Camera *camera) {
|
||||
&lineMesh,
|
||||
&lineIndex,
|
||||
camera,
|
||||
&this->renderManager->simpleShader
|
||||
this->renderManager->getShaderManager()->getShader<SimpleTexturedShader>(this->simpleTexturedShaderLock)
|
||||
);
|
||||
shaderPassItems.push_back(item);
|
||||
itDebugLine = scene->debugLines.erase(itDebugLine);
|
||||
@ -262,5 +262,5 @@ void RenderPipeline::renderSceneCamera(Scene *scene, Camera *camera) {
|
||||
}
|
||||
|
||||
RenderPipeline::~RenderPipeline() {
|
||||
|
||||
this->renderManager->getShaderManager()->releaseShader<SimpleTexturedShader>(this->simpleTexturedShaderLock);
|
||||
}
|
@ -17,6 +17,7 @@ namespace Dawn {
|
||||
class RenderPipeline {
|
||||
private:
|
||||
int_fast16_t renderId = -1;
|
||||
shaderlock_t simpleTexturedShaderLock;
|
||||
|
||||
public:
|
||||
RenderManager *renderManager;
|
||||
|
@ -4,8 +4,8 @@
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "RenderTarget.hpp"
|
||||
#include "util/flag.hpp"
|
||||
#include "RenderTarget.hpp"
|
||||
|
||||
#define RENDER_MANAGER_RENDER_FLAG_DEPTH_TEST FLAG_DEFINE(0)
|
||||
#define RENDER_MANAGER_RENDER_FLAG_BLEND FLAG_DEFINE(1)
|
||||
@ -14,6 +14,7 @@ typedef flag_t renderflag_t;
|
||||
namespace Dawn {
|
||||
class DawnGame;
|
||||
class RenderPipeline;
|
||||
class ShaderManager;
|
||||
|
||||
class IRenderManager {
|
||||
protected:
|
||||
@ -21,7 +22,6 @@ namespace Dawn {
|
||||
|
||||
public:
|
||||
DawnGame *game;
|
||||
RenderPipeline *renderPipeline;
|
||||
|
||||
/**
|
||||
* Default constructor for a render manager instance.
|
||||
@ -48,6 +48,13 @@ namespace Dawn {
|
||||
* @return Reference to the currently active main scene render pipeline.
|
||||
*/
|
||||
virtual RenderPipeline * getRenderPipeline() = 0;
|
||||
|
||||
/**
|
||||
* Returns the shader manager that this render manager uses.
|
||||
*
|
||||
* @return Reference to the shader manager.
|
||||
*/
|
||||
virtual ShaderManager * getShaderManager() = 0;
|
||||
|
||||
/**
|
||||
* Sets the render flags for the render manager to use.
|
||||
|
10
src/dawn/display/shader/CMakeLists.txt
Normal file
10
src/dawn/display/shader/CMakeLists.txt
Normal file
@ -0,0 +1,10 @@
|
||||
# Copyright (c) 2023 Dominic Masters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
# Sources
|
||||
target_sources(${DAWN_TARGET_NAME}
|
||||
PRIVATE
|
||||
ShaderManager.cpp
|
||||
)
|
@ -38,6 +38,7 @@ namespace Dawn {
|
||||
|
||||
class Shader {
|
||||
public:
|
||||
int32_t shaderId = -1;
|
||||
int_fast16_t renderId = 0;
|
||||
|
||||
/**
|
||||
|
20
src/dawn/display/shader/ShaderManager.cpp
Normal file
20
src/dawn/display/shader/ShaderManager.cpp
Normal file
@ -0,0 +1,20 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#include "ShaderManager.hpp"
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
ShaderManager::ShaderManager() {
|
||||
this->nextLock = 0;
|
||||
}
|
||||
|
||||
ShaderManager::~ShaderManager() {
|
||||
auto it = this->shaders.begin();
|
||||
while(it != this->shaders.end()) {
|
||||
delete it->second;
|
||||
++it;
|
||||
}
|
||||
}
|
108
src/dawn/display/shader/ShaderManager.hpp
Normal file
108
src/dawn/display/shader/ShaderManager.hpp
Normal file
@ -0,0 +1,108 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "display/shader/Shader.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
typedef int64_t shaderlock_t;
|
||||
typedef int16_t shaderid_t;
|
||||
|
||||
class ShaderManager {
|
||||
private:
|
||||
int32_t nextId;
|
||||
shaderlock_t nextLock;
|
||||
std::map<shaderid_t, Shader*> shaders;
|
||||
std::map<shaderlock_t, shaderid_t> shaderLocks;
|
||||
std::map<shaderid_t, std::vector<shaderlock_t>> shaderLocksByShader;
|
||||
|
||||
/**
|
||||
* Returns the shader id for the given shader type, or -1 if it is not
|
||||
* loaded.
|
||||
*
|
||||
* @return The shader id for the shader, or -1 if it is not loaded.
|
||||
*/
|
||||
template<class T>
|
||||
shaderid_t getShaderId() {
|
||||
auto it = shaders.begin();
|
||||
while(it != shaders.end()) {
|
||||
auto asT = dynamic_cast<T*>(it->second);
|
||||
if(asT != nullptr) return asT->shaderId;
|
||||
++it;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public:
|
||||
/**
|
||||
* Creates a new shader manager.
|
||||
*/
|
||||
ShaderManager();
|
||||
|
||||
/**
|
||||
* Locks a shader of the given type. If the shader is not already loaded,
|
||||
* it will be loaded. If the shader is already loaded, it will be
|
||||
* returned.
|
||||
*
|
||||
* @return The shader lock for the shader of the given type.
|
||||
*/
|
||||
template<class T>
|
||||
shaderlock_t lockShader() {
|
||||
auto shaderId = this->getShaderId<T>();
|
||||
if(shaderId == -1) {
|
||||
T* shader = new T();
|
||||
shader->compile();
|
||||
shader->shaderId = this->nextId++;
|
||||
this->shaders[shader->shaderId] = shader;
|
||||
shaderId = shader->shaderId;
|
||||
}
|
||||
|
||||
shaderlock_t lock = this->nextId++;
|
||||
this->shaderLocks[lock] = shaderId;
|
||||
this->shaderLocksByShader[shaderId].push_back(lock);
|
||||
return lock;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the shader for the given lock.
|
||||
*
|
||||
* @param lock The shader lock.
|
||||
* @return The shader for the given lock.
|
||||
*/
|
||||
template<class T>
|
||||
T * getShader(shaderlock_t lock) {
|
||||
auto shaderId = this->shaderLocks[lock];
|
||||
return (T*)this->shaders[shaderId];
|
||||
}
|
||||
|
||||
/**
|
||||
* Releases the shader for the given lock. This will unload any shader
|
||||
* that is no longer in use.
|
||||
*
|
||||
* @param lock Lock to release.
|
||||
*/
|
||||
template<class T>
|
||||
void releaseShader(shaderlock_t lock) {
|
||||
auto shaderId = this->shaderLocks[lock];
|
||||
this->shaderLocks.erase(lock);
|
||||
|
||||
auto& locks = this->shaderLocksByShader[shaderId];
|
||||
auto it = std::find(locks.begin(), locks.end(), lock);
|
||||
if(it != locks.end()) locks.erase(it);
|
||||
|
||||
if(locks.size() == 0) {
|
||||
this->shaderLocksByShader.erase(shaderId);
|
||||
auto shader = (T*)this->shaders[shaderId];
|
||||
delete shader;
|
||||
this->shaders.erase(shaderId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroys the shader manager.
|
||||
*/
|
||||
~ShaderManager();
|
||||
};
|
||||
}
|
@ -7,15 +7,6 @@
|
||||
#include "display/Texture.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
// class Material;
|
||||
// enum ShaderParameterType {
|
||||
// SHADER_PARAMETER_TYPE_MATRIX,
|
||||
// SHADER_PARAMETER_TYPE_BOOLEAN,
|
||||
// SHADER_PARAMETER_TYPE_COLOR,
|
||||
// SHADER_PARAMETER_TYPE_VECTOR3,
|
||||
// SHADER_PARAMETER_TYPE_TEXTURE,
|
||||
// SHADER_PARAMETER_TYPE_FLOAT
|
||||
// };
|
||||
|
||||
template<typename T>
|
||||
class IShaderProgram {
|
||||
|
@ -6,6 +6,7 @@
|
||||
#pragma once
|
||||
#include "event/Event.hpp"
|
||||
#include "asset/Asset.hpp"
|
||||
#include "display/shader/ShaderManager.hpp"
|
||||
#include "scene/debug/SceneDebugLine.hpp"
|
||||
#include "physics/ScenePhysicsManager.hpp"
|
||||
#include "state/StateEvent.hpp"
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
#pragma once
|
||||
#include "scene/SceneItemComponent.hpp"
|
||||
#include "display/shader/Shader.hpp"
|
||||
#include "display/shader/ShaderManager.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
class Material : public SceneItemComponent {
|
||||
|
@ -6,7 +6,6 @@
|
||||
#pragma once
|
||||
#include "scene/SceneItemComponent.hpp"
|
||||
#include "UICanvas.hpp"
|
||||
#include "display/shader/Shader.hpp"
|
||||
#include "util/mathutils.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
|
@ -29,7 +29,7 @@ std::vector<struct ShaderPassItem> UIImage::getPassItems(
|
||||
glm::mat4 proj, glm::mat4 view
|
||||
) {
|
||||
struct ShaderPassItem item;
|
||||
auto shader = &getGame()->renderManager.uiShaderProgram;
|
||||
auto shader = &getGame()->renderManager.uiShader->program;
|
||||
item.shaderProgram = shader;
|
||||
item.colorValues[shader->paramColor] = this->color;
|
||||
item.matrixValues[shader->paramProjection] = proj;
|
||||
|
@ -63,7 +63,7 @@ std::vector<struct ShaderPassItem> UILabel::getPassItems(
|
||||
this->updateMesh();
|
||||
|
||||
struct ShaderPassItem item;
|
||||
auto shader = &getGame()->renderManager.uiShaderProgram;
|
||||
auto shader = &getGame()->renderManager.uiShader->program;
|
||||
item.shaderProgram = shader;
|
||||
item.colorValues[shader->paramColor] = textColor;
|
||||
item.matrixValues[shader->paramProjection] = proj;
|
||||
|
@ -6,7 +6,7 @@
|
||||
#pragma once
|
||||
#include "display/Color.hpp"
|
||||
#include "display/mesh/Mesh.hpp"
|
||||
#include "display/shader/Shader.hpp"
|
||||
#include "display/shader/ShaderManager.hpp"
|
||||
|
||||
#define SCENE_DEBUG_LINE_VERTICE_COUNT 2
|
||||
#define SCENE_DEBUG_LINE_INDICE_COUNT 2
|
||||
|
Reference in New Issue
Block a user