Index: source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Object/Object.cpp =================================================================== --- source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Object/Object.cpp +++ source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Object/Object.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2021 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -49,6 +49,7 @@ ID_ViewerBoundingBox, ID_ViewerAxesMarker, ID_ViewerPropPoints, + ID_ViewerToggle3d, ID_ViewerPlay, ID_ViewerPause, ID_ViewerSlow @@ -87,6 +88,7 @@ bool m_ViewerPolyCount; bool m_ViewerBoundingBox; bool m_ViewerAxesMarker; + bool m_ViewerToggle3d; // true for 3d, false for 2d int m_ViewerPropPointsMode; // 0 disabled, 1 for point markers, 2 for point markers + axes wxPanel* m_ViewerPanel; @@ -99,6 +101,7 @@ struct ObjectSidebarImpl { ObjectSidebarImpl(ScenarioEditor& scenarioEditor) : + m_ScenarioEditor(scenarioEditor), m_ObjectListBox(NULL), m_ActorViewerActive(false), m_ActorViewerEntity(L"actor|structures/fndn_1x1.xml"), m_ActorViewerAnimation("idle"), m_ActorViewerSpeed(0.f), @@ -106,6 +109,7 @@ { } + ScenarioEditor& m_ScenarioEditor; wxListBox* m_ObjectListBox; std::vector m_Objects; ObservableScopedConnection m_ToolConn; @@ -525,6 +529,7 @@ m_ViewerPolyCount = false; m_ViewerBoundingBox = false; m_ViewerAxesMarker = false; + m_ViewerToggle3d = true; m_ViewerPropPointsMode = 0; wxSizer* mainSizer = new wxBoxSizer(wxHORIZONTAL); @@ -553,6 +558,7 @@ viewerButtonsRight->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerBoundingBox, _("Bounding Boxes")), _("Toggle bounding boxes")), wxSizerFlags().Expand()); viewerButtonsRight->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerAxesMarker, _("Axes Marker")), _("Toggle the axes marker (R=X, G=Y, B=Z)")), wxSizerFlags().Expand()); viewerButtonsRight->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerPropPoints, _("Prop Points")), _("Toggle prop points (works best in wireframe mode)")), wxSizerFlags().Expand()); + viewerButtonsRight->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerToggle3d, _("Toggle 3d")), _("Toggle between 2d and 3d projection in the viewer")), wxSizerFlags().Expand()); viewerButtonsSizer->Add(viewerButtonsLeft, wxSizerFlags().Expand()); viewerButtonsSizer->Add(viewerButtonsRight, wxSizerFlags().Expand()); @@ -701,6 +707,7 @@ POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"water", m_ViewerWater)); POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"stats", m_ViewerPolyCount)); POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"bounding_box", m_ViewerBoundingBox)); + POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"toggle_3d", m_ViewerToggle3d)); POST_MESSAGE(SetViewParamI, (AtlasMessage::eRenderView::ACTOR, L"prop_points", m_ViewerPropPointsMode)); } @@ -749,6 +756,15 @@ m_ViewerPropPointsMode = (m_ViewerPropPointsMode+1) % 3; POST_MESSAGE(SetViewParamI, (AtlasMessage::eRenderView::ACTOR, L"prop_points", m_ViewerPropPointsMode)); break; + case ID_ViewerToggle3d: + m_ViewerToggle3d = ! m_ViewerToggle3d; + if (m_ViewerToggle3d == true) { + p->m_ScenarioEditor.GetToolManager().GetCurrentTool()->OnCommand(_T("Set 3d"), NULL); + } else { + p->m_ScenarioEditor.GetToolManager().GetCurrentTool()->OnCommand(_T("Set 2d"), NULL); + } + POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"toggle_3d", m_ViewerToggle3d)); //BB was here. + break; } } @@ -783,4 +799,5 @@ EVT_BUTTON(ID_ViewerBoundingBox, ObjectBottomBar::OnViewerSetting) EVT_BUTTON(ID_ViewerAxesMarker, ObjectBottomBar::OnViewerSetting) EVT_BUTTON(ID_ViewerPropPoints, ObjectBottomBar::OnViewerSetting) + EVT_BUTTON(ID_ViewerToggle3d, ObjectBottomBar::OnViewerSetting) END_EVENT_TABLE(); Index: source/tools/atlas/AtlasUI/ScenarioEditor/Tools/ActorViewerTool.cpp =================================================================== --- source/tools/atlas/AtlasUI/ScenarioEditor/Tools/ActorViewerTool.cpp +++ source/tools/atlas/AtlasUI/ScenarioEditor/Tools/ActorViewerTool.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2011 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -38,6 +38,7 @@ float m_Distance; float m_Angle; float m_Elevation; + bool m_Toggle3d; // true for 3d // Mouse input state int m_LastX, m_LastY; @@ -45,7 +46,10 @@ public: ActorViewerTool() : - m_Distance(20.f), m_Angle(0.f), m_Elevation((float)M_PI / 6.f), + m_Distance(20.f), + m_Angle(0.f), + m_Elevation((float)M_PI / 6.f), + m_Toggle3d(true), m_LastIsValid(false) { } @@ -53,12 +57,27 @@ void PostLookAt() { float offset = 0.3f; // slight fudge so we turn nicely when going over the top of the unit - POST_MESSAGE(LookAt, (AtlasMessage::eRenderView::ACTOR, - Position( - m_Distance*cos(m_Elevation)*sin(m_Angle) + offset*cos(m_Angle), - m_Distance*sin(m_Elevation), - m_Distance*cos(m_Elevation)*cos(m_Angle) - offset*sin(m_Angle)), - Position(0, 0, 0))); + + + + if (m_Toggle3d == true) { + + POST_MESSAGE(LookAt, (AtlasMessage::eRenderView::ACTOR, + Position( + m_Distance*cos(m_Elevation)*sin(m_Angle) + offset*cos(m_Angle), + m_Distance*sin(m_Elevation), + m_Distance*cos(m_Elevation)*cos(m_Angle) - offset*sin(m_Angle)), + Position(0, 0, 0))); + } else { + + POST_MESSAGE(LookAt, (AtlasMessage::eRenderView::ACTOR, + Position( + 20*cos(m_Elevation)*sin(m_Angle) + offset*cos(m_Angle), + 20*sin(m_Elevation), + 20*cos(m_Elevation)*cos(m_Angle) - offset*sin(m_Angle)), + Position(0, 0, 0))); + + } } virtual void Init(void* initData, ScenarioEditor* scenarioEditor) @@ -68,6 +87,17 @@ SetState(&Viewing); } + virtual void OnCommand(const wxString& command, void* WXUNUSED(userdata)) + { + if (command == _T("Set 2d")) { + m_Toggle3d = false; + PostLookAt(); + } else if (command == _T("Set 3d")) { + m_Toggle3d = true; + PostLookAt(); + } + } + void OnEnable() { GetScenarioEditor().GetObjectSettings().SetView(AtlasMessage::eRenderView::ACTOR); @@ -102,7 +132,8 @@ float speed = -1.f * ScenarioEditor::GetSpeedModifier(); obj->m_Distance += evt.GetWheelRotation() * speed / evt.GetWheelDelta(); - + POST_MESSAGE(SetViewParamF, + (AtlasMessage::eRenderView::ACTOR, L"Set 2d scale", obj->m_Distance / 3.0)); camera_changed = true; } @@ -123,11 +154,17 @@ obj->m_Angle += dx * M_PI/256.f * ScenarioEditor::GetSpeedModifier(); - if (evt.ButtonIsDown(wxMOUSE_BTN_LEFT)) + if (evt.ButtonIsDown(wxMOUSE_BTN_LEFT)) { obj->m_Distance += dy / 8.f * ScenarioEditor::GetSpeedModifier(); - else // evt.ButtonIsDown(wxMOUSE_BTN_RIGHT)) - obj->m_Elevation += dy * M_PI/256.f * ScenarioEditor::GetSpeedModifier(); + POST_MESSAGE(SetViewParamF, + (AtlasMessage::eRenderView::ACTOR, L"Set 2d scale", obj->m_Distance / 3.0)); + + camera_changed = true; + + } else {// evt.ButtonIsDown(wxMOUSE_BTN_RIGHT)) + obj->m_Elevation += dy * M_PI / 256.f * ScenarioEditor::GetSpeedModifier(); + } camera_changed = true; } else if ((evt.ButtonUp(wxMOUSE_BTN_LEFT) || evt.ButtonUp(wxMOUSE_BTN_RIGHT)) Index: source/tools/atlas/GameInterface/Handlers/GraphicsSetupHandlers.cpp =================================================================== --- source/tools/atlas/GameInterface/Handlers/GraphicsSetupHandlers.cpp +++ source/tools/atlas/GameInterface/Handlers/GraphicsSetupHandlers.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -178,6 +178,13 @@ view->SetParam(*msg->name, msg->value); } +MESSAGEHANDLER(SetViewParamF) +{ + AtlasView* view = AtlasView::GetView(msg->view); + view->SetParam(*msg->name, msg->value); +} + + MESSAGEHANDLER(SetViewParamC) { AtlasView* view = AtlasView::GetView(msg->view); Index: source/tools/atlas/GameInterface/Messages.h =================================================================== --- source/tools/atlas/GameInterface/Messages.h +++ source/tools/atlas/GameInterface/Messages.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -71,6 +71,11 @@ ((std::wstring, name)) ((int, value)) ); +MESSAGE(SetViewParamF, + ((int, view)) // eRenderView + ((std::wstring, name)) + ((float, value)) +); MESSAGE(SetViewParamC, ((int, view)) // eRenderView ((std::wstring, name)) Index: source/tools/atlas/GameInterface/View.h =================================================================== --- source/tools/atlas/GameInterface/View.h +++ source/tools/atlas/GameInterface/View.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2021 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -142,6 +142,7 @@ virtual void SetParam(const std::wstring& name, bool value); virtual void SetParam(const std::wstring& name, int value); + virtual void SetParam(const std::wstring& name, float value); virtual void SetParam(const std::wstring& name, const AtlasMessage::Color& value); void SetSpeedMultiplier(float speedMultiplier); @@ -151,6 +152,8 @@ float m_SpeedMultiplier; CCamera m_Camera; ActorViewer* m_ActorViewer; + bool m_Toggle_3d; //True for 3d + float m_2d_Scale; }; #endif // INCLUDED_VIEW Index: source/tools/atlas/GameInterface/View.cpp =================================================================== --- source/tools/atlas/GameInterface/View.cpp +++ source/tools/atlas/GameInterface/View.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -72,7 +72,7 @@ ////////////////////////////////////////////////////////////////////////// AtlasViewActor::AtlasViewActor() -: m_SpeedMultiplier(1.f), m_ActorViewer(new ActorViewer()) +: m_SpeedMultiplier(1.f), m_ActorViewer(new ActorViewer()), m_2d_Scale(20.0/3.0), m_Toggle_3d(true) { } @@ -91,7 +91,7 @@ SViewPort vp = { 0, 0, g_xres, g_yres }; CCamera& camera = GetCamera(); camera.SetViewPort(vp); - camera.SetPerspectiveProjection(2.f, 512.f, DEGTORAD(20.f)); + //camera.SetPerspectiveProjection(2.f, 512.f, DEGTORAD(20.f)); camera.UpdateFrustum(); m_ActorViewer->Render(); @@ -157,6 +157,19 @@ m_ActorViewer->SetBoundingBoxesEnabled(value); else if (name == L"axes_marker") m_ActorViewer->SetAxesMarkerEnabled(value); + else if (name == L"toggle_3d") { + CCamera& camera = AtlasView::GetView_Actor()->GetCamera(); + if (value == true) { + m_Toggle_3d = true; + camera.SetPerspectiveProjection(2.f, 512.f, DEGTORAD(20.f)); //BB was here - return to 512.f + camera.UpdateFrustum(); + } else { + m_Toggle_3d = false; + camera.SetOrthoProjection(-2.f, -512.f, m_2d_Scale); + camera.UpdateFrustum(); + } + + } } void AtlasViewActor::SetParam(const std::wstring& name, int value) @@ -164,7 +177,18 @@ if (name == L"prop_points") m_ActorViewer->SetPropPointsMode(value); } - +void AtlasViewActor::SetParam(const std::wstring& name, float value) +{ + if (name == L"Set 2d scale") { + m_2d_Scale = value; + if (m_Toggle_3d == false) { + CCamera &camera = AtlasView::GetView_Actor()->GetCamera(); + camera.SetOrthoProjection(-2.f, -512.f, m_2d_Scale); + printf("m_2d_Scale = %f\n", m_2d_Scale); + camera.UpdateFrustum(); + } + } +} void AtlasViewActor::SetParam(const std::wstring& UNUSED(name), const AtlasMessage::Color& UNUSED(value)) { }