Work resumed
This commit is contained in:
@ -12,6 +12,7 @@ target_sources(${DAWN_TARGET_NAME}
|
||||
UIImage.cpp
|
||||
UIEmpty.cpp
|
||||
UIBorder.cpp
|
||||
UIMesh.cpp
|
||||
)
|
||||
|
||||
add_subdirectory(menu)
|
||||
|
@ -41,27 +41,61 @@ void UIComponent::updateAlignment() {
|
||||
parentInnerWidth = dimensional->getContentWidth();
|
||||
parentInnerHeight = dimensional->getContentHeight();
|
||||
|
||||
UIComponent::calculateDimensions(
|
||||
this->alignX,
|
||||
this->alignUnitLeft,
|
||||
this->alignUnitRight,
|
||||
&translate.x,
|
||||
&this->width,
|
||||
parentInnerWidth,
|
||||
this->getContentWidth(),
|
||||
glm::vec2(align[0], align[2])
|
||||
);
|
||||
UIComponent::calculateDimensions(
|
||||
this->alignY,
|
||||
this->alignUnitTop,
|
||||
this->alignUnitBottom,
|
||||
&translate.y,
|
||||
&this->height,
|
||||
parentInnerHeight,
|
||||
this->getContentHeight(),
|
||||
glm::vec2(align[1], align[3])
|
||||
// Should we be doing width first, or height first?
|
||||
bool_t heightFirst = (
|
||||
this->alignUnitLeft == UI_COMPONENT_ALIGN_UNIT_RATIO ||
|
||||
this->alignUnitRight == UI_COMPONENT_ALIGN_UNIT_RATIO
|
||||
);
|
||||
|
||||
if(heightFirst) {
|
||||
UIComponent::calculateDimensions(
|
||||
this->alignY,
|
||||
this->alignUnitTop,
|
||||
this->alignUnitBottom,
|
||||
&translate.y,
|
||||
&this->height,
|
||||
parentInnerHeight,
|
||||
this->getContentHeight(),
|
||||
this->width,
|
||||
glm::vec2(align[1], align[3])
|
||||
);
|
||||
UIComponent::calculateDimensions(
|
||||
this->alignX,
|
||||
this->alignUnitLeft,
|
||||
this->alignUnitRight,
|
||||
&translate.x,
|
||||
&this->width,
|
||||
parentInnerWidth,
|
||||
this->getContentWidth(),
|
||||
this->height,
|
||||
glm::vec2(align[0], align[2])
|
||||
);
|
||||
} else {
|
||||
UIComponent::calculateDimensions(
|
||||
this->alignY,
|
||||
this->alignUnitTop,
|
||||
this->alignUnitBottom,
|
||||
&translate.y,
|
||||
&this->height,
|
||||
parentInnerHeight,
|
||||
this->getContentHeight(),
|
||||
this->width,
|
||||
glm::vec2(align[1], align[3])
|
||||
);
|
||||
UIComponent::calculateDimensions(
|
||||
this->alignX,
|
||||
this->alignUnitLeft,
|
||||
this->alignUnitRight,
|
||||
&translate.x,
|
||||
&this->width,
|
||||
parentInnerWidth,
|
||||
this->getContentWidth(),
|
||||
this->height,
|
||||
glm::vec2(align[0], align[2])
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
translate.x += dimensional->getChildOffsetX();
|
||||
translate.y += dimensional->getChildOffsetY();
|
||||
|
||||
@ -73,10 +107,14 @@ void UIComponent::updateAlignment() {
|
||||
float_t UIComponent::calculateAlignmentValue(
|
||||
float_t alignmentValue,
|
||||
float_t parentSize,
|
||||
float_t ratioSize,
|
||||
enum UIComponentAlignUnit unit
|
||||
) {
|
||||
if(unit == UI_COMPONENT_ALIGN_UNIT_SCALE) return alignmentValue;
|
||||
return (alignmentValue / 100.0f) * parentSize;
|
||||
if(unit == UI_COMPONENT_ALIGN_UNIT_PERCENT) return (alignmentValue / 100.0f) * parentSize;
|
||||
if(unit == UI_COMPONENT_ALIGN_UNIT_RATIO) return (alignmentValue / 100.0f) * ratioSize;
|
||||
assertUnreachable("UIComponent::calculateAlignmentValue: Unknown alignment unit");
|
||||
return -1;
|
||||
}
|
||||
|
||||
void UIComponent::calculateDimensions(
|
||||
@ -87,6 +125,7 @@ void UIComponent::calculateDimensions(
|
||||
float_t *size,
|
||||
float_t outerSize,
|
||||
float_t innerSize,
|
||||
float_t ratioSize,
|
||||
glm::vec2 alignment
|
||||
) {
|
||||
assertNotNull(position, "UIComponent::calculateDimensions: Position cannot be null");
|
||||
@ -99,11 +138,13 @@ void UIComponent::calculateDimensions(
|
||||
*position = UIComponent::calculateAlignmentValue(
|
||||
alignment[0],
|
||||
outerSize,
|
||||
ratioSize,
|
||||
unitStart
|
||||
);
|
||||
*size = outerSize - (*position + UIComponent::calculateAlignmentValue(
|
||||
alignment[1],
|
||||
outerSize,
|
||||
ratioSize,
|
||||
unitEnd
|
||||
));
|
||||
break;
|
||||
@ -115,28 +156,29 @@ void UIComponent::calculateDimensions(
|
||||
*position = UIComponent::calculateAlignmentValue(
|
||||
alignment[0],
|
||||
outerSize,
|
||||
ratioSize,
|
||||
unitStart
|
||||
);
|
||||
*size = UIComponent::calculateAlignmentValue(
|
||||
alignment[1],
|
||||
outerSize,
|
||||
ratioSize,
|
||||
unitEnd
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
case UI_COMPONENT_ALIGN_MIDDLE: {
|
||||
*size = mathMax<float_t>(
|
||||
innerSize,
|
||||
UIComponent::calculateAlignmentValue(
|
||||
alignment[1],
|
||||
outerSize,
|
||||
unitEnd
|
||||
)
|
||||
*size = UIComponent::calculateAlignmentValue(
|
||||
alignment[1],
|
||||
outerSize,
|
||||
ratioSize,
|
||||
unitEnd
|
||||
);
|
||||
*position = (outerSize / 2.0f) - (*size / 2.0f) + UIComponent::calculateAlignmentValue(
|
||||
*position = (outerSize / 2.0f) - ((*size) / 2.0f) + UIComponent::calculateAlignmentValue(
|
||||
alignment[0],
|
||||
outerSize,
|
||||
ratioSize,
|
||||
unitStart
|
||||
);
|
||||
break;
|
||||
@ -146,11 +188,13 @@ void UIComponent::calculateDimensions(
|
||||
*size = UIComponent::calculateAlignmentValue(
|
||||
alignment[0],
|
||||
outerSize,
|
||||
ratioSize,
|
||||
unitStart
|
||||
);
|
||||
*position = outerSize - *size - UIComponent::calculateAlignmentValue(
|
||||
alignment[1],
|
||||
outerSize,
|
||||
ratioSize,
|
||||
unitEnd
|
||||
);
|
||||
break;
|
||||
|
@ -21,7 +21,8 @@ namespace Dawn {
|
||||
|
||||
enum UIComponentAlignUnit {
|
||||
UI_COMPONENT_ALIGN_UNIT_SCALE,
|
||||
UI_COMPONENT_ALIGN_UNIT_PERCENT
|
||||
UI_COMPONENT_ALIGN_UNIT_PERCENT,
|
||||
UI_COMPONENT_ALIGN_UNIT_RATIO
|
||||
};
|
||||
|
||||
class UIComponent : public SceneItemComponent, public UIComponentDimensional {
|
||||
@ -53,12 +54,14 @@ namespace Dawn {
|
||||
*
|
||||
* @param alignmentValue Alignment value.
|
||||
* @param parentSize Parent size.
|
||||
* @param ratioSize The dimension that the ratio is based on.
|
||||
* @param unit Alignment unit.
|
||||
* @return The calculated alignment value.
|
||||
*/
|
||||
static float_t calculateAlignmentValue(
|
||||
float_t alignmentValue,
|
||||
float_t parentSize,
|
||||
float_t ratioSize,
|
||||
enum UIComponentAlignUnit unit
|
||||
);
|
||||
|
||||
@ -72,6 +75,7 @@ namespace Dawn {
|
||||
* @param size Output size floating point.
|
||||
* @param outerSize Outer size (of the parent).
|
||||
* @param innerSize Inner size (of this element's content).
|
||||
* @param ratioSize The size that the opposite dimension is.
|
||||
* @param alignment Alignment settings.
|
||||
*/
|
||||
static void calculateDimensions(
|
||||
@ -82,6 +86,7 @@ namespace Dawn {
|
||||
float_t *size,
|
||||
float_t outerSize,
|
||||
float_t innerSize,
|
||||
float_t ratioSize,
|
||||
glm::vec2 alignment
|
||||
);
|
||||
|
||||
|
@ -10,7 +10,8 @@ using namespace Dawn;
|
||||
|
||||
UIImage::UIImage(SceneItem *item) :
|
||||
texture(nullptr),
|
||||
UIComponentRenderable(item)
|
||||
UIComponentRenderable(item),
|
||||
uvs(glm::vec4(0, 1, 1, 0))
|
||||
{
|
||||
|
||||
}
|
||||
@ -42,7 +43,6 @@ std::vector<struct ShaderPassItem> UIImage::getUIRenderPasses() {
|
||||
item.w = this->transform->getWorldPosition().z;
|
||||
item.renderFlags = RENDER_MANAGER_RENDER_FLAG_BLEND;
|
||||
item.mesh = &mesh;
|
||||
|
||||
return { item };
|
||||
}
|
||||
|
||||
@ -51,13 +51,22 @@ void UIImage::onStart() {
|
||||
|
||||
useEvent([&]{
|
||||
QuadMesh::bufferPositions(&mesh,
|
||||
glm::vec2(0, 0), glm::vec2(width, height), 0
|
||||
glm::vec2(0, 0),
|
||||
glm::vec2(width, height), 0
|
||||
);
|
||||
}, this->eventAlignmentUpdated);
|
||||
|
||||
QuadMesh::initQuadMesh(&mesh,
|
||||
glm::vec2(0, 0), glm::vec2(0, 1),
|
||||
glm::vec2(width, height), glm::vec2(1, 0),
|
||||
useEffect([&]{
|
||||
QuadMesh::bufferCoordinates(&mesh,
|
||||
glm::vec2(this->uvs._realValue[0], this->uvs._realValue[1]),
|
||||
glm::vec2(this->uvs._realValue[2], this->uvs._realValue[3]),
|
||||
0
|
||||
);
|
||||
}, this->uvs);
|
||||
|
||||
QuadMesh::initQuadMesh(&mesh,
|
||||
glm::vec2(0, 0), glm::vec2(this->uvs._realValue[0], this->uvs._realValue[1]),
|
||||
glm::vec2(width, height), glm::vec2(this->uvs._realValue[2], this->uvs._realValue[3]),
|
||||
0.0f
|
||||
);
|
||||
}
|
@ -17,6 +17,8 @@ namespace Dawn {
|
||||
struct Color color = COLOR_WHITE;
|
||||
// @optional
|
||||
StateProperty<Texture*> texture;
|
||||
// @optional
|
||||
StateProperty<glm::vec4> uvs;
|
||||
|
||||
UIImage(SceneItem *item);
|
||||
|
||||
|
56
src/dawn/scene/components/ui/UIMesh.cpp
Normal file
56
src/dawn/scene/components/ui/UIMesh.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#include "UIMesh.hpp"
|
||||
#include "game/DawnGame.hpp"
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UIMesh::UIMesh(SceneItem *i) :
|
||||
texture(nullptr),
|
||||
UIComponentRenderable(i)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
float_t UIMesh::getContentWidth() {
|
||||
if(this->texture != nullptr) return this->texture->getWidth();
|
||||
return this->width;
|
||||
}
|
||||
|
||||
float_t UIMesh::getContentHeight() {
|
||||
if(this->texture != nullptr) return this->texture->getHeight();
|
||||
return this->height;
|
||||
}
|
||||
|
||||
std::vector<struct ShaderPassItem> UIMesh::getUIRenderPasses() {
|
||||
struct ShaderPassItem item;
|
||||
auto shader = getGame()->renderManager.uiShader;
|
||||
item.shader = shader;
|
||||
item.colorValues[shader->paramColor] = this->color;
|
||||
item.parameterBuffers[shader->bufferUiCanvas] = &getCanvas()->shaderBuffer;
|
||||
item.matrixValues[shader->paramModel] = this->transform->getWorldTransform();
|
||||
if(this->texture == nullptr) {
|
||||
item.boolValues[shader->paramHasTexture] = false;
|
||||
} else {
|
||||
item.boolValues[shader->paramHasTexture] = true;
|
||||
item.textureSlots[0] = this->texture;
|
||||
item.textureValues[shader->paramTexture] = 0;
|
||||
}
|
||||
item.w = this->transform->getWorldPosition().z;
|
||||
item.renderFlags = RENDER_MANAGER_RENDER_FLAG_BLEND;
|
||||
item.mesh = &mesh;
|
||||
return { item };
|
||||
}
|
||||
|
||||
void UIMesh::onStart() {
|
||||
useEffect([&]{
|
||||
|
||||
}, this->positions)();
|
||||
|
||||
useEffect([&]{
|
||||
|
||||
}, this->uvs)();
|
||||
}
|
31
src/dawn/scene/components/ui/UIMesh.hpp
Normal file
31
src/dawn/scene/components/ui/UIMesh.hpp
Normal file
@ -0,0 +1,31 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "UIComponentRenderable.hpp"
|
||||
#include "display/mesh/QuadMesh.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
class UIMesh : public UIComponentRenderable {
|
||||
private:
|
||||
Mesh mesh;
|
||||
|
||||
public:
|
||||
// @optional
|
||||
StateProperty<std::vector<glm::vec2>> positions;
|
||||
// @optional
|
||||
StateProperty<std::vector<glm::vec2>> uvs;
|
||||
// @optional
|
||||
struct Color color = COLOR_WHITE;
|
||||
// @optional
|
||||
StateProperty<Texture*> texture;
|
||||
|
||||
UIMesh(SceneItem *item);
|
||||
float_t getContentWidth() override;
|
||||
float_t getContentHeight() override;
|
||||
std::vector<struct ShaderPassItem> getUIRenderPasses() override;
|
||||
void onStart() override;
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user