Added IRenderable, removed shader programs and allow more nuanced control of render passes, UI items are now rendered same as other scene item components.

This commit is contained in:
2023-05-29 15:52:08 -07:00
parent 117262267c
commit 96dd33c6b8
30 changed files with 419 additions and 600 deletions

View File

@ -25,12 +25,15 @@ float_t UIBorder::getContentHeight() {
return this->height;
}
std::vector<struct ShaderPassItem> UIBorder::getPassItems(
glm::mat4 proj, glm::mat4 view
) {
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->program;
item.shaderProgram = shader;
auto shader = getGame()->renderManager.uiShader;
item.shader = shader;
item.colorValues[shader->paramColor] = COLOR_WHITE;
item.matrixValues[shader->paramProjection] = proj;
item.matrixValues[shader->paramView] = view;

View File

@ -24,9 +24,7 @@ namespace Dawn {
float_t getContentWidth() override;
float_t getContentHeight() override;
std::vector<struct ShaderPassItem> getPassItems(
glm::mat4 proj, glm::mat4 view
) override;
std::vector<struct ShaderPassItem> getRenderPasses() override;
void onStart() override;
};
}

View File

@ -161,6 +161,17 @@ void UIComponent::calculateDimensions(
}
}
UICanvas * UIComponent::getCanvas() {
// TODO: Cache this on first hit.
auto parent = this->transform->getParent();
while(parent != nullptr) {
auto canvas = parent->item->getComponent<UICanvas>();
if(canvas != nullptr) return canvas;
parent = parent->getParent();
}
return nullptr;
}
float_t UIComponent::getWidth() {
return this->width;
}

View File

@ -5,6 +5,7 @@
#pragma once
#include "scene/SceneItemComponent.hpp"
#include "scene/components/display/IRenderable.hpp"
#include "UICanvas.hpp"
#include "util/mathutils.hpp"
@ -21,7 +22,7 @@ namespace Dawn {
UI_COMPONENT_ALIGN_UNIT_PERCENT
};
class UIComponentRenderable {
class UIComponentRenderable : public IRenderable {
public:
/**
* Implemented UI Components that have rendering should implement this and
@ -32,10 +33,7 @@ namespace Dawn {
* @param view Camera view, obtained from the canvas.
* @return A list of renderable shader pass items for this renderable.
*/
virtual std::vector<struct ShaderPassItem> getPassItems(
glm::mat4 projection,
glm::mat4 view
) = 0;
virtual std::vector<struct ShaderPassItem> getRenderPasses() = 0;
};
class UIComponent : public SceneItemComponent, public UIComponentDimensional {
@ -114,6 +112,13 @@ namespace Dawn {
UIComponent(SceneItem *item);
/**
* Returns the canvas that this UI element is belonging to.
*
* @return Pointer to the UI Canvas this component is a child of.
*/
UICanvas * getCanvas();
float_t getWidth() override;
float_t getHeight() override;
void onStart() override;

View File

@ -25,12 +25,15 @@ float_t UIImage::getContentHeight() {
return this->height;
}
std::vector<struct ShaderPassItem> UIImage::getPassItems(
glm::mat4 proj, glm::mat4 view
) {
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->program;
item.shaderProgram = shader;
auto shader = getGame()->renderManager.uiShader;
item.shader = shader;
item.colorValues[shader->paramColor] = this->color;
item.matrixValues[shader->paramProjection] = proj;
item.matrixValues[shader->paramView] = view;

View File

@ -22,9 +22,7 @@ namespace Dawn {
float_t getContentWidth() override;
float_t getContentHeight() override;
std::vector<struct ShaderPassItem> getPassItems(
glm::mat4 proj, glm::mat4 view
) override;
std::vector<struct ShaderPassItem> getRenderPasses() override;
void onStart() override;
};
}

View File

@ -67,15 +67,18 @@ void UILabel::updateMesh() {
this->eventFontRebuffered.invoke();
}
std::vector<struct ShaderPassItem> UILabel::getPassItems(
glm::mat4 proj, glm::mat4 view
) {
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->program;
item.shaderProgram = shader;
auto shader = getGame()->renderManager.fontShader;
item.shader = shader;
item.colorValues[shader->paramColor] = textColor;
item.matrixValues[shader->paramProjection] = proj;
item.matrixValues[shader->paramView] = view;

View File

@ -53,9 +53,7 @@ namespace Dawn {
float_t getContentWidth() override;
float_t getContentHeight() override;
std::vector<struct ShaderPassItem> getPassItems(
glm::mat4 projection, glm::mat4 view
) override;
std::vector<struct ShaderPassItem> getRenderPasses() override;
void onStart() override;
};
}