Moved a few things to shader buffers, added some bugs that I have to fix
This commit is contained in:
@ -26,17 +26,11 @@ float_t UIBorder::getContentHeight() {
|
||||
}
|
||||
|
||||
std::vector<struct ShaderPassItem> UIBorder::getRenderPasses() {
|
||||
glm::mat4 view, proj;
|
||||
auto canvas = this->getCanvas();
|
||||
assertNotNull(canvas);
|
||||
canvas->getProjectionAndView(&proj, &view);
|
||||
|
||||
struct ShaderPassItem item;
|
||||
auto shader = getGame()->renderManager.uiShader;
|
||||
item.shader = shader;
|
||||
item.colorValues[shader->paramColor] = COLOR_WHITE;
|
||||
item.matrixValues[shader->paramProjection] = proj;
|
||||
item.matrixValues[shader->paramView] = view;
|
||||
item.parameterBuffers[shader->bufferUiCanvas] = &this->getCanvas()->shaderBuffer;
|
||||
item.matrixValues[shader->paramModel] = this->transform->getWorldTransform();
|
||||
if(this->texture == nullptr) {
|
||||
item.boolValues[shader->paramHasTexture] = false;
|
||||
|
@ -20,6 +20,32 @@ UICanvas::UICanvas(SceneItem *item) :
|
||||
{
|
||||
}
|
||||
|
||||
void UICanvas::rebufferShaderParameters() {
|
||||
struct UICanvasShaderParameterBufferData data;
|
||||
|
||||
switch(this->drawType) {
|
||||
case UI_DRAW_TYPE_WORLD_ABSOLUTE:
|
||||
data.projection = camera->getProjection();
|
||||
data.view = camera->transform->getWorldTransform();
|
||||
break;
|
||||
|
||||
case UI_DRAW_TYPE_WORLD_CAMERA_RELATIVE:
|
||||
data.projection = glm::ortho(
|
||||
0.0f,
|
||||
camera->getRenderTarget()->getWidth(),
|
||||
camera->getRenderTarget()->getHeight(),
|
||||
0.0f
|
||||
);
|
||||
data.view = glm::mat4(1.0f);
|
||||
break;
|
||||
|
||||
default:
|
||||
assertUnreachable();
|
||||
}
|
||||
|
||||
this->shaderBuffer.buffer(&data);
|
||||
}
|
||||
|
||||
float_t UICanvas::getWidth() {
|
||||
return w;
|
||||
}
|
||||
@ -36,41 +62,22 @@ float_t UICanvas::getContentHeight() {
|
||||
return this->getHeight();
|
||||
}
|
||||
|
||||
void UICanvas::getProjectionAndView(glm::mat4 *proj, glm::mat4 *view) {
|
||||
assertNotNull(proj);
|
||||
assertNotNull(view);
|
||||
|
||||
switch(this->drawType) {
|
||||
case UI_DRAW_TYPE_WORLD_ABSOLUTE:
|
||||
*proj = camera->getProjection();
|
||||
*view = camera->transform->getWorldTransform();
|
||||
break;
|
||||
|
||||
case UI_DRAW_TYPE_WORLD_CAMERA_RELATIVE:
|
||||
*proj = glm::ortho(
|
||||
0.0f,
|
||||
camera->getRenderTarget()->getWidth(),
|
||||
camera->getRenderTarget()->getHeight(),
|
||||
0.0f
|
||||
);
|
||||
*view = glm::mat4(1.0f);
|
||||
break;
|
||||
|
||||
default:
|
||||
assertUnreachable();
|
||||
}
|
||||
}
|
||||
|
||||
void UICanvas::onStart() {
|
||||
if(camera == nullptr) camera = getScene()->findComponent<Camera>();
|
||||
|
||||
this->shaderBuffer.init();
|
||||
this->rebufferShaderParameters();
|
||||
|
||||
useEffectWithTeardown([&]{
|
||||
if(camera == nullptr) return evtRenderResize = [&] {};
|
||||
this->w = camera->getRenderTarget()->getWidth();
|
||||
this->h = camera->getRenderTarget()->getHeight();
|
||||
this->rebufferShaderParameters();
|
||||
|
||||
return evtRenderResize = useEvent([&](float_t w, float_t h){
|
||||
this->w = w;
|
||||
this->h = h;
|
||||
this->rebufferShaderParameters();
|
||||
|
||||
auto comps = this->item->findChildren<UIComponent>();
|
||||
auto itComps = comps.begin();
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "scene/SceneItemComponent.hpp"
|
||||
#include "display/RenderTarget.hpp"
|
||||
#include "scene/components/display/Camera.hpp"
|
||||
#include "display/shader/shaders/UIShader.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
class UIComponentDimensional {
|
||||
@ -52,7 +53,15 @@ namespace Dawn {
|
||||
float_t w = 1;
|
||||
float_t h = 1;
|
||||
|
||||
/**
|
||||
* Rebuffers all of the necessary shader buffer data for this canvas to
|
||||
* the GPU.
|
||||
*/
|
||||
void rebufferShaderParameters();
|
||||
|
||||
public:
|
||||
UICanvasShaderParameterBuffer shaderBuffer;
|
||||
|
||||
/**
|
||||
* Creates a UI Canvas Scene Item Element, and attaches it to the provided
|
||||
* scene.
|
||||
@ -73,14 +82,6 @@ namespace Dawn {
|
||||
*/
|
||||
UICanvas(SceneItem *item);
|
||||
|
||||
/**
|
||||
* Return the type of projection and view matrixes are used.
|
||||
*
|
||||
* @param proj Projection matrix output.
|
||||
* @param view View matrix ouput.
|
||||
*/
|
||||
void getProjectionAndView(glm::mat4 *proj, glm::mat4 *view);
|
||||
|
||||
float_t getWidth() override;
|
||||
float_t getHeight() override;
|
||||
float_t getContentWidth() override;
|
||||
|
@ -169,6 +169,7 @@ UICanvas * UIComponent::getCanvas() {
|
||||
if(canvas != nullptr) return canvas;
|
||||
parent = parent->getParent();
|
||||
}
|
||||
assertUnreachable();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -26,17 +26,11 @@ float_t UIImage::getContentHeight() {
|
||||
}
|
||||
|
||||
std::vector<struct ShaderPassItem> UIImage::getRenderPasses() {
|
||||
glm::mat4 view, proj;
|
||||
auto canvas = this->getCanvas();
|
||||
assertNotNull(canvas);
|
||||
canvas->getProjectionAndView(&proj, &view);
|
||||
|
||||
struct ShaderPassItem item;
|
||||
auto shader = getGame()->renderManager.uiShader;
|
||||
item.shader = shader;
|
||||
item.colorValues[shader->paramColor] = this->color;
|
||||
item.matrixValues[shader->paramProjection] = proj;
|
||||
item.matrixValues[shader->paramView] = view;
|
||||
item.parameterBuffers[shader->bufferUiCanvas] = &this->getCanvas()->shaderBuffer;
|
||||
item.matrixValues[shader->paramModel] = this->transform->getWorldTransform();
|
||||
if(this->texture == nullptr) {
|
||||
item.boolValues[shader->paramHasTexture] = false;
|
||||
|
@ -71,17 +71,11 @@ std::vector<struct ShaderPassItem> UILabel::getRenderPasses() {
|
||||
if(!this->hasText()) return {};
|
||||
this->updateMesh();
|
||||
|
||||
glm::mat4 view, proj;
|
||||
auto canvas = this->getCanvas();
|
||||
assertNotNull(canvas);
|
||||
canvas->getProjectionAndView(&proj, &view);
|
||||
|
||||
struct ShaderPassItem item;
|
||||
auto shader = getGame()->renderManager.fontShader;
|
||||
auto shader = getGame()->renderManager.uiShader;
|
||||
item.shader = shader;
|
||||
item.colorValues[shader->paramColor] = textColor;
|
||||
item.matrixValues[shader->paramProjection] = proj;
|
||||
item.matrixValues[shader->paramView] = view;
|
||||
item.parameterBuffers[shader->bufferUiCanvas] = &getCanvas()->shaderBuffer;
|
||||
item.matrixValues[shader->paramModel] = this->transform->getWorldTransform();
|
||||
item.textureSlots[0] = this->font->getTexture();
|
||||
item.textureValues[shader->paramTexture] = 0;
|
||||
|
Reference in New Issue
Block a user