First pass of new shader manager
This commit is contained in:
		| @@ -17,9 +17,14 @@ RenderManager::RenderManager(DawnGame *game) : | ||||
| } | ||||
|  | ||||
| void RenderManager::init() { | ||||
|   // Lock the common shaders | ||||
|   this->lockSimpleTextured = this->shaderManager.lockShader<SimpleTexturedShader>(); | ||||
|   this->lockUIShaderProgram = this->shaderManager.lockShader<SimpleTexturedShader>(); | ||||
|   this->simpleTexturedShader = this->shaderManager.getShader<SimpleTexturedShader>(this->lockSimpleTextured); | ||||
|   this->uiShader = this->shaderManager.getShader<SimpleTexturedShader>(this->lockUIShaderProgram); | ||||
|  | ||||
|   this->renderPipeline.init(); | ||||
|   this->simpleShader.compile(); | ||||
|   this->uiShaderProgram.compile(); | ||||
|  | ||||
|   // Prepare the initial values | ||||
|   glEnable(GL_TEXTURE_2D); | ||||
|   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
| @@ -37,6 +42,10 @@ RenderPipeline * RenderManager::getRenderPipeline() { | ||||
|   return &this->renderPipeline; | ||||
| } | ||||
|  | ||||
| ShaderManager * RenderManager::getShaderManager() { | ||||
|   return &this->shaderManager; | ||||
| } | ||||
|  | ||||
| void RenderManager::setRenderFlags(renderflag_t flags) { | ||||
|   this->renderFlags = flags; | ||||
|    | ||||
| @@ -58,4 +67,6 @@ void RenderManager::update() { | ||||
| } | ||||
|  | ||||
| RenderManager::~RenderManager() { | ||||
|   this->shaderManager.releaseShader<SimpleTexturedShader>(this->lockSimpleTextured); | ||||
|   this->shaderManager.releaseShader<SimpleTexturedShader>(this->lockUIShaderProgram); | ||||
| } | ||||
| @@ -6,6 +6,7 @@ | ||||
| #pragma once | ||||
| #include "display/_RenderManager.hpp" | ||||
| #include "display/BackBufferRenderTarget.hpp" | ||||
| #include "display/shader/ShaderManager.hpp" | ||||
| #include "display/shader/SimpleTexturedShader.hpp" | ||||
| #include "display/shader/UIShaderProgram.hpp" | ||||
| #include "display/RenderPipeline.hpp" | ||||
| @@ -15,11 +16,14 @@ namespace Dawn { | ||||
|   class RenderManager : public IRenderManager { | ||||
|     private: | ||||
|       RenderPipeline renderPipeline; | ||||
|       ShaderManager shaderManager; | ||||
|       shaderlock_t lockSimpleTextured = -1; | ||||
|       shaderlock_t lockUIShaderProgram = -1; | ||||
|  | ||||
|     public: | ||||
|       BackBufferRenderTarget backBuffer; | ||||
|       SimpleTexturedShader simpleShader; | ||||
|       UIShaderProgram uiShaderProgram; | ||||
|       SimpleTexturedShader *simpleTexturedShader = nullptr; | ||||
|       SimpleTexturedShader *uiShader = nullptr; | ||||
|       ExampleFont defaultFont; | ||||
|  | ||||
|       /** | ||||
| @@ -29,6 +33,7 @@ namespace Dawn { | ||||
|        | ||||
|       RenderTarget * getBackBuffer() override; | ||||
|       RenderPipeline * getRenderPipeline() override; | ||||
|       ShaderManager * getShaderManager() override; | ||||
|       void setRenderFlags(renderflag_t renderFlags) override; | ||||
|       void init() override; | ||||
|       void update() override; | ||||
|   | ||||
| @@ -8,4 +8,5 @@ target_sources(${DAWN_TARGET_NAME} | ||||
|   PRIVATE | ||||
|     ShaderProgram.cpp | ||||
|     SimpleTexturedShader.cpp | ||||
|     SimpleBillboardedShader.cpp | ||||
| ) | ||||
| @@ -4,6 +4,8 @@ | ||||
| // https://opensource.org/licenses/MIT | ||||
|  | ||||
| #include "SimpleBillboardedShader.hpp" | ||||
| #include "scene/components/display/mesh/MeshRenderer.hpp" | ||||
| #include "scene/components/display/Camera.hpp" | ||||
|  | ||||
| using namespace Dawn; | ||||
|  | ||||
| @@ -25,9 +27,9 @@ void SimpleBillboardedShaderProgram::compile() { | ||||
|  | ||||
|       "out vec2 o_TextCoord;\n" | ||||
|       "void main() {\n" | ||||
|         "vec3 camRight = vec3(view[0][0], view[1][0], view[2][0]);\n" | ||||
|         "vec3 camUp = vec3(view[0][1], view[1][1], view[2][1]);\n" | ||||
|         "vec3 billboardPos = view[3].xyz + position.x * camRight + position.y * camUp;\n" | ||||
|         "vec3 camRight = vec3(u_View[0][0], u_View[1][0], u_View[2][0]);\n" | ||||
|         "vec3 camUp = vec3(u_View[0][1], u_View[1][1], u_View[2][1]);\n" | ||||
|         "vec3 billboardPos = u_View[3].xyz + aPos.x * camRight + aPos.y * camUp;\n" | ||||
|         "gl_Position = u_Proj * u_View * u_Model * vec4(billboardPos, 1.0);\n" | ||||
|         "o_TextCoord = vec2(aTexCoord.x, aTexCoord.y);\n" | ||||
|       "}", | ||||
| @@ -56,4 +58,43 @@ void SimpleBillboardedShaderProgram::compile() { | ||||
|   this->paramColor = this->getParameterByName("u_Color"); | ||||
|   this->paramTexture = this->getParameterByName("u_Text"); | ||||
|   this->paramHasTexture = this->getParameterByName("u_HasTexture"); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void SimpleBillboardedShader::compile() { | ||||
|   this->program.compile(); | ||||
| } | ||||
|  | ||||
| std::vector<struct ShaderPassItem> SimpleBillboardedShader::getPassItems( | ||||
|   Mesh *mesh, | ||||
|   Material *material, | ||||
|   Camera *camera | ||||
| ) { | ||||
|   auto simpleMaterial = dynamic_cast<SimpleBillboardedMaterial*>(material); | ||||
|   assertNotNull(simpleMaterial); | ||||
|  | ||||
|   struct ShaderPassItem onlyPass; | ||||
|   onlyPass.mesh = mesh; | ||||
|   onlyPass.shaderProgram = &program; | ||||
|   onlyPass.colorValues[program.paramColor] = simpleMaterial->color; | ||||
|   onlyPass.matrixValues[program.paramModel] = material->transform->getWorldTransform(); | ||||
|   onlyPass.matrixValues[program.paramView] = camera->transform->getWorldTransform(); | ||||
|   onlyPass.matrixValues[program.paramProjection] = camera->getProjection(); | ||||
|   onlyPass.renderFlags = ( | ||||
|     RENDER_MANAGER_RENDER_FLAG_BLEND | | ||||
|     RENDER_MANAGER_RENDER_FLAG_DEPTH_TEST | ||||
|   ); | ||||
|  | ||||
|   if(simpleMaterial->texture != nullptr) { | ||||
|     onlyPass.boolValues[program.paramHasTexture] = true; | ||||
|     onlyPass.textureSlots[0] = simpleMaterial->texture; | ||||
|     onlyPass.textureValues[program.paramTexture] = 0; | ||||
|   } else { | ||||
|     onlyPass.boolValues[program.paramHasTexture] = false; | ||||
|   } | ||||
|  | ||||
|   std::vector<struct ShaderPassItem> passes; | ||||
|   passes.push_back(onlyPass); | ||||
|   return passes; | ||||
| } | ||||
| @@ -4,10 +4,10 @@ | ||||
| // https://opensource.org/licenses/MIT | ||||
|  | ||||
| #pragma once | ||||
| #include "display/shader/Shader.hpp" | ||||
| #include "scene/components/display/material/SimpleBillboardedMaterial.hpp" | ||||
|  | ||||
| namespace Dawn { | ||||
|   class SimpleBillboardedShader : public ShaderProgram { | ||||
|   class SimpleBillboardedShaderProgram : public ShaderProgram { | ||||
|     public: | ||||
|       shaderparameter_t paramProjection; | ||||
|       shaderparameter_t paramView; | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
| // https://opensource.org/licenses/MIT | ||||
|  | ||||
| #pragma once | ||||
| #include "display/shader/Shader.hpp" | ||||
| #include "display/shader/ShaderManager.hpp" | ||||
| #include "scene/components/display/material/SimpleTexturedMaterial.hpp" | ||||
|  | ||||
| namespace Dawn { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user