From d54cdf43eecf6689e051d53d5f05d87a37b810af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Fri, 24 Mar 2023 23:50:46 +0100 Subject: [PATCH] Simulation mode and pause/resume --- .../content/Textures/EditorIcons.dds | Bin 98432 -> 131200 bytes .../content/Textures/EditorIcons.psd | Bin 20136 -> 29517 bytes GlitchyEditor/src/EditorIcons.bf | 4 + GlitchyEditor/src/EditorLayer.bf | 147 ++++++++++++++++-- GlitchyEngine/src/World/Scene.bf | 17 +- 5 files changed, 150 insertions(+), 18 deletions(-) diff --git a/GlitchyEditor/content/Textures/EditorIcons.dds b/GlitchyEditor/content/Textures/EditorIcons.dds index 70df89adc29f1a21a228f192363745ac823d73be..5245d70f42b480047fa1672ff124b9729c644efc 100644 GIT binary patch delta 5666 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 JCkXy$;eYps99jSX literal 98432 zcmeHLQIce-4Q%_vzuqJ4QEcFpGzkc+0=T8Cj{`J|Z;i>&};OW56?Enm*XZ~+^{%iEVmkko0lKl?6{^i(*9Cdp) zy+<|gr;2&z|DKnB5B_VjN5xaM(SbBeCEo^(IxMMOV$}to#Gl!LXa4Vb_hH8|(1Hq+h%Yjps69pM{V_n#IAul4``fzU^Pkl$VJS$BAsj+wf( zhkTZB=A3$!a5!PfxnAo$s!dDr7`zAI(C_fYfwd*K~CU~}nmZpm-&MIXFtCjNKN zJ9`ry#8XCy1rzcENx&PLhlKx63n9O)C#g-haN77?`D@*yGu59_PJK^tEQr-I&>8B# zXA-*DbSU(Awg$N?YQB5n6+?xq!&TG7cST(uBOHQBk%LIU6Pkym;Sb#-zpbaBytlBL zc+IcjXyw%0>D;iddlP|hjU-^a&ktPnlqh8 zIox}STM|okBzOwT)oO&JB#2_ka{h`EmEfzEk$sXzsmw3U+OtAwgq%Qj>jpv4j^?4l z|J_oMU(ORz203{>OwHNDa_(xrbmru7F%*A}WsZEN)`X$rImYG4xJ7H0H@znN`8!S4 zAh`HFThpk#FKq33!bybO;Msf+ZqSV8;e`LYq$0oEo>Jzxxh-7gY~6F?nWtR2xm;Yy zUGD4r@~+$`TzM|{5{??{d@g00>{A=cuLL*%~A*>s`4b0dTPPT=N^8BX9)JdE^JQp?PTF_jC&6SMw;8K@HDL&T0)* zJxMHimEbAtOuv-5lnmEcYE%A73tf3itE@DsBzL^EXGg&ixC5)p3qha>%|l23r%)rm z+E$llBphWPwbyb<^0Zh=FDF*kYL_*+QZ&~HRUfUAK>6^AT*Sa67i>l3tcr}IFvm?P!r zt+F!3n!FRNJ$vgd_#^BCtLu&+(17M)q3=_-$gg8-<$r)19rx5I)uxJb%z?u%HHcY?KNZ@mP6gjjHXwcm>_)^Egov2dC1Ur zcL?&U?OQ9)yE(18o^fwa5`Isg1h+(*DHgPd`BDzy!7?P)j?yPLZK&zekaVE$Fp&W$ zIWzo-&ueg&BKFydr3ilzjs6z@ejpNe+_9B3XIYdnz- z`Q>$~kJ@FjuS$Nq%ZEi>xm#9-g)|ihs8i>$oasO+O`b`qPdY1fmZw%H?g+erb~BDb zE}Dl<8c(7{e#adeBX*e^E0ZC1`LL)fahmEe@fOll9H38~$MmLwsWf>er9Nqlv~oPP zI&(+h4=rDq!V>jM_eLrnFNC*+sgrxtE^hg!O%@!dWw>i0a?{5@=OSEnsK zgAQ@MlvC*U*orlICRqFR)Vi2ELcK8h0RRk|hl@4tD2M#!{&0n4d|tVEUbw6yuiQEr zpI2_)$++yLUMbBrrg5fHm&HJnxK_$(c(Dq1HC^?)7|Tm*zn0n#;fkOmv>qSs&^$au zv!@K?H}yqYtn8&U*BU>gWhU3!hXr5hC+&NjHMVi?QMlg?ERgk6PQ!~;n5uK-?dKISbIIeld*;fe4+K)aEIoh zaqSc7kl$8cxbfWvxjIL<-9A>=ANAw9Uo8vO0}bfRJ)}IQKMjm4V+qdM>k`pxibN?>%>u za+v-!FjB@<^Y!l)YELE!f|;{Ux#F9avLei}ZMdt-X5do#2m<8`Q7X zNCZwa4=429B^CK?v_%zO)c}>aLDDMir_>p=BVTWq3qnL15z&IyYTwJP@5=o8PI@l6?z%5Mk35vv!G1*Lb`QEl z+zCJMVsS0fv;u7Ddx72vHG;)MSa5(AG!GZ}-(3Rv)%1`upy8RxvDQHG-7Qx4v!}nt zcFsK-*E`T8;!pUF534JYrWIgI-;R1Ca0jbLu;KwtXdXKHKZP3kmG+S`A?2{bTWX=W z?iOqHmGaTT5^*YhNer}z>Lfg&-#V0PeA9K+e%*QQzZHhSRS%Z=55+$ji;y4YmH9A$ zHZ%_>z1|@m`IU5)GAGIRz*=ddcasKF5YDy3i z1g_xq09L%95zRwG|EE$RzuZ1jX1KX6T;^=ubK{w(T)DX!SLWVzpS|?f?5&3>?#RFE zW)ANabcjkMe4*WQE7Ii&zC4@xHqaV@BX~C7k{h(5d1&DObPD8`(@V+_C$ER8IeS>n zUCo!yoV*f4aoiv$Y2Ab$c{jS>(hsVrwP&gZGZq0CjQYEb1~j92 z$n<(=81g%6G-Y&@!?~|{IXNRt&6&=lobsN^ze}w2;jn-I9surTEs@qrcn9wk<+2`( z3R!y|)g$gB!~)f%JH$XcnumnHPYWTxy*Hwa_wbUtnp=|F!`8g%+{4#*RQ~C)+Jp1? z{ky=cFQETjL$P&M|2Z!H3Jw z#R2^}Rs!)x5n|z3!IQ$k8=8lN|4$1czmx4#r`JtY6D>%rweCDGuTc~o_jdv)d*=V*=Yc<$5x!w@ z*=^;(E1HLJ{`3#>yQ}ealXvNO>K@gBZ@&+YQum1YxDLP^Li6yaop(LxGyivW{;B(P z;ORi_z)zd^wcp%_9c%s_u%q@<^Xb6Tfu{rYJp5_r=O^Ilz|(=J13$F`KW*OEe*Xqf CT5N;> diff --git a/GlitchyEditor/content/Textures/EditorIcons.psd b/GlitchyEditor/content/Textures/EditorIcons.psd index c6e8d275a65a14695ff71c2a472afbe0a7724f32..c39d28579ee88cd3b95099c4c47c6de20adae817 100644 GIT binary patch literal 29517 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 delta 3149 zcmeHIU1(HS5S}Xs(bSf$?v@+4u~)c(wXC?lS88kNiv>4Ujg4-qf_8V4O?E>meJOFl zhdyj+(hEh9SZNg${KXc05G2$hVxx`mhjy)2Luyjprefj`aeF%7oSSATzWcHq?zi8} znKLtI&g?k@e^>|lte)^JYe(-Z`{u-oM6sQuPJCsZwN88-IsIBUSu}^{$q1889>pjs zBTjMVan?X~WjHLk0Vsh*>~)XIVDXm)`L z)KC5THfarhoB1$RgbzQ1@1`gE9!=<@Y=1VGzf4p5A%7(*vA&|uvEKh_qpQw?98ZP) z-`@(W0SI5O_S8j?Md`4gSQ%1-5MD@lY6#@bL`+=)8B9C=?nFpkgYa_3_B)ax^$Uca zWK5MnE+k#`8n`6ms{iHI5nqS<2)NNOFy>#z5Q;Tyy~bW0OG)T4Amm$}lCeQ$HH zpZF@<>`*rcd)~V$s6uW-P?y6@q*6`qn$r2Fwt1$QQ`=lq-aYSors%!-uwUFBGRNVz zxaNTFZgCW#|zvk`+{yT9i{0X*39$``tAQcR^5lw zy*d3`J@?EWT^fY1HEFF$@mH)hY3(NEHmKdC(>Ex7@y46C{u{o1E4q(JU*)er--*13 zCUv=<9#koY^f9tdulRw^>5897IabC0C>3KomWnct3c6|V{K|-*O)p^9la4d~EEvkb z`io?}e>h#|cV_0Y^jXGZ)X9iHn1TI72J2&OF5@P_qTs1E#2amM7FKASM)aR_mA}jU zmH2HeX-;fR5?j#@!*;=4f@j*{Y(mh>f+yBS{B#!Kidlp^Blt8MW#{+#fgR_E_Ay=J z$MrfpzX<1(;(T)loEHU8b|9C(X_!r_&9A|{East3n7=NV>V$cj#@H*&ha~lJx(V|U zG4B_{vS57s|Kp fik$6EdaU>Vca)+k5YbaU>w|$*pl_=h#5Bym&Wk>3 diff --git a/GlitchyEditor/src/EditorIcons.bf b/GlitchyEditor/src/EditorIcons.bf index a550f62..1f13efe 100644 --- a/GlitchyEditor/src/EditorIcons.bf +++ b/GlitchyEditor/src/EditorIcons.bf @@ -16,6 +16,8 @@ namespace GlitchyEditor public SubTexture2D File ~ _.ReleaseRef(); public SubTexture2D Play ~ _.ReleaseRef(); public SubTexture2D Stop ~ _.ReleaseRef(); + public SubTexture2D Simulate ~ _.ReleaseRef(); + public SubTexture2D Pause ~ _.ReleaseRef(); public SamplerState SamplerState { @@ -35,6 +37,8 @@ namespace GlitchyEditor File = GetNextGridTexture(ref pen, iconSize); Play = GetNextGridTexture(ref pen, iconSize); Stop = GetNextGridTexture(ref pen, iconSize); + Simulate = GetNextGridTexture(ref pen, iconSize); + Pause = GetNextGridTexture(ref pen, iconSize); } private SubTexture2D GetNextGridTexture(ref Vector2 pen, Vector2 iconSize) diff --git a/GlitchyEditor/src/EditorLayer.bf b/GlitchyEditor/src/EditorLayer.bf index 4ccb9e3..dba5fc2 100644 --- a/GlitchyEditor/src/EditorLayer.bf +++ b/GlitchyEditor/src/EditorLayer.bf @@ -69,11 +69,11 @@ namespace GlitchyEditor { Edit, Play, - // Pause, - // Simulate + Simulate } SceneState _sceneState = .Edit; + bool _isPaused = false; public this(EditorContentManager contentManager) : base("Example") { @@ -197,11 +197,25 @@ namespace GlitchyEditor { Debug.Profiler.ProfileFunction!(); - _camera.Update(gameTime); - _editor.CurrentScene = _activeScene; - - _activeScene.Update(gameTime, (_sceneState == .Edit) ? .Editor : .Runtime); + + Scene.UpdateMode updateMode; + + switch (_sceneState) + { + case .Edit: + updateMode = .Editor; + case .Play: + updateMode = .Runtime; + case .Simulate: + updateMode = .Physics; + } + + if (_sceneState != .Edit && _isPaused) + updateMode = .None; + + + _activeScene.Update(gameTime, updateMode); // Clear the swapchain-buffer RenderCommand.Clear(null, .Color | .Depth, .(0.2f, 0.2f, 0.2f), 1.0f, 0); @@ -211,6 +225,8 @@ namespace GlitchyEditor if (_editor.SceneViewportWindow.Visible) { + _camera.Update(gameTime); + _editorSceneRenderer.Scene = _activeScene; RenderCommand.Clear(_editorViewportTarget, .Color | .Depth, .(0.2f, 0.2f, 0.2f), 1.0f, 0); @@ -366,22 +382,86 @@ namespace GlitchyEditor ImGui.Begin("##toolbar", null, .NoDecoration | .NoScrollbar | .NoScrollWithMouse); - SubTexture2D icon = _sceneState == .Edit ? _editorIcons.Play : _editorIcons.Stop; + float padding = 2.0f; - float size = ImGui.GetWindowHeight() - 4.0f; - - ImGui.SameLine((ImGui.GetContentRegionMax().x / 2 - size / 2)); + float size = ImGui.GetWindowHeight() - 2 * padding; - if (ImGui.ImageButton(icon, .(size, size), .Zero, .Ones, 0)) + float centerX = ImGui.GetContentRegionMax().x / 2; + + + if (_sceneState == .Edit) + EditorButtons: { - if (_sceneState == .Edit) - { + // Display the buttons for edit state + + float totalWidth = size * 3 + padding * 4; + + float penX = centerX - totalWidth / 2; + + ImGui.SameLine(penX); + + if (ImGui.ImageButton(_editorIcons.Play, .(size, size), .Zero, .Ones, 0)) OnScenePlay(); - } - else if (_sceneState == .Play) + + ImGui.AttachTooltip("Play the game."); + + ImGui.SameLine(penX += size + 2 * padding); + + ImGui.PushID(1); + + if (ImGui.ImageButton(_editorIcons.Simulate, .(size, size), .Zero, .Ones, 0)) + OnSceneSimulate(); + + ImGui.PopID(); + + ImGui.AttachTooltip("Enter simulation mode.\nThis only runs the physics engine."); + + if (_isPaused) { - OnSceneStop(); + ImGui.PushStyleColor(.Button, *ImGui.GetStyleColorVec4(.ButtonActive)); + + defer:EditorButtons { ImGui.PopStyleColor(); } } + + ImGui.PushID(2); + + ImGui.SameLine(penX += size + 2 * padding); + + if (ImGui.ImageButton(_editorIcons.Pause, .(size, size), .Zero, .Ones, 0)) + _isPaused = !_isPaused; + + ImGui.PopID(); + + ImGui.AttachTooltip("If enabled the game or simulation will be started in paused state."); + + } + else + { + // Display the buttons for play/simulation state + + ImGui.SameLine(centerX - size - padding); + + SubTexture2D pauseButtonIcon = _isPaused ? _editorIcons.Play : _editorIcons.Pause; + + if (ImGui.ImageButton(pauseButtonIcon, .(size, size), .Zero, .Ones, 0)) + { + if (_isPaused) + OnSceneResume(); + else + OnScenePause(); + } + + ImGui.AttachTooltip(_isPaused ? "Resume" : "Pause"); + + ImGui.SameLine(centerX + padding); + ImGui.PushID(1); + + if (ImGui.ImageButton(_editorIcons.Stop, .(size, size), .Zero, .Ones, 0)) + OnSceneStop(); + + ImGui.PopID(); + + ImGui.AttachTooltip("Stop"); } ImGui.End(); @@ -407,15 +487,48 @@ namespace GlitchyEditor _editor.CurrentScene = _activeScene; } + private void OnSceneSimulate() + { + _editor.SceneViewportWindow.EditorMode = false; + _sceneState = .Simulate; + + using (Scene simulationScene = new Scene()) + { + _editorScene.CopyTo(simulationScene); + + simulationScene.OnSimulationStart(); + + SetReference!(_activeScene, simulationScene); + } + + _editor.CurrentScene = _activeScene; + } + + private void OnScenePause() + { + _isPaused = true; + } + + private void OnSceneResume() + { + _isPaused = false; + } + private void OnSceneStop() { - _activeScene.OnRuntimeStop(); + if (_sceneState == .Play) + _activeScene.OnRuntimeStop(); + else + _activeScene.OnSimulationStop(); + SetReference!(_activeScene, _editorScene); _editor.SceneViewportWindow.EditorMode = true; _sceneState = .Edit; _editor.CurrentScene = _activeScene; + + _isPaused = false; /* * Update the viewport size because if the game windows size changed in diff --git a/GlitchyEngine/src/World/Scene.bf b/GlitchyEngine/src/World/Scene.bf index cdf6417..be82ee6 100644 --- a/GlitchyEngine/src/World/Scene.bf +++ b/GlitchyEngine/src/World/Scene.bf @@ -125,6 +125,16 @@ namespace GlitchyEngine.World } public void OnRuntimeStart() + { + OnSimulationStart(); + } + + public void OnRuntimeStop() + { + OnSimulationStop(); + } + + public void OnSimulationStart() { _physicsWorld2D = Box2D.World.Create(ref _gravity2D); @@ -183,7 +193,7 @@ namespace GlitchyEngine.World } } - public void OnRuntimeStop() + public void OnSimulationStop() { Box2D.World.Delete(_physicsWorld2D); _physicsWorld2D = null; @@ -191,8 +201,13 @@ namespace GlitchyEngine.World public enum UpdateMode { + /// No special update configuration (this does NOT mean nothing will be updated!) + None = 0x00, + /// Update editor-specific stuff Editor = 0x01, + /// Update the physics related stuff Physics = 0x02, + /// Update the runtume related stuff (e.g. execute scripts). Also run physics! Runtime = 0x04 | Physics, }