More trigger stuff
This commit is contained in:
parent
ece5da170b
commit
526a477a59
@ -38,28 +38,32 @@ namespace gui_debug
|
|||||||
{
|
{
|
||||||
bool enabled;
|
bool enabled;
|
||||||
bool camera_locked;
|
bool camera_locked;
|
||||||
float camera[3] = {};
|
|
||||||
float range = 500.f;
|
|
||||||
float color[4] = {1.f, 0.f, 0.f, 1.f};
|
|
||||||
float mesh_thickness = 1.f;
|
|
||||||
float size = 10.f;
|
|
||||||
object_type type;
|
object_type type;
|
||||||
|
float range = 500.f;
|
||||||
|
float camera[3] = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct : draw_settings
|
struct : draw_settings
|
||||||
{
|
{
|
||||||
|
bool draw_node_links;
|
||||||
|
float size = 10.f;
|
||||||
|
float mesh_thickness = 1.f;
|
||||||
float link_thickness = 1.f;
|
float link_thickness = 1.f;
|
||||||
bool draw_linked_nodes;
|
float color[4] = {1.f, 0.f, 0.f, 1.f};
|
||||||
} path_node_settings{};
|
} path_node_settings{};
|
||||||
|
|
||||||
|
struct : draw_settings
|
||||||
|
{
|
||||||
|
int point_count = 30;
|
||||||
|
float color[4] = {0.f, 1.f, 0.f, 0.5f};
|
||||||
|
} trigger_settings{};
|
||||||
|
|
||||||
struct point
|
struct point
|
||||||
{
|
{
|
||||||
ImVec2 point;
|
ImVec2 point;
|
||||||
bool valid;
|
bool valid;
|
||||||
};
|
};
|
||||||
|
|
||||||
draw_settings trigger_settings{};
|
|
||||||
|
|
||||||
float vector_dot(float* a, float* b)
|
float vector_dot(float* a, float* b)
|
||||||
{
|
{
|
||||||
return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]);
|
return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]);
|
||||||
@ -248,82 +252,21 @@ namespace gui_debug
|
|||||||
return pi;
|
return pi;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_circle(float* center, float radius, float* color, float thickness)
|
void draw_cylinder(float* center, float radius, float height, int point_count, float* color)
|
||||||
{
|
{
|
||||||
const auto pi = get_pi();
|
const auto pi = get_pi();
|
||||||
|
|
||||||
ImGuiWindow* window = ImGui::GetCurrentWindow();
|
ImGuiWindow* window = ImGui::GetCurrentWindow();
|
||||||
|
|
||||||
window->DrawList->PathClear();
|
|
||||||
|
|
||||||
for (auto angle = 0.f; angle < 360; angle += 1.f)
|
|
||||||
{
|
|
||||||
const auto x = center[0] + radius * cos(angle * pi / 180.f);
|
|
||||||
const auto y = center[1] + radius * sin(angle * pi / 180.f);
|
|
||||||
|
|
||||||
float point[3] = {x, y, center[2]};
|
|
||||||
float point_screen[2] = {};
|
|
||||||
|
|
||||||
if (!world_pos_to_screen_pos(point, point_screen))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto point_ = ImVec2(point_screen[0], point_screen[1]);
|
|
||||||
window->DrawList->PathLineTo(point_);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto color_ = ImGui::GetColorU32({color[0], color[1], color[2], color[3]});
|
|
||||||
window->DrawList->PathStroke(color_, 0, thickness);
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw_circle_filled(float* center, float radius, float* color)
|
|
||||||
{
|
|
||||||
const auto pi = get_pi();
|
|
||||||
|
|
||||||
ImGuiWindow* window = ImGui::GetCurrentWindow();
|
|
||||||
|
|
||||||
window->DrawList->PathClear();
|
|
||||||
|
|
||||||
for (auto angle = 0; angle < 360; angle += 12)
|
|
||||||
{
|
|
||||||
const auto x = center[0] + radius * cos(static_cast<float>(angle) * pi / 180.f);
|
|
||||||
const auto y = center[1] + radius * sin(static_cast<float>(angle) * pi / 180.f);
|
|
||||||
|
|
||||||
float point[3] = {x, y, center[2]};
|
|
||||||
float point_screen[2] = {};
|
|
||||||
|
|
||||||
if (!world_pos_to_screen_pos(point, point_screen))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto point_ = ImVec2(point_screen[0], point_screen[1]);
|
|
||||||
window->DrawList->PathLineTo(point_);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto color_ = ImGui::GetColorU32({color[0], color[1], color[2], color[3]});
|
|
||||||
window->DrawList->PathFillConvex(color_);
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw_cylinder(float* center, float radius, float height, float* color, float thickness)
|
|
||||||
{
|
|
||||||
const auto pi = get_pi();
|
|
||||||
|
|
||||||
ImGuiWindow* window = ImGui::GetCurrentWindow();
|
|
||||||
|
|
||||||
float top[3] = {center[0], center[1], center[2] + height};
|
|
||||||
|
|
||||||
const auto color_ = ImGui::GetColorU32({color[0], color[1], color[2], color[3]});
|
const auto color_ = ImGui::GetColorU32({color[0], color[1], color[2], color[3]});
|
||||||
|
|
||||||
const auto max_points = 30;
|
point_count = std::max(0, std::min(point_count, 360));
|
||||||
const auto step = 360 / max_points;
|
const auto step = 360.f / point_count;
|
||||||
|
|
||||||
point points_top[max_points];
|
point points_top[360];
|
||||||
point points_bottom[max_points];
|
point points_bottom[360];
|
||||||
|
|
||||||
auto point_index = 0;
|
auto point_index = 0;
|
||||||
for (auto angle = 0; angle < 360; angle += step)
|
for (auto angle = 0.f; angle < 360.f; angle += step)
|
||||||
{
|
{
|
||||||
const auto x = center[0] + radius * cos(static_cast<float>(angle) * pi / 180.f);
|
const auto x = center[0] + radius * cos(static_cast<float>(angle) * pi / 180.f);
|
||||||
const auto y = center[1] + radius * sin(static_cast<float>(angle) * pi / 180.f);
|
const auto y = center[1] + radius * sin(static_cast<float>(angle) * pi / 180.f);
|
||||||
@ -352,7 +295,7 @@ namespace gui_debug
|
|||||||
}
|
}
|
||||||
|
|
||||||
window->DrawList->PathClear();
|
window->DrawList->PathClear();
|
||||||
for (auto i = 0; i < max_points; i++)
|
for (auto i = 0; i < point_count; i++)
|
||||||
{
|
{
|
||||||
if (!points_bottom[i].valid)
|
if (!points_bottom[i].valid)
|
||||||
{
|
{
|
||||||
@ -364,7 +307,7 @@ namespace gui_debug
|
|||||||
window->DrawList->PathFillConvex(color_);
|
window->DrawList->PathFillConvex(color_);
|
||||||
|
|
||||||
window->DrawList->PathClear();
|
window->DrawList->PathClear();
|
||||||
for (auto i = 0; i < max_points; i++)
|
for (auto i = 0; i < point_count; i++)
|
||||||
{
|
{
|
||||||
if (!points_top[i].valid)
|
if (!points_top[i].valid)
|
||||||
{
|
{
|
||||||
@ -375,7 +318,7 @@ namespace gui_debug
|
|||||||
}
|
}
|
||||||
window->DrawList->PathFillConvex(color_);
|
window->DrawList->PathFillConvex(color_);
|
||||||
|
|
||||||
for (auto i = 0; i < max_points; i++)
|
for (auto i = 0; i < point_count; i++)
|
||||||
{
|
{
|
||||||
window->DrawList->PathClear();
|
window->DrawList->PathClear();
|
||||||
|
|
||||||
@ -387,7 +330,7 @@ namespace gui_debug
|
|||||||
|
|
||||||
window->DrawList->PathLineTo(points_bottom[i].point);
|
window->DrawList->PathLineTo(points_bottom[i].point);
|
||||||
|
|
||||||
if (i == max_points - 1)
|
if (i == point_count - 1)
|
||||||
{
|
{
|
||||||
if (!points_bottom[0].valid || !points_top[0].valid)
|
if (!points_bottom[0].valid || !points_top[0].valid)
|
||||||
{
|
{
|
||||||
@ -409,30 +352,10 @@ namespace gui_debug
|
|||||||
}
|
}
|
||||||
|
|
||||||
window->DrawList->PathLineTo(points_top[i].point);
|
window->DrawList->PathLineTo(points_top[i].point);
|
||||||
|
|
||||||
window->DrawList->PathFillConvex(color_);
|
window->DrawList->PathFillConvex(color_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_object(float* origin, object_type type)
|
|
||||||
{
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case object_type::square:
|
|
||||||
draw_square(origin, path_node_settings.size, path_node_settings.color);
|
|
||||||
break;
|
|
||||||
case object_type::circle:
|
|
||||||
break;
|
|
||||||
case object_type::cube:
|
|
||||||
draw_cube(origin, path_node_settings.size, path_node_settings.color);
|
|
||||||
break;
|
|
||||||
case object_type::cube_mesh:
|
|
||||||
draw_cube_mesh(origin, path_node_settings.size, path_node_settings.color,
|
|
||||||
path_node_settings.mesh_thickness);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw_window()
|
void draw_window()
|
||||||
{
|
{
|
||||||
if (!gui::enabled_menus["debug"])
|
if (!gui::enabled_menus["debug"])
|
||||||
@ -447,7 +370,7 @@ namespace gui_debug
|
|||||||
ImGui::Checkbox("Draw", &path_node_settings.enabled);
|
ImGui::Checkbox("Draw", &path_node_settings.enabled);
|
||||||
ImGui::Checkbox("Lock camera", &path_node_settings.camera_locked);
|
ImGui::Checkbox("Lock camera", &path_node_settings.camera_locked);
|
||||||
|
|
||||||
ImGui::Checkbox("Draw linked nodes", &path_node_settings.draw_linked_nodes);
|
ImGui::Checkbox("Draw node links", &path_node_settings.draw_node_links);
|
||||||
|
|
||||||
if (ImGui::TreeNode("Object type"))
|
if (ImGui::TreeNode("Object type"))
|
||||||
{
|
{
|
||||||
@ -461,7 +384,7 @@ namespace gui_debug
|
|||||||
ImGui::SliderFloat("range", &path_node_settings.range, 0.f, 10000.f);
|
ImGui::SliderFloat("range", &path_node_settings.range, 0.f, 10000.f);
|
||||||
ImGui::SliderFloat("size", &path_node_settings.size, 5.f, 100.f);
|
ImGui::SliderFloat("size", &path_node_settings.size, 5.f, 100.f);
|
||||||
|
|
||||||
if (path_node_settings.draw_linked_nodes)
|
if (path_node_settings.draw_node_links)
|
||||||
{
|
{
|
||||||
ImGui::SliderFloat("link thickness", &path_node_settings.link_thickness, 1.f, 20.f);
|
ImGui::SliderFloat("link thickness", &path_node_settings.link_thickness, 1.f, 20.f);
|
||||||
}
|
}
|
||||||
@ -486,7 +409,7 @@ namespace gui_debug
|
|||||||
ImGui::Checkbox("Lock camera", &trigger_settings.camera_locked);
|
ImGui::Checkbox("Lock camera", &trigger_settings.camera_locked);
|
||||||
|
|
||||||
ImGui::SliderFloat("range", &trigger_settings.range, 0.f, 10000.f);
|
ImGui::SliderFloat("range", &trigger_settings.range, 0.f, 10000.f);
|
||||||
ImGui::SliderFloat("mesh thickness", &trigger_settings.mesh_thickness, 1.f, 20.f);
|
ImGui::SliderInt("circle max points", &trigger_settings.point_count, 3, 360);
|
||||||
|
|
||||||
if (ImGui::TreeNode("Color picker"))
|
if (ImGui::TreeNode("Color picker"))
|
||||||
{
|
{
|
||||||
@ -514,7 +437,7 @@ namespace gui_debug
|
|||||||
game::PathNode_WorldifyPosFromParent(node, out);
|
game::PathNode_WorldifyPosFromParent(node, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_linked_nodes(game::pathnode_t* node, float* origin)
|
void draw_node_links(game::pathnode_t* node, float* origin)
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < node->totalLinkCount; i++)
|
for (unsigned int i = 0; i < node->totalLinkCount; i++)
|
||||||
{
|
{
|
||||||
@ -572,10 +495,23 @@ namespace gui_debug
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
draw_object(origin, path_node_settings.type);
|
switch (path_node_settings.type)
|
||||||
if (path_node_settings.draw_linked_nodes)
|
|
||||||
{
|
{
|
||||||
draw_linked_nodes(node, origin);
|
case object_type::square:
|
||||||
|
draw_square(origin, path_node_settings.size, path_node_settings.color);
|
||||||
|
break;
|
||||||
|
case object_type::cube:
|
||||||
|
draw_cube(origin, path_node_settings.size, path_node_settings.color);
|
||||||
|
break;
|
||||||
|
case object_type::cube_mesh:
|
||||||
|
draw_cube_mesh(origin, path_node_settings.size, path_node_settings.color,
|
||||||
|
path_node_settings.mesh_thickness);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path_node_settings.draw_node_links)
|
||||||
|
{
|
||||||
|
draw_node_links(node, origin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -598,12 +534,14 @@ namespace gui_debug
|
|||||||
|
|
||||||
const auto distance = distance_2d(trigger_settings.camera, origin);
|
const auto distance = distance_2d(trigger_settings.camera, origin);
|
||||||
|
|
||||||
if (distance - radius > trigger_settings.range || entity->script_classname != trigger_radius)
|
if (distance - radius * 2 > trigger_settings.range ||
|
||||||
|
entity->script_classname != trigger_radius)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
draw_cylinder(origin, radius, height, trigger_settings.color, trigger_settings.mesh_thickness);
|
draw_cylinder(origin, radius, height, trigger_settings.point_count,
|
||||||
|
trigger_settings.color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user