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:
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user