| 574 | }; |
| 575 | |
| 576 | void DrawWeaponConnectionUI(const SceneGraph* scenegraph, IMUIContext& imui_context, const ItemRef& item_ref, WeapConnectionResult* result) { |
| 577 | result->mo = NULL; |
| 578 | vec3 cam_facing = ActiveCameras::Get()->GetFacing(); |
| 579 | vec3 cam_up = ActiveCameras::Get()->GetUpVector(); |
| 580 | vec3 cam_right = cross(cam_facing, cam_up); |
| 581 | int ui_index = 0; |
| 582 | for (auto movement_object : scenegraph->movement_objects_) { |
| 583 | MovementObject* mo = (MovementObject*)movement_object; |
| 584 | std::list<AttachmentSlot> list; |
| 585 | mo->rigged_object()->AvailableItemSlots(item_ref, &list); |
| 586 | for (auto& slot : list) { |
| 587 | mat4 circle_transform; |
| 588 | circle_transform.SetColumn(0, cam_right * 0.1f); |
| 589 | circle_transform.SetColumn(1, cam_up * 0.1f); |
| 590 | circle_transform.SetColumn(2, cam_facing * 0.1f); |
| 591 | circle_transform.SetTranslationPart(slot.pos); |
| 592 | vec4 color = vec4(0.5f, 0.5f, 0.5f, 0.5f); |
| 593 | vec3 screen_pos_tl = ActiveCameras::Get()->worldToScreen(circle_transform * vec3(-1, -1, 0)); |
| 594 | vec3 screen_pos_br = ActiveCameras::Get()->worldToScreen(circle_transform * vec3(1, 1, 0)); |
| 595 | if (screen_pos_tl[2] < 1.0 && screen_pos_br[2] < 1.0) { |
| 596 | vec2 top_left(screen_pos_tl[0], screen_pos_tl[1]); |
| 597 | vec2 bottom_right(screen_pos_br[0], screen_pos_br[1]); |
| 598 | IMUIContext::UIState ui_state; |
| 599 | if (imui_context.DoButton(ui_index++, top_left, bottom_right, ui_state)) { |
| 600 | result->mo = mo; |
| 601 | result->slot = slot; |
| 602 | } |
| 603 | if (ui_state == IMUIContext::kActive) { |
| 604 | color = vec4(0.0f, 0.0f, 0.0f, 0.5f); |
| 605 | } |
| 606 | if (ui_state == IMUIContext::kHot) { |
| 607 | color = vec4(1.0f, 1.0f, 1.0f, 0.5f); |
| 608 | } |
| 609 | } |
| 610 | DebugDraw::Instance()->AddCircle(circle_transform, color, _delete_on_draw); |
| 611 | } |
| 612 | } |
| 613 | } |
| 614 | |
| 615 | static vec3 TransformVec3(const mat4& transform, const vec3& vector) { |
| 616 | return { |
no test coverage detected