forked from bit/DotRecastNetSim
remove VectorPtr
This commit is contained in:
parent
e13dc0ac70
commit
12b5cc9ea8
|
@ -155,15 +155,6 @@ namespace DotRecast.Core
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Vector3f VSub(VectorPtr v1, VectorPtr v2)
|
|
||||||
{
|
|
||||||
Vector3f dest = new Vector3f();
|
|
||||||
dest.x = v1.Get(0) - v2.Get(0);
|
|
||||||
dest.y = v1.Get(1) - v2.Get(1);
|
|
||||||
dest.z = v1.Get(2) - v2.Get(2);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Vector3f VSub(Vector3f v1, Vector3f v2)
|
public static Vector3f VSub(Vector3f v1, Vector3f v2)
|
||||||
{
|
{
|
||||||
Vector3f dest = new Vector3f();
|
Vector3f dest = new Vector3f();
|
||||||
|
@ -173,16 +164,6 @@ namespace DotRecast.Core
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vector3f VSub(Vector3f v1, VectorPtr v2)
|
|
||||||
{
|
|
||||||
Vector3f dest = new Vector3f();
|
|
||||||
dest.x = v1.x - v2.Get(0);
|
|
||||||
dest.y = v1.y - v2.Get(1);
|
|
||||||
dest.z = v1.z - v2.Get(2);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static Vector3f VSub(Vector3f v1, float[] v2)
|
public static Vector3f VSub(Vector3f v1, float[] v2)
|
||||||
{
|
{
|
||||||
Vector3f dest = new Vector3f();
|
Vector3f dest = new Vector3f();
|
||||||
|
@ -821,8 +802,9 @@ namespace DotRecast.Core
|
||||||
var p0v = p0;
|
var p0v = p0;
|
||||||
for (int i = 0, j = nverts - 1; i < nverts; j = i++)
|
for (int i = 0, j = nverts - 1; i < nverts; j = i++)
|
||||||
{
|
{
|
||||||
VectorPtr vpj = new VectorPtr(verts, j * 3);
|
Vector3f vpj = Vector3f.Of(verts, j * 3);
|
||||||
var edge = VSub(new VectorPtr(verts, i * 3), vpj);
|
Vector3f vpi = Vector3f.Of(verts, i * 3);
|
||||||
|
var edge = VSub(vpi, vpj);
|
||||||
var diff = VSub(p0v, vpj);
|
var diff = VSub(p0v, vpj);
|
||||||
float n = VPerp2D(edge, diff);
|
float n = VPerp2D(edge, diff);
|
||||||
float d = VPerp2D(dir, edge);
|
float d = VPerp2D(dir, edge);
|
||||||
|
|
|
@ -31,7 +31,12 @@ namespace DotRecast.Core
|
||||||
|
|
||||||
public static Vector3f Of(float[] f)
|
public static Vector3f Of(float[] f)
|
||||||
{
|
{
|
||||||
return new Vector3f(f);
|
return Of(f, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector3f Of(float[] f, int idx)
|
||||||
|
{
|
||||||
|
return Of(f[idx + 0], f[idx + 1], f[idx + 2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vector3f Of(float x, float y, float z)
|
public static Vector3f Of(float x, float y, float z)
|
||||||
|
@ -95,7 +100,7 @@ namespace DotRecast.Core
|
||||||
|
|
||||||
return Equals((Vector3f)obj);
|
return Equals((Vector3f)obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Equals(Vector3f other)
|
public bool Equals(Vector3f other)
|
||||||
{
|
{
|
||||||
return x.Equals(other.x) &&
|
return x.Equals(other.x) &&
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2009-2010 Mikko Mononen memon@inside.org
|
|
||||||
recast4j copyright (c) 2015-2019 Piotr Piastucki piotr@jtilia.org
|
|
||||||
DotRecast Copyright (c) 2023 Choi Ikpil ikpil@naver.com
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace DotRecast.Core
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Wrapper for 3-element pieces (3D vectors) of a bigger float array.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class VectorPtr
|
|
||||||
{
|
|
||||||
private readonly float[] array;
|
|
||||||
private readonly int index;
|
|
||||||
|
|
||||||
public VectorPtr(float[] array) :
|
|
||||||
this(array, 0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public VectorPtr(float[] array, int index)
|
|
||||||
{
|
|
||||||
this.array = array;
|
|
||||||
this.index = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float Get(int offset)
|
|
||||||
{
|
|
||||||
return array[index + offset];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -48,14 +48,13 @@ namespace DotRecast.Detour.Extras.Unity.Astar
|
||||||
connection.poly = poly;
|
connection.poly = poly;
|
||||||
connection.pos = new float[]
|
connection.pos = new float[]
|
||||||
{
|
{
|
||||||
l.clamped1.x, l.clamped1.y, l.clamped1.z,
|
l.clamped1.x, l.clamped1.y, l.clamped1.z,
|
||||||
l.clamped2.x, l.clamped2.y, l.clamped2.z
|
l.clamped2.x, l.clamped2.y, l.clamped2.z
|
||||||
};
|
};
|
||||||
connection.rad = 0.1f;
|
connection.rad = 0.1f;
|
||||||
connection.side = startTile == endTile
|
connection.side = startTile == endTile
|
||||||
? 0xFF
|
? 0xFF
|
||||||
: NavMeshBuilder.ClassifyOffMeshPoint(new VectorPtr(connection.pos, 3),
|
: NavMeshBuilder.ClassifyOffMeshPoint(Vector3f.Of(connection.pos, 3), startTile.header.bmin, startTile.header.bmax);
|
||||||
startTile.header.bmin, startTile.header.bmax);
|
|
||||||
connection.userId = (int)l.linkID;
|
connection.userId = (int)l.linkID;
|
||||||
if (startTile.offMeshCons == null)
|
if (startTile.offMeshCons == null)
|
||||||
{
|
{
|
||||||
|
@ -73,4 +72,4 @@ namespace DotRecast.Detour.Extras.Unity.Astar
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -667,9 +667,10 @@ namespace DotRecast.Detour
|
||||||
m_openList.Push(startNode);
|
m_openList.Push(startNode);
|
||||||
|
|
||||||
float radiusSqr = Sqr(maxRadius);
|
float radiusSqr = Sqr(maxRadius);
|
||||||
Vector3f hitPos = new Vector3f();
|
Vector3f hitPos = Vector3f.Zero;
|
||||||
VectorPtr bestvj = null;
|
Vector3f? bestvj = null;
|
||||||
VectorPtr bestvi = null;
|
Vector3f? bestvi = null;
|
||||||
|
|
||||||
while (!m_openList.IsEmpty())
|
while (!m_openList.IsEmpty())
|
||||||
{
|
{
|
||||||
Node bestNode = m_openList.Pop();
|
Node bestNode = m_openList.Pop();
|
||||||
|
@ -752,11 +753,11 @@ namespace DotRecast.Detour
|
||||||
// Calculate hit pos.
|
// Calculate hit pos.
|
||||||
hitPos.x = bestTile.data.verts[vj] + (bestTile.data.verts[vi] - bestTile.data.verts[vj]) * tseg;
|
hitPos.x = bestTile.data.verts[vj] + (bestTile.data.verts[vi] - bestTile.data.verts[vj]) * tseg;
|
||||||
hitPos.y = bestTile.data.verts[vj + 1]
|
hitPos.y = bestTile.data.verts[vj + 1]
|
||||||
+ (bestTile.data.verts[vi + 1] - bestTile.data.verts[vj + 1]) * tseg;
|
+ (bestTile.data.verts[vi + 1] - bestTile.data.verts[vj + 1]) * tseg;
|
||||||
hitPos.z = bestTile.data.verts[vj + 2]
|
hitPos.z = bestTile.data.verts[vj + 2]
|
||||||
+ (bestTile.data.verts[vi + 2] - bestTile.data.verts[vj + 2]) * tseg;
|
+ (bestTile.data.verts[vi + 2] - bestTile.data.verts[vj + 2]) * tseg;
|
||||||
bestvj = new VectorPtr(bestTile.data.verts, vj);
|
bestvj = Vector3f.Of(bestTile.data.verts, vj);
|
||||||
bestvi = new VectorPtr(bestTile.data.verts, vi);
|
bestvi = Vector3f.Of(bestTile.data.verts, vi);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = bestTile.polyLinks[bestPoly.index]; i != NavMesh.DT_NULL_LINK; i = bestTile.links[i].next)
|
for (int i = bestTile.polyLinks[bestPoly.index]; i != NavMesh.DT_NULL_LINK; i = bestTile.links[i].next)
|
||||||
|
@ -843,7 +844,7 @@ namespace DotRecast.Detour
|
||||||
Vector3f hitNormal = new Vector3f();
|
Vector3f hitNormal = new Vector3f();
|
||||||
if (bestvi != null && bestvj != null)
|
if (bestvi != null && bestvj != null)
|
||||||
{
|
{
|
||||||
var tangent = VSub(bestvi, bestvj);
|
var tangent = VSub(bestvi.Value, bestvj.Value);
|
||||||
hitNormal.x = tangent.z;
|
hitNormal.x = tangent.z;
|
||||||
hitNormal.y = 0;
|
hitNormal.y = 0;
|
||||||
hitNormal.z = -tangent.x;
|
hitNormal.z = -tangent.x;
|
||||||
|
|
|
@ -223,13 +223,13 @@ namespace DotRecast.Detour
|
||||||
const int XM = 1 << 2;
|
const int XM = 1 << 2;
|
||||||
const int ZM = 1 << 3;
|
const int ZM = 1 << 3;
|
||||||
|
|
||||||
public static int ClassifyOffMeshPoint(VectorPtr pt, Vector3f bmin, Vector3f bmax)
|
public static int ClassifyOffMeshPoint(Vector3f pt, Vector3f bmin, Vector3f bmax)
|
||||||
{
|
{
|
||||||
int outcode = 0;
|
int outcode = 0;
|
||||||
outcode |= (pt.Get(0) >= bmax.x) ? XP : 0;
|
outcode |= (pt.x >= bmax.x) ? XP : 0;
|
||||||
outcode |= (pt.Get(2) >= bmax.z) ? ZP : 0;
|
outcode |= (pt.z >= bmax.z) ? ZP : 0;
|
||||||
outcode |= (pt.Get(0) < bmin.x) ? XM : 0;
|
outcode |= (pt.x < bmin.x) ? XM : 0;
|
||||||
outcode |= (pt.Get(2) < bmin.z) ? ZM : 0;
|
outcode |= (pt.z < bmin.z) ? ZM : 0;
|
||||||
|
|
||||||
switch (outcode)
|
switch (outcode)
|
||||||
{
|
{
|
||||||
|
@ -319,8 +319,8 @@ namespace DotRecast.Detour
|
||||||
|
|
||||||
for (int i = 0; i < option.offMeshConCount; ++i)
|
for (int i = 0; i < option.offMeshConCount; ++i)
|
||||||
{
|
{
|
||||||
VectorPtr p0 = new VectorPtr(option.offMeshConVerts, (i * 2 + 0) * 3);
|
var p0 = Vector3f.Of(option.offMeshConVerts, (i * 2 + 0) * 3);
|
||||||
VectorPtr p1 = new VectorPtr(option.offMeshConVerts, (i * 2 + 1) * 3);
|
var p1 = Vector3f.Of(option.offMeshConVerts, (i * 2 + 1) * 3);
|
||||||
|
|
||||||
offMeshConClass[i * 2 + 0] = ClassifyOffMeshPoint(p0, bmin, bmax);
|
offMeshConClass[i * 2 + 0] = ClassifyOffMeshPoint(p0, bmin, bmax);
|
||||||
offMeshConClass[i * 2 + 1] = ClassifyOffMeshPoint(p1, bmin, bmax);
|
offMeshConClass[i * 2 + 1] = ClassifyOffMeshPoint(p1, bmin, bmax);
|
||||||
|
@ -329,7 +329,7 @@ namespace DotRecast.Detour
|
||||||
// potentially touching the mesh.
|
// potentially touching the mesh.
|
||||||
if (offMeshConClass[i * 2 + 0] == 0xff)
|
if (offMeshConClass[i * 2 + 0] == 0xff)
|
||||||
{
|
{
|
||||||
if (p0.Get(1) < bmin.y || p0.Get(1) > bmax.y)
|
if (p0.y < bmin.y || p0.y > bmax.y)
|
||||||
offMeshConClass[i * 2 + 0] = 0;
|
offMeshConClass[i * 2 + 0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2375,12 +2375,12 @@ namespace DotRecast.Detour
|
||||||
// and correct the height (since the raycast moves in 2d)
|
// and correct the height (since the raycast moves in 2d)
|
||||||
lastPos = curPos;
|
lastPos = curPos;
|
||||||
curPos = VMad(startPos, dir, hit.t);
|
curPos = VMad(startPos, dir, hit.t);
|
||||||
VectorPtr e1 = new VectorPtr(verts, iresult.segMax * 3);
|
var e1 = Vector3f.Of(verts, iresult.segMax * 3);
|
||||||
VectorPtr e2 = new VectorPtr(verts, ((iresult.segMax + 1) % nv) * 3);
|
var e2 = Vector3f.Of(verts, ((iresult.segMax + 1) % nv) * 3);
|
||||||
Vector3f eDir = VSub(e2, e1);
|
var eDir = VSub(e2, e1);
|
||||||
Vector3f diff = VSub(curPos, e1);
|
var diff = VSub(curPos, e1);
|
||||||
float s = Sqr(eDir.x) > Sqr(eDir.z) ? diff.x / eDir.x : diff.z / eDir.z;
|
float s = Sqr(eDir.x) > Sqr(eDir.z) ? diff.x / eDir.x : diff.z / eDir.z;
|
||||||
curPos.y = e1.Get(1) + eDir.y * s;
|
curPos.y = e1.y + eDir.y * s;
|
||||||
|
|
||||||
hit.pathCost += filter.GetCost(lastPos, curPos, prevRef, prevTile, prevPoly, curRef, tile, poly,
|
hit.pathCost += filter.GetCost(lastPos, curPos, prevRef, prevTile, prevPoly, curRef, tile, poly,
|
||||||
nextRef, nextTile, nextPoly);
|
nextRef, nextTile, nextPoly);
|
||||||
|
@ -3193,8 +3193,8 @@ namespace DotRecast.Detour
|
||||||
|
|
||||||
float radiusSqr = Sqr(maxRadius);
|
float radiusSqr = Sqr(maxRadius);
|
||||||
Vector3f hitPos = new Vector3f();
|
Vector3f hitPos = new Vector3f();
|
||||||
VectorPtr bestvj = null;
|
Vector3f? bestvj = null;
|
||||||
VectorPtr bestvi = null;
|
Vector3f? bestvi = null;
|
||||||
while (!m_openList.IsEmpty())
|
while (!m_openList.IsEmpty())
|
||||||
{
|
{
|
||||||
Node bestNode = m_openList.Pop();
|
Node bestNode = m_openList.Pop();
|
||||||
|
@ -3280,8 +3280,8 @@ namespace DotRecast.Detour
|
||||||
+ (bestTile.data.verts[vi + 1] - bestTile.data.verts[vj + 1]) * tseg;
|
+ (bestTile.data.verts[vi + 1] - bestTile.data.verts[vj + 1]) * tseg;
|
||||||
hitPos.z = bestTile.data.verts[vj + 2]
|
hitPos.z = bestTile.data.verts[vj + 2]
|
||||||
+ (bestTile.data.verts[vi + 2] - bestTile.data.verts[vj + 2]) * tseg;
|
+ (bestTile.data.verts[vi + 2] - bestTile.data.verts[vj + 2]) * tseg;
|
||||||
bestvj = new VectorPtr(bestTile.data.verts, vj);
|
bestvj = Vector3f.Of(bestTile.data.verts, vj);
|
||||||
bestvi = new VectorPtr(bestTile.data.verts, vi);
|
bestvi = Vector3f.Of(bestTile.data.verts, vi);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = bestTile.polyLinks[bestPoly.index]; i != NavMesh.DT_NULL_LINK; i = bestTile.links[i].next)
|
for (int i = bestTile.polyLinks[bestPoly.index]; i != NavMesh.DT_NULL_LINK; i = bestTile.links[i].next)
|
||||||
|
@ -3368,7 +3368,7 @@ namespace DotRecast.Detour
|
||||||
Vector3f hitNormal = new Vector3f();
|
Vector3f hitNormal = new Vector3f();
|
||||||
if (bestvi != null && bestvj != null)
|
if (bestvi != null && bestvj != null)
|
||||||
{
|
{
|
||||||
var tangent = VSub(bestvi, bestvj);
|
var tangent = VSub(bestvi.Value, bestvj.Value);
|
||||||
hitNormal.x = tangent.z;
|
hitNormal.x = tangent.z;
|
||||||
hitNormal.y = 0;
|
hitNormal.y = 0;
|
||||||
hitNormal.z = -tangent.x;
|
hitNormal.z = -tangent.x;
|
||||||
|
|
Loading…
Reference in New Issue