Added camera relative UI support.

This commit is contained in:
2023-03-08 17:37:08 -08:00
parent 186ac8bc3f
commit 326e42bef3
9 changed files with 76 additions and 39 deletions

View File

@ -54,6 +54,7 @@ void UIMenuController::onStart() {
menuY = mathClamp<int32_t>(menuY-1, 0, rows);
break;
case INPUT_BIND_ACCEPT:
case INPUT_BIND_MOUSE_CLICK:
eventItemSelected.invoke(menuX, menuY);
break;
case INPUT_BIND_CANCEL:

View File

@ -22,10 +22,7 @@ namespace Dawn {
StateEvent<int32_t, int32_t> eventItemSelected;
StateEvent<> eventMenuCancel;
void moveRelative(int32_t x, int32_t y);
UIMenuController(SceneItem *item);
void onStart();
void onStart() override;
};
}

View File

@ -62,19 +62,32 @@ void UISimpleMenu::onStart() {
assertNotNull(canvas->camera);
if(!this->menu->active) return;
// Mouse in screen space.
auto mouse = getGame()->inputManager.getAxis2D(INPUT_BIND_MOUSE_X, INPUT_BIND_MOUSE_Y);
mouse *= 2.0f;
mouse -= glm::vec2(1, 1);
struct Ray3D ray;
ray.origin = canvas->camera->transform->getWorldPosition();
ray.direction = canvas->camera->getRayDirectionFromScreenSpace(mouse);
switch(canvas->drawType) {
case UI_DRAW_TYPE_WORLD_CAMERA_RELATIVE:
break;
case UI_DRAW_TYPE_WORLD_ABSOLUTE:
case UI_DRAW_TYPE_WORLD_ABSOLUTE: {
// Calculate ray
struct Ray3D ray;
switch(canvas->drawType) {
case UI_DRAW_TYPE_WORLD_ABSOLUTE:
mouse *= 2.0f;
mouse -= glm::vec2(1, 1);
ray.origin = canvas->camera->transform->getWorldPosition();
ray.direction = canvas->camera->getRayDirectionFromScreenSpace(mouse);
break;
case UI_DRAW_TYPE_WORLD_CAMERA_RELATIVE:
RenderTarget *rt = canvas->camera->getRenderTarget();
mouse *= glm::vec2(rt->getWidth(), rt->getHeight());
ray.origin = glm::vec3(mouse, 5);
ray.direction = glm::vec3(0, 0, -10);
break;
}
// Find mouse item
auto itItems = menuItems.begin();
while(itItems != menuItems.end()) {
auto item = *itItems;
@ -90,7 +103,7 @@ void UISimpleMenu::onStart() {
glm::vec3 normal;
float_t distance;
// TODO: Include Z axis.
// TODO: Include Z axis for determining which item is hovered.
if(!raytestQuad(
ray,
glm::vec2(0, 0), size,
@ -105,6 +118,11 @@ void UISimpleMenu::onStart() {
break;
}
break;
}
default: {
assertUnreachable();
}
}
}, getScene()->eventSceneUnpausedUpdate);
}

View File

@ -17,7 +17,6 @@ namespace Dawn {
public:
UISimpleMenu(SceneItem *item);
std::vector<SceneItemComponent*> getDependencies() override;
void onStart() override;
};

View File

@ -12,14 +12,19 @@ namespace Dawn {
StateEvent<> eventHoveredOn;
StateEvent<> eventHoveredOff;
StateEvent<> eventSelected;
// May make these into either state events or make a new event.
int32_t menuX;
int32_t menuY;
int32_t menuX = 0;
int32_t menuY = 0;
UIComponent *uiComponent = nullptr;
UISimpleMenuItem(SceneItem *item);
/**
* Returns the UI component that this simple UI menu item uses to figure
* out if it is being hovered over currently or not.
*
* @return UI Component to use for highlighting / hovering.
*/
virtual UIComponent * getComponentForHighlighting();
};
}