From a1048c487f2c8746b654b49b1a0a1562fbdf9494 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Wed, 9 Jun 2021 12:42:54 +0200 Subject: [PATCH 01/29] Set up CI with Azure Pipelines [skip ci] --- azure-pipelines.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 azure-pipelines.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000..6a9684e79 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,33 @@ +# .NET Desktop +# Build and run tests for .NET Desktop or Windows classic desktop solutions. +# Add steps that publish symbols, save build artifacts, and more: +# https://docs.microsoft.com/azure/devops/pipelines/apps/windows/dot-net + +trigger: +- master + +pool: + vmImage: 'windows-latest' + +variables: + solution: '**/*.sln' + buildPlatform: 'Any CPU' + buildConfiguration: 'Release' + +steps: +- task: NuGetToolInstaller@1 + +- task: NuGetCommand@2 + inputs: + restoreSolution: '$(solution)' + +- task: VSBuild@1 + inputs: + solution: '$(solution)' + platform: '$(buildPlatform)' + configuration: '$(buildConfiguration)' + +- task: VSTest@2 + inputs: + platform: '$(buildPlatform)' + configuration: '$(buildConfiguration)' From 821ecfb7e94e1d2bd9f77e27069b888abc597d52 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Wed, 9 Jun 2021 12:54:51 +0200 Subject: [PATCH 02/29] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6a9684e79..b14247210 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -10,9 +10,9 @@ pool: vmImage: 'windows-latest' variables: - solution: '**/*.sln' + solution: 'Library.sln' buildPlatform: 'Any CPU' - buildConfiguration: 'Release' + buildConfiguration: 'ReleaseStripNoProfiling' steps: - task: NuGetToolInstaller@1 @@ -31,3 +31,16 @@ steps: inputs: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' + +- task: NuGetCommand@2 + inputs: + command: 'pack' + packagesToPack: '$(solution)' + versioningScheme: 'off' + +- task: NuGetCommand@2 + inputs: + command: 'push' + packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg' + nuGetFeedType: 'internal' + publishVstsFeed: 'd04c348e-3752-477f-9659-fb7b72738d76/951cbf21-f9fe-4ddf-835a-1992fcbc702b' \ No newline at end of file From 6ab960b8d8cecae9a7060521ba00b0467f54c8c3 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Wed, 9 Jun 2021 12:55:34 +0200 Subject: [PATCH 03/29] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b14247210..43b278ab3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -4,7 +4,7 @@ # https://docs.microsoft.com/azure/devops/pipelines/apps/windows/dot-net trigger: -- master +- neos-release pool: vmImage: 'windows-latest' From d99023dfb03c998836431f11ce2d9db988890f3a Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Wed, 9 Jun 2021 13:01:21 +0200 Subject: [PATCH 04/29] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 43b278ab3..047f7c2a3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -35,7 +35,7 @@ steps: - task: NuGetCommand@2 inputs: command: 'pack' - packagesToPack: '$(solution)' + packagesToPack: '**\BepuPhysics.csproj' versioningScheme: 'off' - task: NuGetCommand@2 From 78eef1205fd25920ab90707a480ffd6345a7d50b Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Wed, 9 Jun 2021 13:10:57 +0200 Subject: [PATCH 05/29] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 047f7c2a3..641d64719 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -35,7 +35,7 @@ steps: - task: NuGetCommand@2 inputs: command: 'pack' - packagesToPack: '**\BepuPhysics.csproj' + packagesToPack: '**\BepuPhysics.csproj;**\BepuUtilities.csproj' versioningScheme: 'off' - task: NuGetCommand@2 From 5654b16f9faca62abd9965d99e29501ba9fd1c78 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Wed, 9 Jun 2021 13:16:06 +0200 Subject: [PATCH 06/29] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 641d64719..beb3a56cb 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -35,7 +35,14 @@ steps: - task: NuGetCommand@2 inputs: command: 'pack' - packagesToPack: '**\BepuPhysics.csproj;**\BepuUtilities.csproj' + packagesToPack: '**/*.csproj' + configuration: 'ReleaseStrip' + versioningScheme: 'off' + +- task: NuGetCommand@2 + inputs: + command: 'pack' + packagesToPack: '**\BepuPhysics.csproj' versioningScheme: 'off' - task: NuGetCommand@2 From fd9b584b4f9123f0f756080b53bb47abda2c3a86 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Wed, 9 Jun 2021 13:18:43 +0200 Subject: [PATCH 07/29] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index beb3a56cb..65278f103 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -35,7 +35,7 @@ steps: - task: NuGetCommand@2 inputs: command: 'pack' - packagesToPack: '**/*.csproj' + packagesToPack: '**\BepuUtilities.csproj' configuration: 'ReleaseStrip' versioningScheme: 'off' From 791ca32c2fb492ddcfb3bf96cc5e8b0e1ad5f220 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Wed, 9 Jun 2021 13:22:15 +0200 Subject: [PATCH 08/29] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 65278f103..dff649cd4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -37,13 +37,13 @@ steps: command: 'pack' packagesToPack: '**\BepuUtilities.csproj' configuration: 'ReleaseStrip' - versioningScheme: 'off' + versioningScheme: 'byBuildNumber' - task: NuGetCommand@2 inputs: command: 'pack' packagesToPack: '**\BepuPhysics.csproj' - versioningScheme: 'off' + versioningScheme: 'byBuildNumber' - task: NuGetCommand@2 inputs: From 381fd64c8fa02a209e5f22c587aab3048c28c5c2 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Wed, 9 Jun 2021 13:27:53 +0200 Subject: [PATCH 09/29] Update azure-pipelines.yml for Azure Pipelines --- azure-pipelines.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index dff649cd4..061196bca 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -37,13 +37,19 @@ steps: command: 'pack' packagesToPack: '**\BepuUtilities.csproj' configuration: 'ReleaseStrip' - versioningScheme: 'byBuildNumber' + versioningScheme: 'byPrereleaseNumber' + majorVersion: '2' + minorVersion: '4' + patchVersion: '0' - task: NuGetCommand@2 inputs: command: 'pack' packagesToPack: '**\BepuPhysics.csproj' - versioningScheme: 'byBuildNumber' + versioningScheme: 'byPrereleaseNumber' + majorVersion: '2' + minorVersion: '4' + patchVersion: '0' - task: NuGetCommand@2 inputs: From df7bfa6161bd98c07e798342a6ab2261c6847241 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 27 Jun 2021 23:22:34 +0200 Subject: [PATCH 10/29] Some testing for dual sided triangle raycasts (WIP) --- BepuPhysics/Collidables/Triangle.cs | 41 ++++++++++++++++++++++++- DemoUtilities/Window.cs | 4 +-- Demos/DemoSet.cs | 9 +++++- Demos/Demos/Characters/CharacterDemo.cs | 40 ++++++++++++++++++++++-- Demos/Demos/ContactEventsDemo.cs | 8 +++++ 5 files changed, 95 insertions(+), 7 deletions(-) diff --git a/BepuPhysics/Collidables/Triangle.cs b/BepuPhysics/Collidables/Triangle.cs index 374bbe050..cd441ceef 100644 --- a/BepuPhysics/Collidables/Triangle.cs +++ b/BepuPhysics/Collidables/Triangle.cs @@ -95,13 +95,52 @@ public static bool RayTest(in Vector3 a, in Vector3 b, in Vector3 c, in Vector3 return true; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool RayTestDualSided(in Vector3 a, in Vector3 b, in Vector3 c, in Vector3 origin, in Vector3 direction, out float t, out Vector3 normal) + { + var ab = b - a; + var ac = c - a; + normal = Vector3.Cross(ac, ab); + var dn = -Vector3.Dot(direction, normal); + if (dn <= 0) + { + normal *= -1; + dn *= -1; + ab *= -1; + ac *= -1; + } + var ao = origin - a; + t = Vector3.Dot(ao, normal); + if (t < 0) + { + //Impact occurred before the start of the ray. + return false; + } + var aoxd = Vector3.Cross(ao, direction); + var v = -Vector3.Dot(ac, aoxd); + if (v < 0 || v > dn) + { + //Invalid barycentric coordinate for b. + return false; + } + var w = Vector3.Dot(ab, aoxd); + if (w < 0 || v + w > dn) + { + //Invalid barycentric coordinate for b and/or c. + return false; + } + t /= dn; + normal /= (float)Math.Sqrt(Vector3.Dot(normal, normal)); + return true; + } + public bool RayTest(in RigidPose pose, in Vector3 origin, in Vector3 direction, out float t, out Vector3 normal) { var offset = origin - pose.Position; Matrix3x3.CreateFromQuaternion(pose.Orientation, out var orientation); Matrix3x3.TransformTranspose(offset, orientation, out var localOffset); Matrix3x3.TransformTranspose(direction, orientation, out var localDirection); - if (RayTest(A, B, C, localOffset, localDirection, out t, out normal)) + if (RayTestDualSided(A, B, C, localOffset, localDirection, out t, out normal)) { Matrix3x3.Transform(normal, orientation, out normal); return true; diff --git a/DemoUtilities/Window.cs b/DemoUtilities/Window.cs index c70b59c9c..64c16e08c 100644 --- a/DemoUtilities/Window.cs +++ b/DemoUtilities/Window.cs @@ -95,8 +95,8 @@ public Int2 Resolution public Window(string title, Int2 resolution, Int2 location, WindowMode windowMode) { window = new NativeWindow(location.X, location.Y, resolution.X, resolution.Y, title, GameWindowFlags.FixedWindow, GraphicsMode.Default, DisplayDevice.Default); - Debug.Assert(window.ClientSize.Width == resolution.X); - Debug.Assert(window.ClientSize.Height == resolution.Y); + //Debug.Assert(window.ClientSize.Width == resolution.X); + //Debug.Assert(window.ClientSize.Height == resolution.Y); window.Visible = true; Resolution = resolution; window.Resize += (form, args) => resized = true; diff --git a/Demos/DemoSet.cs b/Demos/DemoSet.cs index 73907d3a1..9cc8d7812 100644 --- a/Demos/DemoSet.cs +++ b/Demos/DemoSet.cs @@ -45,6 +45,9 @@ struct Option public DemoSet() { + AddOption(); + AddOption(); + AddOption(); AddOption(); AddOption(); AddOption(); @@ -54,6 +57,7 @@ public DemoSet() AddOption(); AddOption(); AddOption(); + AddOption(); AddOption(); AddOption(); AddOption(); @@ -61,11 +65,14 @@ public DemoSet() AddOption(); AddOption(); AddOption(); - AddOption(); AddOption(); AddOption(); AddOption(); AddOption(); + AddOption(); + AddOption(); + AddOption(); + AddOption(); } public int Count { get { return options.Count; } } diff --git a/Demos/Demos/Characters/CharacterDemo.cs b/Demos/Demos/Characters/CharacterDemo.cs index 6dd2a12fa..cb3ee425f 100644 --- a/Demos/Demos/Characters/CharacterDemo.cs +++ b/Demos/Demos/Characters/CharacterDemo.cs @@ -9,6 +9,7 @@ using DemoUtilities; using DemoRenderer.UI; using OpenTK.Input; +using System.Collections.Generic; namespace Demos.Demos.Characters { @@ -18,8 +19,13 @@ namespace Demos.Demos.Characters public class CharacterDemo : Demo { CharacterControllers characters; + List staticPlatforms = new List(); + public unsafe override void Initialize(ContentArchive content, Camera camera) { + var result = Triangle.RayTestDualSided(new Vector3(0f, 1f, 0f), new Vector3(1f, -1f, 0f), new Vector3(-1f, -1f, 0f), + Vector3.UnitZ * -1, Vector3.UnitZ, out float t, out Vector3 normal); + camera.Position = new Vector3(20, 10, 20); camera.Yaw = MathF.PI; camera.Pitch = 0; @@ -152,7 +158,7 @@ public unsafe override void Initialize(ContentArchive content, Camera camera) { for (int j = 0; j < width; ++j) { - Simulation.Statics.Add(new StaticDescription(new Vector3(box.Width, 0, box.Length) * new Vector3(i, 0, j) + new Vector3(32f, 1, 0), boxCollidable)); + staticPlatforms.Add(Simulation.Statics.Add(new StaticDescription(new Vector3(box.Width, 0, box.Length) * new Vector3(i, 0, j) + new Vector3(32f, 1, 0), boxCollidable))); } } @@ -172,7 +178,7 @@ struct MovingPlatform public MovingPlatform(CollidableDescription collidable, double timeOffset, float goalSatisfactionTime, Simulation simulation, Func poseCreator) { PoseCreator = poseCreator; - BodyHandle = simulation.Bodies.Add(BodyDescription.CreateKinematic(poseCreator(timeOffset), collidable, new BodyActivityDescription(-1))); + BodyHandle = simulation.Bodies.Add(BodyDescription.CreateKinematic(poseCreator(timeOffset), collidable, new BodyActivityDescription(0.1f))); InverseGoalSatisfactionTime = 1f / goalSatisfactionTime; TimeOffset = timeOffset; } @@ -187,6 +193,9 @@ public void Update(Simulation simulation, double time) QuaternionEx.GetRelativeRotationWithoutOverlap(pose.Orientation, targetPose.Orientation, out var rotation); QuaternionEx.GetAxisAngleFromQuaternion(rotation, out var axis, out var angle); velocity.Angular = axis * (angle * InverseGoalSatisfactionTime); + + if (velocity.Linear.Length() > 1e-5f && !body.Awake) + body.Awake = true; } } MovingPlatform[] movingPlatforms; @@ -194,6 +203,7 @@ public void Update(Simulation simulation, double time) bool characterActive; CharacterInput character; double time; + double updateTime; void CreateCharacter(Vector3 position) { characterActive = true; @@ -202,7 +212,20 @@ void CreateCharacter(Vector3 position) public override void Update(Window window, Camera camera, Input input, float dt) { + if(input.WasPushed(Key.U)) + { + foreach(var handle in staticPlatforms) + { + var index = Simulation.Statics.HandleToIndex[handle.Value]; + ref var pose = ref Simulation.Statics.Poses[index]; + + pose.Position += Vector3.UnitX; + } + } + + const float simulationDt = 1 / 60f; + if (input.WasPushed(Key.C)) { if (characterActive) @@ -221,7 +244,18 @@ public override void Update(Window window, Camera camera, Input input, float dt) character.UpdateCharacterGoals(input, camera, simulationDt); } //Using a fixed time per update to match the demos simulation update rate. - time += 1 / 60f; + updateTime += 1 / 60f; + + Simulation.Bodies.GetDescription(character.BodyHandle, out BodyDescription description); + Simulation.Shapes.RecursivelyRemoveAndDispose(description.Collidable.Shape, BufferPool); + var shapeIndex = Simulation.Shapes.Add(new Capsule(0.5f, MathF.Sin((float)updateTime) + 1f)); + Simulation.Bodies.SetShape(character.BodyHandle, shapeIndex); + + /*if(updateTime % 20 > 10) + time += 1 / 60f;*/ + + time += Math.Max(0, Math.Sin(updateTime) / 60f); + for (int i = 0; i < movingPlatforms.Length; ++i) { movingPlatforms[i].Update(Simulation, time); diff --git a/Demos/Demos/ContactEventsDemo.cs b/Demos/Demos/ContactEventsDemo.cs index 7014872aa..21861d873 100644 --- a/Demos/Demos/ContactEventsDemo.cs +++ b/Demos/Demos/ContactEventsDemo.cs @@ -57,6 +57,7 @@ public interface IContactEventHandler void OnContactAdded(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, in Vector3 contactOffset, in Vector3 contactNormal, float depth, int featureId, int contactIndex, int workerIndex) where TManifold : unmanaged, IContactManifold { + Console.WriteLine($"OnContactAdded<{typeof(TManifold)}>"); } /// @@ -70,6 +71,7 @@ void OnContactAdded(CollidableReference eventSource, CollidablePair p /// Index of the worker thread that fired this event. void OnContactRemoved(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int removedFeatureId, int workerIndex) where TManifold : unmanaged, IContactManifold { + Console.WriteLine($"OnContactAdded<{typeof(TManifold)}>"); } /// @@ -82,6 +84,7 @@ void OnContactRemoved(CollidableReference eventSource, CollidablePair /// Index of the worker thread that fired this event. void OnStartedTouching(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { + Console.WriteLine($"OnStartedTouching<{typeof(TManifold)}>"); } /// @@ -94,6 +97,7 @@ void OnStartedTouching(CollidableReference eventSource, CollidablePai /// Index of the worker thread that fired this event. void OnTouching(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { + //Console.WriteLine($"OnTouching<{typeof(TManifold)}>"); } @@ -107,6 +111,7 @@ void OnTouching(CollidableReference eventSource, CollidablePair pair, /// Index of the worker thread that fired this event. void OnStoppedTouching(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { + Console.WriteLine($"OnStoppedTouching<{typeof(TManifold)}>"); } @@ -120,6 +125,7 @@ void OnStoppedTouching(CollidableReference eventSource, CollidablePai /// Index of the worker thread that fired this event. void OnPairCreated(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { + Console.WriteLine($"OnPairCreated<{typeof(TManifold)}>"); } /// @@ -132,6 +138,7 @@ void OnPairCreated(CollidableReference eventSource, CollidablePair pa /// Index of the worker thread that fired this event. void OnPairUpdated(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { + //Console.WriteLine($"OnPairUpdated<{typeof(TManifold)}>"); } /// @@ -142,6 +149,7 @@ void OnPairUpdated(CollidableReference eventSource, CollidablePair pa /// Collidable pair triggering the event. void OnPairEnded(CollidableReference eventSource, CollidablePair pair) { + Console.WriteLine($"OnPairEnded"); } } From 0b5be48c503d48bf7235092f3f58f56d3ce5d005 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 27 Jun 2021 23:42:55 +0200 Subject: [PATCH 11/29] Actually use the dualsided method for test --- BepuPhysics/Collidables/Mesh.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BepuPhysics/Collidables/Mesh.cs b/BepuPhysics/Collidables/Mesh.cs index b886e2849..a269e161e 100644 --- a/BepuPhysics/Collidables/Mesh.cs +++ b/BepuPhysics/Collidables/Mesh.cs @@ -209,7 +209,7 @@ unsafe struct HitLeafTester : IRayLeafTester where T : IShapeRayHitHandler public unsafe void TestLeaf(int leafIndex, RayData* rayData, float* maximumT) { ref var triangle = ref Triangles[leafIndex]; - if (Triangle.RayTest(triangle.A, triangle.B, triangle.C, rayData->Origin, rayData->Direction, out var t, out var normal) && t <= *maximumT) + if (Triangle.RayTestDualSided(triangle.A, triangle.B, triangle.C, rayData->Origin, rayData->Direction, out var t, out var normal) && t <= *maximumT) { //Pull the hit back into world space before handing it off to the user. This does cost a bit more, but not much, and you can always add a specialized no-transform path later. Matrix3x3.Transform(normal * InverseScale, Orientation, out normal); From 891d6ff4876f6ce6ce944291c2ad016899f460a9 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 25 Jul 2021 12:20:35 +0200 Subject: [PATCH 12/29] - Initial implementation of fast boolean checks (doesn't test every single element of compound colliders, only cares if there's any hit or not, currently only homogenous ones) - Tree leaf/node count access to support external serialization - Fast mesh bounds option - Cherry picked convex hull transformed copy from upstream --- BepuPhysics/BepuPhysics.csproj | 2 +- BepuPhysics/Collidables/BigCompound.cs | 10 +-- BepuPhysics/Collidables/Compound.cs | 8 +- BepuPhysics/Collidables/ConvexHullHelper.cs | 84 ++++++++++++++++++ BepuPhysics/Collidables/Mesh.cs | 54 ++++++++++-- .../ConvexCompoundOverlapFinder.cs | 5 +- .../CollisionDetection/SweepTaskRegistry.cs | 42 +++++++++ .../CompoundHomogeneousCompoundSweepTask.cs | 5 ++ .../CompoundPairSweepOverlapFinder.cs | 7 +- .../ConvexCompoundSweepOverlapFinder.cs | 29 ++++++- .../SweepTasks/ConvexCompoundSweepTask.cs | 3 +- .../ConvexHomogeneousCompoundSweepTask.cs | 86 ++++++++++++++++++- BepuPhysics/Simulation_Queries.cs | 49 +++++++---- BepuPhysics/Trees/Tree.cs | 8 ++ BepuPhysics/Trees/Tree_Sweep.cs | 2 +- BepuUtilities/BepuUtilities.csproj | 6 +- Demos/Demos/CustomVoxelCollidableDemo.cs | 8 +- Demos/SpecializedTests/ConvexHullTestDemo.cs | 15 +++- 18 files changed, 376 insertions(+), 47 deletions(-) diff --git a/BepuPhysics/BepuPhysics.csproj b/BepuPhysics/BepuPhysics.csproj index b6fbd635e..142c9d67e 100644 --- a/BepuPhysics/BepuPhysics.csproj +++ b/BepuPhysics/BepuPhysics.csproj @@ -43,7 +43,7 @@ true - TRACE;RELEASE;NETSTANDARD2_0;RELEASESTRIP + TRACE;DEBUG;RELEASE;NETSTANDARD2_0;RELEASESTRIP;FAST_MESH_BOUNDS diff --git a/BepuPhysics/Collidables/BigCompound.cs b/BepuPhysics/Collidables/BigCompound.cs index a172c3b96..55880ff83 100644 --- a/BepuPhysics/Collidables/BigCompound.cs +++ b/BepuPhysics/Collidables/BigCompound.cs @@ -193,13 +193,11 @@ public void TestLeaf(int leafIndex, ref float maximumT) Unsafe.AsRef(Overlaps).Allocate(Pool) = leafIndex; } } - public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) - where TOverlaps : ICollisionTaskSubpairOverlaps + + public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, ref TLeafTester leafTester) + where TLeafTester : ISweepLeafTester { - SweepLeafTester enumerator; - enumerator.Pool = pool; - enumerator.Overlaps = overlaps; - Tree.Sweep(min, max, sweep, maximumT, ref enumerator); + Tree.Sweep(min, max, sweep, maximumT, ref leafTester); } public void Dispose(BufferPool bufferPool) diff --git a/BepuPhysics/Collidables/Compound.cs b/BepuPhysics/Collidables/Compound.cs index 3624a4b7e..93cadb932 100644 --- a/BepuPhysics/Collidables/Compound.cs +++ b/BepuPhysics/Collidables/Compound.cs @@ -259,12 +259,11 @@ public unsafe void FindLocalOverlaps(ref Buffer(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlapsPointer) - where TOverlaps : ICollisionTaskSubpairOverlaps + public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, ref TLeafTester leafTester) + where TLeafTester : ISweepLeafTester { Tree.ConvertBoxToCentroidWithExtent(min, max, out var sweepOrigin, out var expansion); TreeRay.CreateFrom(sweepOrigin, sweep, maximumT, out var ray); - ref var overlaps = ref Unsafe.AsRef(overlapsPointer); for (int i = 0; i < Children.Length; ++i) { ref var child = ref Children[i]; @@ -273,10 +272,9 @@ public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, childMax = childMax + child.LocalPose.Position + expansion; if (Tree.Intersects(childMin, childMax, &ray, out _)) { - overlaps.Allocate(pool) = i; + leafTester.TestLeaf(i, ref maximumT); } } - } public void Dispose(BufferPool bufferPool) diff --git a/BepuPhysics/Collidables/ConvexHullHelper.cs b/BepuPhysics/Collidables/ConvexHullHelper.cs index d074d1d41..6f4a7252d 100644 --- a/BepuPhysics/Collidables/ConvexHullHelper.cs +++ b/BepuPhysics/Collidables/ConvexHullHelper.cs @@ -849,5 +849,89 @@ public static void CreateShape(Span points, BufferPool pool, out Vector if (hullData.OriginalVertexMapping.Allocated) hullData.Dispose(pool); } + + + /// + /// Creates a transformed copy of a convex hull. + /// + /// Source convex hull to copy. + /// Transform to apply to the hull points. + /// Transformed points in the copy target hull. + /// Transformed bounding planes in the copy target hull. + public static void CreateTransformedCopy(in ConvexHull source, in Matrix3x3 transform, Buffer targetPoints, Buffer targetBoundingPlanes) + { + if (targetPoints.Length < source.Points.Length) + throw new ArgumentException("Target points buffer cannot hold the copy.", nameof(targetPoints)); + if (targetBoundingPlanes.Length < source.BoundingPlanes.Length) + throw new ArgumentException("Target bounding planes buffer cannot hold the copy.", nameof(targetBoundingPlanes)); + Matrix3x3Wide.Broadcast(transform, out var transformWide); + for (int i = 0; i < source.Points.Length; ++i) + { + Matrix3x3Wide.TransformWithoutOverlap(source.Points[i], transformWide, out targetPoints[i]); + } + Matrix3x3.Invert(transform, out var inverse); + Matrix3x3Wide.Broadcast(inverse, out var inverseWide); + for (int i = 0; i < source.BoundingPlanes.Length; ++i) + { + Matrix3x3Wide.TransformByTransposedWithoutOverlap(source.BoundingPlanes[i].Normal, inverseWide, out var normal); + Vector3Wide.Normalize(normal, out targetBoundingPlanes[i].Normal); + } + + for (int faceIndex = 0; faceIndex < source.FaceToVertexIndicesStart.Length; ++faceIndex) + { + //This isn't exactly an optimal implementation- it uses a pretty inefficient gather, but any optimization can wait for it being a problem. + var vertexIndex = source.FaceVertexIndices[source.FaceToVertexIndicesStart[faceIndex]]; + BundleIndexing.GetBundleIndices(faceIndex, out var bundleIndex, out var indexInBundle); + Vector3Wide.ReadSlot(ref targetPoints[vertexIndex.BundleIndex], vertexIndex.InnerIndex, out var point); + Vector3Wide.ReadSlot(ref targetBoundingPlanes[bundleIndex].Normal, indexInBundle, out var normal); + GatherScatter.Get(ref targetBoundingPlanes[bundleIndex].Offset, indexInBundle) = Vector3.Dot(point, normal); + } + + //Clear any trailing bounding plane data to keep it from contributing. + var boundingPlaneCapacity = targetBoundingPlanes.Length * Vector.Count; + for (int i = source.FaceToVertexIndicesStart.Length; i < boundingPlaneCapacity; ++i) + { + BundleIndexing.GetBundleIndices(i, out var bundleIndex, out var innerIndex); + ref var offsetInstance = ref GatherScatter.GetOffsetInstance(ref targetBoundingPlanes[bundleIndex], innerIndex); + Vector3Wide.WriteFirst(default, ref offsetInstance.Normal); + GatherScatter.GetFirst(ref offsetInstance.Offset) = float.MinValue; + } + } + + /// + /// Creates a transformed copy of a convex hull. FaceVertexIndices and FaceToVertexIndicesStart buffers from the source are reused in the copy target. + /// Note that disposing two convex hulls with the same buffers will cause errors; disposal must be handled carefully to avoid double freeing the shared buffers. + /// + /// Source convex hull to copy. + /// Transform to apply to the hull points. + /// Pool from which to allocate the new hull's points and bounding planes buffers. + /// Target convex hull to copy into. FaceVertexIndices and FaceToVertexIndicesStart buffers are reused from the source. + public static void CreateTransformedShallowCopy(in ConvexHull source, in Matrix3x3 transform, BufferPool pool, out ConvexHull target) + { + pool.Take(source.Points.Length, out target.Points); + pool.Take(source.BoundingPlanes.Length, out target.BoundingPlanes); + CreateTransformedCopy(source, transform, target.Points, target.BoundingPlanes); + target.FaceVertexIndices = source.FaceVertexIndices; + target.FaceToVertexIndicesStart = source.FaceToVertexIndicesStart; + } + + /// + /// Creates a transformed copy of a convex hull. Unique FaceVertexIndices and FaceToVertexIndicesStart buffers are allocated for the copy target. + /// + /// Source convex hull to copy. + /// Transform to apply to the hull points. + /// Pool from which to allocate the new hull's buffers. + /// Target convex hull to copy into. + public static void CreateTransformedCopy(in ConvexHull source, in Matrix3x3 transform, BufferPool pool, out ConvexHull target) + { + pool.Take(source.Points.Length, out target.Points); + pool.Take(source.BoundingPlanes.Length, out target.BoundingPlanes); + pool.Take(source.FaceVertexIndices.Length, out target.FaceVertexIndices); + pool.Take(source.FaceToVertexIndicesStart.Length, out target.FaceToVertexIndicesStart); + CreateTransformedCopy(source, transform, target.Points, target.BoundingPlanes); + source.FaceVertexIndices.CopyTo(0, target.FaceVertexIndices, 0, target.FaceVertexIndices.Length); + source.FaceToVertexIndicesStart.CopyTo(0, target.FaceToVertexIndicesStart, 0, target.FaceToVertexIndicesStart.Length); + } + } } diff --git a/BepuPhysics/Collidables/Mesh.cs b/BepuPhysics/Collidables/Mesh.cs index b886e2849..f12c66840 100644 --- a/BepuPhysics/Collidables/Mesh.cs +++ b/BepuPhysics/Collidables/Mesh.cs @@ -46,6 +46,33 @@ public struct Mesh : IHomogeneousCompoundShape public Buffer Triangles; internal Vector3 scale; internal Vector3 inverseScale; +#if FAST_MESH_BOUNDS + internal Vector3 boundsCenter; + internal Vector3 boundsHalfSize; + + public Vector3 BoundsCenter + { + get + { + return boundsCenter; + } + set + { + boundsCenter = value; + } + } + public Vector3 BoundsSize + { + get + { + return boundsHalfSize * 2; + } + set + { + boundsHalfSize = value * 0.5f; + } + } +#endif /// /// Gets or sets the scale of the mesh. /// @@ -167,6 +194,22 @@ public unsafe void GetLocalChild(int triangleIndex, ref TriangleWide target) Vector3Wide.WriteFirst(source.C * scale, ref target.C); } +#if FAST_MESH_BOUNDS + public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) + { + Matrix3x3.CreateFromQuaternion(orientation, out var basis); + var x = scale.X * boundsHalfSize.X * basis.X; + var y = scale.Y * boundsHalfSize.Y * basis.Y; + var z = scale.Z * boundsHalfSize.Z * basis.Z; + max = Vector3.Abs(x) + Vector3.Abs(y) + Vector3.Abs(z); + min = -max; + + var rotatedPose = Vector3.Transform(scale * boundsCenter, orientation); + + min += rotatedPose; + max += rotatedPose; + } +#else public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) { Matrix3x3.CreateFromQuaternion(orientation, out var r); @@ -191,6 +234,7 @@ public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector max = Vector3.Max(max0, max1); } } +#endif public ShapeBatch CreateShapeBatch(BufferPool pool, int initialCapacity, Shapes shapeBatches) { @@ -294,17 +338,15 @@ public unsafe void FindLocalOverlaps(ref Buffer(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) - where TOverlaps : ICollisionTaskSubpairOverlaps + public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, ref TLeafTester leafTester) + where TLeafTester : ISweepLeafTester { var scaledMin = min * inverseScale; var scaledMax = max * inverseScale; var scaledSweep = sweep * inverseScale; - ShapeTreeSweepLeafTester enumerator; - enumerator.Pool = pool; - enumerator.Overlaps = overlaps; + //Take a min/max to compensate for negative scales. - Tree.Sweep(Vector3.Min(scaledMin, scaledMax), Vector3.Max(scaledMin, scaledMax), scaledSweep, maximumT, ref enumerator); + Tree.Sweep(Vector3.Min(scaledMin, scaledMax), Vector3.Max(scaledMin, scaledMax), scaledSweep, maximumT, ref leafTester); } public struct MeshTriangleSource : ITriangleSource diff --git a/BepuPhysics/CollisionDetection/CollisionTasks/ConvexCompoundOverlapFinder.cs b/BepuPhysics/CollisionDetection/CollisionTasks/ConvexCompoundOverlapFinder.cs index 104c31a5b..962573dc0 100644 --- a/BepuPhysics/CollisionDetection/CollisionTasks/ConvexCompoundOverlapFinder.cs +++ b/BepuPhysics/CollisionDetection/CollisionTasks/ConvexCompoundOverlapFinder.cs @@ -1,4 +1,5 @@ using BepuPhysics.Collidables; +using BepuPhysics.Trees; using BepuUtilities; using BepuUtilities.Memory; using System.Numerics; @@ -19,8 +20,8 @@ unsafe void FindLocalOverlaps(ref Buffer where TSubpairOverlaps : struct, ICollisionTaskSubpairOverlaps; - unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) - where TOverlaps : ICollisionTaskSubpairOverlaps; + unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, ref TLeafTester leafTester) + where TLeafTester : ISweepLeafTester; } public interface IConvexCompoundOverlapFinder diff --git a/BepuPhysics/CollisionDetection/SweepTaskRegistry.cs b/BepuPhysics/CollisionDetection/SweepTaskRegistry.cs index 43dba7e22..0ca42aa2b 100644 --- a/BepuPhysics/CollisionDetection/SweepTaskRegistry.cs +++ b/BepuPhysics/CollisionDetection/SweepTaskRegistry.cs @@ -72,6 +72,20 @@ protected abstract unsafe bool PreorderedTypeSweep( bool flipRequired, ref TSweepFilter filter, Shapes shapes, SweepTaskRegistry sweepTasks, BufferPool pool, out float t0, out float t1, out Vector3 hitLocation, out Vector3 hitNormal) where TSweepFilter : ISweepFilter; + protected virtual unsafe bool PreorderedTypeCheck( + void* shapeDataA, in Quaternion orientationA, in BodyVelocity velocityA, + void* shapeDataB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, float maximumT, + float minimumProgression, float convergenceThreshold, int maximumIterationCount, + bool flipRequired, ref TSweepFilter filter, Shapes shapes, SweepTaskRegistry sweepTasks, BufferPool pool) + where TSweepFilter : ISweepFilter + { + // Use the Sweep by default, so each sweep task doesn't have to do this in case it doesn't need to optimize the Check over Sweep + return PreorderedTypeSweep(shapeDataA, orientationA, velocityA, + shapeDataB, offsetB, orientationB, velocityB, + maximumT, minimumProgression, convergenceThreshold, maximumIterationCount, + flipRequired, ref filter, shapes, sweepTasks, pool, out _, out _, out _, out _); + } + public unsafe bool Sweep( void* shapeDataA, int shapeTypeA, in Quaternion orientationA, in BodyVelocity velocityA, void* shapeDataB, int shapeTypeB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, @@ -104,6 +118,34 @@ public unsafe bool Sweep( out t0, out t1, out hitLocation, out hitNormal); } } + + public unsafe bool Check( + void* shapeDataA, int shapeTypeA, in Quaternion orientationA, in BodyVelocity velocityA, + void* shapeDataB, int shapeTypeB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, + float maximumT, float minimumProgression, float convergenceThreshold, int maximumIterationCount, + ref TSweepFilter filter, Shapes shapes, SweepTaskRegistry sweepTasks, BufferPool pool) + where TSweepFilter : ISweepFilter + { + Debug.Assert((shapeTypeA == ShapeTypeIndexA && shapeTypeB == ShapeTypeIndexB) || (shapeTypeA == ShapeTypeIndexB && shapeTypeB == ShapeTypeIndexA), + "Types must match expected types."); + var flipRequired = shapeTypeB == ShapeTypeIndexA; + if (flipRequired) + { + return PreorderedTypeCheck( + shapeDataB, orientationB, velocityB, + shapeDataA, -offsetB, orientationA, velocityA, + maximumT, minimumProgression, convergenceThreshold, maximumIterationCount, + flipRequired, ref filter, shapes, sweepTasks, pool); + } + else + { + return PreorderedTypeCheck( + shapeDataA, orientationA, velocityA, + shapeDataB, offsetB, orientationB, velocityB, + maximumT, minimumProgression, convergenceThreshold, maximumIterationCount, + flipRequired, ref filter, shapes, sweepTasks, pool); + } + } } public class SweepTaskRegistry diff --git a/BepuPhysics/CollisionDetection/SweepTasks/CompoundHomogeneousCompoundSweepTask.cs b/BepuPhysics/CollisionDetection/SweepTasks/CompoundHomogeneousCompoundSweepTask.cs index d9cfbdc81..8aebca97b 100644 --- a/BepuPhysics/CollisionDetection/SweepTasks/CompoundHomogeneousCompoundSweepTask.cs +++ b/BepuPhysics/CollisionDetection/SweepTasks/CompoundHomogeneousCompoundSweepTask.cs @@ -69,6 +69,11 @@ protected unsafe override bool PreorderedTypeSweep( return t1 < float.MaxValue; } + void TestChild() + { + + } + protected override unsafe bool PreorderedTypeSweep(void* shapeDataA, in RigidPose localPoseA, in Quaternion orientationA, in BodyVelocity velocityA, void* shapeDataB, in RigidPose localPoseB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, float maximumT, float minimumProgression, float convergenceThreshold, int maximumIterationCount, out float t0, out float t1, out Vector3 hitLocation, out Vector3 hitNormal) { throw new NotImplementedException("Compounds and meshes can never be nested; this should never be called."); diff --git a/BepuPhysics/CollisionDetection/SweepTasks/CompoundPairSweepOverlapFinder.cs b/BepuPhysics/CollisionDetection/SweepTasks/CompoundPairSweepOverlapFinder.cs index dba5614d1..868c2115c 100644 --- a/BepuPhysics/CollisionDetection/SweepTasks/CompoundPairSweepOverlapFinder.cs +++ b/BepuPhysics/CollisionDetection/SweepTasks/CompoundPairSweepOverlapFinder.cs @@ -32,7 +32,12 @@ public unsafe void FindOverlaps( offsetB, orientationB, velocityB, maximumT, out var sweep, out var min, out var max); ref var childOverlaps = ref overlaps.GetOverlapsForChild(i); childOverlaps.ChildIndex = i; - compoundB.FindLocalOverlaps(min, max, sweep, maximumT, pool, shapes, Unsafe.AsPointer(ref childOverlaps)); + + ShapeTreeSweepLeafTester enumerator; + enumerator.Pool = pool; + enumerator.Overlaps = Unsafe.AsPointer(ref childOverlaps); + + compoundB.FindLocalOverlaps(min, max, sweep, maximumT, pool, shapes, ref enumerator); } } } diff --git a/BepuPhysics/CollisionDetection/SweepTasks/ConvexCompoundSweepOverlapFinder.cs b/BepuPhysics/CollisionDetection/SweepTasks/ConvexCompoundSweepOverlapFinder.cs index 989893607..02814a974 100644 --- a/BepuPhysics/CollisionDetection/SweepTasks/ConvexCompoundSweepOverlapFinder.cs +++ b/BepuPhysics/CollisionDetection/SweepTasks/ConvexCompoundSweepOverlapFinder.cs @@ -1,5 +1,6 @@ using BepuPhysics.Collidables; using BepuPhysics.CollisionDetection.CollisionTasks; +using BepuPhysics.Trees; using BepuUtilities; using BepuUtilities.Collections; using BepuUtilities.Memory; @@ -15,6 +16,11 @@ public interface IConvexCompoundSweepOverlapFinder where TS unsafe void FindOverlaps(ref TShapeA shapeA, in Quaternion orientationA, in BodyVelocity velocityA, ref TCompoundB compoundB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, float maximumT, Shapes shapes, BufferPool pool, out ChildOverlapsCollection overlaps); + + unsafe void FindOverlaps(ref TShapeA shapeA, in Quaternion orientationA, in BodyVelocity velocityA, + ref TCompoundB compoundB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, float maximumT, + Shapes shapes, BufferPool pool, ref TLeafTester leafTester) + where TLeafTester : ISweepLeafTester; } public struct ConvexCompoundSweepOverlapFinder : IConvexCompoundSweepOverlapFinder @@ -24,10 +30,27 @@ public unsafe void FindOverlaps(ref TShapeA shapeA, in Quaternion orientationA, ref TCompoundB compoundB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, float maximumT, Shapes shapes, BufferPool pool, out ChildOverlapsCollection overlaps) { - BoundingBoxHelpers.GetLocalBoundingBoxForSweep(ref shapeA, orientationA, velocityA, offsetB, orientationB, velocityB, maximumT, out var sweep, out var min, out var max); - overlaps = default; - compoundB.FindLocalOverlaps(min, max, sweep, maximumT, pool, shapes, Unsafe.AsPointer(ref overlaps)); + + ShapeTreeSweepLeafTester enumerator; + enumerator.Pool = pool; + enumerator.Overlaps = Unsafe.AsPointer(ref overlaps); + + BoundingBoxHelpers.GetLocalBoundingBoxForSweep(ref shapeA, orientationA, velocityA, offsetB, orientationB, velocityB, maximumT, out var sweep, out var min, out var max); + + FindOverlaps(ref shapeA, orientationA, velocityA, + ref compoundB, offsetB, orientationB, velocityB, maximumT, + shapes, pool, ref enumerator); + } + + public unsafe void FindOverlaps(ref TShapeA shapeA, in Quaternion orientationA, in BodyVelocity velocityA, + ref TCompoundB compoundB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, float maximumT, + Shapes shapes, BufferPool pool, ref TLeafTester leafTester) + where TLeafTester : ISweepLeafTester + { + BoundingBoxHelpers.GetLocalBoundingBoxForSweep(ref shapeA, orientationA, velocityA, offsetB, orientationB, velocityB, maximumT, out var sweep, out var min, out var max); + + compoundB.FindLocalOverlaps(min, max, sweep, maximumT, pool, shapes, ref leafTester); } } } diff --git a/BepuPhysics/CollisionDetection/SweepTasks/ConvexCompoundSweepTask.cs b/BepuPhysics/CollisionDetection/SweepTasks/ConvexCompoundSweepTask.cs index 656a2b92d..d005bb618 100644 --- a/BepuPhysics/CollisionDetection/SweepTasks/ConvexCompoundSweepTask.cs +++ b/BepuPhysics/CollisionDetection/SweepTasks/ConvexCompoundSweepTask.cs @@ -30,7 +30,8 @@ protected override unsafe bool PreorderedTypeSweep( t1 = float.MaxValue; hitLocation = new Vector3(); hitNormal = new Vector3(); - default(TOverlapFinder).FindOverlaps(ref convex, orientationA, velocityA, ref compound, offsetB, orientationB, velocityB, maximumT, shapes, pool, out var overlaps); + var overlapFinder = default(TOverlapFinder); + overlapFinder.FindOverlaps(ref convex, orientationA, velocityA, ref compound, offsetB, orientationB, velocityB, maximumT, shapes, pool, out var overlaps); for (int i = 0; i < overlaps.Count; ++i) { var compoundChildIndex = overlaps.Overlaps[i]; diff --git a/BepuPhysics/CollisionDetection/SweepTasks/ConvexHomogeneousCompoundSweepTask.cs b/BepuPhysics/CollisionDetection/SweepTasks/ConvexHomogeneousCompoundSweepTask.cs index 9b7198ee0..82ec99c72 100644 --- a/BepuPhysics/CollisionDetection/SweepTasks/ConvexHomogeneousCompoundSweepTask.cs +++ b/BepuPhysics/CollisionDetection/SweepTasks/ConvexHomogeneousCompoundSweepTask.cs @@ -2,6 +2,7 @@ using System.Numerics; using System.Runtime.CompilerServices; using BepuPhysics.Collidables; +using BepuPhysics.Trees; using BepuUtilities; using BepuUtilities.Memory; @@ -16,6 +17,48 @@ public class ConvexHomogeneousCompoundSweepTask { + unsafe struct SweepCheckTester : ISweepLeafTester + where TSweepFilter : ISweepFilter + { + public bool flipRequired; + public TSweepFilter filter; + public TCompound compound; + public SweepTask task; + + public void* shapeDataA; + public int shapeTypeIndexA; + public Quaternion orientationA; + public BodyVelocity velocityA; + + public void* shapeDataB; + public Quaternion orientationB; + public BodyVelocity velocityB; + public Vector3 offsetB; + + public float minimumProgression; + public float convergenceThreshold; + public int maximumIterationCount; + + public bool hitFound; + + public void TestLeaf(int childIndex, ref float maximumT) + { + if (filter.AllowTest(flipRequired ? 0 : childIndex, flipRequired ? childIndex : 0)) + { + compound.GetPosedLocalChild(childIndex, out var childShape, out var childPose); + if (task.Sweep( + shapeDataA, shapeTypeIndexA, new RigidPose(Vector3.Zero, Quaternion.Identity), orientationA, velocityA, + Unsafe.AsPointer(ref childShape), Triangle.Id, childPose, offsetB, orientationB, velocityB, + maximumT, minimumProgression, convergenceThreshold, maximumIterationCount, + out _, out _, out _, out _)) + { + hitFound = true; + maximumT = -1; + } + } + } + } + public ConvexHomogeneousCompoundSweepTask() { ShapeTypeIndexA = default(TConvex).TypeId; @@ -37,7 +80,8 @@ protected override unsafe bool PreorderedTypeSweep( var task = sweepTasks.GetTask(ShapeTypeIndexA, default(TChildType).TypeId); if (task != null) { - default(TOverlapFinder).FindOverlaps(ref Unsafe.AsRef(shapeDataA), orientationA, velocityA, ref compound, offsetB, orientationB, velocityB, maximumT, shapes, pool, out var overlaps); + var overlapFinder = default(TOverlapFinder); + overlapFinder.FindOverlaps(ref Unsafe.AsRef(shapeDataA), orientationA, velocityA, ref compound, offsetB, orientationB, velocityB, maximumT, shapes, pool, out var overlaps); for (int i = 0; i < overlaps.Count; ++i) { var childIndex = overlaps.Overlaps[i]; @@ -67,6 +111,46 @@ protected override unsafe bool PreorderedTypeSweep( return t1 < float.MaxValue; } + protected override unsafe bool PreorderedTypeCheck( + void* shapeDataA, in Quaternion orientationA, in BodyVelocity velocityA, + void* shapeDataB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, float maximumT, + float minimumProgression, float convergenceThreshold, int maximumIterationCount, + bool flipRequired, ref TSweepFilter filter, Shapes shapes, SweepTaskRegistry sweepTasks, BufferPool pool) + + { + ref var compound = ref Unsafe.AsRef(shapeDataB); + var task = sweepTasks.GetTask(ShapeTypeIndexA, default(TChildType).TypeId); + if(task != null) + { + var overlapFinder = default(TOverlapFinder); + var leafTester = default(SweepCheckTester); + + leafTester.flipRequired = flipRequired; + leafTester.filter = filter; + leafTester.compound = compound; + leafTester.task = task; + + leafTester.shapeDataA = shapeDataA; + leafTester.shapeTypeIndexA = ShapeTypeIndexA; + leafTester.orientationA = orientationA; + leafTester.velocityA = velocityA; + + leafTester.shapeDataB = shapeDataB; + leafTester.orientationB = orientationB; + leafTester.velocityB = velocityB; + leafTester.offsetB = offsetB; + + leafTester.minimumProgression = minimumProgression; + leafTester.convergenceThreshold = convergenceThreshold; + leafTester.maximumIterationCount = maximumIterationCount; + + overlapFinder.FindOverlaps(ref Unsafe.AsRef(shapeDataA), orientationA, velocityA, ref compound, offsetB, orientationB, velocityB, maximumT, shapes, pool, ref leafTester); + + return leafTester.hitFound; + } + return false; + } + protected override unsafe bool PreorderedTypeSweep(void* shapeDataA, in RigidPose localPoseA, in Quaternion orientationA, in BodyVelocity velocityA, void* shapeDataB, in RigidPose localPoseB, in Vector3 offsetB, in Quaternion orientationB, in BodyVelocity velocityB, float maximumT, float minimumProgression, float convergenceThreshold, int maximumIterationCount, out float t0, out float t1, out Vector3 hitLocation, out Vector3 hitNormal) { throw new NotImplementedException("Compounds can never be nested; this should never be called."); diff --git a/BepuPhysics/Simulation_Queries.cs b/BepuPhysics/Simulation_Queries.cs index e9d82419c..54d9d39cf 100644 --- a/BepuPhysics/Simulation_Queries.cs +++ b/BepuPhysics/Simulation_Queries.cs @@ -182,6 +182,7 @@ unsafe struct SweepHitDispatcher : IBroadPhaseSweepTester, ISw public float MinimumProgression; public float ConvergenceThreshold; public int MaximumIterationCount; + public bool CheckOnly; [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AllowTest(int childA, int childB) @@ -219,22 +220,39 @@ public unsafe void Test(CollidableReference reference, ref float maximumT) var task = Simulation.NarrowPhase.SweepTaskRegistry.GetTask(ShapeType, shape.Type); if (task != null) { - var result = task.Sweep( - ShapeData, ShapeType, Pose.Orientation, Velocity, - targetShapeData, shape.Type, targetPose->Position - Pose.Position, targetPose->Orientation, new BodyVelocity(), - maximumT, MinimumProgression, ConvergenceThreshold, MaximumIterationCount, - ref this, Simulation.Shapes, Simulation.NarrowPhase.SweepTaskRegistry, Pool, out var t0, out var t1, out var hitLocation, out var hitNormal); - if (result) + if (CheckOnly) { - if (t1 > 0) + var result = task.Check(ShapeData, ShapeType, Pose.Orientation, Velocity, + targetShapeData, shape.Type, targetPose->Position - Pose.Position, targetPose->Orientation, new BodyVelocity(), + maximumT, MinimumProgression, ConvergenceThreshold, MaximumIterationCount, + ref this, Simulation.Shapes, Simulation.NarrowPhase.SweepTaskRegistry, Pool); + + if(result) { - hitLocation += Pose.Position; - HitHandler.OnHit(ref maximumT, t1, hitLocation, hitNormal, reference); + // Since we're not checking for an exact hit, the hit normals and locations can be random, since they + // represent only the first element that was hit, but not necessarily the closest one + HitHandler.OnHitAtZeroT(ref maximumT, reference); } - else + } + else + { + var result = task.Sweep( + ShapeData, ShapeType, Pose.Orientation, Velocity, + targetShapeData, shape.Type, targetPose->Position - Pose.Position, targetPose->Orientation, new BodyVelocity(), + maximumT, MinimumProgression, ConvergenceThreshold, MaximumIterationCount, + ref this, Simulation.Shapes, Simulation.NarrowPhase.SweepTaskRegistry, Pool, out var t0, out var t1, out var hitLocation, out var hitNormal); + if (result) { - //At t1 == 0, hitLocation and hitNormal do not have valid values, so don't imply that they exist. - HitHandler.OnHitAtZeroT(ref maximumT, reference); + if (t1 > 0) + { + hitLocation += Pose.Position; + HitHandler.OnHit(ref maximumT, t1, hitLocation, hitNormal, reference); + } + else + { + //At t1 == 0, hitLocation and hitNormal do not have valid values, so don't imply that they exist. + HitHandler.OnHitAtZeroT(ref maximumT, reference); + } } } } @@ -259,7 +277,7 @@ public unsafe void Test(CollidableReference reference, ref float maximumT) /// Threshold in terms of t parameter under which iterative sweep tests are permitted to exit in collision. /// Maximum number of iterations to use in iterative sweep tests. public unsafe void Sweep(TShape shape, in RigidPose pose, in BodyVelocity velocity, float maximumT, BufferPool pool, ref TSweepHitHandler hitHandler, - float minimumProgression, float convergenceThreshold, int maximumIterationCount) + float minimumProgression, float convergenceThreshold, int maximumIterationCount, bool checkOnly = false) where TShape : unmanaged, IConvexShape where TSweepHitHandler : ISweepHitHandler { //Build a bounding box. @@ -282,6 +300,7 @@ public unsafe void Sweep(TShape shape, in RigidPose po dispatcher.MinimumProgression = minimumProgression; dispatcher.ConvergenceThreshold = convergenceThreshold; dispatcher.MaximumIterationCount = maximumIterationCount; + dispatcher.CheckOnly = checkOnly; BroadPhase.Sweep(min, max, direction, maximumT, ref dispatcher); //The hit handler was copied to pass it into the child processing; since the user may (and probably does) rely on mutations, copy it back to the original reference. hitHandler = dispatcher.HitHandler; @@ -299,7 +318,7 @@ public unsafe void Sweep(TShape shape, in RigidPose po /// Pool to allocate any temporary resources in during execution. /// Callbacks executed when a sweep impacts an object in the scene. /// Simulation objects are treated as stationary during the sweep. - public unsafe void Sweep(in TShape shape, in RigidPose pose, in BodyVelocity velocity, float maximumT, BufferPool pool, ref TSweepHitHandler hitHandler) + public unsafe void Sweep(in TShape shape, in RigidPose pose, in BodyVelocity velocity, float maximumT, BufferPool pool, ref TSweepHitHandler hitHandler, bool checkOnly = false) where TShape : unmanaged, IConvexShape where TSweepHitHandler : ISweepHitHandler { //Estimate some reasonable termination conditions for iterative sweeps based on the input shape size. @@ -315,7 +334,7 @@ public unsafe void Sweep(in TShape shape, in RigidPose var minimumProgressionT = minimumProgressionDistance * inverseVelocity; var convergenceThresholdT = convergenceThresholdDistance * inverseVelocity; var maximumIterationCount = 25; - Sweep(shape, pose, velocity, maximumT, pool, ref hitHandler, minimumProgressionT, convergenceThresholdT, maximumIterationCount); + Sweep(shape, pose, velocity, maximumT, pool, ref hitHandler, minimumProgressionT, convergenceThresholdT, maximumIterationCount, checkOnly); } } } diff --git a/BepuPhysics/Trees/Tree.cs b/BepuPhysics/Trees/Tree.cs index 9ce5b8e38..55554bda5 100644 --- a/BepuPhysics/Trees/Tree.cs +++ b/BepuPhysics/Trees/Tree.cs @@ -17,6 +17,10 @@ public int NodeCount { return nodeCount; } + set + { + nodeCount = value; + } } public Buffer Leaves; @@ -27,6 +31,10 @@ public int LeafCount { return leafCount; } + set + { + leafCount = value; + } } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/BepuPhysics/Trees/Tree_Sweep.cs b/BepuPhysics/Trees/Tree_Sweep.cs index f12e97568..c4f78b87a 100644 --- a/BepuPhysics/Trees/Tree_Sweep.cs +++ b/BepuPhysics/Trees/Tree_Sweep.cs @@ -28,7 +28,7 @@ unsafe void Sweep(int nodeIndex, in Vector3 expansion, in Vector3 o var leafIndex = Encode(nodeIndex); leafTester.TestLeaf(leafIndex, ref treeRay->MaximumT); //Leaves have no children; have to pull from the stack to get a new target. - if (stackEnd == 0) + if (stackEnd == 0 || treeRay->MaximumT < 0) return; nodeIndex = stack[--stackEnd]; } diff --git a/BepuUtilities/BepuUtilities.csproj b/BepuUtilities/BepuUtilities.csproj index 7fe48cc75..d42650e85 100644 --- a/BepuUtilities/BepuUtilities.csproj +++ b/BepuUtilities/BepuUtilities.csproj @@ -39,13 +39,13 @@ true - TRACE;RELEASE;NETSTANDARD2_0;RELEASESTRIP + TRACE;DEBUG;RELEASE;NETSTANDARD2_0;RELEASESTRIP - + - + diff --git a/Demos/Demos/CustomVoxelCollidableDemo.cs b/Demos/Demos/CustomVoxelCollidableDemo.cs index 9102fa309..03be40372 100644 --- a/Demos/Demos/CustomVoxelCollidableDemo.cs +++ b/Demos/Demos/CustomVoxelCollidableDemo.cs @@ -225,6 +225,12 @@ public unsafe void FindLocalOverlaps(ref Buffer(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, ref TLeafTester leafTester) + where TLeafTester : ISweepLeafTester + { + Tree.Sweep(min, max, sweep, maximumT, ref leafTester); + } + public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) where TOverlaps : ICollisionTaskSubpairOverlaps { //Similar to the non-swept FindLocalOverlaps function above, this just adds the overlaps to the provided collection. @@ -233,7 +239,7 @@ public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, ShapeTreeSweepLeafTester enumerator; enumerator.Pool = pool; enumerator.Overlaps = overlaps; - Tree.Sweep(min, max, sweep, maximumT, ref enumerator); + FindLocalOverlaps(min, max, sweep, maximumT, pool, shapes, ref enumerator); } public void Dispose(BufferPool pool) diff --git a/Demos/SpecializedTests/ConvexHullTestDemo.cs b/Demos/SpecializedTests/ConvexHullTestDemo.cs index 187cafdb4..affb01581 100644 --- a/Demos/SpecializedTests/ConvexHullTestDemo.cs +++ b/Demos/SpecializedTests/ConvexHullTestDemo.cs @@ -49,6 +49,19 @@ public override void Initialize(ContentArchive content, Camera camera) var pointsBuffer = points.Span.Slice(points.Count); CreateShape(pointsBuffer, BufferPool, out _, out var hullShape); + + Matrix3x3.CreateScale(new Vector3(5, 0.5f, 3), out var scale); + var transform = Matrix3x3.CreateFromAxisAngle(Vector3.Normalize(new Vector3(3, 2, 1)), 1207) * scale; + const int transformCount = 10000; + var transformStart = Stopwatch.GetTimestamp(); + for (int i = 0; i < transformCount; ++i) + { + CreateTransformedCopy(hullShape, transform, BufferPool, out var transformedHullShape); + transformedHullShape.Dispose(BufferPool); + } + var transformEnd = Stopwatch.GetTimestamp(); + Console.WriteLine($"Transform hull computation time (us): {(transformEnd - transformStart) * 1e6 / (transformCount * Stopwatch.Frequency)}"); + hullShape.RayTest(RigidPose.Identity, new Vector3(0, 1, 0), -Vector3.UnitY, out var t, out var normal); const int rayIterationCount = 10000; @@ -60,7 +73,7 @@ public override void Initialize(ContentArchive content, Camera camera) var start = Stopwatch.GetTimestamp(); for (int i = 0; i < rayIterationCount; ++i) { - if(hullShape.RayTest(rayPose, rayOrigin, rayDirection, out _, out _)) + if (hullShape.RayTest(rayPose, rayOrigin, rayDirection, out _, out _)) { ++hitCounter; } From 107289d94551f97b471653bdd2ae63007d85a1b2 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sat, 28 Aug 2021 23:32:09 +0200 Subject: [PATCH 13/29] - Added validation for fast mesh bounds - Added ability to configure minimum tests and slept colliders in IslandSleeper - Made profiler API be public - Allow sweep parameters to be computed externally based on ratios - Fixed bodies not sleeping in some cases due to the timestep counter wrapping around --- BepuPhysics/Collidables/Mesh.cs | 3 +++ BepuPhysics/IslandSleeper.cs | 21 +++++++++++++++++++-- BepuPhysics/PoseIntegrator.cs | 9 ++++++--- BepuPhysics/SimulationProfiler.cs | 6 +++--- BepuPhysics/Simulation_Queries.cs | 20 ++++++++++++++------ 5 files changed, 45 insertions(+), 14 deletions(-) diff --git a/BepuPhysics/Collidables/Mesh.cs b/BepuPhysics/Collidables/Mesh.cs index f12c66840..9bf091988 100644 --- a/BepuPhysics/Collidables/Mesh.cs +++ b/BepuPhysics/Collidables/Mesh.cs @@ -208,6 +208,9 @@ public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector min += rotatedPose; max += rotatedPose; + + MathChecker.Validate(min, "MeshBounds min"); + MathChecker.Validate(max, "MeshBounds max"); } #else public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) diff --git a/BepuPhysics/IslandSleeper.cs b/BepuPhysics/IslandSleeper.cs index 0c2de8d9a..338e86c74 100644 --- a/BepuPhysics/IslandSleeper.cs +++ b/BepuPhysics/IslandSleeper.cs @@ -29,15 +29,29 @@ public class IslandSleeper /// public float TestedFractionPerFrame { get; set; } = 0.01f; /// + /// Gets or sets the minimum number of active bodies used to calculate the number of sleep traversals in a given timestep. + /// + public int MinimumTestedPerFrame { get; set; } = 1; + /// /// Gets or sets the fraction of the active set to target as the number of bodies slept in a given frame. /// This is only a goal; the actual number of slept bodies may be more or less. /// public float TargetSleptFraction { get; set; } = 0.005f; /// + /// Gets or sets minimum number of the active set to target as the number of bodies slept in a given frame. + /// + public int MinimumTargetSlept { get; set; } = 1; + /// /// Gets or sets the fraction of the active set to target as the number of bodies traversed for sleeping in a given frame. /// This is only a goal; the actual number of traversed bodies may be more or less. /// public float TargetTraversedFraction { get; set; } = 0.01f; + /// + /// Gets or sets minimum number of the active set to target as the number of bodies traversed for sleeping in a given frame. + /// + public int MinimumTargetTraversed { get; set; } = 1; + + public int LastIslandCount { get; private set; } public IslandSleeper(Bodies bodies, Solver solver, BroadPhase broadPhase, ConstraintRemover constraintRemover, BufferPool pool) { @@ -656,6 +670,7 @@ void DisposeWorkerTraversalResults() } pool.Return(ref workerTraversalResults); } + LastIslandCount = totalIslandCount; if (totalIslandCount == 0) { DisposeWorkerTraversalResults(); @@ -925,7 +940,7 @@ internal void Update(IThreadDispatcher threadDispatcher, bool deterministic) if (bodies.ActiveSet.Count == 0) return; - int candidateCount = (int)Math.Max(1, bodies.ActiveSet.Count * TestedFractionPerFrame); + int candidateCount = (int)Math.Max(Math.Min(bodies.ActiveSet.Count, MinimumTestedPerFrame), bodies.ActiveSet.Count * TestedFractionPerFrame); var traversalStartBodyIndices = new QuickList(candidateCount, pool); @@ -976,7 +991,9 @@ internal void Update(IThreadDispatcher threadDispatcher, bool deterministic) } pool.Return(ref sortedIndices); } - Sleep(ref traversalStartBodyIndices, threadDispatcher, deterministic, (int)Math.Ceiling(bodies.ActiveSet.Count * TargetSleptFraction), (int)Math.Ceiling(bodies.ActiveSet.Count * TargetTraversedFraction), false); + Sleep(ref traversalStartBodyIndices, threadDispatcher, deterministic, + Math.Max(Math.Min(MinimumTargetSlept, bodies.ActiveSet.Count), (int)Math.Ceiling(bodies.ActiveSet.Count * TargetSleptFraction)), + Math.Max(Math.Min(MinimumTargetTraversed, bodies.ActiveSet.Count), (int)Math.Ceiling(bodies.ActiveSet.Count * TargetTraversedFraction)), false); traversalStartBodyIndices.Dispose(pool); } diff --git a/BepuPhysics/PoseIntegrator.cs b/BepuPhysics/PoseIntegrator.cs index c8d4e5c23..ac42c1554 100644 --- a/BepuPhysics/PoseIntegrator.cs +++ b/BepuPhysics/PoseIntegrator.cs @@ -198,10 +198,13 @@ void UpdateSleepCandidacy(ref BodyVelocity velocity, ref BodyActivity activity) } else { - ++activity.TimestepsUnderThresholdCount; - if (activity.TimestepsUnderThresholdCount >= activity.MinimumTimestepsUnderThreshold) + if (activity.TimestepsUnderThresholdCount < byte.MaxValue) { - activity.SleepCandidate = true; + ++activity.TimestepsUnderThresholdCount; + if (activity.TimestepsUnderThresholdCount >= activity.MinimumTimestepsUnderThreshold) + { + activity.SleepCandidate = true; + } } } diff --git a/BepuPhysics/SimulationProfiler.cs b/BepuPhysics/SimulationProfiler.cs index ef22cdc7c..010dd1e30 100644 --- a/BepuPhysics/SimulationProfiler.cs +++ b/BepuPhysics/SimulationProfiler.cs @@ -46,7 +46,7 @@ public SimulationProfiler(int initialStageCount) #endif } - internal void Start(object o) + public void Start(object o) { #if PROFILE Debug.Assert(!startTimeStamps.ContainsKey(o), "Cannot start a stage that has already been started."); @@ -54,7 +54,7 @@ internal void Start(object o) #endif } - internal void End(object o) + public void End(object o) { #if PROFILE var endTimeStamp = Stopwatch.GetTimestamp(); @@ -68,7 +68,7 @@ internal void End(object o) #endif } - internal void Clear() + public void Clear() { #if PROFILE Debug.Assert(startTimeStamps.Count == 0, "It's likely that some stage was left unended from the previous frame."); diff --git a/BepuPhysics/Simulation_Queries.cs b/BepuPhysics/Simulation_Queries.cs index 54d9d39cf..f97e800ff 100644 --- a/BepuPhysics/Simulation_Queries.cs +++ b/BepuPhysics/Simulation_Queries.cs @@ -320,6 +320,16 @@ public unsafe void Sweep(TShape shape, in RigidPose po /// Simulation objects are treated as stationary during the sweep. public unsafe void Sweep(in TShape shape, in RigidPose pose, in BodyVelocity velocity, float maximumT, BufferPool pool, ref TSweepHitHandler hitHandler, bool checkOnly = false) where TShape : unmanaged, IConvexShape where TSweepHitHandler : ISweepHitHandler + { + ComputeSweepParameters(shape, velocity, maximumT, out var minimumProgressionT, out var convergenceThresholdT); + var maximumIterationCount = 25; + Sweep(shape, pose, velocity, maximumT, pool, ref hitHandler, minimumProgressionT, convergenceThresholdT, maximumIterationCount, checkOnly); + } + + public void ComputeSweepParameters(in TShape shape, in BodyVelocity velocity, float maximumT, + out float minimumProgressionT, out float convergenceThresholdT, + float progressionDistanceRatio = 0.1f, float convergenceThresholdDistanceRatio = 1e-5f) + where TShape : unmanaged, IConvexShape { //Estimate some reasonable termination conditions for iterative sweeps based on the input shape size. shape.ComputeAngularExpansionData(out var maximumRadius, out var maximumAngularExpansion); @@ -327,14 +337,12 @@ public unsafe void Sweep(in TShape shape, in RigidPose var sizeEstimate = Math.Max(minimumRadius, maximumRadius * 0.25f); //By default, lean towards precision. This may often trip the maximum iteration count, but that's okay. Performance sensitive users can tune it down with the other overload. //It would be far more disconcerting for new users to use a 'fast' default tuning and get visibly incorrect results. - var minimumProgressionDistance = .1f * sizeEstimate; - var convergenceThresholdDistance = 1e-5f * sizeEstimate; + var minimumProgressionDistance = progressionDistanceRatio * sizeEstimate; + var convergenceThresholdDistance = convergenceThresholdDistanceRatio * sizeEstimate; var tangentVelocity = Math.Min(velocity.Angular.Length() * maximumRadius, maximumAngularExpansion / maximumT); var inverseVelocity = 1f / (velocity.Linear.Length() + tangentVelocity); - var minimumProgressionT = minimumProgressionDistance * inverseVelocity; - var convergenceThresholdT = convergenceThresholdDistance * inverseVelocity; - var maximumIterationCount = 25; - Sweep(shape, pose, velocity, maximumT, pool, ref hitHandler, minimumProgressionT, convergenceThresholdT, maximumIterationCount, checkOnly); + minimumProgressionT = minimumProgressionDistance * inverseVelocity; + convergenceThresholdT = convergenceThresholdDistance * inverseVelocity; } } } From 46cf626a74724ee867d58a0afdcb1d4f1235954b Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sat, 28 Aug 2021 23:51:20 +0200 Subject: [PATCH 14/29] Temporarily replacing files from upstream to resolve merge conflict --- BepuPhysics/BepuPhysics.csproj | 25 +++---- BepuPhysics/Collidables/Mesh.cs | 91 ++++++------------------ BepuUtilities/BepuUtilities.csproj | 27 ++----- Demos/Demos/CustomVoxelCollidableDemo.cs | 30 ++++---- 4 files changed, 49 insertions(+), 124 deletions(-) diff --git a/BepuPhysics/BepuPhysics.csproj b/BepuPhysics/BepuPhysics.csproj index 142c9d67e..35d575690 100644 --- a/BepuPhysics/BepuPhysics.csproj +++ b/BepuPhysics/BepuPhysics.csproj @@ -1,7 +1,7 @@  - netstandard2.0 - 2.4.0-beta4 + net5.0 + 2.4.0-beta6 Bepu Entertainment LLC Ross Nordby Speedy real time physics simulation library. @@ -10,7 +10,7 @@ Apache-2.0 https://github.com/bepu/bepuphysics2 bepuphysicslogo256.png - Debug;Release;ReleaseStrip;ReleaseStripNoProfiling + Debug;Release;ReleaseNoProfiling latest physics;3d;rigid body;real time;simulation True @@ -19,31 +19,22 @@ false key.snk - - - - - + false - TRACE;DEBUG;CHECKMATH;PROFILE;NETSTANDARD2_0 + TRACE;DEBUG;CHECKMATH;PROFILE true embedded true - TRACE;RELEASE;PROFILE;NETSTANDARD2_0 - - - - true - TRACE;RELEASE;PROFILE;NETSTANDARD2_0;RELEASESTRIP + TRACE;RELEASE;PROFILE - + true - TRACE;DEBUG;RELEASE;NETSTANDARD2_0;RELEASESTRIP;FAST_MESH_BOUNDS + TRACE;RELEASE diff --git a/BepuPhysics/Collidables/Mesh.cs b/BepuPhysics/Collidables/Mesh.cs index 9bf091988..5381c6851 100644 --- a/BepuPhysics/Collidables/Mesh.cs +++ b/BepuPhysics/Collidables/Mesh.cs @@ -46,33 +46,6 @@ public struct Mesh : IHomogeneousCompoundShape public Buffer Triangles; internal Vector3 scale; internal Vector3 inverseScale; -#if FAST_MESH_BOUNDS - internal Vector3 boundsCenter; - internal Vector3 boundsHalfSize; - - public Vector3 BoundsCenter - { - get - { - return boundsCenter; - } - set - { - boundsCenter = value; - } - } - public Vector3 BoundsSize - { - get - { - return boundsHalfSize * 2; - } - set - { - boundsHalfSize = value * 0.5f; - } - } -#endif /// /// Gets or sets the scale of the mesh. /// @@ -141,7 +114,7 @@ public unsafe Mesh(Span data, BufferPool pool) /// /// Mesh to measure. /// Number of bytes it would take to store the mesh. - public unsafe int GetSerializedByteCount() + public readonly unsafe int GetSerializedByteCount() { return 16 + Triangles.Length * sizeof(Triangle) + Tree.GetSerializedByteCount(); } @@ -151,7 +124,7 @@ public unsafe int GetSerializedByteCount() /// /// Mesh to write into the byte buffer. /// Byte buffer to store the mesh in. - public unsafe void Serialize(Span data) + public readonly unsafe void Serialize(Span data) { var requiredSizeInBytes = GetSerializedByteCount(); if (data.Length < requiredSizeInBytes) @@ -163,10 +136,10 @@ public unsafe void Serialize(Span data) Tree.Serialize(data.Slice(16 + triangleByteCount, data.Length - 16 - triangleByteCount)); } - public int ChildCount => Triangles.Length; + public readonly int ChildCount => Triangles.Length; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe void GetLocalChild(int triangleIndex, out Triangle target) + public readonly unsafe void GetLocalChild(int triangleIndex, out Triangle target) { ref var source = ref Triangles[triangleIndex]; target.A = scale * source.A; @@ -175,7 +148,7 @@ public unsafe void GetLocalChild(int triangleIndex, out Triangle target) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe void GetPosedLocalChild(int triangleIndex, out Triangle target, out RigidPose childPose) + public readonly unsafe void GetPosedLocalChild(int triangleIndex, out Triangle target, out RigidPose childPose) { GetLocalChild(triangleIndex, out target); childPose = new RigidPose((target.A + target.B + target.C) * (1f / 3f)); @@ -185,7 +158,7 @@ public unsafe void GetPosedLocalChild(int triangleIndex, out Triangle target, ou } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe void GetLocalChild(int triangleIndex, ref TriangleWide target) + public readonly unsafe void GetLocalChild(int triangleIndex, ref TriangleWide target) { //This inserts a triangle into the first slot of the given wide instance. ref var source = ref Triangles[triangleIndex]; @@ -194,26 +167,7 @@ public unsafe void GetLocalChild(int triangleIndex, ref TriangleWide target) Vector3Wide.WriteFirst(source.C * scale, ref target.C); } -#if FAST_MESH_BOUNDS - public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) - { - Matrix3x3.CreateFromQuaternion(orientation, out var basis); - var x = scale.X * boundsHalfSize.X * basis.X; - var y = scale.Y * boundsHalfSize.Y * basis.Y; - var z = scale.Z * boundsHalfSize.Z * basis.Z; - max = Vector3.Abs(x) + Vector3.Abs(y) + Vector3.Abs(z); - min = -max; - - var rotatedPose = Vector3.Transform(scale * boundsCenter, orientation); - - min += rotatedPose; - max += rotatedPose; - - MathChecker.Validate(min, "MeshBounds min"); - MathChecker.Validate(max, "MeshBounds max"); - } -#else - public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) + public readonly void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) { Matrix3x3.CreateFromQuaternion(orientation, out var r); min = new Vector3(float.MaxValue); @@ -237,9 +191,8 @@ public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector max = Vector3.Max(max0, max1); } } -#endif - public ShapeBatch CreateShapeBatch(BufferPool pool, int initialCapacity, Shapes shapeBatches) + public readonly ShapeBatch CreateShapeBatch(BufferPool pool, int initialCapacity, Shapes shapeBatches) { return new HomogeneousCompoundShapeBatch(pool, initialCapacity); } @@ -274,7 +227,7 @@ public unsafe void TestLeaf(int leafIndex, RayData* rayData, float* maximumT) /// Ray to test against the mesh. /// Maximum length of the ray in units of the ray direction length. /// Callback to execute for every hit. - public unsafe void RayTest(in RigidPose pose, in RayData ray, ref float maximumT, ref TRayHitHandler hitHandler) where TRayHitHandler : struct, IShapeRayHitHandler + public readonly unsafe void RayTest(in RigidPose pose, in RayData ray, ref float maximumT, ref TRayHitHandler hitHandler) where TRayHitHandler : struct, IShapeRayHitHandler { HitLeafTester leafTester; leafTester.Triangles = Triangles.Memory; @@ -298,7 +251,7 @@ public unsafe void RayTest(in RigidPose pose, in RayData ray, re /// Pose of the mesh during the ray test. /// Set of rays to cast against the mesh. /// Callbacks to execute. - public unsafe void RayTest(in RigidPose pose, ref RaySource rays, ref TRayHitHandler hitHandler) where TRayHitHandler : struct, IShapeRayHitHandler + public readonly unsafe void RayTest(in RigidPose pose, ref RaySource rays, ref TRayHitHandler hitHandler) where TRayHitHandler : struct, IShapeRayHitHandler { HitLeafTester leafTester; leafTester.Triangles = Triangles.Memory; @@ -320,7 +273,7 @@ public unsafe void RayTest(in RigidPose pose, ref RaySource rays hitHandler = leafTester.HitHandler; } - public unsafe void FindLocalOverlaps(ref Buffer pairs, BufferPool pool, Shapes shapes, ref TOverlaps overlaps) + public readonly unsafe void FindLocalOverlaps(ref Buffer pairs, BufferPool pool, Shapes shapes, ref TOverlaps overlaps) where TOverlaps : struct, ICollisionTaskOverlaps where TSubpairOverlaps : struct, ICollisionTaskSubpairOverlaps { @@ -341,15 +294,17 @@ public unsafe void FindLocalOverlaps(ref Buffer(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, ref TLeafTester leafTester) - where TLeafTester : ISweepLeafTester + public readonly unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) + where TOverlaps : ICollisionTaskSubpairOverlaps { var scaledMin = min * inverseScale; var scaledMax = max * inverseScale; var scaledSweep = sweep * inverseScale; - + ShapeTreeSweepLeafTester enumerator; + enumerator.Pool = pool; + enumerator.Overlaps = overlaps; //Take a min/max to compensate for negative scales. - Tree.Sweep(Vector3.Min(scaledMin, scaledMax), Vector3.Max(scaledMin, scaledMax), scaledSweep, maximumT, ref leafTester); + Tree.Sweep(Vector3.Min(scaledMin, scaledMax), Vector3.Max(scaledMin, scaledMax), scaledSweep, maximumT, ref enumerator); } public struct MeshTriangleSource : ITriangleSource @@ -429,7 +384,7 @@ public void ComputeClosedInertia(float mass, out BodyInertia inertia, out Vector /// /// Mass to scale the inertia tensor with. /// Inertia of the closed mesh. - public void ComputeClosedInertia(float mass, out BodyInertia inertia) + public readonly void ComputeClosedInertia(float mass, out BodyInertia inertia) { var triangleSource = new MeshTriangleSource(this); MeshInertiaHelper.ComputeClosedInertia(ref triangleSource, mass, out _, out var inertiaTensor); @@ -442,7 +397,7 @@ public void ComputeClosedInertia(float mass, out BodyInertia inertia) /// /// Volume of the closed mesh. /// Center of mass of the closed mesh. - public void ComputeClosedCenterOfMass(out float volume, out Vector3 center) + public readonly void ComputeClosedCenterOfMass(out float volume, out Vector3 center) { var triangleSource = new MeshTriangleSource(this); MeshInertiaHelper.ComputeClosedCenterOfMass(ref triangleSource, out volume, out center); @@ -453,7 +408,7 @@ public void ComputeClosedCenterOfMass(out float volume, out Vector3 center) /// Assumes the mesh is closed and should be treated as solid. /// /// Center of mass of the closed mesh. - public Vector3 ComputeClosedCenterOfMass() + public readonly Vector3 ComputeClosedCenterOfMass() { var triangleSource = new MeshTriangleSource(this); MeshInertiaHelper.ComputeClosedCenterOfMass(ref triangleSource, out _, out var center); @@ -484,7 +439,7 @@ public void ComputeOpenInertia(float mass, out BodyInertia inertia, out Vector3 /// /// Mass to scale the inertia tensor with. /// Inertia of the open mesh. - public void ComputeOpenInertia(float mass, out BodyInertia inertia) + public readonly void ComputeOpenInertia(float mass, out BodyInertia inertia) { var triangleSource = new MeshTriangleSource(this); MeshInertiaHelper.ComputeOpenInertia(ref triangleSource, mass, out var inertiaTensor); @@ -497,7 +452,7 @@ public void ComputeOpenInertia(float mass, out BodyInertia inertia) /// Assumes the mesh is open and should be treated as a triangle soup. /// /// Center of mass of the open mesh. - public Vector3 ComputeOpenCenterOfMass() + public readonly Vector3 ComputeOpenCenterOfMass() { var triangleSource = new MeshTriangleSource(this); return MeshInertiaHelper.ComputeOpenCenterOfMass(ref triangleSource); @@ -518,7 +473,7 @@ public void Dispose(BufferPool bufferPool) /// Type id of mesh shapes. /// public const int Id = 8; - public int TypeId => Id; + public readonly int TypeId => Id; } } diff --git a/BepuUtilities/BepuUtilities.csproj b/BepuUtilities/BepuUtilities.csproj index d42650e85..b6a1b7c25 100644 --- a/BepuUtilities/BepuUtilities.csproj +++ b/BepuUtilities/BepuUtilities.csproj @@ -2,8 +2,8 @@ BepuUtilities BepuUtilities - netstandard2.0 - 2.4.0-beta4 + net5.0 + 2.4.0-beta6 Bepu Entertainment LLC Ross Nordby Supporting utilities library for BEPUphysics v2. @@ -12,7 +12,7 @@ Apache-2.0 https://github.com/bepu/bepuphysics2 bepuphysicslogo256.png - Debug;Release;ReleaseStrip + Debug;Release latest True @@ -21,33 +21,18 @@ key.snk - - - - false - TRACE;DEBUG;CHECKMATH;NETSTANDARD2_0 + TRACE;DEBUG;CHECKMATH true - TRACE;RELEASE;NETSTANDARD2_0 + TRACE;RELEASE true embedded - - - true - TRACE;DEBUG;RELEASE;NETSTANDARD2_0;RELEASESTRIP - - - - - - - - + True diff --git a/Demos/Demos/CustomVoxelCollidableDemo.cs b/Demos/Demos/CustomVoxelCollidableDemo.cs index 03be40372..1c1dbf5d0 100644 --- a/Demos/Demos/CustomVoxelCollidableDemo.cs +++ b/Demos/Demos/CustomVoxelCollidableDemo.cs @@ -25,7 +25,7 @@ namespace Demos.Demos struct Voxels : IHomogeneousCompoundShape { //Type ids should be unique across all shape types in a simulation. - public int TypeId => 12; + public readonly int TypeId => 12; //Using an object space tree isn't necessarily ideal for a highly regular data like voxels. //We're using it here since it exists already and a voxel-specialized version doesn't. @@ -46,7 +46,7 @@ struct Voxels : IHomogeneousCompoundShape /// public Vector3 VoxelSize; - public int ChildCount => VoxelIndices.Count; + public readonly int ChildCount => VoxelIndices.Count; public Voxels(QuickList voxelIndices, Vector3 voxelSize, BufferPool pool) { @@ -69,7 +69,7 @@ public Voxels(QuickList voxelIndices, Vector3 voxelSize, BufferPool poo pool.Return(ref bounds); } - public ShapeBatch CreateShapeBatch(BufferPool pool, int initialCapacity, Shapes shapeBatches) + public readonly ShapeBatch CreateShapeBatch(BufferPool pool, int initialCapacity, Shapes shapeBatches) { //Shapes types are responsible for informing the shape system how to create a batch for them. //Convex shapes will return a ConvexShapeBatch, compound shapes a CompoundShapeBatch, @@ -79,7 +79,7 @@ public ShapeBatch CreateShapeBatch(BufferPool pool, int initialCapacity, Shapes return new HomogeneousCompoundShapeBatch(pool, initialCapacity); } - public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) + public readonly void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) { Matrix3x3.CreateFromQuaternion(orientation, out var basis); min = new Vector3(float.MaxValue); @@ -130,7 +130,7 @@ public unsafe void TestLeaf(int leafIndex, RayData* ray, float* maximumT) /// Ray to test against the voxels. /// Maximum length of the ray in units of the ray direction length. /// Callback to execute for every hit. - public unsafe void RayTest(in RigidPose pose, in RayData ray, ref float maximumT, ref TRayHitHandler hitHandler) where TRayHitHandler : struct, IShapeRayHitHandler + public readonly unsafe void RayTest(in RigidPose pose, in RayData ray, ref float maximumT, ref TRayHitHandler hitHandler) where TRayHitHandler : struct, IShapeRayHitHandler { HitLeafTester leafTester; leafTester.VoxelIndices = VoxelIndices; @@ -155,7 +155,7 @@ public unsafe void RayTest(in RigidPose pose, in RayData ray, re /// Pose of the voxels during the ray test. /// Set of rays to cast against the voxels. /// Callbacks to execute. - public unsafe void RayTest(in RigidPose pose, ref RaySource rays, ref TRayHitHandler hitHandler) where TRayHitHandler : struct, IShapeRayHitHandler + public readonly unsafe void RayTest(in RigidPose pose, ref RaySource rays, ref TRayHitHandler hitHandler) where TRayHitHandler : struct, IShapeRayHitHandler { HitLeafTester leafTester; leafTester.VoxelIndices = VoxelIndices; @@ -177,7 +177,7 @@ public unsafe void RayTest(in RigidPose pose, ref RaySource rays } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void GetLocalChild(int childIndex, out Box childShape) + public readonly void GetLocalChild(int childIndex, out Box childShape) { var halfSize = VoxelSize * 0.5f; childShape.HalfWidth = halfSize.X; @@ -186,14 +186,14 @@ public void GetLocalChild(int childIndex, out Box childShape) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void GetPosedLocalChild(int childIndex, out Box childShape, out RigidPose childPose) + public readonly void GetPosedLocalChild(int childIndex, out Box childShape, out RigidPose childPose) { GetLocalChild(childIndex, out childShape); childPose = new RigidPose((VoxelIndices[childIndex] + new Vector3(0.5f)) * VoxelSize); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void GetLocalChild(int childIndex, ref BoxWide shapeWide) + public readonly void GetLocalChild(int childIndex, ref BoxWide shapeWide) { //This function provides a reference to a lane in an AOSOA structure. //We are to fill in the first lane and ignore the others. @@ -205,7 +205,7 @@ public void GetLocalChild(int childIndex, ref BoxWide shapeWide) [MethodImpl(MethodImplOptions.AggressiveInlining)] - public unsafe void FindLocalOverlaps(ref Buffer pairs, BufferPool pool, Shapes shapes, ref TOverlaps overlaps) + public readonly unsafe void FindLocalOverlaps(ref Buffer pairs, BufferPool pool, Shapes shapes, ref TOverlaps overlaps) where TOverlaps : struct, ICollisionTaskOverlaps where TSubpairOverlaps : struct, ICollisionTaskSubpairOverlaps { @@ -225,13 +225,7 @@ public unsafe void FindLocalOverlaps(ref Buffer(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, ref TLeafTester leafTester) - where TLeafTester : ISweepLeafTester - { - Tree.Sweep(min, max, sweep, maximumT, ref leafTester); - } - - public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) where TOverlaps : ICollisionTaskSubpairOverlaps + public readonly unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) where TOverlaps : ICollisionTaskSubpairOverlaps { //Similar to the non-swept FindLocalOverlaps function above, this just adds the overlaps to the provided collection. //Some unfortunate loss of type information due to some language limitations around generic pointers- pretend the overlaps pointer has type TOverlaps*. @@ -239,7 +233,7 @@ public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, ShapeTreeSweepLeafTester enumerator; enumerator.Pool = pool; enumerator.Overlaps = overlaps; - FindLocalOverlaps(min, max, sweep, maximumT, pool, shapes, ref enumerator); + Tree.Sweep(min, max, sweep, maximumT, ref enumerator); } public void Dispose(BufferPool pool) From d41c90c8fd6ba59474e456c080e773886e73a4fc Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 00:04:08 +0200 Subject: [PATCH 15/29] Reapply changes to Mesh.cs --- BepuPhysics/Collidables/Mesh.cs | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/BepuPhysics/Collidables/Mesh.cs b/BepuPhysics/Collidables/Mesh.cs index 5381c6851..9d282e798 100644 --- a/BepuPhysics/Collidables/Mesh.cs +++ b/BepuPhysics/Collidables/Mesh.cs @@ -167,6 +167,25 @@ public readonly unsafe void GetLocalChild(int triangleIndex, ref TriangleWide ta Vector3Wide.WriteFirst(source.C * scale, ref target.C); } +#if FAST_MESH_BOUNDS + public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) + { + Matrix3x3.CreateFromQuaternion(orientation, out var basis); + var x = scale.X * boundsHalfSize.X * basis.X; + var y = scale.Y * boundsHalfSize.Y * basis.Y; + var z = scale.Z * boundsHalfSize.Z * basis.Z; + max = Vector3.Abs(x) + Vector3.Abs(y) + Vector3.Abs(z); + min = -max; + + var rotatedPose = Vector3.Transform(scale * boundsCenter, orientation); + + min += rotatedPose; + max += rotatedPose; + + MathChecker.Validate(min, "MeshBounds min"); + MathChecker.Validate(max, "MeshBounds max"); + } +#else public readonly void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) { Matrix3x3.CreateFromQuaternion(orientation, out var r); @@ -191,6 +210,7 @@ public readonly void ComputeBounds(in Quaternion orientation, out Vector3 min, o max = Vector3.Max(max0, max1); } } +#endif public readonly ShapeBatch CreateShapeBatch(BufferPool pool, int initialCapacity, Shapes shapeBatches) { @@ -294,17 +314,14 @@ public readonly unsafe void FindLocalOverlaps(ref B } } - public readonly unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) - where TOverlaps : ICollisionTaskSubpairOverlaps + public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, ref TLeafTester leafTester) + where TLeafTester : ISweepLeafTester { var scaledMin = min * inverseScale; var scaledMax = max * inverseScale; var scaledSweep = sweep * inverseScale; - ShapeTreeSweepLeafTester enumerator; - enumerator.Pool = pool; - enumerator.Overlaps = overlaps; //Take a min/max to compensate for negative scales. - Tree.Sweep(Vector3.Min(scaledMin, scaledMax), Vector3.Max(scaledMin, scaledMax), scaledSweep, maximumT, ref enumerator); + Tree.Sweep(Vector3.Min(scaledMin, scaledMax), Vector3.Max(scaledMin, scaledMax), scaledSweep, maximumT, ref leafTester); } public struct MeshTriangleSource : ITriangleSource From d2b03677d251b0453c787c436530f8b661c87705 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 00:04:57 +0200 Subject: [PATCH 16/29] Reapply more changes to Mesh.cs --- BepuPhysics/Collidables/Mesh.cs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/BepuPhysics/Collidables/Mesh.cs b/BepuPhysics/Collidables/Mesh.cs index 9d282e798..c6867f2fb 100644 --- a/BepuPhysics/Collidables/Mesh.cs +++ b/BepuPhysics/Collidables/Mesh.cs @@ -46,6 +46,33 @@ public struct Mesh : IHomogeneousCompoundShape public Buffer Triangles; internal Vector3 scale; internal Vector3 inverseScale; +#if FAST_MESH_BOUNDS + internal Vector3 boundsCenter; + internal Vector3 boundsHalfSize; + + public Vector3 BoundsCenter + { + get + { + return boundsCenter; + } + set + { + boundsCenter = value; + } + } + public Vector3 BoundsSize + { + get + { + return boundsHalfSize * 2; + } + set + { + boundsHalfSize = value * 0.5f; + } + } +#endif /// /// Gets or sets the scale of the mesh. /// From d3f59b3dfc157d16c024bf55a108bd00b06d6d8c Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 00:17:27 +0200 Subject: [PATCH 17/29] Reapply changes to project files --- BepuPhysics/BepuPhysics.csproj | 19 ++++++++++++++----- BepuUtilities/BepuUtilities.csproj | 23 +++++++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/BepuPhysics/BepuPhysics.csproj b/BepuPhysics/BepuPhysics.csproj index 35d575690..481b5f40d 100644 --- a/BepuPhysics/BepuPhysics.csproj +++ b/BepuPhysics/BepuPhysics.csproj @@ -1,6 +1,6 @@  - net5.0 + netstandard2.0 2.4.0-beta6 Bepu Entertainment LLC Ross Nordby @@ -10,7 +10,7 @@ Apache-2.0 https://github.com/bepu/bepuphysics2 bepuphysicslogo256.png - Debug;Release;ReleaseNoProfiling + Debug;Release;ReleaseStrip;ReleaseStripNoProfiling latest physics;3d;rigid body;real time;simulation True @@ -19,20 +19,29 @@ false key.snk + + + + false - TRACE;DEBUG;CHECKMATH;PROFILE + TRACE;DEBUG;CHECKMATH;PROFILE;NETSTANDARD2_0 true embedded true - TRACE;RELEASE;PROFILE + TRACE;RELEASE;PROFILE;NETSTANDARD2_0 + + + + true + TRACE;RELEASE;NETSTANDARD2_0;RELEASESTRIP;FAST_MESH_BOUNDS - + true TRACE;RELEASE diff --git a/BepuUtilities/BepuUtilities.csproj b/BepuUtilities/BepuUtilities.csproj index b6a1b7c25..c1f3a745b 100644 --- a/BepuUtilities/BepuUtilities.csproj +++ b/BepuUtilities/BepuUtilities.csproj @@ -2,7 +2,7 @@ BepuUtilities BepuUtilities - net5.0 + netstandard2.0 2.4.0-beta6 Bepu Entertainment LLC Ross Nordby @@ -12,7 +12,7 @@ Apache-2.0 https://github.com/bepu/bepuphysics2 bepuphysicslogo256.png - Debug;Release + Debug;Release;ReleaseStrip latest True @@ -21,17 +21,32 @@ key.snk + + + + false - TRACE;DEBUG;CHECKMATH + TRACE;DEBUG;CHECKMATH;NETSTANDARD2_0 true - TRACE;RELEASE + TRACE;RELEASE;NETSTANDARD2_0 true embedded + + + true + TRACE;DEBUG;RELEASE;NETSTANDARD2_0;RELEASESTRIP + + + + + + + From 61dbd1292dc79d66a607fa105e88e5c819b24b24 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 03:21:07 +0200 Subject: [PATCH 18/29] - Fix readonly properties on Tree node count --- BepuPhysics/Trees/Tree.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BepuPhysics/Trees/Tree.cs b/BepuPhysics/Trees/Tree.cs index c0dfbea01..017212fd0 100644 --- a/BepuPhysics/Trees/Tree.cs +++ b/BepuPhysics/Trees/Tree.cs @@ -11,9 +11,9 @@ public unsafe partial struct Tree public Buffer Nodes; public Buffer Metanodes; int nodeCount; - public readonly int NodeCount + public int NodeCount { - get + readonly get { return nodeCount; } @@ -25,9 +25,9 @@ public readonly int NodeCount public Buffer Leaves; int leafCount; - public readonly int LeafCount + public int LeafCount { - get + readonly get { return leafCount; } From 8f2d72fb60e100479e01b24a40eeda465ff30764 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 03:25:49 +0200 Subject: [PATCH 19/29] - Reapply changes to CustomVoxelCollidableDemo --- Demos/Demos/CustomVoxelCollidableDemo.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Demos/Demos/CustomVoxelCollidableDemo.cs b/Demos/Demos/CustomVoxelCollidableDemo.cs index 1c1dbf5d0..4e3338ff9 100644 --- a/Demos/Demos/CustomVoxelCollidableDemo.cs +++ b/Demos/Demos/CustomVoxelCollidableDemo.cs @@ -225,7 +225,13 @@ public readonly unsafe void FindLocalOverlaps(ref B } } - public readonly unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) where TOverlaps : ICollisionTaskSubpairOverlaps + public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, ref TLeafTester leafTester) + where TLeafTester : ISweepLeafTester + { + Tree.Sweep(min, max, sweep, maximumT, ref leafTester); + } + + public unsafe void FindLocalOverlaps(in Vector3 min, in Vector3 max, in Vector3 sweep, float maximumT, BufferPool pool, Shapes shapes, void* overlaps) where TOverlaps : ICollisionTaskSubpairOverlaps { //Similar to the non-swept FindLocalOverlaps function above, this just adds the overlaps to the provided collection. //Some unfortunate loss of type information due to some language limitations around generic pointers- pretend the overlaps pointer has type TOverlaps*. @@ -233,7 +239,7 @@ public readonly unsafe void FindLocalOverlaps(in Vector3 min, in Vect ShapeTreeSweepLeafTester enumerator; enumerator.Pool = pool; enumerator.Overlaps = overlaps; - Tree.Sweep(min, max, sweep, maximumT, ref enumerator); + FindLocalOverlaps(min, max, sweep, maximumT, pool, shapes, ref enumerator); } public void Dispose(BufferPool pool) From 600be0477102066d54cec9cb9892f2a56604f00d Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 03:27:24 +0200 Subject: [PATCH 20/29] Add readonly decorators to mesh --- BepuPhysics/Collidables/Mesh.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BepuPhysics/Collidables/Mesh.cs b/BepuPhysics/Collidables/Mesh.cs index c6867f2fb..52145c908 100644 --- a/BepuPhysics/Collidables/Mesh.cs +++ b/BepuPhysics/Collidables/Mesh.cs @@ -52,7 +52,7 @@ public struct Mesh : IHomogeneousCompoundShape public Vector3 BoundsCenter { - get + readonly get { return boundsCenter; } @@ -63,7 +63,7 @@ public Vector3 BoundsCenter } public Vector3 BoundsSize { - get + readonly get { return boundsHalfSize * 2; } @@ -78,7 +78,7 @@ public Vector3 BoundsSize /// public Vector3 Scale { - get + readonly get { return scale; } From d31618d238a1e16ea6bbd12fbb8fd6909c2504c9 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 03:28:01 +0200 Subject: [PATCH 21/29] Remove the extended version of Validate (used these only during debugging) --- BepuPhysics/Collidables/Mesh.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BepuPhysics/Collidables/Mesh.cs b/BepuPhysics/Collidables/Mesh.cs index 52145c908..35f7f42fa 100644 --- a/BepuPhysics/Collidables/Mesh.cs +++ b/BepuPhysics/Collidables/Mesh.cs @@ -209,8 +209,8 @@ public void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector min += rotatedPose; max += rotatedPose; - MathChecker.Validate(min, "MeshBounds min"); - MathChecker.Validate(max, "MeshBounds max"); + MathChecker.Validate(min); + MathChecker.Validate(max); } #else public readonly void ComputeBounds(in Quaternion orientation, out Vector3 min, out Vector3 max) From 0c51b7d202453534986de7b8bcad2e663d66bd65 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 08:07:10 +0200 Subject: [PATCH 22/29] Few more changes to compile as .NET Standard 2.0 again --- BepuPhysics/Simulation.cs | 2 +- BepuUtilities/Memory/Buffer.cs | 2 +- Demos.sln | 208 ++++++++++++++++++++++----------- 3 files changed, 140 insertions(+), 72 deletions(-) diff --git a/BepuPhysics/Simulation.cs b/BepuPhysics/Simulation.cs index cd7d13b81..a59d1a2cb 100644 --- a/BepuPhysics/Simulation.cs +++ b/BepuPhysics/Simulation.cs @@ -9,7 +9,7 @@ using System.Runtime.CompilerServices; using BepuPhysics.Trees; -#if !DEBUG +#if !DEBUG && !NETSTANDARD2_0 [module: SkipLocalsInit] #endif diff --git a/BepuUtilities/Memory/Buffer.cs b/BepuUtilities/Memory/Buffer.cs index 801b14227..e3d85bd77 100644 --- a/BepuUtilities/Memory/Buffer.cs +++ b/BepuUtilities/Memory/Buffer.cs @@ -4,7 +4,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -#if !DEBUG +#if !DEBUG && !NETSTANDARD2_0 [module: SkipLocalsInit] #endif diff --git a/Demos.sln b/Demos.sln index 47c988c3c..a4d2dadc6 100644 --- a/Demos.sln +++ b/Demos.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31423.177 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30223.230 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demos", "Demos\Demos.csproj", "{C4C313CF-0BBD-407F-AC30-C5E889206F55}" ProjectSection(ProjectDependencies) = postProject @@ -36,10 +36,14 @@ Global Release|ARM = Release|ARM Release|x64 = Release|x64 Release|x86 = Release|x86 - ReleaseNoProfiling|Any CPU = ReleaseNoProfiling|Any CPU - ReleaseNoProfiling|ARM = ReleaseNoProfiling|ARM - ReleaseNoProfiling|x64 = ReleaseNoProfiling|x64 - ReleaseNoProfiling|x86 = ReleaseNoProfiling|x86 + ReleaseStrip|Any CPU = ReleaseStrip|Any CPU + ReleaseStrip|ARM = ReleaseStrip|ARM + ReleaseStrip|x64 = ReleaseStrip|x64 + ReleaseStrip|x86 = ReleaseStrip|x86 + ReleaseStripNoProfiling|Any CPU = ReleaseStripNoProfiling|Any CPU + ReleaseStripNoProfiling|ARM = ReleaseStripNoProfiling|ARM + ReleaseStripNoProfiling|x64 = ReleaseStripNoProfiling|x64 + ReleaseStripNoProfiling|x86 = ReleaseStripNoProfiling|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {C4C313CF-0BBD-407F-AC30-C5E889206F55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -58,14 +62,22 @@ Global {C4C313CF-0BBD-407F-AC30-C5E889206F55}.Release|x64.Build.0 = Release|Any CPU {C4C313CF-0BBD-407F-AC30-C5E889206F55}.Release|x86.ActiveCfg = Release|Any CPU {C4C313CF-0BBD-407F-AC30-C5E889206F55}.Release|x86.Build.0 = Release|Any CPU - {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseNoProfiling|Any CPU.ActiveCfg = Release|Any CPU - {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseNoProfiling|Any CPU.Build.0 = Release|Any CPU - {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseNoProfiling|ARM.ActiveCfg = Release|Any CPU - {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseNoProfiling|ARM.Build.0 = Release|Any CPU - {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseNoProfiling|x64.ActiveCfg = Release|Any CPU - {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseNoProfiling|x64.Build.0 = Release|Any CPU - {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseNoProfiling|x86.ActiveCfg = Release|Any CPU - {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseNoProfiling|x86.Build.0 = Release|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStrip|Any CPU.ActiveCfg = Release|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStrip|Any CPU.Build.0 = Release|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStrip|ARM.ActiveCfg = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStrip|ARM.Build.0 = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStrip|x64.ActiveCfg = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStrip|x64.Build.0 = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStrip|x86.ActiveCfg = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStrip|x86.Build.0 = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStripNoProfiling|Any CPU.ActiveCfg = Release|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStripNoProfiling|Any CPU.Build.0 = Release|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStripNoProfiling|ARM.ActiveCfg = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStripNoProfiling|ARM.Build.0 = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStripNoProfiling|x64.ActiveCfg = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStripNoProfiling|x64.Build.0 = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStripNoProfiling|x86.ActiveCfg = ReleaseStrip|Any CPU + {C4C313CF-0BBD-407F-AC30-C5E889206F55}.ReleaseStripNoProfiling|x86.Build.0 = ReleaseStrip|Any CPU {21058D92-EC74-4F70-98FF-D3D7D02A537E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {21058D92-EC74-4F70-98FF-D3D7D02A537E}.Debug|Any CPU.Build.0 = Debug|Any CPU {21058D92-EC74-4F70-98FF-D3D7D02A537E}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -82,14 +94,22 @@ Global {21058D92-EC74-4F70-98FF-D3D7D02A537E}.Release|x64.Build.0 = Release|Any CPU {21058D92-EC74-4F70-98FF-D3D7D02A537E}.Release|x86.ActiveCfg = Release|Any CPU {21058D92-EC74-4F70-98FF-D3D7D02A537E}.Release|x86.Build.0 = Release|Any CPU - {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseNoProfiling|Any CPU.ActiveCfg = Release|Any CPU - {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseNoProfiling|Any CPU.Build.0 = Release|Any CPU - {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseNoProfiling|ARM.ActiveCfg = Release|Any CPU - {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseNoProfiling|ARM.Build.0 = Release|Any CPU - {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseNoProfiling|x64.ActiveCfg = Release|Any CPU - {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseNoProfiling|x64.Build.0 = Release|Any CPU - {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseNoProfiling|x86.ActiveCfg = Release|Any CPU - {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseNoProfiling|x86.Build.0 = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStrip|Any CPU.ActiveCfg = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStrip|Any CPU.Build.0 = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStrip|ARM.ActiveCfg = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStrip|ARM.Build.0 = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStrip|x64.ActiveCfg = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStrip|x64.Build.0 = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStrip|x86.ActiveCfg = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStrip|x86.Build.0 = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStripNoProfiling|Any CPU.ActiveCfg = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStripNoProfiling|Any CPU.Build.0 = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStripNoProfiling|ARM.ActiveCfg = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStripNoProfiling|ARM.Build.0 = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStripNoProfiling|x64.ActiveCfg = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStripNoProfiling|x64.Build.0 = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStripNoProfiling|x86.ActiveCfg = Release|Any CPU + {21058D92-EC74-4F70-98FF-D3D7D02A537E}.ReleaseStripNoProfiling|x86.Build.0 = Release|Any CPU {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.Debug|Any CPU.Build.0 = Debug|Any CPU {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -106,14 +126,22 @@ Global {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.Release|x64.Build.0 = Release|Any CPU {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.Release|x86.ActiveCfg = Release|Any CPU {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.Release|x86.Build.0 = Release|Any CPU - {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseNoProfiling|Any CPU.ActiveCfg = Release|Any CPU - {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseNoProfiling|Any CPU.Build.0 = Release|Any CPU - {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseNoProfiling|ARM.ActiveCfg = Release|Any CPU - {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseNoProfiling|ARM.Build.0 = Release|Any CPU - {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseNoProfiling|x64.ActiveCfg = Release|Any CPU - {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseNoProfiling|x64.Build.0 = Release|Any CPU - {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseNoProfiling|x86.ActiveCfg = Release|Any CPU - {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseNoProfiling|x86.Build.0 = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStrip|Any CPU.ActiveCfg = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStrip|Any CPU.Build.0 = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStrip|ARM.ActiveCfg = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStrip|ARM.Build.0 = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStrip|x64.ActiveCfg = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStrip|x64.Build.0 = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStrip|x86.ActiveCfg = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStrip|x86.Build.0 = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStripNoProfiling|Any CPU.ActiveCfg = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStripNoProfiling|Any CPU.Build.0 = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStripNoProfiling|ARM.ActiveCfg = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStripNoProfiling|ARM.Build.0 = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStripNoProfiling|x64.ActiveCfg = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStripNoProfiling|x64.Build.0 = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStripNoProfiling|x86.ActiveCfg = Release|Any CPU + {FABD2BE3-697B-4B57-85D0-1077A3198C5C}.ReleaseStripNoProfiling|x86.Build.0 = Release|Any CPU {499C899F-CD56-476E-AFF8-85A8C29B19BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {499C899F-CD56-476E-AFF8-85A8C29B19BF}.Debug|Any CPU.Build.0 = Debug|Any CPU {499C899F-CD56-476E-AFF8-85A8C29B19BF}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -130,14 +158,22 @@ Global {499C899F-CD56-476E-AFF8-85A8C29B19BF}.Release|x64.Build.0 = Release|Any CPU {499C899F-CD56-476E-AFF8-85A8C29B19BF}.Release|x86.ActiveCfg = Release|Any CPU {499C899F-CD56-476E-AFF8-85A8C29B19BF}.Release|x86.Build.0 = Release|Any CPU - {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseNoProfiling|Any CPU.ActiveCfg = Release|Any CPU - {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseNoProfiling|Any CPU.Build.0 = Release|Any CPU - {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseNoProfiling|ARM.ActiveCfg = Release|Any CPU - {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseNoProfiling|ARM.Build.0 = Release|Any CPU - {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseNoProfiling|x64.ActiveCfg = Release|Any CPU - {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseNoProfiling|x64.Build.0 = Release|Any CPU - {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseNoProfiling|x86.ActiveCfg = Release|Any CPU - {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseNoProfiling|x86.Build.0 = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStrip|Any CPU.ActiveCfg = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStrip|Any CPU.Build.0 = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStrip|ARM.ActiveCfg = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStrip|ARM.Build.0 = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStrip|x64.ActiveCfg = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStrip|x64.Build.0 = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStrip|x86.ActiveCfg = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStrip|x86.Build.0 = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStripNoProfiling|Any CPU.ActiveCfg = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStripNoProfiling|Any CPU.Build.0 = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStripNoProfiling|ARM.ActiveCfg = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStripNoProfiling|ARM.Build.0 = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStripNoProfiling|x64.ActiveCfg = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStripNoProfiling|x64.Build.0 = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStripNoProfiling|x86.ActiveCfg = Release|Any CPU + {499C899F-CD56-476E-AFF8-85A8C29B19BF}.ReleaseStripNoProfiling|x86.Build.0 = Release|Any CPU {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.Debug|Any CPU.ActiveCfg = Debug|x64 {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.Debug|Any CPU.Build.0 = Debug|x64 {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.Debug|ARM.ActiveCfg = Debug|x64 @@ -154,14 +190,22 @@ Global {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.Release|x64.Build.0 = Release|x64 {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.Release|x86.ActiveCfg = Release|x64 {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.Release|x86.Build.0 = Release|x64 - {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseNoProfiling|Any CPU.ActiveCfg = Release|x64 - {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseNoProfiling|Any CPU.Build.0 = Release|x64 - {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseNoProfiling|ARM.ActiveCfg = Release|x64 - {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseNoProfiling|ARM.Build.0 = Release|x64 - {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseNoProfiling|x64.ActiveCfg = Release|x64 - {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseNoProfiling|x64.Build.0 = Release|x64 - {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseNoProfiling|x86.ActiveCfg = Release|x64 - {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseNoProfiling|x86.Build.0 = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStrip|Any CPU.ActiveCfg = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStrip|Any CPU.Build.0 = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStrip|ARM.ActiveCfg = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStrip|ARM.Build.0 = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStrip|x64.ActiveCfg = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStrip|x64.Build.0 = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStrip|x86.ActiveCfg = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStrip|x86.Build.0 = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStripNoProfiling|Any CPU.ActiveCfg = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStripNoProfiling|Any CPU.Build.0 = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStripNoProfiling|ARM.ActiveCfg = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStripNoProfiling|ARM.Build.0 = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStripNoProfiling|x64.ActiveCfg = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStripNoProfiling|x64.Build.0 = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStripNoProfiling|x86.ActiveCfg = Release|x64 + {6F7900A8-6B1A-41BB-BB2F-0348A527A2F5}.ReleaseStripNoProfiling|x86.Build.0 = Release|x64 {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.Debug|Any CPU.Build.0 = Debug|Any CPU {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -178,14 +222,22 @@ Global {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.Release|x64.Build.0 = Release|Any CPU {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.Release|x86.ActiveCfg = Release|Any CPU {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.Release|x86.Build.0 = Release|Any CPU - {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseNoProfiling|Any CPU.ActiveCfg = Release|Any CPU - {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseNoProfiling|Any CPU.Build.0 = Release|Any CPU - {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseNoProfiling|ARM.ActiveCfg = Release|Any CPU - {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseNoProfiling|ARM.Build.0 = Release|Any CPU - {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseNoProfiling|x64.ActiveCfg = Release|Any CPU - {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseNoProfiling|x64.Build.0 = Release|Any CPU - {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseNoProfiling|x86.ActiveCfg = Release|Any CPU - {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseNoProfiling|x86.Build.0 = Release|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStrip|Any CPU.ActiveCfg = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStrip|Any CPU.Build.0 = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStrip|ARM.ActiveCfg = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStrip|ARM.Build.0 = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStrip|x64.ActiveCfg = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStrip|x64.Build.0 = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStrip|x86.ActiveCfg = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStrip|x86.Build.0 = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStripNoProfiling|Any CPU.ActiveCfg = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStripNoProfiling|Any CPU.Build.0 = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStripNoProfiling|ARM.ActiveCfg = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStripNoProfiling|ARM.Build.0 = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStripNoProfiling|x64.ActiveCfg = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStripNoProfiling|x64.Build.0 = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStripNoProfiling|x86.ActiveCfg = ReleaseStrip|Any CPU + {8D3FB6BE-2726-4479-8AF2-13F593314AC0}.ReleaseStripNoProfiling|x86.Build.0 = ReleaseStrip|Any CPU {5FBC743A-8911-4DE6-B136-C0B274E1B185}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5FBC743A-8911-4DE6-B136-C0B274E1B185}.Debug|Any CPU.Build.0 = Debug|Any CPU {5FBC743A-8911-4DE6-B136-C0B274E1B185}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -202,14 +254,22 @@ Global {5FBC743A-8911-4DE6-B136-C0B274E1B185}.Release|x64.Build.0 = Release|Any CPU {5FBC743A-8911-4DE6-B136-C0B274E1B185}.Release|x86.ActiveCfg = Release|Any CPU {5FBC743A-8911-4DE6-B136-C0B274E1B185}.Release|x86.Build.0 = Release|Any CPU - {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseNoProfiling|Any CPU.ActiveCfg = ReleaseNoProfiling|Any CPU - {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseNoProfiling|Any CPU.Build.0 = ReleaseNoProfiling|Any CPU - {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseNoProfiling|ARM.ActiveCfg = ReleaseNoProfiling|Any CPU - {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseNoProfiling|ARM.Build.0 = ReleaseNoProfiling|Any CPU - {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseNoProfiling|x64.ActiveCfg = ReleaseNoProfiling|Any CPU - {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseNoProfiling|x64.Build.0 = ReleaseNoProfiling|Any CPU - {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseNoProfiling|x86.ActiveCfg = ReleaseNoProfiling|Any CPU - {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseNoProfiling|x86.Build.0 = ReleaseNoProfiling|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStrip|Any CPU.ActiveCfg = ReleaseStrip|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStrip|Any CPU.Build.0 = ReleaseStrip|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStrip|ARM.ActiveCfg = ReleaseStrip|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStrip|ARM.Build.0 = ReleaseStrip|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStrip|x64.ActiveCfg = ReleaseStrip|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStrip|x64.Build.0 = ReleaseStrip|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStrip|x86.ActiveCfg = ReleaseStrip|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStrip|x86.Build.0 = ReleaseStrip|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStripNoProfiling|Any CPU.ActiveCfg = ReleaseStripNoProfiling|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStripNoProfiling|Any CPU.Build.0 = ReleaseStripNoProfiling|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStripNoProfiling|ARM.ActiveCfg = ReleaseStripNoProfiling|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStripNoProfiling|ARM.Build.0 = ReleaseStripNoProfiling|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStripNoProfiling|x64.ActiveCfg = ReleaseStripNoProfiling|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStripNoProfiling|x64.Build.0 = ReleaseStripNoProfiling|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStripNoProfiling|x86.ActiveCfg = ReleaseStripNoProfiling|Any CPU + {5FBC743A-8911-4DE6-B136-C0B274E1B185}.ReleaseStripNoProfiling|x86.Build.0 = ReleaseStripNoProfiling|Any CPU {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.Debug|Any CPU.Build.0 = Debug|Any CPU {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -226,14 +286,22 @@ Global {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.Release|x64.Build.0 = Release|Any CPU {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.Release|x86.ActiveCfg = Release|Any CPU {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.Release|x86.Build.0 = Release|Any CPU - {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseNoProfiling|Any CPU.ActiveCfg = Release|Any CPU - {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseNoProfiling|Any CPU.Build.0 = Release|Any CPU - {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseNoProfiling|ARM.ActiveCfg = Release|Any CPU - {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseNoProfiling|ARM.Build.0 = Release|Any CPU - {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseNoProfiling|x64.ActiveCfg = Release|Any CPU - {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseNoProfiling|x64.Build.0 = Release|Any CPU - {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseNoProfiling|x86.ActiveCfg = Release|Any CPU - {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseNoProfiling|x86.Build.0 = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStrip|Any CPU.ActiveCfg = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStrip|Any CPU.Build.0 = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStrip|ARM.ActiveCfg = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStrip|ARM.Build.0 = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStrip|x64.ActiveCfg = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStrip|x64.Build.0 = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStrip|x86.ActiveCfg = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStrip|x86.Build.0 = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStripNoProfiling|Any CPU.ActiveCfg = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStripNoProfiling|Any CPU.Build.0 = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStripNoProfiling|ARM.ActiveCfg = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStripNoProfiling|ARM.Build.0 = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStripNoProfiling|x64.ActiveCfg = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStripNoProfiling|x64.Build.0 = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStripNoProfiling|x86.ActiveCfg = Release|Any CPU + {32BABF14-6971-41F8-A556-8E0F2D8C86B2}.ReleaseStripNoProfiling|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 9a4a1dd9999a8753a546e92b6097553f1c101570 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 08:14:00 +0200 Subject: [PATCH 23/29] Revert "Merge branch 'neos-release' into master" This reverts commit cee74904bbacb239ec2778e2d04972157bbe6556, reversing changes made to 092e5aa21a87f552cf48cb9f681171881848375e. --- BepuPhysics/Collidables/Mesh.cs | 2 +- BepuPhysics/Collidables/Triangle.cs | 2 +- DemoUtilities/Window.cs | 4 +- Demos/DemoSet.cs | 9 +--- Demos/Demos/Characters/CharacterDemo.cs | 40 ++--------------- Demos/Demos/ContactEventsDemo.cs | 8 ---- azure-pipelines.yml | 59 ------------------------- 7 files changed, 8 insertions(+), 116 deletions(-) delete mode 100644 azure-pipelines.yml diff --git a/BepuPhysics/Collidables/Mesh.cs b/BepuPhysics/Collidables/Mesh.cs index 3eadb29c4..35f7f42fa 100644 --- a/BepuPhysics/Collidables/Mesh.cs +++ b/BepuPhysics/Collidables/Mesh.cs @@ -256,7 +256,7 @@ unsafe struct HitLeafTester : IRayLeafTester where T : IShapeRayHitHandler public unsafe void TestLeaf(int leafIndex, RayData* rayData, float* maximumT) { ref var triangle = ref Triangles[leafIndex]; - if (Triangle.RayTestDualSided(triangle.A, triangle.B, triangle.C, rayData->Origin, rayData->Direction, out var t, out var normal) && t <= *maximumT) + if (Triangle.RayTest(triangle.A, triangle.B, triangle.C, rayData->Origin, rayData->Direction, out var t, out var normal) && t <= *maximumT) { //Pull the hit back into world space before handing it off to the user. This does cost a bit more, but not much, and you can always add a specialized no-transform path later. Matrix3x3.Transform(normal * InverseScale, Orientation, out normal); diff --git a/BepuPhysics/Collidables/Triangle.cs b/BepuPhysics/Collidables/Triangle.cs index f03d371cb..5574f3cd1 100644 --- a/BepuPhysics/Collidables/Triangle.cs +++ b/BepuPhysics/Collidables/Triangle.cs @@ -101,7 +101,7 @@ public readonly bool RayTest(in RigidPose pose, in Vector3 origin, in Vector3 di Matrix3x3.CreateFromQuaternion(pose.Orientation, out var orientation); Matrix3x3.TransformTranspose(offset, orientation, out var localOffset); Matrix3x3.TransformTranspose(direction, orientation, out var localDirection); - if (RayTestDualSided(A, B, C, localOffset, localDirection, out t, out normal)) + if (RayTest(A, B, C, localOffset, localDirection, out t, out normal)) { Matrix3x3.Transform(normal, orientation, out normal); return true; diff --git a/DemoUtilities/Window.cs b/DemoUtilities/Window.cs index 64c16e08c..c70b59c9c 100644 --- a/DemoUtilities/Window.cs +++ b/DemoUtilities/Window.cs @@ -95,8 +95,8 @@ public Int2 Resolution public Window(string title, Int2 resolution, Int2 location, WindowMode windowMode) { window = new NativeWindow(location.X, location.Y, resolution.X, resolution.Y, title, GameWindowFlags.FixedWindow, GraphicsMode.Default, DisplayDevice.Default); - //Debug.Assert(window.ClientSize.Width == resolution.X); - //Debug.Assert(window.ClientSize.Height == resolution.Y); + Debug.Assert(window.ClientSize.Width == resolution.X); + Debug.Assert(window.ClientSize.Height == resolution.Y); window.Visible = true; Resolution = resolution; window.Resize += (form, args) => resized = true; diff --git a/Demos/DemoSet.cs b/Demos/DemoSet.cs index b373f1157..cd152afdf 100644 --- a/Demos/DemoSet.cs +++ b/Demos/DemoSet.cs @@ -45,9 +45,6 @@ struct Option public DemoSet() { - AddOption(); - AddOption(); - AddOption(); AddOption(); AddOption(); AddOption(); @@ -57,7 +54,6 @@ public DemoSet() AddOption(); AddOption(); AddOption(); - AddOption(); AddOption(); AddOption(); AddOption(); @@ -65,14 +61,11 @@ public DemoSet() AddOption(); AddOption(); AddOption(); + AddOption(); AddOption(); AddOption(); AddOption(); AddOption(); - AddOption(); - AddOption(); - AddOption(); - AddOption(); } public int Count { get { return options.Count; } } diff --git a/Demos/Demos/Characters/CharacterDemo.cs b/Demos/Demos/Characters/CharacterDemo.cs index cb3ee425f..6dd2a12fa 100644 --- a/Demos/Demos/Characters/CharacterDemo.cs +++ b/Demos/Demos/Characters/CharacterDemo.cs @@ -9,7 +9,6 @@ using DemoUtilities; using DemoRenderer.UI; using OpenTK.Input; -using System.Collections.Generic; namespace Demos.Demos.Characters { @@ -19,13 +18,8 @@ namespace Demos.Demos.Characters public class CharacterDemo : Demo { CharacterControllers characters; - List staticPlatforms = new List(); - public unsafe override void Initialize(ContentArchive content, Camera camera) { - var result = Triangle.RayTestDualSided(new Vector3(0f, 1f, 0f), new Vector3(1f, -1f, 0f), new Vector3(-1f, -1f, 0f), - Vector3.UnitZ * -1, Vector3.UnitZ, out float t, out Vector3 normal); - camera.Position = new Vector3(20, 10, 20); camera.Yaw = MathF.PI; camera.Pitch = 0; @@ -158,7 +152,7 @@ public unsafe override void Initialize(ContentArchive content, Camera camera) { for (int j = 0; j < width; ++j) { - staticPlatforms.Add(Simulation.Statics.Add(new StaticDescription(new Vector3(box.Width, 0, box.Length) * new Vector3(i, 0, j) + new Vector3(32f, 1, 0), boxCollidable))); + Simulation.Statics.Add(new StaticDescription(new Vector3(box.Width, 0, box.Length) * new Vector3(i, 0, j) + new Vector3(32f, 1, 0), boxCollidable)); } } @@ -178,7 +172,7 @@ struct MovingPlatform public MovingPlatform(CollidableDescription collidable, double timeOffset, float goalSatisfactionTime, Simulation simulation, Func poseCreator) { PoseCreator = poseCreator; - BodyHandle = simulation.Bodies.Add(BodyDescription.CreateKinematic(poseCreator(timeOffset), collidable, new BodyActivityDescription(0.1f))); + BodyHandle = simulation.Bodies.Add(BodyDescription.CreateKinematic(poseCreator(timeOffset), collidable, new BodyActivityDescription(-1))); InverseGoalSatisfactionTime = 1f / goalSatisfactionTime; TimeOffset = timeOffset; } @@ -193,9 +187,6 @@ public void Update(Simulation simulation, double time) QuaternionEx.GetRelativeRotationWithoutOverlap(pose.Orientation, targetPose.Orientation, out var rotation); QuaternionEx.GetAxisAngleFromQuaternion(rotation, out var axis, out var angle); velocity.Angular = axis * (angle * InverseGoalSatisfactionTime); - - if (velocity.Linear.Length() > 1e-5f && !body.Awake) - body.Awake = true; } } MovingPlatform[] movingPlatforms; @@ -203,7 +194,6 @@ public void Update(Simulation simulation, double time) bool characterActive; CharacterInput character; double time; - double updateTime; void CreateCharacter(Vector3 position) { characterActive = true; @@ -212,20 +202,7 @@ void CreateCharacter(Vector3 position) public override void Update(Window window, Camera camera, Input input, float dt) { - if(input.WasPushed(Key.U)) - { - foreach(var handle in staticPlatforms) - { - var index = Simulation.Statics.HandleToIndex[handle.Value]; - ref var pose = ref Simulation.Statics.Poses[index]; - - pose.Position += Vector3.UnitX; - } - } - - const float simulationDt = 1 / 60f; - if (input.WasPushed(Key.C)) { if (characterActive) @@ -244,18 +221,7 @@ public override void Update(Window window, Camera camera, Input input, float dt) character.UpdateCharacterGoals(input, camera, simulationDt); } //Using a fixed time per update to match the demos simulation update rate. - updateTime += 1 / 60f; - - Simulation.Bodies.GetDescription(character.BodyHandle, out BodyDescription description); - Simulation.Shapes.RecursivelyRemoveAndDispose(description.Collidable.Shape, BufferPool); - var shapeIndex = Simulation.Shapes.Add(new Capsule(0.5f, MathF.Sin((float)updateTime) + 1f)); - Simulation.Bodies.SetShape(character.BodyHandle, shapeIndex); - - /*if(updateTime % 20 > 10) - time += 1 / 60f;*/ - - time += Math.Max(0, Math.Sin(updateTime) / 60f); - + time += 1 / 60f; for (int i = 0; i < movingPlatforms.Length; ++i) { movingPlatforms[i].Update(Simulation, time); diff --git a/Demos/Demos/ContactEventsDemo.cs b/Demos/Demos/ContactEventsDemo.cs index ad7930ff2..ab3518852 100644 --- a/Demos/Demos/ContactEventsDemo.cs +++ b/Demos/Demos/ContactEventsDemo.cs @@ -57,7 +57,6 @@ public interface IContactEventHandler void OnContactAdded(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, in Vector3 contactOffset, in Vector3 contactNormal, float depth, int featureId, int contactIndex, int workerIndex) where TManifold : unmanaged, IContactManifold { - Console.WriteLine($"OnContactAdded<{typeof(TManifold)}>"); } /// @@ -71,7 +70,6 @@ void OnContactAdded(CollidableReference eventSource, CollidablePair p /// Index of the worker thread that fired this event. void OnContactRemoved(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int removedFeatureId, int workerIndex) where TManifold : unmanaged, IContactManifold { - Console.WriteLine($"OnContactAdded<{typeof(TManifold)}>"); } /// @@ -84,7 +82,6 @@ void OnContactRemoved(CollidableReference eventSource, CollidablePair /// Index of the worker thread that fired this event. void OnStartedTouching(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { - Console.WriteLine($"OnStartedTouching<{typeof(TManifold)}>"); } /// @@ -97,7 +94,6 @@ void OnStartedTouching(CollidableReference eventSource, CollidablePai /// Index of the worker thread that fired this event. void OnTouching(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { - //Console.WriteLine($"OnTouching<{typeof(TManifold)}>"); } @@ -111,7 +107,6 @@ void OnTouching(CollidableReference eventSource, CollidablePair pair, /// Index of the worker thread that fired this event. void OnStoppedTouching(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { - Console.WriteLine($"OnStoppedTouching<{typeof(TManifold)}>"); } @@ -125,7 +120,6 @@ void OnStoppedTouching(CollidableReference eventSource, CollidablePai /// Index of the worker thread that fired this event. void OnPairCreated(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { - Console.WriteLine($"OnPairCreated<{typeof(TManifold)}>"); } /// @@ -138,7 +132,6 @@ void OnPairCreated(CollidableReference eventSource, CollidablePair pa /// Index of the worker thread that fired this event. void OnPairUpdated(CollidableReference eventSource, CollidablePair pair, ref TManifold contactManifold, int workerIndex) where TManifold : unmanaged, IContactManifold { - //Console.WriteLine($"OnPairUpdated<{typeof(TManifold)}>"); } /// @@ -149,7 +142,6 @@ void OnPairUpdated(CollidableReference eventSource, CollidablePair pa /// Collidable pair triggering the event. void OnPairEnded(CollidableReference eventSource, CollidablePair pair) { - Console.WriteLine($"OnPairEnded"); } } diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 061196bca..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,59 +0,0 @@ -# .NET Desktop -# Build and run tests for .NET Desktop or Windows classic desktop solutions. -# Add steps that publish symbols, save build artifacts, and more: -# https://docs.microsoft.com/azure/devops/pipelines/apps/windows/dot-net - -trigger: -- neos-release - -pool: - vmImage: 'windows-latest' - -variables: - solution: 'Library.sln' - buildPlatform: 'Any CPU' - buildConfiguration: 'ReleaseStripNoProfiling' - -steps: -- task: NuGetToolInstaller@1 - -- task: NuGetCommand@2 - inputs: - restoreSolution: '$(solution)' - -- task: VSBuild@1 - inputs: - solution: '$(solution)' - platform: '$(buildPlatform)' - configuration: '$(buildConfiguration)' - -- task: VSTest@2 - inputs: - platform: '$(buildPlatform)' - configuration: '$(buildConfiguration)' - -- task: NuGetCommand@2 - inputs: - command: 'pack' - packagesToPack: '**\BepuUtilities.csproj' - configuration: 'ReleaseStrip' - versioningScheme: 'byPrereleaseNumber' - majorVersion: '2' - minorVersion: '4' - patchVersion: '0' - -- task: NuGetCommand@2 - inputs: - command: 'pack' - packagesToPack: '**\BepuPhysics.csproj' - versioningScheme: 'byPrereleaseNumber' - majorVersion: '2' - minorVersion: '4' - patchVersion: '0' - -- task: NuGetCommand@2 - inputs: - command: 'push' - packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg' - nuGetFeedType: 'internal' - publishVstsFeed: 'd04c348e-3752-477f-9659-fb7b72738d76/951cbf21-f9fe-4ddf-835a-1992fcbc702b' \ No newline at end of file From 6b46fc14f0bc4bf87b6b062d8c57a75ce780ebf8 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 18:53:10 +0200 Subject: [PATCH 24/29] - Backport MathF back to Math --- BepuPhysics/Collidables/ConvexHullHelper.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BepuPhysics/Collidables/ConvexHullHelper.cs b/BepuPhysics/Collidables/ConvexHullHelper.cs index 29d54acda..a7e377538 100644 --- a/BepuPhysics/Collidables/ConvexHullHelper.cs +++ b/BepuPhysics/Collidables/ConvexHullHelper.cs @@ -194,7 +194,7 @@ static int FindNextIndexForFaceHull(Vector2 start, Vector2 previousEdgeDirection best = candidateY / candidateX; bestIndex = 0; bestDistanceSquared = candidateX * candidateX + candidateY * candidateY; - var inverseBestDistance = 1f / MathF.Sqrt(bestDistanceSquared); + var inverseBestDistance = 1f / (float)Math.Sqrt(bestDistanceSquared); currentEdgeDirectionX = candidateX * inverseBestDistance; currentEdgeDirectionY = candidateY * inverseBestDistance; } @@ -216,7 +216,7 @@ static int FindNextIndexForFaceHull(Vector2 start, Vector2 previousEdgeDirection //1) collinear with the previous best by the plane epsilon test BUT is more distant, or //2) has a greater angle than the previous best. var planeOffset = -candidateX * currentEdgeDirectionY + candidateY * currentEdgeDirectionX; - if (MathF.Abs(planeOffset) < planeEpsilon) + if (Math.Abs(planeOffset) < planeEpsilon) { //The candidate is collinear. Only accept it if it's further away. if (candidateX * candidateX + candidateY * candidateY <= bestDistanceSquared) @@ -231,7 +231,7 @@ static int FindNextIndexForFaceHull(Vector2 start, Vector2 previousEdgeDirection } best = candidateY / candidateX; bestDistanceSquared = candidateX * candidateX + candidateY * candidateY; - var inverseBestDistance = 1f / MathF.Sqrt(bestDistanceSquared); + var inverseBestDistance = 1f / (float)Math.Sqrt(bestDistanceSquared); currentEdgeDirectionX = candidateX * inverseBestDistance; currentEdgeDirectionY = candidateY * inverseBestDistance; bestIndex = i; @@ -546,7 +546,7 @@ public static void ComputeHull(Span points, BufferPool pool, out HullDa Vector3Wide.Broadcast(initialVertex, out var initialVertexBundle); pool.Take>(pointBundles.Length, out var projectedOnX); pool.Take>(pointBundles.Length, out var projectedOnY); - var planeEpsilonNarrow = MathF.Sqrt(bestDistanceSquared) * 1e-6f; + var planeEpsilonNarrow = (float)Math.Sqrt(bestDistanceSquared) * 1e-6f; var planeEpsilon = new Vector(planeEpsilonNarrow); var rawFaceVertexIndices = new QuickList(pointBundles.Length * Vector.Count, pool); var initialSourceEdge = new EdgeEndpoints { A = initialIndex, B = initialIndex }; From 9269bd146580e357bf43a81deb734e388f8f9726 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 20:10:44 +0200 Subject: [PATCH 25/29] Re-add ilopt --- Dependencies/ilopt/License.md | 20 + Dependencies/ilopt/Mono.Cecil.Mdb.dll | Bin 0 -> 38912 bytes Dependencies/ilopt/Mono.Cecil.Pdb.dll | Bin 0 -> 87040 bytes Dependencies/ilopt/Mono.Cecil.Rocks.dll | Bin 0 -> 24576 bytes Dependencies/ilopt/Mono.Cecil.dll | Bin 0 -> 327168 bytes Dependencies/ilopt/ilopt.deps.json | 490 ++++++++++++++++++++ Dependencies/ilopt/ilopt.dll | Bin 0 -> 41472 bytes Dependencies/ilopt/ilopt.runtimeconfig.json | 9 + Dependencies/ilopt/ilopt.xml | 71 +++ 9 files changed, 590 insertions(+) create mode 100644 Dependencies/ilopt/License.md create mode 100644 Dependencies/ilopt/Mono.Cecil.Mdb.dll create mode 100644 Dependencies/ilopt/Mono.Cecil.Pdb.dll create mode 100644 Dependencies/ilopt/Mono.Cecil.Rocks.dll create mode 100644 Dependencies/ilopt/Mono.Cecil.dll create mode 100644 Dependencies/ilopt/ilopt.deps.json create mode 100644 Dependencies/ilopt/ilopt.dll create mode 100644 Dependencies/ilopt/ilopt.runtimeconfig.json create mode 100644 Dependencies/ilopt/ilopt.xml diff --git a/Dependencies/ilopt/License.md b/Dependencies/ilopt/License.md new file mode 100644 index 000000000..0c5c251df --- /dev/null +++ b/Dependencies/ilopt/License.md @@ -0,0 +1,20 @@ +# The MIT License (MIT) +Copyright © Tanner Gooding and Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Dependencies/ilopt/Mono.Cecil.Mdb.dll b/Dependencies/ilopt/Mono.Cecil.Mdb.dll new file mode 100644 index 0000000000000000000000000000000000000000..4c5287554854e5bb43ecc5e6ff8e4b886ca01944 GIT binary patch literal 38912 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 ZtHllSH)~(uUnBZ|RmuOa*Z(aK{4YsC)Vlxx literal 0 HcmV?d00001 diff --git a/Dependencies/ilopt/Mono.Cecil.Pdb.dll b/Dependencies/ilopt/Mono.Cecil.Pdb.dll new file mode 100644 index 0000000000000000000000000000000000000000..d08d850d4149106fa79227f46fe3e90577b5f158 GIT binary patch literal 87040 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 literal 0 HcmV?d00001 diff --git a/Dependencies/ilopt/Mono.Cecil.Rocks.dll b/Dependencies/ilopt/Mono.Cecil.Rocks.dll new file mode 100644 index 0000000000000000000000000000000000000000..d0baa771883b7e15c42a6412e6160c979eb64352 GIT binary patch literal 24576 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 Le|`D?&;$PkME+I^ literal 0 HcmV?d00001 diff --git a/Dependencies/ilopt/Mono.Cecil.dll b/Dependencies/ilopt/Mono.Cecil.dll new file mode 100644 index 0000000000000000000000000000000000000000..cfdccfc1fa701143114b3d27b489472651fa0aec GIT binary patch literal 327168 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 d+fy(;Llh~l7c)=r&JhFMk#Y~bU`o@bS*&xXd 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 WkoMZ3dHJUQ>j?io!G8@L`2PSMj_%t4 literal 0 HcmV?d00001 diff --git a/Dependencies/ilopt/ilopt.deps.json b/Dependencies/ilopt/ilopt.deps.json new file mode 100644 index 000000000..2dcbb8580 --- /dev/null +++ b/Dependencies/ilopt/ilopt.deps.json @@ -0,0 +1,490 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v2.0", + "signature": "fa2f972fe2403570b156ee04aa7e24d6f1f49dca" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v2.0": { + "ilopt/0.1.0-alpha": { + "dependencies": { + "Microsoft.Net.Compilers": "2.3.2", + "Mono.Cecil": "0.10.0-beta6", + "System.Collections.Immutable": "1.4.0" + }, + "runtime": { + "ilopt.dll": {} + } + }, + "Microsoft.Net.Compilers/2.3.2": {}, + "Microsoft.NETCore.Targets/1.0.1": {}, + "Mono.Cecil/0.10.0-beta6": { + "dependencies": { + "System.Collections": "4.0.11", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Reflection": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Csp": "4.0.0", + "System.Threading": "4.0.11" + }, + "runtime": { + "lib/netstandard1.3/Mono.Cecil.Mdb.dll": {}, + "lib/netstandard1.3/Mono.Cecil.Pdb.dll": {}, + "lib/netstandard1.3/Mono.Cecil.Rocks.dll": {}, + "lib/netstandard1.3/Mono.Cecil.dll": {} + } + }, + "runtime.native.System.Security.Cryptography/4.0.0": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "System.Collections/4.0.11": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Collections.Concurrent/4.0.12": { + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Collections.Immutable/1.4.0": {}, + "System.Diagnostics.Debug/4.0.11": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.Tracing/4.1.0": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Globalization/4.0.11": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.IO/4.1.0": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.IO.FileSystem/4.0.1": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Text.Encoding": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.IO.FileSystem.Primitives/4.0.1": { + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.Linq/4.1.0": { + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Reflection/4.1.0": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Primitives/4.0.1": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Resources.ResourceManager/4.0.1": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime/4.1.0": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "System.Runtime.Extensions/4.1.0": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Handles/4.0.1": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.InteropServices/4.1.0": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1" + } + }, + "System.Runtime.Numerics/4.0.1": { + "dependencies": { + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Security.Cryptography.Algorithms/4.2.0": { + "dependencies": { + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + }, + "runtimeTargets": { + "runtime/unix/lib/_._": { + "rid": "unix", + "assetType": "runtime" + }, + "runtime/win/lib/_._": { + "rid": "win", + "assetType": "runtime" + } + } + }, + "System.Security.Cryptography.Csp/4.0.0": { + "dependencies": { + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11" + }, + "runtimeTargets": { + "runtime/unix/lib/_._": { + "rid": "unix", + "assetType": "runtime" + }, + "runtime/win/lib/_._": { + "rid": "win", + "assetType": "runtime" + } + } + }, + "System.Security.Cryptography.Encoding/4.0.0": { + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + }, + "runtimeTargets": { + "runtime/unix/lib/_._": { + "rid": "unix", + "assetType": "runtime" + }, + "runtime/win/lib/_._": { + "rid": "win", + "assetType": "runtime" + } + } + }, + "System.Security.Cryptography.Primitives/4.0.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Text.Encoding/4.0.11": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Threading/4.0.11": { + "dependencies": { + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Tasks/4.0.11": { + "dependencies": { + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + } + } + }, + "libraries": { + "ilopt/0.1.0-alpha": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.Net.Compilers/2.3.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YccjUS0qYw2YUtEwajWfhEjDWJfDvnSqq18MiVfZESd3lQFBZAlLU0Tb3mgFYjD/EGfRByypIAVVW0BFtJFw5Q==", + "path": "microsoft.net.compilers/2.3.2", + "hashPath": "microsoft.net.compilers.2.3.2.nupkg.sha512" + }, + "Microsoft.NETCore.Targets/1.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==", + "path": "microsoft.netcore.targets/1.0.1", + "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512" + }, + "Mono.Cecil/0.10.0-beta6": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AGOyahYE6CGh3dLz/mz6cnj8hABoJm2KcMRHSHMrW75WHgU5YB+5PSQTVWsmQk9RFC4HAGr5ZzLMFFXsbmTi1w==", + "path": "mono.cecil/0.10.0-beta6", + "hashPath": "mono.cecil.0.10.0-beta6.nupkg.sha512" + }, + "runtime.native.System.Security.Cryptography/4.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-2CQK0jmO6Eu7ZeMgD+LOFbNJSXHFVQbCJJkEyEwowh1SCgYnrn9W9RykMfpeeVGw7h4IBvYikzpGUlmZTUafJw==", + "path": "runtime.native.system.security.cryptography/4.0.0", + "hashPath": "runtime.native.system.security.cryptography.4.0.0.nupkg.sha512" + }, + "System.Collections/4.0.11": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==", + "path": "system.collections/4.0.11", + "hashPath": "system.collections.4.0.11.nupkg.sha512" + }, + "System.Collections.Concurrent/4.0.12": { + "type": "package", + "serviceable": true, + "sha512": "sha512-2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==", + "path": "system.collections.concurrent/4.0.12", + "hashPath": "system.collections.concurrent.4.0.12.nupkg.sha512" + }, + "System.Collections.Immutable/1.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-71hw5RUJRu5+q/geUY69gpXD8Upd12cH+F3MwpXV2zle7Bqqkrmc1JblOTuvUcgmdnUtQvBlV5e1d6RH+H2lvA==", + "path": "system.collections.immutable/1.4.0", + "hashPath": "system.collections.immutable.1.4.0.nupkg.sha512" + }, + "System.Diagnostics.Debug/4.0.11": { + "type": "package", + "serviceable": true, + "sha512": "sha512-w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==", + "path": "system.diagnostics.debug/4.0.11", + "hashPath": "system.diagnostics.debug.4.0.11.nupkg.sha512" + }, + "System.Diagnostics.Tracing/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vDN1PoMZCkkdNjvZLql592oYJZgS7URcJzJ7bxeBgGtx5UtR5leNm49VmfHGqIffX4FKacHbI3H6UyNSHQknBg==", + "path": "system.diagnostics.tracing/4.1.0", + "hashPath": "system.diagnostics.tracing.4.1.0.nupkg.sha512" + }, + "System.Globalization/4.0.11": { + "type": "package", + "serviceable": true, + "sha512": "sha512-B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==", + "path": "system.globalization/4.0.11", + "hashPath": "system.globalization.4.0.11.nupkg.sha512" + }, + "System.IO/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==", + "path": "system.io/4.1.0", + "hashPath": "system.io.4.1.0.nupkg.sha512" + }, + "System.IO.FileSystem/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IBErlVq5jOggAD69bg1t0pJcHaDbJbWNUZTPI96fkYWzwYbN6D9wRHMULLDd9dHsl7C2YsxXL31LMfPI1SWt8w==", + "path": "system.io.filesystem/4.0.1", + "hashPath": "system.io.filesystem.4.0.1.nupkg.sha512" + }, + "System.IO.FileSystem.Primitives/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kWkKD203JJKxJeE74p8aF8y4Qc9r9WQx4C0cHzHPrY3fv/L/IhWnyCHaFJ3H1QPOH6A93whlQ2vG5nHlBDvzWQ==", + "path": "system.io.filesystem.primitives/4.0.1", + "hashPath": "system.io.filesystem.primitives.4.0.1.nupkg.sha512" + }, + "System.Linq/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==", + "path": "system.linq/4.1.0", + "hashPath": "system.linq.4.1.0.nupkg.sha512" + }, + "System.Reflection/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==", + "path": "system.reflection/4.1.0", + "hashPath": "system.reflection.4.1.0.nupkg.sha512" + }, + "System.Reflection.Primitives/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==", + "path": "system.reflection.primitives/4.0.1", + "hashPath": "system.reflection.primitives.4.0.1.nupkg.sha512" + }, + "System.Resources.ResourceManager/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==", + "path": "system.resources.resourcemanager/4.0.1", + "hashPath": "system.resources.resourcemanager.4.0.1.nupkg.sha512" + }, + "System.Runtime/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==", + "path": "system.runtime/4.1.0", + "hashPath": "system.runtime.4.1.0.nupkg.sha512" + }, + "System.Runtime.Extensions/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==", + "path": "system.runtime.extensions/4.1.0", + "hashPath": "system.runtime.extensions.4.1.0.nupkg.sha512" + }, + "System.Runtime.Handles/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nCJvEKguXEvk2ymk1gqj625vVnlK3/xdGzx0vOKicQkoquaTBJTP13AIYkocSUwHCLNBwUbXTqTWGDxBTWpt7g==", + "path": "system.runtime.handles/4.0.1", + "hashPath": "system.runtime.handles.4.0.1.nupkg.sha512" + }, + "System.Runtime.InteropServices/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-16eu3kjHS633yYdkjwShDHZLRNMKVi/s0bY8ODiqJ2RfMhDMAwxZaUaWVnZ2P71kr/or+X9o/xFWtNqz8ivieQ==", + "path": "system.runtime.interopservices/4.1.0", + "hashPath": "system.runtime.interopservices.4.1.0.nupkg.sha512" + }, + "System.Runtime.Numerics/4.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+XbKFuzdmLP3d1o9pdHu2nxjNr2OEPqGzKeegPLCUMM71a0t50A/rOcIRmGs9wR7a8KuHX6hYs/7/TymIGLNqg==", + "path": "system.runtime.numerics/4.0.1", + "hashPath": "system.runtime.numerics.4.0.1.nupkg.sha512" + }, + "System.Security.Cryptography.Algorithms/4.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-8JQFxbLVdrtIOKMDN38Fn0GWnqYZw/oMlwOUG/qz1jqChvyZlnUmu+0s7wLx7JYua/nAXoESpHA3iw11QFWhXg==", + "path": "system.security.cryptography.algorithms/4.2.0", + "hashPath": "system.security.cryptography.algorithms.4.2.0.nupkg.sha512" + }, + "System.Security.Cryptography.Csp/4.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/i1Usuo4PgAqgbPNC0NjbO3jPW//BoBlTpcWFD1EHVbidH21y4c1ap5bbEMSGAXjAShhMH4abi/K8fILrnu4BQ==", + "path": "system.security.cryptography.csp/4.0.0", + "hashPath": "system.security.cryptography.csp.4.0.0.nupkg.sha512" + }, + "System.Security.Cryptography.Encoding/4.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FbKgE5MbxSQMPcSVRgwM6bXN3GtyAh04NkV8E5zKCBE26X0vYW0UtTa2FIgkH33WVqBVxRgxljlVYumWtU+HcQ==", + "path": "system.security.cryptography.encoding/4.0.0", + "hashPath": "system.security.cryptography.encoding.4.0.0.nupkg.sha512" + }, + "System.Security.Cryptography.Primitives/4.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Wkd7QryWYjkQclX0bngpntW5HSlMzeJU24UaLJQ7YTfI8ydAVAaU2J+HXLLABOVJlKTVvAeL0Aj39VeTe7L+oA==", + "path": "system.security.cryptography.primitives/4.0.0", + "hashPath": "system.security.cryptography.primitives.4.0.0.nupkg.sha512" + }, + "System.Text.Encoding/4.0.11": { + "type": "package", + "serviceable": true, + "sha512": "sha512-U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==", + "path": "system.text.encoding/4.0.11", + "hashPath": "system.text.encoding.4.0.11.nupkg.sha512" + }, + "System.Threading/4.0.11": { + "type": "package", + "serviceable": true, + "sha512": "sha512-N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==", + "path": "system.threading/4.0.11", + "hashPath": "system.threading.4.0.11.nupkg.sha512" + }, + "System.Threading.Tasks/4.0.11": { + "type": "package", + "serviceable": true, + "sha512": "sha512-k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==", + "path": "system.threading.tasks/4.0.11", + "hashPath": "system.threading.tasks.4.0.11.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Dependencies/ilopt/ilopt.dll b/Dependencies/ilopt/ilopt.dll new file mode 100644 index 0000000000000000000000000000000000000000..6b68388b245713d1e5aa4a830d4c54abf2528a7e GIT binary patch literal 41472 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 literal 0 HcmV?d00001 diff --git a/Dependencies/ilopt/ilopt.runtimeconfig.json b/Dependencies/ilopt/ilopt.runtimeconfig.json new file mode 100644 index 000000000..7539019b1 --- /dev/null +++ b/Dependencies/ilopt/ilopt.runtimeconfig.json @@ -0,0 +1,9 @@ +{ + "runtimeOptions": { + "tfm": "netcoreapp2.0", + "framework": { + "name": "Microsoft.NETCore.App", + "version": "2.0.0" + } + } +} \ No newline at end of file diff --git a/Dependencies/ilopt/ilopt.xml b/Dependencies/ilopt/ilopt.xml new file mode 100644 index 000000000..d79957407 --- /dev/null +++ b/Dependencies/ilopt/ilopt.xml @@ -0,0 +1,71 @@ + + + + ilopt + + + + Defines an optimization that can be performed by the tool. + + + Initializes a new instance of the struct. + The name of the optimization. + The description of the optimization. + The parameters available to the optimization. + The method to use when performing the optimization. + + + Gets the parameters available to the optimization. + + + Gets the name of the optimization. + + + Gets the description of the optimization. + + + Gets or sets the number of methods that were failed by the optimization. + + + Gets the method to use when performing the optimization. + + + Gets or sets the parameter to use when performing the optimization. + + + Gets or sets the number of methods that were skipped by the optimization. + + + Gets or sets the number of methods that were updated by the optimization. + + + Provides methods for stripping the 'init' flag from the '.locals' directive for a method. + + + Defines the types and counts of data that was processed by the tool. + + + The number of modules that were processed. + + + The number of types that were processed. + + + The number of events that were processed. + + + The number of properties that were processed. + + + The number of methods that were processed. + + + Provides a set of methods for executing a program. + + + The entry point of the program. + The arguments that should be used when running the program. + The exit code of the program. + + + From 1b83c2045b0c087cb956bb854f223bf286f23c5b Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 20:29:13 +0200 Subject: [PATCH 26/29] Remove DEBUG keyword from release version --- BepuUtilities/BepuUtilities.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BepuUtilities/BepuUtilities.csproj b/BepuUtilities/BepuUtilities.csproj index c1f3a745b..a9e9aa538 100644 --- a/BepuUtilities/BepuUtilities.csproj +++ b/BepuUtilities/BepuUtilities.csproj @@ -39,7 +39,7 @@ true - TRACE;DEBUG;RELEASE;NETSTANDARD2_0;RELEASESTRIP + TRACE;RELEASE;NETSTANDARD2_0;RELEASESTRIP From 0325cdbc6754d07357020b772315e3b352683bbd Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 20:52:37 +0200 Subject: [PATCH 27/29] Update version to reflect that this is a fork with modifications --- BepuPhysics/BepuPhysics.csproj | 4 +++- BepuUtilities/BepuUtilities.csproj | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/BepuPhysics/BepuPhysics.csproj b/BepuPhysics/BepuPhysics.csproj index 481b5f40d..b7af6965b 100644 --- a/BepuPhysics/BepuPhysics.csproj +++ b/BepuPhysics/BepuPhysics.csproj @@ -1,7 +1,7 @@  netstandard2.0 - 2.4.0-beta6 + 2.4.0-neos_v1 Bepu Entertainment LLC Ross Nordby Speedy real time physics simulation library. @@ -18,6 +18,8 @@ true false key.snk + 2.4.0.1 + 2.4.0.1 diff --git a/BepuUtilities/BepuUtilities.csproj b/BepuUtilities/BepuUtilities.csproj index a9e9aa538..642bc99d0 100644 --- a/BepuUtilities/BepuUtilities.csproj +++ b/BepuUtilities/BepuUtilities.csproj @@ -3,7 +3,7 @@ BepuUtilities BepuUtilities netstandard2.0 - 2.4.0-beta6 + 2.4.0-neos_v1 Bepu Entertainment LLC Ross Nordby Supporting utilities library for BEPUphysics v2. @@ -19,6 +19,8 @@ true false key.snk + 2.4.0.1 + 2.4.0.1 From 5b4b90a79bf0f0ac63d8cb88db304ddfd7e8eff3 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 29 Aug 2021 20:57:25 +0200 Subject: [PATCH 28/29] Use actually valid version string --- BepuPhysics/BepuPhysics.csproj | 2 +- BepuUtilities/BepuUtilities.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BepuPhysics/BepuPhysics.csproj b/BepuPhysics/BepuPhysics.csproj index b7af6965b..7f111d88d 100644 --- a/BepuPhysics/BepuPhysics.csproj +++ b/BepuPhysics/BepuPhysics.csproj @@ -1,7 +1,7 @@  netstandard2.0 - 2.4.0-neos_v1 + 2.4.0-neos1 Bepu Entertainment LLC Ross Nordby Speedy real time physics simulation library. diff --git a/BepuUtilities/BepuUtilities.csproj b/BepuUtilities/BepuUtilities.csproj index 642bc99d0..b58a1e5b3 100644 --- a/BepuUtilities/BepuUtilities.csproj +++ b/BepuUtilities/BepuUtilities.csproj @@ -3,7 +3,7 @@ BepuUtilities BepuUtilities netstandard2.0 - 2.4.0-neos_v1 + 2.4.0-neos1 Bepu Entertainment LLC Ross Nordby Supporting utilities library for BEPUphysics v2. From 76d0fd5fda0d0fc2aaf65f37f77b2a642599e365 Mon Sep 17 00:00:00 2001 From: Tomas Mariancik Date: Sun, 12 Sep 2021 14:45:25 +0200 Subject: [PATCH 29/29] Lower the mesh reduction limit more because we're cheap --- BepuPhysics/CollisionDetection/MeshReduction.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BepuPhysics/CollisionDetection/MeshReduction.cs b/BepuPhysics/CollisionDetection/MeshReduction.cs index 9fdf53e26..d788760d5 100644 --- a/BepuPhysics/CollisionDetection/MeshReduction.cs +++ b/BepuPhysics/CollisionDetection/MeshReduction.cs @@ -236,7 +236,7 @@ public unsafe static void ReduceManifolds(ref Buffer continuationTrian //The current quadratic scaling behavior of this reduction can be explosively bad as the count rises into the thousands. //Ideally we'll do https://github.com/bepu/bepuphysics2/issues/66 so this will become a nonissue. //Until then, attempting to reduce absurdo-manifolds is likely misguided. Better to have some bumps than a multi-second hang. - if (count > 1024) + if (count > 128) return; //Narrow the region of interest. continuationTriangles.Slice(start, count, out var triangles);