Things mode gizmos

This commit is contained in:
kp 2024-08-10 02:11:07 -05:00
parent 2f155d3fe9
commit f9e4187a10
2 changed files with 126 additions and 13676 deletions

File diff suppressed because it is too large Load diff

View file

@ -956,11 +956,55 @@ void Editor::UpdateModeThings()
void Editor::RenderModeThings()
{
// Le wireframe
for (kp3d::Thing& thing: sandbox->map.things)
thing.RenderBox(
&thing == m_selected_thing ? kp3d::Vec3{0.33f, 0.33f, 1.0f} :
(&thing == m_hovered_thing ? kp3d::Vec3{1.0f, 1.0f, 1.0f} : kp3d::Vec3{0.5f, 0.5f, 0.5f})
);
// Le gizmo
if (!m_selected_thing)
return;
ImGuizmo::Enable(true);
ImGuizmo::SetRect(0, 0, sandbox->GetWidth(), sandbox->GetHeight());
ImGuizmo::SetDrawlist(ImGui::GetBackgroundDrawList());
enum { M, V, P };
float tmp[16];
m_selected_thing->transform.rotation = {
kp3d::ToDegrees(m_selected_thing->transform.rotation.x),
kp3d::ToDegrees(m_selected_thing->transform.rotation.y),
kp3d::ToDegrees(m_selected_thing->transform.rotation.z)
};
ImGuizmo::RecomposeMatrixFromComponents(&m_selected_thing->transform.translation.x, &m_selected_thing->transform.rotation.x, &m_selected_thing->transform.scale.x, tmp);
kp3d::Mat4 cam_translation_matrix, cam_rotation_matrix;
cam_translation_matrix.InitTranslation(-sandbox->camera.position);
cam_rotation_matrix.InitRotation(sandbox->camera.forward, sandbox->camera.up, sandbox->camera.right);
kp3d::Mat4 cam_matrix = cam_rotation_matrix * cam_translation_matrix;
bool v = ImGuizmo::Manipulate(
cam_matrix.mat.data(),
sandbox->projection.mat.data(),
static_cast<ImGuizmo::OPERATION>(ImGuizmo::UNIVERSAL),
ImGuizmo::LOCAL,
tmp,
nullptr,
nullptr,
nullptr,
nullptr
);
editing_gizmo = ImGuizmo::IsOver();
// if (v)
{
float translation[3], rotation[3], scale[3];
ImGuizmo::DecomposeMatrixToComponents(tmp, translation, rotation, scale);
m_selected_thing->transform.translation = {translation[0], translation[1], translation[2]};
m_selected_thing->transform.rotation = {
kp3d::ToRadians(rotation[0]),
kp3d::ToRadians(rotation[1]),
kp3d::ToRadians(rotation[2])
};
m_selected_thing->transform.scale = {scale[0], scale[1], scale[2]};
}
}
void Editor::RenderUI()
@ -1022,11 +1066,41 @@ void Editor::RenderUI()
{
if (ImGui::Begin("Selection Info", &show_selection_info))
{
if (m_mode != MODE_NORMAL)
if (m_mode == MODE_BUILD)
{
ImGui::Text("No selection");
}
else
else if (m_mode == MODE_THINGS)
{
if (m_selected_thing)
{
ImGui::SeparatorText("Transform");
if (ImGui::CollapsingHeader("Edit Transformation..."))
{
ImGui::Text("Translation:");
ImGui::InputFloat("X##thingt", &m_selected_thing->transform.translation.x);
ImGui::InputFloat("Y##thingt", &m_selected_thing->transform.translation.y);
ImGui::InputFloat("Z##thingt", &m_selected_thing->transform.translation.z);
ImGui::Text("Rotation:");
ImGui::InputFloat("X##thingr", &m_selected_thing->transform.rotation.x);
ImGui::InputFloat("Y##thingr", &m_selected_thing->transform.rotation.y);
ImGui::InputFloat("Z##thingr", &m_selected_thing->transform.rotation.z);
ImGui::Text("Scale:");
ImGui::InputFloat("X##things", &m_selected_thing->transform.scale.x);
ImGui::InputFloat("Y##things", &m_selected_thing->transform.scale.y);
ImGui::InputFloat("Z##things", &m_selected_thing->transform.scale.z);
}
ImGui::SeparatorText("Properties");
ImGui::CheckboxFlags("Visible", (unsigned int*)(&m_selected_thing->flags), kp3d::Thing::FLAG_VISIBLE);
ImGui::CheckboxFlags("Grounded", (unsigned int*)(&m_selected_thing->flags), kp3d::Thing::FLAG_GROUNDED);
ImGui::CheckboxFlags("Collisions", (unsigned int*)(&m_selected_thing->flags), kp3d::Thing::FLAG_COLLISIONS);
}
else
{
ImGui::Text("No selection");
}
}
else if (m_mode == MODE_NORMAL)
{
if (!kp3d::editor_hovered_batch.empty())
{