Core/Vmaps: Fixed getting map height near large gameobjects like LK platform
This commit is contained in:
@@ -48,10 +48,7 @@ namespace Game.Collision
|
|||||||
{
|
{
|
||||||
impl.balance();
|
impl.balance();
|
||||||
}
|
}
|
||||||
int size()
|
|
||||||
{
|
|
||||||
return impl.size();
|
|
||||||
}
|
|
||||||
public void update(uint diff)
|
public void update(uint diff)
|
||||||
{
|
{
|
||||||
impl.update(diff);
|
impl.update(diff);
|
||||||
@@ -161,7 +158,7 @@ namespace Game.Collision
|
|||||||
|
|
||||||
public void update(uint difftime)
|
public void update(uint difftime)
|
||||||
{
|
{
|
||||||
if (size() == 0)
|
if (empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rebalance_timer.Update((int)difftime);
|
rebalance_timer.Update((int)difftime);
|
||||||
|
|||||||
@@ -37,17 +37,24 @@ namespace Game.Collision
|
|||||||
|
|
||||||
public virtual void insert(T value)
|
public virtual void insert(T value)
|
||||||
{
|
{
|
||||||
Vector3 pos = value.getPosition();
|
AxisAlignedBox bounds = value.getBounds();
|
||||||
Node node = getGridFor(pos.X, pos.Y);
|
Cell low = Cell.ComputeCell(bounds.Lo.X, bounds.Lo.Y);
|
||||||
node.insert(value);
|
Cell high = Cell.ComputeCell(bounds.Hi.X, bounds.Hi.Y);
|
||||||
memberTable.TryAdd(value, node);
|
for (int x = low.x; x <= high.x; ++x)
|
||||||
|
{
|
||||||
|
for (int y = low.y; y <= high.y; ++y)
|
||||||
|
{
|
||||||
|
Node node = getGrid(x, y);
|
||||||
|
node.insert(value);
|
||||||
|
memberTable.Add(value, node);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void remove(T value)
|
public virtual void remove(T value)
|
||||||
{
|
{
|
||||||
memberTable[value].remove(value);
|
|
||||||
// Remove the member
|
// Remove the member
|
||||||
memberTable.TryRemove(value, out Node node);
|
memberTable.Remove(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void balance()
|
public virtual void balance()
|
||||||
@@ -64,7 +71,7 @@ namespace Game.Collision
|
|||||||
}
|
}
|
||||||
|
|
||||||
public bool contains(T value) { return memberTable.ContainsKey(value); }
|
public bool contains(T value) { return memberTable.ContainsKey(value); }
|
||||||
public int size() { return memberTable.Count; }
|
public bool empty() { return memberTable.Empty(); }
|
||||||
|
|
||||||
public struct Cell
|
public struct Cell
|
||||||
{
|
{
|
||||||
@@ -92,12 +99,6 @@ namespace Game.Collision
|
|||||||
public bool isValid() { return x >= 0 && x < CELL_NUMBER && y >= 0 && y < CELL_NUMBER; }
|
public bool isValid() { return x >= 0 && x < CELL_NUMBER && y >= 0 && y < CELL_NUMBER; }
|
||||||
}
|
}
|
||||||
|
|
||||||
Node getGridFor(float fx, float fy)
|
|
||||||
{
|
|
||||||
Cell c = Cell.ComputeCell(fx, fy);
|
|
||||||
return getGrid(c.x, c.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
Node getGrid(int x, int y)
|
Node getGrid(int x, int y)
|
||||||
{
|
{
|
||||||
Contract.Assert(x < CELL_NUMBER && y < CELL_NUMBER);
|
Contract.Assert(x < CELL_NUMBER && y < CELL_NUMBER);
|
||||||
@@ -206,7 +207,7 @@ namespace Game.Collision
|
|||||||
node.intersectRay(ray, intersectCallback, ref max_dist);
|
node.intersectRay(ray, intersectCallback, ref max_dist);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConcurrentDictionary<T, Node> memberTable = new ConcurrentDictionary<T, Node>();
|
MultiMap<T, Node> memberTable = new MultiMap<T, Node>();
|
||||||
Node[][] nodes = new Node[CELL_NUMBER][];
|
Node[][] nodes = new Node[CELL_NUMBER][];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user