From cc7fb7311fae9abb901336bf88d30c3e05c65b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Thu, 20 Jul 2023 23:21:21 +0200 Subject: [PATCH] Added single step for simulation and play mode + Added ManualStepTime to GameTime --- .../content/Textures/EditorIcons.dds | Bin 131200 -> 147584 bytes .../content/Textures/EditorIcons.psd | Bin 29517 -> 35257 bytes GlitchyEditor/src/EditorIcons.bf | 2 + GlitchyEditor/src/EditorLayer.bf | 90 +++++++++++++++++- GlitchyEngine/src/GameTime.bf | 13 ++- 5 files changed, 99 insertions(+), 6 deletions(-) diff --git a/GlitchyEditor/content/Textures/EditorIcons.dds b/GlitchyEditor/content/Textures/EditorIcons.dds index 5245d70f42b480047fa1672ff124b9729c644efc..036696a31881fc19075283619074fa77d9ec2783 100644 GIT binary patch delta 2831 zcma)8Z)g)|81K`jX*vt0YbO~-xN5*w<8sAr2AYktMApr?##Jy%g=2PDr)8-+tWcR{ zN`+OH<-}6X`v=MBI3_@MfA5I zbPnL<6C%61PRw)+Y06eQoRl5L)W*9GO-+$UWOm+R^FocQ_HX;3$R#i1-KwIN$PFyh zy7tn5G2K2}rj~()#1Pf;GZ{DgK0X^?We}Qq0g%feZ<4usS}fm zAFHIfkI^84^5G#^%AV8|#q%*uT2BHA#vZ9VsXE5>ky<<`2snf_Y^r_KOqx1CF(a4E zI`J-uy7r3f<+UPk;SJ3_L$gecq+G{~A*XLu8p}RdOr!g);kx81wHj64%^Sppy>*gMjjg*;b|z3?iGk4y)l7LbM4b zROB^a9vSW5zshNK!{;zO@L=BtUNwsBX_xqJR~Zx_^-~k@YG=`(axg=gts*$J%}DgO zk#PU%Fs}c2(`HTNp`WXO`nN&V&t_8TK5PdqM}f+Ol3~(^!8ODLS_G{+xCI(Tesi-> zV==_mhy?qg9x<~X8YN)+SVSJze{pKc0J&{hD-Vsxjjv4BW)C;uS~zjMjId`6<=0L} zf!Rz136z%@m}ix2xdf4gK!NRGtB)e zGKv>147;In8B-zZtVzn8e;*Y6pg9Y40+r3_WTN9EOd9^oT@beLGto|)?lZR!iz#Ib z1ajzzO<1kK$`Z-J#VffI=JX1h<=QY-8=UqdO!i4GW(nchUpb^^E%pKRShcc96=%K{ ztqgPeCP0lrQ}I#M?jYqsr*PLca^l=bnimBNE~RfmKVA()sSuD=$p2Kc&B_8@`si7a zS?6Ioo9$22uBuephw8@`S+{$Tz0mX)x+yZz^)Nc`{(M*U2g$tt9L;cs+_qC-FY+K< zyFm&LWl6AZ+9bN#d!Ts+fcMPxTWFw)JwZp!@!%>4DU1{gtdvhv>ZY|My4Jh^5P_EJ zM@xmtyzvrQ{lslr00v`^^ lCz`8Sd_z1+Nx9lwew#|SxYFfu$*bpz|8qM<7)t^K>2GSEWn};W delta 2815 zcmaJ@Uu;uV81L7$TPK6n(1j@*R9UtXX4-`*1;JG<$(Gen!ieaGG_u4cD3rh=)D5=? zVMG@1Ji!A_MhPz@Xm-t!oF!mvbP%GLG;tvq#7tx27G7%bL4BFObMNlfwPg>@y}jrA zegD7Tcl!EE`}$qg;qVS`kIiN)ciU|tJZ*OTTs9lwLF}T>|7ApXarXx_&UD}8qQBI0 zpUs}{5yPI{#oWDuYG%I-v(b$n=3iCCwylb)ckZ92fk&wu3OE;l`Gq^QR-|f!rp}K~ zjIrqZ_1x_xA5*>1G9#WZtcg)+vpF-$oMS8~{ zPNmxvjlCS^q4mgNW{ZPI*C7+ha3w4q0Qf~%iknvSrzy^&tr4NU;dYoF>w7aLLjf18 zwyDB4yg5{S!RE9pD()SdI+{vFjAg;lO)#Ac|k zvPz$q{db}5DEGce%*X&srcbcYdBKJo&I@g1FX812nLJNZ#JukWS$aAkGN0lj|hDqLsR;E5R3EJ2*sH8;4*M~a&Vb*Yk_O#fv+iMW%eVnZlYU7 zYoHP1VYq%4;PxCailCf)h!A%REfFR$@#}4~0EU+*y8ujP0~=YYvxIGH?SQ5s8G4z7E5$S_X4)rBtLU{tApX5_eaSL)^;TEu^6ygyLYSb2V%*(WCk& zPty_-t^e#);d)`MPhuj=2)1j~Wcif?NRUf-XZoBuGKz~7K@J6$L#%f}clJvprWs>h zPGgwGAlH|X#sdeb1M~8Hj(BRrgLZ}+o)KEYOH%g`G6W(sDJdC_ zN^nypvDBm&&er8=d;%KVm|pEhOE_d`C50V%@aB?y|C%M3C{nDZh=X|!u+iqNP>#J( zyBzN|mZ9uC4l0l1s*+{$dXRpB??&$!$($tVeSr=;S#0bwJdNZi>z63Xa=RK1+1f%| zttmTFNLHozG6KVP@P|~&WMDfPjjjgsk&tnSh5@Nm9oMGjLWzS^jYi83&G6=k@-RP1MO;rwqhLT~mN)9W*3B0H(8G-{&W0V6k zYoz};b(biQxcdz05Xg21Jq6w{=Q6dS6q9{RY8ts67O!EpIQ1L1036HSu{B|a!LDyr1m+vi?TUijp#T!dl4Wc+U0|<=<3|&fRUhq z%WMHv9cx-(5aTuDneAGS1R=#83zk;%EYcdf6?15{)U?DP7D7ZVD|zoG-6+c0k6{CC zjkUb+Bl2Vpeo z|Iw|*?n%mn2V!j5UZ9*UEzFkJxJpP#dEI>ULsEN;1 z*sGbh&a(goI$a`%m)V{3&{>5_=^6>pzq2vSUpCjv^40d~yw3_z=r<)@wf4VpyD4~T HA-ett1{-^r diff --git a/GlitchyEditor/content/Textures/EditorIcons.psd b/GlitchyEditor/content/Textures/EditorIcons.psd index c39d28579ee88cd3b95099c4c47c6de20adae817..8b53a3032d1eff1083c0b8759c31690e20443720 100644 GIT binary patch literal 35257 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 delta 2188 zcmeH{O-NKx6vxjq2od|5@-Ye;J%n`B={b$#XgV{ZSw=a2%&6lBg3%^wv=$LzKAlNN z7h-i<1W`n`(M=ypVDv$Vixy=NWVB3(2wY@DSjqIicNE4|n?M3NoZmV3+CmlBK0l2HB{X9MW9m zLheFEjIGiv80{w=UO;ZDpd;j`YN~>{$U|jx2=1YSm~&!JF%?oNtO(;0%#>lbc#Z|8 zkvVp%f#cWn1&rkNeE|b)h;_h3CNw1zt#YoI2hA*j+2vSA<8{i7vsh(yb^MIT^Hx@h zdAl?>mE$^MxlUO)Z9D1W?i2ecW*;dUjb(Reo|aeg(fFK~t5cN-r+U+sAujUf^I2~( zPkJ4^2-j;I9ISEiB;4Ft%)>ot+)$gzp;{Y1sdccq%fZe%D+lYW$`X&&<$=nXY%sk( zA8fC;fe$+NfnPgBp6#=PL7xkJ>MI9#_^ZH9zYl!xKL$D)4ud0-pBqX=rO^!zG!-|tNPN%MCDQl5LJ>1A|DBsiPvy7xez&UGJv zKB+w0twEzy-gZ%gPO0og)N528K@8Sp@EqbK;_e;|x|N2Q#HV}A(616`mx>kk3&L* z62gKb4Jq6n7S*d^vHP`T(j}2sN`@q#N&b{{^viSlbFpSr=5zfyoHUTTqGcB7n9A1% zG-#QL-yk|$Oq?9iplNpKnaYEaY@UjgL(@#G4(4#xpq=~SFW}3AIu{IO@rfa`ZS`J> Me#<);`>VG70TdPFoB#j- diff --git a/GlitchyEditor/src/EditorIcons.bf b/GlitchyEditor/src/EditorIcons.bf index 34f7d3e..c335d5e 100644 --- a/GlitchyEditor/src/EditorIcons.bf +++ b/GlitchyEditor/src/EditorIcons.bf @@ -18,6 +18,7 @@ namespace GlitchyEditor public SubTexture2D Stop ~ _.ReleaseRef(); public SubTexture2D Simulate ~ _.ReleaseRef(); public SubTexture2D Pause ~ _.ReleaseRef(); + public SubTexture2D SingleStep ~ _.ReleaseRef(); public SamplerState SamplerState { @@ -39,6 +40,7 @@ namespace GlitchyEditor Stop = GetNextGridTexture(ref pen, iconSize); Simulate = GetNextGridTexture(ref pen, iconSize); Pause = GetNextGridTexture(ref pen, iconSize); + SingleStep = GetNextGridTexture(ref pen, iconSize); } private SubTexture2D GetNextGridTexture(ref float2 pen, float2 iconSize) diff --git a/GlitchyEditor/src/EditorLayer.bf b/GlitchyEditor/src/EditorLayer.bf index e39084e..a35da5e 100644 --- a/GlitchyEditor/src/EditorLayer.bf +++ b/GlitchyEditor/src/EditorLayer.bf @@ -70,6 +70,9 @@ namespace GlitchyEditor SceneState _sceneState = .Edit; bool _isPaused = false; + bool _singleStep = false; + + private float _fixedTimestep = 1.0f / 60.0f; append List<(String Name, String Path)> _recentProjectPaths = .() ~ { for (var item in _) @@ -79,6 +82,8 @@ namespace GlitchyEditor } }; + private GameTime _simulationGameTime = new .() ~ delete _; + /// Gets or sets the path of the current scene. public StringView SceneFilePath { @@ -92,6 +97,7 @@ namespace GlitchyEditor } } + [AllowAppend] public this(String[] args, EditorContentManager contentManager) : base("Editor") { Application.Get().Window.IsVSync = true; @@ -199,10 +205,37 @@ namespace GlitchyEditor updateMode = .Physics; } - if (_sceneState != .Edit && _isPaused) + if (_sceneState != .Edit && _isPaused && !_singleStep) updateMode = .None; - _activeScene.Update(gameTime, updateMode); + /* + * If we are in edit mode we use the "official" gametime. + * However in play or simulation mode we use a simulation game time + * which is decoupled from the actual time. This allows us to manipulate + * the simulation speed without potentially messing with the rest of the editor. + */ + GameTime gt = null; + + if (updateMode == .Editor) + { + gt = gameTime; + } + else + { + gt = _simulationGameTime; + + if (_singleStep) + { + _singleStep = false; + _simulationGameTime.ManualStepFrame(_fixedTimestep); + } + else + { + _simulationGameTime.ManualStepFrame(gameTime.DeltaTime); + } + } + + _activeScene.Update(gt, updateMode); // Clear the swapchain-buffer RenderCommand.Clear(null, .Color | .Depth, .(0.2f, 0.2f, 0.2f), 1.0f, 0); @@ -385,7 +418,6 @@ namespace GlitchyEditor float centerX = ImGui.GetContentRegionMax().x / 2; - if (_sceneState == .Edit) EditorButtons: { @@ -434,10 +466,17 @@ namespace GlitchyEditor } else { + float totalWidth = size * 2 + padding * 2; + + if (_isPaused) + { + totalWidth = size * 3 + padding * 4; + } + // Display the buttons for play/simulation state ImGui.SameLine(); - ImGui.SetCursorPosX(centerX - size - padding); + ImGui.SetCursorPosX(centerX - totalWidth / 2.0f); SubTexture2D pauseButtonIcon = _isPaused ? _editorIcons.Play : _editorIcons.Pause; @@ -450,7 +489,43 @@ namespace GlitchyEditor } ImGui.AttachTooltip(_isPaused ? "Resume" : "Pause"); - + + if (_isPaused) + { + ImGui.PushID(2); + + ImGui.SameLine(); + + SubTexture2D singleStepButtonIcon = _editorIcons.SingleStep; + + if (ImGui.ImageButton(singleStepButtonIcon, .(size, size), .Zero, .Ones, 0)) + { + DoSingleStep(); + } + + if (ImGui.BeginPopupContextItem()) + { + ImGui.TextUnformatted("Time step:"); + ImGui.SameLine(); + ImGui.DragFloat("##timestep", &_fixedTimestep, 0.001f, 0.001f, 1000.0f, "%.4fs"); + + float fps = 1.0f / _fixedTimestep; + + ImGui.TextUnformatted("Frame rate:"); + ImGui.SameLine(); + if (ImGui.DragFloat("##fps", &fps, 1.0f, 0.001f, 1000.0f, "%.3f FPS")) + { + _fixedTimestep = 1.0f / fps; + } + + ImGui.EndPopup(); + } + + ImGui.AttachTooltip("Step one Frame (Right-click to change time step)"); + + ImGui.PopID(); + } + ImGui.SameLine(); ImGui.PushID(1); @@ -512,6 +587,11 @@ namespace GlitchyEditor _isPaused = false; } + private void DoSingleStep() + { + _singleStep = true; + } + private void OnSceneStop() { if (_sceneState == .Play) diff --git a/GlitchyEngine/src/GameTime.bf b/GlitchyEngine/src/GameTime.bf index 5d4649b..f623d6b 100644 --- a/GlitchyEngine/src/GameTime.bf +++ b/GlitchyEngine/src/GameTime.bf @@ -48,7 +48,7 @@ namespace GlitchyEngine let sw = append Stopwatch(startNow); _stopwatch = sw; } - + /** * Starts or continues the internal timer. */ @@ -98,5 +98,16 @@ namespace GlitchyEngine _frameCount++; } + + /** + * Tells the timer that a frame has passed and updates the counters according to the given time step. + */ + public void ManualStepFrame(float deltaTimeSeconds) + { + _frameTime = TimeSpan.FromSeconds(deltaTimeSeconds); + _totalTime += _frameTime; + + _frameCount++; + } } }