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 {
|
||||
|
@ -7,4 +7,5 @@
|
||||
target_sources(${DAWN_TARGET_NAME}
|
||||
PRIVATE
|
||||
SimpleTexturedMaterial.cpp
|
||||
SimpleBillboardedMaterial.cpp
|
||||
)
|
@ -0,0 +1,27 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#include "display/shader/SimpleBillboardedShader.hpp"
|
||||
#include "SimpleBillboardedMaterial.hpp"
|
||||
#include "game/DawnGame.hpp"
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
SimpleBillboardedMaterial::SimpleBillboardedMaterial(SceneItem *i) :
|
||||
Material(i)
|
||||
{
|
||||
}
|
||||
|
||||
void SimpleBillboardedMaterial::onStart() {
|
||||
this->shaderLock = this->getGame()->renderManager.getShaderManager()->lockShader<SimpleBillboardedShader>();
|
||||
}
|
||||
|
||||
void SimpleBillboardedMaterial::onDispose() {
|
||||
this->getGame()->renderManager.getShaderManager()->releaseShader<SimpleBillboardedShader>(this->shaderLock);
|
||||
}
|
||||
|
||||
Shader * SimpleBillboardedMaterial::getShader() {
|
||||
return this->getGame()->renderManager.getShaderManager()->getShader<SimpleBillboardedShader>(this->shaderLock);
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "scene/components/display/Material.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
class SimpleBillboardedMaterial : public Material {
|
||||
private:
|
||||
shaderlock_t shaderLock = -1;
|
||||
|
||||
public:
|
||||
// @optional
|
||||
Texture *texture = nullptr;
|
||||
// @optional
|
||||
struct Color color = COLOR_WHITE;
|
||||
|
||||
/**
|
||||
* SimpleBillboardMaterial scene item component interface.
|
||||
*
|
||||
* @param i Scene Item this interface belongs to.
|
||||
*/
|
||||
SimpleBillboardedMaterial(SceneItem *i);
|
||||
|
||||
void onStart() override;
|
||||
void onDispose() override;
|
||||
|
||||
Shader * getShader() override;
|
||||
};
|
||||
}
|
@ -13,6 +13,14 @@ SimpleTexturedMaterial::SimpleTexturedMaterial(SceneItem *i) :
|
||||
{
|
||||
}
|
||||
|
||||
void SimpleTexturedMaterial::onStart() {
|
||||
this->shaderLock = this->getGame()->renderManager.getShaderManager()->lockShader<SimpleTexturedShader>();
|
||||
}
|
||||
|
||||
void SimpleTexturedMaterial::onDispose() {
|
||||
this->getGame()->renderManager.getShaderManager()->releaseShader<SimpleTexturedShader>(this->shaderLock);
|
||||
}
|
||||
|
||||
Shader * SimpleTexturedMaterial::getShader() {
|
||||
return &this->getGame()->renderManager.simpleShader;
|
||||
return this->getGame()->renderManager.getShaderManager()->getShader<SimpleTexturedShader>(this->shaderLock);
|
||||
}
|
@ -8,6 +8,9 @@
|
||||
|
||||
namespace Dawn {
|
||||
class SimpleTexturedMaterial : public Material {
|
||||
private:
|
||||
shaderlock_t shaderLock = -1;
|
||||
|
||||
public:
|
||||
// @optional
|
||||
Texture *texture = nullptr;
|
||||
@ -20,6 +23,9 @@ namespace Dawn {
|
||||
* @param i Scene Item this interface belongs to.
|
||||
*/
|
||||
SimpleTexturedMaterial(SceneItem *i);
|
||||
|
||||
void onStart() override;
|
||||
void onDispose() override;
|
||||
|
||||
Shader * getShader() override;
|
||||
};
|
||||
|
Reference in New Issue
Block a user