From caad52f6362219baa174f91062e27e91154cfc8a Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 21 Mar 2018 23:44:08 -0400 Subject: [PATCH] Core/Vmap: Fix vmaps not getting floor on gameobjects --- .../Collision/BoundingIntervalHierarchy.cs | 28 +++++++++---------- .../BoundingIntervalHierarchyWrap.cs | 2 +- Source/Game/Collision/Callbacks.cs | 5 ++-- .../Game/Collision/Models/GameObjectModel.cs | 2 +- Source/Game/Collision/Models/IModel.cs | 4 +++ Source/Game/Collision/Models/WorldModel.cs | 4 +-- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/Source/Game/Collision/BoundingIntervalHierarchy.cs b/Source/Game/Collision/BoundingIntervalHierarchy.cs index aee94dabf..840dc0429 100644 --- a/Source/Game/Collision/BoundingIntervalHierarchy.cs +++ b/Source/Game/Collision/BoundingIntervalHierarchy.cs @@ -33,12 +33,10 @@ namespace Game.Collision void init_empty() { - tree.Clear(); - objects.Clear(); + tree= new uint[3]; + objects = new uint[0]; // create space for the first node - tree.Add(3u << 30); // dummy leaf - tree.Add(0); - tree.Add(0); + tree[0] = (3u << 30); // dummy leaf } void buildHierarchy(List tempTree, buildData dat, BuildStats stats) @@ -278,14 +276,14 @@ namespace Game.Collision bounds = new AxisAlignedBox(lo, hi); uint treeSize = reader.ReadUInt32(); - tree.Clear(); + tree = new uint[treeSize]; for (var i = 0; i < treeSize; i++) - tree.Add(reader.ReadUInt32()); + tree[i] = reader.ReadUInt32(); var count = reader.ReadUInt32(); - objects.Clear(); + objects = new uint[count]; for (var i = 0; i < count; i++) - objects.Add(reader.ReadUInt32()); + objects[i] = reader.ReadUInt32(); return true; } @@ -314,12 +312,14 @@ namespace Game.Collision BuildStats stats = new BuildStats(); buildHierarchy(tempTree, dat, stats); + objects = new uint[dat.numPrims]; for (int i = 0; i < dat.numPrims; ++i) - objects.Add(dat.indices[i]); - tree = tempTree; + objects[i] = dat.indices[i]; + + tree = tempTree.ToArray(); } - public uint primCount() { return (uint)objects.Count; } + public uint primCount() { return (uint)objects.Length; } public void intersectRay(Ray r, WorkerCallback intersectCallback, ref float maxDist, bool stopAtFirst = false) { @@ -612,8 +612,8 @@ namespace Game.Collision AxisAlignedBox bounds; - List tree = new List(); - List objects = new List(); + uint[] tree; + uint[] objects; [StructLayout(LayoutKind.Explicit)] public struct FloatToIntConverter diff --git a/Source/Game/Collision/BoundingIntervalHierarchyWrap.cs b/Source/Game/Collision/BoundingIntervalHierarchyWrap.cs index 3042ff13c..61b44ce02 100644 --- a/Source/Game/Collision/BoundingIntervalHierarchyWrap.cs +++ b/Source/Game/Collision/BoundingIntervalHierarchyWrap.cs @@ -85,7 +85,7 @@ namespace Game.Collision } /// Intersect ray - public override bool Invoke(Ray ray, uint idx, ref float maxDist) + public override bool Invoke(Ray ray, uint idx, ref float maxDist, bool stopAtFirst) { if (idx >= objects_size) return false; diff --git a/Source/Game/Collision/Callbacks.cs b/Source/Game/Collision/Callbacks.cs index 52a0563c5..ef88ecc4d 100644 --- a/Source/Game/Collision/Callbacks.cs +++ b/Source/Game/Collision/Callbacks.cs @@ -25,7 +25,6 @@ namespace Game.Collision { public virtual void Invoke(Vector3 point, uint entry) { } public virtual bool Invoke(Ray ray, uint entry, ref float distance, bool pStopAtFirstHit) { return false; } - public virtual bool Invoke(Ray r, GameObjectModel obj, ref float distance) { return false; } public virtual bool Invoke(Ray r, IModel obj, ref float distance) { return false; } public virtual bool Invoke(Ray ray, uint idx, ref float maxDist) { return false; } } @@ -234,9 +233,9 @@ namespace Game.Collision _phases = phases; } - public override bool Invoke(Ray r, GameObjectModel obj, ref float distance) + public override bool Invoke(Ray r, IModel obj, ref float distance) { - _didHit = obj.intersectRay(r, ref distance, true, _phases); + _didHit = obj.IntersectRay(r, ref distance, true, _phases); return _didHit; } diff --git a/Source/Game/Collision/Models/GameObjectModel.cs b/Source/Game/Collision/Models/GameObjectModel.cs index 384de2cff..b9494529e 100644 --- a/Source/Game/Collision/Models/GameObjectModel.cs +++ b/Source/Game/Collision/Models/GameObjectModel.cs @@ -86,7 +86,7 @@ namespace Game.Collision return mdl; } - public bool intersectRay(Ray ray, ref float maxDist, bool stopAtFirstHit, List phases) + public override bool IntersectRay(Ray ray, ref float maxDist, bool stopAtFirstHit, List phases) { if (!isCollisionEnabled() || !owner.IsSpawned()) return false; diff --git a/Source/Game/Collision/Models/IModel.cs b/Source/Game/Collision/Models/IModel.cs index 8bc6f377c..38edbe855 100644 --- a/Source/Game/Collision/Models/IModel.cs +++ b/Source/Game/Collision/Models/IModel.cs @@ -16,6 +16,7 @@ */ using Framework.GameMath; +using System.Collections.Generic; namespace Game.Collision { @@ -23,5 +24,8 @@ namespace Game.Collision { public virtual Vector3 getPosition() { return default(Vector3); } public virtual AxisAlignedBox getBounds() { return default(AxisAlignedBox); } + + public virtual bool IntersectRay(Ray ray, ref float maxDist, bool stopAtFirstHit, List phases) { return false; } + public virtual bool IntersectRay(Ray ray, ref float distance, bool stopAtFirstHit) { return false; } } } diff --git a/Source/Game/Collision/Models/WorldModel.cs b/Source/Game/Collision/Models/WorldModel.cs index aeafa62cd..e34c5c991 100644 --- a/Source/Game/Collision/Models/WorldModel.cs +++ b/Source/Game/Collision/Models/WorldModel.cs @@ -249,7 +249,7 @@ namespace Game.Collision return true; } - public bool IntersectRay(Ray ray, ref float distance, bool stopAtFirstHit) + public override bool IntersectRay(Ray ray, ref float distance, bool stopAtFirstHit) { if (triangles.Empty()) return false; @@ -311,7 +311,7 @@ namespace Game.Collision RootWMOID = 0; } - public bool IntersectRay(Ray ray, ref float distance, bool stopAtFirstHit) + public override bool IntersectRay(Ray ray, ref float distance, bool stopAtFirstHit) { // small M2 workaround, maybe better make separate class with virtual intersection funcs // in any case, there's no need to use a bound tree if we only have one submodel