Switching SceneItems to smarts
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UIBorder::UIBorder(SceneItem *item) :
|
||||
UIBorder::UIBorder(std::weak_ptr<SceneItem> item) :
|
||||
texture(nullptr),
|
||||
borderSize(glm::vec2(8, 8)),
|
||||
UIComponentRenderable(item)
|
||||
@ -37,7 +37,7 @@ std::vector<struct ShaderPassItem> UIBorder::getUIRenderPasses() {
|
||||
item.shader = shader;
|
||||
item.colorValues[shader->paramColor] = COLOR_WHITE;
|
||||
item.parameterBuffers[shader->bufferUiCanvas] = &this->getCanvas()->shaderBuffer;
|
||||
item.matrixValues[shader->paramModel] = this->item->getWorldTransform();
|
||||
item.matrixValues[shader->paramModel] = this->item.lock()->getWorldTransform();
|
||||
if(this->texture == nullptr) {
|
||||
item.boolValues[shader->paramHasTexture] = false;
|
||||
} else {
|
||||
@ -45,7 +45,7 @@ std::vector<struct ShaderPassItem> UIBorder::getUIRenderPasses() {
|
||||
item.textureSlots[0] = this->texture;
|
||||
item.textureValues[shader->paramTexture] = 0;
|
||||
}
|
||||
item.w = this->item->getWorldPosition().z;
|
||||
item.w = this->item.lock()->getWorldPosition().z;
|
||||
item.renderFlags = RENDER_MANAGER_RENDER_FLAG_BLEND;
|
||||
item.mesh = &mesh;
|
||||
|
||||
|
@ -20,7 +20,7 @@ namespace Dawn {
|
||||
// @optional
|
||||
StateProperty<Texture*> texture;
|
||||
|
||||
UIBorder(SceneItem *item);
|
||||
UIBorder(std::weak_ptr<SceneItem> item);
|
||||
|
||||
float_t getContentWidth() override;
|
||||
float_t getContentHeight() override;
|
||||
|
@ -14,7 +14,7 @@ std::shared_ptr<UICanvas> UICanvas::create(Scene *scene) {
|
||||
return item->addComponent<UICanvas>();
|
||||
}
|
||||
|
||||
UICanvas::UICanvas(SceneItem *item) :
|
||||
UICanvas::UICanvas(std::weak_ptr<SceneItem> item) :
|
||||
SceneItemComponent(item),
|
||||
camera(nullptr)
|
||||
{
|
||||
@ -26,7 +26,7 @@ void UICanvas::rebufferShaderParameters() {
|
||||
switch(this->drawType) {
|
||||
case UI_DRAW_TYPE_WORLD_ABSOLUTE:
|
||||
data.projection = camera->getProjection();
|
||||
data.view = camera->item->getWorldTransform();
|
||||
data.view = camera->item.lock()->getWorldTransform();
|
||||
break;
|
||||
|
||||
case UI_DRAW_TYPE_WORLD_CAMERA_RELATIVE:
|
||||
@ -91,7 +91,7 @@ void UICanvas::onStart() {
|
||||
this->h = h / this->getScale();
|
||||
this->rebufferShaderParameters();
|
||||
|
||||
auto comps = this->item->findChildren<UIComponent>();
|
||||
auto comps = this->item.lock()->findChildren<UIComponent>();
|
||||
auto itComps = comps.begin();
|
||||
while(itComps != comps.end()) {
|
||||
(*itComps)->alignmentNeedsUpdating = true;
|
||||
|
@ -94,7 +94,7 @@ namespace Dawn {
|
||||
*
|
||||
* @param item Item that this canvas item belongs to.
|
||||
*/
|
||||
UICanvas(SceneItem *item);
|
||||
UICanvas(std::weak_ptr<SceneItem> item);
|
||||
|
||||
/**
|
||||
* Returns the scale of this canvas.
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UIComponent::UIComponent(SceneItem *item) :
|
||||
UIComponent::UIComponent(std::weak_ptr<SceneItem> item) :
|
||||
SceneItemComponent(item),
|
||||
alignment(glm::vec4(0, 0, 128, 128)),
|
||||
alignUnitLeft(UI_COMPONENT_ALIGN_UNIT_SCALE),
|
||||
@ -22,7 +22,7 @@ UIComponent::UIComponent(SceneItem *item) :
|
||||
}
|
||||
|
||||
std::shared_ptr<UIComponentDimensional> UIComponent::getParentDimensional() {
|
||||
auto parent = item->getParent();
|
||||
auto parent = item.lock()->getParent();
|
||||
if(parent == nullptr) return nullptr;
|
||||
auto dimensional = parent->getComponent<UIComponentDimensional>();
|
||||
assertNotNull(dimensional, "UIComponent::getParentDimensional: Parent must have a UIComponentDimensional");
|
||||
@ -34,7 +34,7 @@ void UIComponent::updateAlignment() {
|
||||
|
||||
auto align = (glm::vec4)this->alignment;
|
||||
auto dimensional = this->getParentDimensional();
|
||||
auto translate = item->getLocalPosition();
|
||||
auto translate = item.lock()->getLocalPosition();
|
||||
|
||||
assertNotNull(dimensional, "UIComponent::updateAlignment: Parent must have a UIComponentDimensional");
|
||||
|
||||
@ -99,7 +99,7 @@ void UIComponent::updateAlignment() {
|
||||
translate.x += dimensional->getChildOffsetX();
|
||||
translate.y += dimensional->getChildOffsetY();
|
||||
|
||||
item->setLocalPosition(translate);
|
||||
item.lock()->setLocalPosition(translate);
|
||||
this->alignmentNeedsUpdating = false;
|
||||
this->eventAlignmentUpdated.invoke();
|
||||
}
|
||||
@ -240,7 +240,7 @@ void UIComponent::calculateDimensions(
|
||||
|
||||
std::shared_ptr<UICanvas> UIComponent::getCanvas() {
|
||||
// TODO: Cache this on first hit.
|
||||
auto parent = item->getParent();
|
||||
auto parent = item.lock()->getParent();
|
||||
while(parent) {
|
||||
auto canvas = parent->getComponent<UICanvas>();
|
||||
if(canvas != nullptr) return canvas;
|
||||
@ -274,7 +274,7 @@ void UIComponent::onStart() {
|
||||
useEffect([&]{
|
||||
this->updateAlignment();
|
||||
|
||||
auto child = this->item->findChildren<UIComponent>();
|
||||
auto child = this->item.lock()->findChildren<UIComponent>();
|
||||
auto itChild = child.begin();
|
||||
while(itChild != child.end()) {
|
||||
(*itChild)->alignmentNeedsUpdating = true;
|
||||
|
@ -123,7 +123,7 @@ namespace Dawn {
|
||||
// @optional
|
||||
StateProperty<glm::vec4> alignment;
|
||||
|
||||
UIComponent(SceneItem *item);
|
||||
UIComponent(std::weak_ptr<SceneItem> item);
|
||||
|
||||
/**
|
||||
* Returns the canvas that this UI element is belonging to.
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UIComponentRenderable::UIComponentRenderable(SceneItem *i) : UIComponent(i) {
|
||||
UIComponentRenderable::UIComponentRenderable(std::weak_ptr<SceneItem> i) : UIComponent(i) {
|
||||
|
||||
}
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
namespace Dawn {
|
||||
class UIComponentRenderable : public UIComponent, public IRenderable {
|
||||
public:
|
||||
UIComponentRenderable(SceneItem *item);
|
||||
UIComponentRenderable(std::weak_ptr<SceneItem> item);
|
||||
|
||||
std::vector<struct ShaderPassItem> getRenderPasses(
|
||||
struct IRenderableContext &context
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UIEmpty::UIEmpty(SceneItem *item) : UIComponent(item) { }
|
||||
UIEmpty::UIEmpty(std::weak_ptr<SceneItem> item) : UIComponent(item) { }
|
||||
|
||||
float_t UIEmpty::getContentWidth() {
|
||||
return this->getWidthFromAlignment();
|
||||
|
@ -9,7 +9,7 @@
|
||||
namespace Dawn {
|
||||
class UIEmpty : public UIComponent {
|
||||
public:
|
||||
UIEmpty(SceneItem *item);
|
||||
UIEmpty(std::weak_ptr<SceneItem> item);
|
||||
float_t getContentWidth() override;
|
||||
float_t getContentHeight() override;
|
||||
float_t getChildOffsetX() override;
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UIImage::UIImage(SceneItem *item) :
|
||||
UIImage::UIImage(std::weak_ptr<SceneItem> item) :
|
||||
texture(nullptr),
|
||||
UIComponentRenderable(item),
|
||||
uvs(glm::vec4(0, 1, 1, 0))
|
||||
@ -32,7 +32,7 @@ std::vector<struct ShaderPassItem> UIImage::getUIRenderPasses() {
|
||||
item.shader = shader;
|
||||
item.colorValues[shader->paramColor] = this->color;
|
||||
item.parameterBuffers[shader->bufferUiCanvas] = &getCanvas()->shaderBuffer;
|
||||
item.matrixValues[shader->paramModel] = this->item->getWorldTransform();
|
||||
item.matrixValues[shader->paramModel] = this->item.lock()->getWorldTransform();
|
||||
if(this->texture == nullptr) {
|
||||
item.boolValues[shader->paramHasTexture] = false;
|
||||
} else {
|
||||
@ -40,7 +40,7 @@ std::vector<struct ShaderPassItem> UIImage::getUIRenderPasses() {
|
||||
item.textureSlots[0] = this->texture;
|
||||
item.textureValues[shader->paramTexture] = 0;
|
||||
}
|
||||
item.w = this->item->getWorldPosition().z;
|
||||
item.w = this->item.lock()->getWorldPosition().z;
|
||||
item.renderFlags = RENDER_MANAGER_RENDER_FLAG_BLEND;
|
||||
item.mesh = &mesh;
|
||||
return { item };
|
||||
|
@ -20,7 +20,7 @@ namespace Dawn {
|
||||
// @optional
|
||||
StateProperty<glm::vec4> uvs;
|
||||
|
||||
UIImage(SceneItem *item);
|
||||
UIImage(std::weak_ptr<SceneItem> item);
|
||||
|
||||
float_t getContentWidth() override;
|
||||
float_t getContentHeight() override;
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UIMesh::UIMesh(SceneItem *i) :
|
||||
UIMesh::UIMesh(std::weak_ptr<SceneItem> i) :
|
||||
texture(nullptr),
|
||||
UIComponentRenderable(i)
|
||||
{
|
||||
@ -31,7 +31,7 @@ std::vector<struct ShaderPassItem> UIMesh::getUIRenderPasses() {
|
||||
shaderItem.shader = shader;
|
||||
shaderItem.colorValues[shader->paramColor] = this->color;
|
||||
shaderItem.parameterBuffers[shader->bufferUiCanvas] = &getCanvas()->shaderBuffer;
|
||||
shaderItem.matrixValues[shader->paramModel] = item->getWorldTransform();
|
||||
shaderItem.matrixValues[shader->paramModel] = item.lock()->getWorldTransform();
|
||||
if(this->texture == nullptr) {
|
||||
shaderItem.boolValues[shader->paramHasTexture] = false;
|
||||
} else {
|
||||
@ -39,7 +39,7 @@ std::vector<struct ShaderPassItem> UIMesh::getUIRenderPasses() {
|
||||
shaderItem.textureSlots[0] = this->texture;
|
||||
shaderItem.textureValues[shader->paramTexture] = 0;
|
||||
}
|
||||
shaderItem.w = item->getWorldPosition().z;
|
||||
shaderItem.w = item.lock()->getWorldPosition().z;
|
||||
shaderItem.renderFlags = RENDER_MANAGER_RENDER_FLAG_BLEND;
|
||||
shaderItem.mesh = &mesh;
|
||||
return { shaderItem };
|
||||
|
@ -22,7 +22,7 @@ namespace Dawn {
|
||||
// @optional
|
||||
StateProperty<Texture*> texture;
|
||||
|
||||
UIMesh(SceneItem *item);
|
||||
UIMesh(std::weak_ptr<SceneItem> item);
|
||||
float_t getContentWidth() override;
|
||||
float_t getContentHeight() override;
|
||||
std::vector<struct ShaderPassItem> getUIRenderPasses() override;
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UIMenuController::UIMenuController(SceneItem *item) :
|
||||
UIMenuController::UIMenuController(std::weak_ptr<SceneItem> item) :
|
||||
SceneItemComponent(item),
|
||||
active(true),
|
||||
menuX(0),
|
||||
|
@ -22,7 +22,7 @@ namespace Dawn {
|
||||
StateEvent<int32_t, int32_t> eventItemSelected;
|
||||
StateEvent<> eventMenuCancel;
|
||||
|
||||
UIMenuController(SceneItem *item);
|
||||
UIMenuController(std::weak_ptr<SceneItem> item);
|
||||
void onStart() override;
|
||||
};
|
||||
}
|
@ -8,7 +8,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UISimpleMenu::UISimpleMenu(SceneItem *item) :
|
||||
UISimpleMenu::UISimpleMenu(std::weak_ptr<SceneItem> item) :
|
||||
SceneItemComponent(item)
|
||||
{
|
||||
|
||||
@ -16,8 +16,8 @@ UISimpleMenu::UISimpleMenu(SceneItem *item) :
|
||||
|
||||
std::vector<std::shared_ptr<SceneItemComponent>> UISimpleMenu::getDependencies() {
|
||||
return {
|
||||
(this->menu = this->item->getComponent<UIMenuController>()),
|
||||
(this->canvas == nullptr ? (this->canvas = this->item->getComponent<UICanvas>()) : nullptr)
|
||||
(this->menu = this->item.lock()->getComponent<UIMenuController>()),
|
||||
(this->canvas == nullptr ? (this->canvas = this->item.lock()->getComponent<UICanvas>()) : nullptr)
|
||||
};
|
||||
}
|
||||
|
||||
@ -26,7 +26,7 @@ void UISimpleMenu::onStart() {
|
||||
|
||||
assertNotNull(this->menu, "UISimpleMenu::onStart: Menu cannot be null");
|
||||
assertNotNull(this->canvas, "UISimpleMenu::onStart: Canvas cannot be null");
|
||||
menuItems = this->item->findChildren<UISimpleMenuItem>();
|
||||
menuItems = this->item.lock()->findChildren<UISimpleMenuItem>();
|
||||
|
||||
auto updateSimpleMenuPos = [&](int32_t x, int32_t y) {
|
||||
if(currentlySelected != nullptr) {
|
||||
@ -75,7 +75,7 @@ void UISimpleMenu::onStart() {
|
||||
case UI_DRAW_TYPE_WORLD_ABSOLUTE:
|
||||
mouse *= 2.0f;
|
||||
mouse -= glm::vec2(1, 1);
|
||||
ray.origin = canvas->camera->item->getWorldPosition();
|
||||
ray.origin = canvas->camera->item.lock()->getWorldPosition();
|
||||
ray.direction = canvas->camera->getRayDirectionFromScreenSpace(mouse);
|
||||
break;
|
||||
|
||||
@ -107,7 +107,7 @@ void UISimpleMenu::onStart() {
|
||||
if(!raytestQuad(
|
||||
ray,
|
||||
glm::vec2(0, 0), size,
|
||||
highlight->item->getWorldTransform(),
|
||||
highlight->item.lock()->getWorldTransform(),
|
||||
&point,
|
||||
&normal,
|
||||
&distance
|
||||
|
@ -16,7 +16,7 @@ namespace Dawn {
|
||||
std::vector<std::shared_ptr<UISimpleMenuItem>> menuItems;
|
||||
|
||||
public:
|
||||
UISimpleMenu(SceneItem *item);
|
||||
UISimpleMenu(std::weak_ptr<SceneItem> item);
|
||||
std::vector<std::shared_ptr<SceneItemComponent>> getDependencies() override;
|
||||
void onStart() override;
|
||||
};
|
||||
|
@ -7,11 +7,11 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UISimpleMenuItem::UISimpleMenuItem(SceneItem *item) : SceneItemComponent(item) {
|
||||
UISimpleMenuItem::UISimpleMenuItem(std::weak_ptr<SceneItem> item) : SceneItemComponent(item) {
|
||||
|
||||
}
|
||||
|
||||
std::shared_ptr<UIComponent> UISimpleMenuItem::getComponentForHighlighting() {
|
||||
if(uiComponent == nullptr) uiComponent = item->getComponent<UIComponent>();
|
||||
if(uiComponent == nullptr) uiComponent = item.lock()->getComponent<UIComponent>();
|
||||
return uiComponent;
|
||||
}
|
@ -17,7 +17,7 @@ namespace Dawn {
|
||||
int32_t menuY = 0;
|
||||
std::shared_ptr<UIComponent> uiComponent = nullptr;
|
||||
|
||||
UISimpleMenuItem(SceneItem *item);
|
||||
UISimpleMenuItem(std::weak_ptr<SceneItem> item);
|
||||
|
||||
/**
|
||||
* Returns the UI component that this simple UI menu item uses to figure
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UILabel::UILabel(SceneItem *item) :
|
||||
UILabel::UILabel(std::weak_ptr<SceneItem> item) :
|
||||
UIComponentRenderable(item),
|
||||
lineHeight(1.0f),
|
||||
textAlign(UI_LABEL_TEXT_ALIGN_LEFT)
|
||||
@ -90,7 +90,7 @@ std::vector<struct ShaderPassItem> UILabel::getUIRenderPasses() {
|
||||
auto shader = getGame()->renderManager->fontShader;
|
||||
|
||||
// Translate
|
||||
glm::mat4 model = item->getWorldTransform();
|
||||
glm::mat4 model = item.lock()->getWorldTransform();
|
||||
model = glm::translate(model, glm::vec3(this->textOffset, 0.0f));
|
||||
|
||||
struct ShaderPassItem item;
|
||||
|
@ -79,7 +79,7 @@ namespace Dawn {
|
||||
// @optional
|
||||
StateProperty<enum UILabelTextAlign> textAlign;
|
||||
|
||||
UILabel(SceneItem *item);
|
||||
UILabel(std::weak_ptr<SceneItem> item);
|
||||
|
||||
void onStart() override;
|
||||
std::vector<struct ShaderPassItem> getUIRenderPasses() override;
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UIRichTextLabel::UIRichTextLabel(SceneItem *item) :
|
||||
UIRichTextLabel::UIRichTextLabel(std::weak_ptr<SceneItem> item) :
|
||||
UILabel(item)
|
||||
{
|
||||
|
||||
|
@ -12,7 +12,7 @@ namespace Dawn {
|
||||
// @innerXml
|
||||
StateProperty<std::string> richText;
|
||||
|
||||
UIRichTextLabel(SceneItem *item);
|
||||
UIRichTextLabel(std::weak_ptr<SceneItem> item);
|
||||
|
||||
void onStart() override;
|
||||
};
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UISimpleLabel::UISimpleLabel(SceneItem *i) :
|
||||
UISimpleLabel::UISimpleLabel(std::weak_ptr<SceneItem> i) :
|
||||
UILabel(i),
|
||||
text("Hello World"),
|
||||
font(nullptr),
|
||||
|
@ -22,7 +22,7 @@ namespace Dawn {
|
||||
// @optional
|
||||
StateProperty<struct Color> color;
|
||||
|
||||
UISimpleLabel(SceneItem *item);
|
||||
UISimpleLabel(std::weak_ptr<SceneItem> item);
|
||||
|
||||
void onStart() override;
|
||||
};
|
||||
|
Reference in New Issue
Block a user