From 4997077978730a6a2424d206f74d566f83d782aa Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Mon, 21 Mar 2022 19:01:28 +0200 Subject: [PATCH] working replay system --- Content/Materials/SimpleMapMaterial.flax | Bin 32172 -> 32172 bytes Content/Scenes/AerowalkScene.scene | 16 +- .../EngineSettings/PhysicsSettings.json | 6 +- .../Settings/EngineSettings/TimeSettings.json | 4 +- Content/aerowalk/DefaultMaterial.flax | Bin 29822 -> 30146 bytes Content/aerowalk/common WTF.flax | Bin 29822 -> 30146 bytes Content/aerowalk/common clip.flax | Bin 29822 -> 30146 bytes Content/aerowalk/dev dev_128_gray.flax | Bin 30066 -> 30390 bytes Content/aerowalk_uv/common clip.flax | Bin 29822 -> 30146 bytes GoakeFlax.code-workspace | 2 +- .../Cabrito/Console/ConsoleContentTextBox.cs | 4 +- Source/Game/Cabrito/FpsScript.cs | 3 +- Source/Game/PlayerInput.cs | 8 +- Source/Game/PlayerInputDemo.cs | 19 +- Source/Game/PlayerInputLocal.cs | 46 ++-- Source/Game/PlayerMovement.cs | 213 +++++++++++++----- Source/Game/Q3MapImporter.cs | 30 ++- 17 files changed, 243 insertions(+), 108 deletions(-) diff --git a/Content/Materials/SimpleMapMaterial.flax b/Content/Materials/SimpleMapMaterial.flax index 1b46bc7dad6e3fd46122716f895908d8bc3ea012..cd3771e64297ccbf977f24580c54195955fa4cb2 100644 GIT binary patch delta 34 kcmZ4Un{mx=#tmld{7ei$zziZ-ftYc!A)CnNNcP||0Fx015&!@I delta 30 kcmZ4Un{mx=#tmld+^h@?42(=bf`NImAcw@}NcP||0Dz_j^Z)<= diff --git a/Content/Scenes/AerowalkScene.scene b/Content/Scenes/AerowalkScene.scene index d5cd8ae..4603a1a 100644 --- a/Content/Scenes/AerowalkScene.scene +++ b/Content/Scenes/AerowalkScene.scene @@ -1,7 +1,7 @@ { "ID": "194e05f445ece24ec5448d886e1334df", "TypeName": "FlaxEngine.SceneAsset", - "EngineBuild": 6226, + "EngineBuild": 6330, "Data": [ { "ID": "194e05f445ece24ec5448d886e1334df", @@ -70,13 +70,13 @@ "Transform": { "Translation": { "X": 0.0, - "Y": 226.0, + "Y": 716.0, "Z": 0.0 } }, "Control": "FlaxEngine.GUI.Label", "Data": { - "Text": "eFPS: 61\nuFPS: 60\nrFPS: 60\npFPS: 30\nCon: NaNms\nDirectX11", + "Text": "eFPS: 120\nuFPS: 120\nrFPS: 120\npFPS: 30", "TextColor": { "R": 1.0, "G": 1.0, @@ -123,9 +123,9 @@ }, "Offsets": { "Left": 0.0, - "Right": 71.0, - "Top": -562.0, - "Bottom": 96.0 + "Right": 57.0, + "Top": -97.0, + "Bottom": 64.0 }, "Scale": { "X": 1.0, @@ -164,8 +164,8 @@ "Name": "ContainerControl 0", "Transform": { "Translation": { - "X": 45849.0, - "Y": -12.0, + "X": 45644.0, + "Y": 0.5, "Z": 0.0 } }, diff --git a/Content/Settings/EngineSettings/PhysicsSettings.json b/Content/Settings/EngineSettings/PhysicsSettings.json index 505a53c..8bb1268 100644 --- a/Content/Settings/EngineSettings/PhysicsSettings.json +++ b/Content/Settings/EngineSettings/PhysicsSettings.json @@ -1,7 +1,7 @@ { "ID": "4bd8a4cc460399b5f1975fbe0a668e3f", "TypeName": "FlaxEditor.Content.Settings.PhysicsSettings", - "EngineBuild": 6226, + "EngineBuild": 6330, "Data": { "DefaultGravity": { "X": 0.0, @@ -17,8 +17,8 @@ "EnableAdaptiveForce": false, "MaxDeltaTime": 0.1, "EnableSubstepping": false, - "SubstepDeltaTime": 0.008333334, - "MaxSubsteps": 5, + "SubstepDeltaTime": 0.001, + "MaxSubsteps": 60, "SupportCookingAtRuntime": true, "LayerMasks": [ 4294967295, diff --git a/Content/Settings/EngineSettings/TimeSettings.json b/Content/Settings/EngineSettings/TimeSettings.json index 692d208..a1b0432 100644 --- a/Content/Settings/EngineSettings/TimeSettings.json +++ b/Content/Settings/EngineSettings/TimeSettings.json @@ -1,9 +1,9 @@ { "ID": "a55dc3c04da4ea3744b7f1994565beac", "TypeName": "FlaxEditor.Content.Settings.TimeSettings", - "EngineBuild": 6226, + "EngineBuild": 6330, "Data": { - "UpdateFPS": 120.0, + "UpdateFPS": 0.0, "PhysicsFPS": 120.0, "DrawFPS": 120.0, "TimeScale": 1.0, diff --git a/Content/aerowalk/DefaultMaterial.flax b/Content/aerowalk/DefaultMaterial.flax index 845a65e0f7fda1731e21c3106f8a011faeeb3ab5..a8a9a069dcc14a80ed17fd6682b3bcfc1b3a58c3 100644 GIT binary patch delta 4323 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 McQVfUg~cZR58+LI6#xJL delta 3995 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 F{|mXp1ib(N diff --git a/Content/aerowalk/common WTF.flax b/Content/aerowalk/common WTF.flax index e39c2fe40898a95084092b89e48a93d729dba472..012e7935fa64cae43dfccfae45c38a36422d8410 100644 GIT binary patch delta 4323 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 McQVfUg~cZR58+LI6#xJL delta 3995 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 F{|mXp1ib(N diff --git a/Content/aerowalk/common clip.flax b/Content/aerowalk/common clip.flax index 9cba26af0617bca8f2d66c45e67b7a7b3823a4a1..b642df8be746e61c29be3b7b7ac740e828833f7e 100644 GIT binary patch delta 4323 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 McQVfUg~cZR58+LI6#xJL delta 3995 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 F{|mXp1ib(N diff --git a/Content/aerowalk/dev dev_128_gray.flax b/Content/aerowalk/dev dev_128_gray.flax index 88dc859a4da78a33c17bb73518f734ec3b225257..6b2a5c3b554ae2550baeac711bbc61f808631f36 100644 GIT binary patch delta 4331 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

6@O5m|+851(>I z*K!-k-Sthx+BJ|m{;2+Wlz(_Y6d|*z`+0xU^ECm8gf`kGC?z?I;_B~8DCBO*Le!3- zOntEaY5O>C!6k9;6m>shJeyfx6H>_{<|SmuRZyG1mObqFUO-M>Ikhbyth1d^-S%jH zct>c*8ESMAVZ|C8UwZd|+V@@r z{Ol_KVMP~jzd%xXH-lcdU-^s<0y$@7@8S_-WzBq@n3!D#NT6kcG&8;66Qmy!b*-td zxby+}S@*#F%pOSjxDLw2H!>kUpIF=ltRd7*O#@!6ZElASYVT})zOl*=JWx$h2M#-B zgLS4%Elf}w>FjEcz+2<1n_#>mAUuf29}jFn8PL+v*1F-rH|%Miw2}bUO`F`(H8jTA zSqG^@4NTnp0YD7px zRaw{eJlew1CrCRXjY575@LTBPCP;Q=O+3;khzM*!EsfJy`eJ%%+X5`3hjLDPkdR%M zK&tHO;m)rj!AIp0251fQBx-p^bbb?wPMaQCT9#D{GBz{7VnUL$+bXNu`a*7nL?svE zNzY!*g3Y{u&fYS!zRGxB!s5K%`V3M~l5=vp78#rF5gf7)ll&hrQQU`#r%&Aff(gJ9 zX}}53eq#wPr?jrMB0Pf0dc|3sSvw#lZ)Rx@7?F3_jlBH#dw>L;oQZM#%P-=;z*i4S z8U~~Ul~y)VyE*+E{1TFLuTj(4HX|yuv=Q**nVzM^7S5oUL%t z5g}1&ojuRU%tKOd*VYB0`UnW}qE9MdMBiqJC-{q}Q=A-D7isU56dsvFAvO(){CGf4 z2`)OOD4X2X!)xy2;AhGG#9F|^|8+poHa+TIX=p?H_$cqdFyxqlr4>{kBjvq+K|*@b z%*cn8of#<|a{xxyWApEq)-X0&9>1Jaf*T2gwe+04u$DoYr8!Mc+Ix6k_Cz4Z3^TL+ zovy~>LQ@It6^zayj>?ZvODU=tn5H!K4R`h988shPzR2#!;zL-s2to-O;}dmqR+0z>t5vARwr!tZC_F7=dvq&nV6-qqGeGEKrw6dgJit+^%5O99 zncwnzqDi54*HsX!+W19x4-2g$-TZK=&i2G6fM(pSpJ((9PdQ*RBclk!`v7b<1tC($ zwa=Zyd4?&#tWo|U;n^9to4fkhGaHLShtzc)BhqvJ?t1ik?ER{Qu(m4fH=vUa7t?{n zm0$Ltt5p~u+)JAs|0)Ffc}CgL)x|p~>#y5!c=q_{?&iUxDyv7GjCAcUxyEOl$NYZ* zI?Bd&s6V2k>^2R=actqd*8{G+euvBv~PMm1TlwiYFnAg9k`Lo;p^J#232 zotWi`9<&X;06mQliH#^N1Tx~2H~5vbVrpmi`>DkpkR-qKQ7ymV@YJHphc&EM3tM{| z5)imcKxkOPts-1#?DTp?SzWuh@(GyMw#tto%DlsPJhAk39VDl5$k5{Vm})xlyAN1= zl7g97BF$p&bTMn9ZxSf0<2+H2I!xEz=J$x$6vF+MhqNL5+*)n~ky<`6GrzMd{;NLB z#2J?upZlPm#+aC|Yh_5v9+(3QI(lD=%@1;`>wU}F=7E%#O`!HRPJx+ucc~NIFIwo5 zQrsmGAx#C{GbuXPqcchi$)E##l7=8j2`I2V7XxqSG*y2~R5BvkN(OLGZ_lKgnRONW zR*e5IF9xi5d|~a#ajWpZoAHC(_n)_iRaJEj&%%B?Z)|-cISIpg&)wMK1Iww|TDZc@ z(Ydh&#U)|wLsjcPL6vyBG7500nME!NNBHY@TQ%dqjEGou%QZA3dF?BZrVkx4I4P~I zXMrm54@!SOuiSJ)=Md^m-s%Oq&G4O<2mE=y^D>9SyW>y!VAwTptt3XN@y`;9Iw_W7a+IK6D zz@o9&;*)brr&qh!3-cmi>66#}&ba!8#KcN--hh>%4v~zvfRRw^VeB#Prr7@h5|j<4 diff --git a/Content/aerowalk_uv/common clip.flax b/Content/aerowalk_uv/common clip.flax index 77cf7ab67ba1b984d6a34ba405a7a17cd633515d..39349b4482c2635fdfc2b713dcdd0d5819a22a23 100644 GIT binary patch delta 4323 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 McQVfUg~cZR58+LI6#xJL delta 3995 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 F{|mXp1ib(N diff --git a/GoakeFlax.code-workspace b/GoakeFlax.code-workspace index ae2d3e6..578fec4 100644 --- a/GoakeFlax.code-workspace +++ b/GoakeFlax.code-workspace @@ -14,7 +14,7 @@ }, { "name": "Flax", - "path": "C:\\dev\\Flax\\FlaxEngine" + "path": "C:\\dev\\Flax\\Flax_master" } ] } \ No newline at end of file diff --git a/Source/Game/Cabrito/Console/ConsoleContentTextBox.cs b/Source/Game/Cabrito/Console/ConsoleContentTextBox.cs index 727a9cb..ea6c91c 100644 --- a/Source/Game/Cabrito/Console/ConsoleContentTextBox.cs +++ b/Source/Game/Cabrito/Console/ConsoleContentTextBox.cs @@ -461,7 +461,9 @@ namespace Cabrito else if (key == KeyboardKeys.PageUp) { ScrollOffset += GetHeightInLines() / 2; - var maxOffset = Console.Lines.Count - GetHeightInLines(); + // should count the wrapped line count here over Console.Lines.Count + //var maxOffset = Console.Lines.Count - GetHeightInLines(); + var maxOffset = Console.Lines.Count - 1; if (ScrollOffset > maxOffset) ScrollOffset = maxOffset; } diff --git a/Source/Game/Cabrito/FpsScript.cs b/Source/Game/Cabrito/FpsScript.cs index 787a9e2..7fa3de0 100644 --- a/Source/Game/Cabrito/FpsScript.cs +++ b/Source/Game/Cabrito/FpsScript.cs @@ -88,8 +88,7 @@ namespace Cabrito sb.Append("\nuFPS: " + ((int) Math.Round(1.0f / updateTimeAvg)).ToString()); sb.Append("\nrFPS: " + ((int) Math.Round(1.0f / drawTimeAvg)).ToString()); sb.Append("\npFPS: " + ((int) Math.Round(1.0f / physicsTimeAvg)).ToString()); - sb.Append("\nCon: " + conTime.ToString() + "ms"); - sb.Append("\n" + currentRenderer); + //sb.Append("\nCon: " + conTime.ToString() + "ms"); //sb.Append("\nGC memory: " + (GC.GetTotalMemory(false) / 1000000.0f).ToString() + "MB"); //sb.Append("\nUpdate profiler: " + updateProfTime.ToString() + "ms"); diff --git a/Source/Game/PlayerInput.cs b/Source/Game/PlayerInput.cs index 5b96499..30fe3f0 100644 --- a/Source/Game/PlayerInput.cs +++ b/Source/Game/PlayerInput.cs @@ -16,6 +16,10 @@ namespace Game public float moveRight; public bool attacking; public bool jumping; + + public Vector3 verificationPosition; + public Vector3 verificationVelocity; + public Quaternion verificationOrientation; } [StructLayout(LayoutKind.Sequential)] @@ -36,7 +40,6 @@ namespace Game public class PlayerInput { - public PlayerState lastState; public PlayerState currentState; public ulong frame; @@ -54,9 +57,8 @@ namespace Game { } - public void RecordCurrentActorState(PlayerActorState actorState) + public virtual void RecordCurrentActorState(PlayerActorState actorState) { - currentState.actor = actorState; } public PlayerInputState GetCurrentInputState() diff --git a/Source/Game/PlayerInputDemo.cs b/Source/Game/PlayerInputDemo.cs index 2f8ffc6..55c0854 100644 --- a/Source/Game/PlayerInputDemo.cs +++ b/Source/Game/PlayerInputDemo.cs @@ -35,7 +35,7 @@ namespace Game { int rawsize = Marshal.SizeOf(typeof(T)); if (rawsize > rawData.Length - position) - throw new ArgumentException("Not enough data to fill struct. Array length from position: "+(rawData.Length-position) + ", Struct length: "+rawsize); + throw new ArgumentException("Not enough data to fill struct. Array length from position: " + (rawData.Length-position) + ", Struct length: " + rawsize); IntPtr buffer = Marshal.AllocHGlobal(rawsize); Marshal.Copy(rawData, position, buffer, rawsize); T retobj = (T)Marshal.PtrToStructure(buffer, typeof(T)); @@ -56,21 +56,19 @@ namespace Game bufferEnumerable = buffer.GetEnumerator(); Console.Print("demo numstates: " + buffer.Count); + + OnEndFrame(); // advances to first frame } - public override void OnUpdate() - { - lastState = currentState; - } - - public override void OnFixedUpdate() - { - } - + private int asdf = 0; public override void OnEndFrame() { // TODO: check if the current state frame matches the current frame number before advancing + /*asdf++; + if (asdf < 8) + return;*/ + if (bufferEnumerable == null || !bufferEnumerable.MoveNext()) { if (buffer.Any()) @@ -85,6 +83,7 @@ namespace Game //var actorState = currentState.actor; currentState.input = bufferEnumerable.Current; + //frame++; //currentState.actor = actorState; } } diff --git a/Source/Game/PlayerInputLocal.cs b/Source/Game/PlayerInputLocal.cs index f190dc5..6c27034 100644 --- a/Source/Game/PlayerInputLocal.cs +++ b/Source/Game/PlayerInputLocal.cs @@ -4,6 +4,7 @@ using System.IO; using System.Net; using System.Runtime.InteropServices; using FlaxEngine; +using Console = Cabrito.Console; namespace Game { @@ -14,10 +15,6 @@ namespace Game public bool IsRecording { get { return demoFileStream != null; } } - public PlayerInputLocal() - { - } - public PlayerInputLocal(string demoPath) { demoFileStream = File.Open(demoPath, FileMode.Create, FileAccess.Write); @@ -29,32 +26,55 @@ namespace Game public override void OnUpdate() { - lastState = currentState; + // Collect anything framerate independent here like camera movement + // All axis values here should be accumulated, and binary actions OR'ed + currentState.input.viewDeltaX += InputManager.GetAxisRaw("Mouse X"); + currentState.input.viewDeltaY += InputManager.GetAxisRaw("Mouse Y"); - // Record camera angles here? - currentState.input.viewDeltaX = InputManager.GetAxisRaw("Mouse X"); - currentState.input.viewDeltaY = InputManager.GetAxisRaw("Mouse Y"); - } - - public override void OnFixedUpdate() - { - // Record intent here currentState.input.moveForward = InputManager.GetAxis("Vertical"); currentState.input.moveRight = InputManager.GetAxis("Horizontal"); currentState.input.attacking = InputManager.GetAction("Attack"); currentState.input.jumping = InputManager.GetAction("Jump"); } + public override void OnFixedUpdate() + { + // Collect all input here + /*currentState.input.moveForward = InputManager.GetAxis("Vertical"); + currentState.input.moveRight = InputManager.GetAxis("Horizontal"); + currentState.input.attacking = InputManager.GetAction("Attack"); + currentState.input.jumping = InputManager.GetAction("Jump");*/ + } + public override void OnEndFrame() { if (IsRecording) { + currentState.input.verificationPosition = currentState.actor.position; + currentState.input.verificationOrientation = currentState.actor.orientation; + currentState.input.verificationVelocity = currentState.actor.velocity; + currentState.input.frame = frame; buffer.Add(currentState.input); } + + // Reset anything accumulatable here + currentState.input.viewDeltaX = 0; + currentState.input.viewDeltaY = 0; + frame++; } + public override void RecordCurrentActorState(PlayerActorState actorState) + { + if (!IsRecording) + return; + + if (actorState.position.Length <= 0.01) + Console.Print("wrong recorded position?"); + currentState.actor = actorState; + } + public void FlushDemo() { if (!IsRecording) diff --git a/Source/Game/PlayerMovement.cs b/Source/Game/PlayerMovement.cs index 553a2d7..861d3ff 100644 --- a/Source/Game/PlayerMovement.cs +++ b/Source/Game/PlayerMovement.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using FlaxEngine; using System.Diagnostics; using System.Threading.Tasks; +using FlaxEditor.CustomEditors.Editors; using FlaxEngine.Assertions; using Console = Cabrito.Console; using Debug = FlaxEngine.Debug; @@ -42,6 +43,10 @@ namespace Game private float viewYaw; private float viewRoll; + private float viewPitchLastFrame; + private float viewYawLastFrame; + private float viewRollLastFrame; + private InputEvent onExit = new InputEvent("Exit"); // FIXME, should be much smaller but needed to avoid issues with box collider edges against brush edges diagonally @@ -56,8 +61,19 @@ namespace Game { base.OnAwake(); - input = new PlayerInputLocal(@"C:\dev\GoakeFlax\testdemo.gdem"); // record - //input = new PlayerInputDemo(@"C:\dev\GoakeFlax\testdemo.gdem"); //playback + bool record = false; + //record = true; + + if (record) + { + input = new PlayerInputLocal(@"C:\dev\GoakeFlax\testdemo.gdem"); // record + } + else + { + //input = new PlayerInputLocal(); + input = new PlayerInputDemo(@"C:\dev\GoakeFlax\testdemo.gdem"); //playback + //input = new PlayerInputDemo(@"C:\dev\GoakeFlax\testdemo_desync.gdem"); //playback + } onExit.Triggered += () => { @@ -73,6 +89,8 @@ namespace Game //rigidBody.CollisionEnter += OnCollisionEnter; //rigidBody.TriggerEnter += OnTriggerEnter; //rigidBody.TriggerExit += OnTriggerExit; + + startupTime = Time.TimeSinceStartup; } public override void OnDisable() @@ -120,13 +138,25 @@ namespace Game viewPitch = initialEulerAngles.X; viewYaw = initialEulerAngles.Y; viewRoll = initialEulerAngles.Z; + viewPitchLastFrame = viewPitch; + viewYawLastFrame = viewYaw; + viewRollLastFrame = viewRoll; } + private int lastInputFrame = 0; + private int currentInputFrame = 0; + private int currentInputFrame2 = 0; + private float startupTime = 0f; public override void OnUpdate() { + //input.OnUpdate(); + + if (input is PlayerInputDemo /*&& currentInputFrame2 >= currentInputFrame*/) + return; + input.OnUpdate(); - if (input.frame > 0) + /*if (input.frame > 0) { PlayerActorState actorState = input.GetCurrentActorState(); Actor.Position = actorState.position; @@ -134,11 +164,96 @@ namespace Game viewYaw = actorState.viewYaw; viewPitch = actorState.viewPitch; viewRoll = actorState.viewRoll; - } + }*/ PlayerInputState inputState = input.GetCurrentInputState(); - // Update camera view + viewYaw = viewYawLastFrame; + viewPitch = viewPitchLastFrame; + viewRoll = viewRollLastFrame; + ApplyInputToCamera(inputState); + + /*input.RecordCurrentActorState(new PlayerActorState() + { + position = Actor.Position, + velocity = currentVelocity, + orientation = rootActor.Orientation, + viewYaw = viewYaw, + viewPitch = viewPitch, + viewRoll = viewRoll + });*/ + currentInputFrame2++; + } + + private Vector3 fixedPosition = Vector3.Zero; + private bool newframe = false; + + public override void OnFixedUpdate() + { + if (input is PlayerInputDemo) + input.OnUpdate(); + + input.OnFixedUpdate(); + PlayerInputState inputState = input.GetCurrentInputState(); + + if (input is PlayerInputDemo) + ApplyInputToCamera(inputState); + + + SimulatePlayerMovement(inputState); + + if (input is PlayerInputDemo) + { + // verify + float positionDelta = (Actor.Position - inputState.verificationPosition).Length; + if (positionDelta > 0.00001) + Console.Print("pos delta: " + positionDelta + " " + (Actor.Position - inputState.verificationPosition)); + + float velocityDelta = (currentVelocity - inputState.verificationVelocity).Length; + if (velocityDelta > 0.00001) + Console.Print("pos vel: " + velocityDelta); + + float orientationDelta = (rootActor.Orientation - inputState.verificationOrientation).Length; + if (orientationDelta > 0.00001) + Console.Print("pos orient: " + rootActor.Orientation); + + //if (currentInputFrame == 0) + /*{ + //Console.Print("repos: " + inputState.verificationPosition); + Actor.Position = inputState.verificationPosition; + currentVelocity = inputState.verificationVelocity; + rootActor.Orientation = inputState.verificationOrientation; + }*/ + } + + input.RecordCurrentActorState(new PlayerActorState() + { + position = Actor.Position, + velocity = currentVelocity, + orientation = rootActor.Orientation, + viewYaw = viewYaw, + viewPitch = viewPitch, + viewRoll = viewRoll + }); + input.OnEndFrame(); + + + + + lastInputFrame = currentInputFrame; + currentInputFrame++; + + viewPitchLastFrame = viewPitch; + viewYawLastFrame = viewYaw; + viewRollLastFrame = viewRoll; + + fixedPosition = Actor.Position; + newframe = true; + } + + private void ApplyInputToCamera(PlayerInputState inputState) + { + // Update camera viewf float xAxis = inputState.viewDeltaX; float yAxis = inputState.viewDeltaY; if (xAxis != 0.0f || yAxis != 0.0f) @@ -148,56 +263,24 @@ namespace Game viewPitch = Mathf.Clamp(viewPitch + yAxis, -90.0f, 90.0f); viewYaw += xAxis; - // root orientation must be set first rootActor.Orientation = Quaternion.Euler(0, viewYaw, 0); camera.Orientation = Quaternion.Euler(viewPitch, viewYaw, viewRoll); } - - input.RecordCurrentActorState(new PlayerActorState() - { - position = Actor.Position, - velocity = currentVelocity, - viewYaw = viewYaw, - viewPitch = viewPitch, - viewRoll = viewRoll - }); } - public override void OnFixedUpdate() - { - input.OnFixedUpdate(); - PlayerInputState inputState = input.GetCurrentInputState(); - - SimulatePlayerMovement(inputState); - - input.RecordCurrentActorState(new PlayerActorState() - { - position = Actor.Position, - velocity = currentVelocity, - viewYaw = viewYaw, - viewPitch = viewPitch, - viewRoll = viewRoll - }); - input.OnEndFrame(); - } - - - - private bool SweepPlayerCollider(Vector3 start, Vector3 end, out RayCastHit[] hits) + private static bool SweepPlayerCollider(Actor actor, Vector3 start, Vector3 end, out RayCastHit[] hits) { Vector3 delta = end - start; float maxDistance = delta.Length; Vector3 direction = delta.Normalized; bool collided = false; - var capsuleCollider = Actor.GetChild(); - var boxCollider = Actor.GetChild(); - var meshCollider = Actor.GetChild(); - PhysicsColliderActor colliderActor = null; + var capsuleCollider = actor.GetChild(); + var boxCollider = actor.GetChild(); + var meshCollider = actor.GetChild(); if (capsuleCollider && capsuleCollider.IsActive) { - colliderActor = capsuleCollider; collided = Physics.CapsuleCastAll(start, capsuleCollider.Radius, capsuleCollider.Height, direction, out hits, capsuleCollider.Orientation, maxDistance, @@ -206,7 +289,6 @@ namespace Game } else if (meshCollider && meshCollider.IsActive) { - colliderActor = meshCollider; collided = Physics.ConvexCastAll(start, meshCollider.CollisionData, meshCollider.Scale, direction, out hits, meshCollider.Orientation, maxDistance, @@ -215,7 +297,6 @@ namespace Game } else if (boxCollider && boxCollider.IsActive) { - colliderActor = boxCollider; collided = Physics.BoxCastAll(start, boxCollider.OrientedBox.Extents, direction, out hits, boxCollider.Orientation, maxDistance, @@ -291,10 +372,11 @@ namespace Game ///

/// Sweeps the player rigidbody in world and returns geometry which was hit during the trace. /// + /// Player actor /// Start position /// End position /// - private TraceInfo TracePlayer(Vector3 start, Vector3 end) + private static TraceInfo TracePlayer(Actor actor, Vector3 start, Vector3 end) { TraceInfo traceInfo = new TraceInfo(); @@ -302,7 +384,7 @@ namespace Game float maxDistance = delta.Length; Vector3 direction = delta.Normalized; - bool collided = SweepPlayerCollider(start, end, out traceInfo.hitInfos); + bool collided = SweepPlayerCollider(actor, start, end, out traceInfo.hitInfos); if (collided) { List hitInfosFiltered = new List(); @@ -312,7 +394,7 @@ namespace Game { //if (hitInfo.Collider == colliderActor) // continue; - if (hitInfo.Collider.Parent == Actor) + if (hitInfo.Collider.Parent == actor) continue; hitInfosFiltered.Add(hitInfo); @@ -411,7 +493,7 @@ namespace Game } #endif - private SlideMoveHit StepSlideMove(ref Vector3 position, ref Vector3 velocity, bool onGround) + private static SlideMoveHit StepSlideMove(Actor actor, ref Vector3 position, ref Vector3 velocity, bool onGround) { if (velocity.IsZero) return SlideMoveHit.Nothing; @@ -419,7 +501,7 @@ namespace Game Vector3 originalPosition = position; Vector3 originalVelocity = velocity; - SlideMoveHit slideMoveHit = SlideMove(ref position, ref velocity); + SlideMoveHit slideMoveHit = SlideMove(actor, ref position, ref velocity); if (slideMoveHit == SlideMoveHit.Nothing) { // TODO: step down here @@ -438,16 +520,16 @@ namespace Game // step up Vector3 stepUp = position + stepDelta; - TraceInfo traceUp = TracePlayer(position, stepUp); + TraceInfo traceUp = TracePlayer(actor, position, stepUp); if (traceUp.fraction > 0f) position = traceUp.endPosition; // try moving from step up position - SlideMoveHit slideMoveStepHit = SlideMove(ref position, ref velocity); + SlideMoveHit slideMoveStepHit = SlideMove(actor, ref position, ref velocity); // step down Vector3 stepDown = position - stepDelta; - TraceInfo traceDown = TracePlayer(position, stepDown); + TraceInfo traceDown = TracePlayer(actor, position, stepDown); if (traceDown.fraction < 1f && -Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal) < slopeNormal) { // can't step down, slide move like normally @@ -508,7 +590,7 @@ namespace Game Other = 4, } - private SlideMoveHit SlideMove(ref Vector3 position, ref Vector3 velocity) + private static SlideMoveHit SlideMove(Actor actor, ref Vector3 position, ref Vector3 velocity) { if (velocity.IsZero) return SlideMoveHit.Nothing; @@ -526,7 +608,7 @@ namespace Game Vector3 startPos = position; Vector3 endPos = position + (velocity * timeleft); - TraceInfo trace = TracePlayer(startPos, endPos); + TraceInfo trace = TracePlayer(actor, startPos, endPos); // TODO: handle portals here float fraction = trace.fraction; @@ -725,7 +807,7 @@ namespace Game Vector3 groundDelta = Physics.Gravity.Normalized;//Physics.Gravity.Normalized * (collisionMargin * 2); //if (velocity.Y < 0f) // groundDelta = Physics.Gravity.Normalized * velocity.Y * Time.DeltaTime; - TraceInfo traceGround = TracePlayer(position, position + groundDelta); + TraceInfo traceGround = TracePlayer(Actor, position, position + groundDelta); if (!traceGround.startSolid && traceGround.fraction < 1f && -Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < slopeNormal) @@ -742,8 +824,10 @@ namespace Game Vector3 point = (position + groundDelta) + (1f - traceGround.fraction) * bounce; + Console.Print("backoff: " + backoff); + // retrace - traceGround = TracePlayer(position, position + point); + traceGround = TracePlayer(Actor, position, position + point); } if (!traceGround.startSolid && (traceGround.fraction >= 1f || @@ -751,9 +835,12 @@ namespace Game { // falling or sliding down a slope onGround = false; + } else { + //if (onGround != !traceGround.startSolid) + // Console.Print("slidefrac: " + traceGround.fraction); onGround = !traceGround.startSolid; //Console.Print("issolid? :" + traceGround.startSolid); } @@ -770,6 +857,7 @@ namespace Game // jump if (onGround && jumpAction && !jumped) { + // reset velocity from gravity if (-Vector3.Dot(Physics.Gravity.Normalized, velocity) < 0 && Vector3.Dot(velocity, traceGround.hitNormal) < -0.1) @@ -782,7 +870,7 @@ namespace Game jumped = true; lastJumped = Time.GameTime; - var jumpLandSound = JumpLandSound; + /*var jumpLandSound = JumpLandSound; for (int i = 0; i < 10; i++) { var r = soundRandom.Next(3); @@ -808,7 +896,7 @@ namespace Game audioSource.Play(); Destroy(audioSource, jumpLandSound.Length); lastJumpLandSound = jumpLandSound; - } + }*/ } if (onGround) @@ -874,15 +962,16 @@ namespace Game // apply gravity velocity += Physics.Gravity * Time.DeltaTime; + //Console.Print(Time.DeltaTime.ToString()); } - safePosition = rigidBody.Position; + //safePosition = rigidBody.Position; currentVelocity = velocity; - if (!rigidBody.IsKinematic) + /*if (!rigidBody.IsKinematic) rigidBody.LinearVelocity = velocity; - else + else*/ { - StepSlideMove(ref position, ref velocity, onGround); + StepSlideMove(Actor, ref position, ref velocity, onGround); rigidBody.Position = position; currentVelocity = velocity; @@ -890,7 +979,7 @@ namespace Game } } - void ApplyAcceleration(ref Vector3 velocity, Vector3 wishDir, float wishspeed, float maxWishspeed, + private static void ApplyAcceleration(ref Vector3 velocity, Vector3 wishDir, float wishspeed, float maxWishspeed, float acceleration) { float wishspeedOrig = wishspeed; diff --git a/Source/Game/Q3MapImporter.cs b/Source/Game/Q3MapImporter.cs index 5917713..3c6a888 100644 --- a/Source/Game/Q3MapImporter.cs +++ b/Source/Game/Q3MapImporter.cs @@ -27,6 +27,7 @@ namespace Game public Dictionary brushMaterials; } + [ExecuteInEditMode] public class Q3MapImporter : Script { //private string mapPath = @"C:\dev\GoakeFlax\Assets\Maps\cube_q1.map"; @@ -188,6 +189,25 @@ namespace Game public override void OnStart() { + LoadMap(false); + } + + private void LoadMap(bool forceLoad) + { + Actor worldSpawnActor = Actor.GetChild("WorldSpawn"); + if (worldSpawnActor != null) + { + if (forceLoad) + { + worldSpawnActor.DestroyChildren(); + } + else + { + //Console.Print("Map already loaded in the scene"); + return; + } + } + { var workDir = Directory.GetCurrentDirectory(); var matBasePath = Path.Combine(workDir, "Content", "Materials"); @@ -218,8 +238,11 @@ namespace Game } } - var worldSpawnActor = Actor.AddChild(); - worldSpawnActor.Name = "WorldSpawn"; + if (worldSpawnActor == null) + { + worldSpawnActor = Actor.AddChild(); + worldSpawnActor.Name = "WorldSpawn"; + } List brushGeometries = new List(root.entities[0].brushes.Count); @@ -265,7 +288,8 @@ namespace Game materials.Add(textureName, brushMaterial); else { - Console.Print("Material '" + textureName + "' not found for brush"); + // TODO: engine doesn't seem to always load the asset even though it exists, bug? seems to happen at low framerate + Console.Print("Material '" + textureName + "' not found for brush, assetPath: " + assetPath); materials.Add(textureName, missingMaterial); brushMaterial = missingMaterial; }