forked from mirror/DotRecast
remove nullable RcVec3f
This commit is contained in:
parent
ee5d3fd8c7
commit
e22c31052c
|
@ -3157,8 +3157,10 @@ namespace DotRecast.Detour
|
|||
m_openList.Push(startNode);
|
||||
|
||||
float radiusSqr = Sqr(maxRadius);
|
||||
RcVec3f? bestvj = null;
|
||||
RcVec3f? bestvi = null;
|
||||
|
||||
var hasBestV = false;
|
||||
var bestvj = RcVec3f.Zero;
|
||||
var bestvi = RcVec3f.Zero;
|
||||
|
||||
var status = DtStatus.DT_SUCCSESS;
|
||||
while (!m_openList.IsEmpty())
|
||||
|
@ -3238,6 +3240,7 @@ namespace DotRecast.Detour
|
|||
hitPos.x = bestTile.data.verts[vj + 0] + (bestTile.data.verts[vi + 0] - bestTile.data.verts[vj + 0]) * tseg;
|
||||
hitPos.y = bestTile.data.verts[vj + 1] + (bestTile.data.verts[vi + 1] - bestTile.data.verts[vj + 1]) * tseg;
|
||||
hitPos.z = bestTile.data.verts[vj + 2] + (bestTile.data.verts[vi + 2] - bestTile.data.verts[vj + 2]) * tseg;
|
||||
hasBestV = true;
|
||||
bestvj = RcVec3f.Of(bestTile.data.verts, vj);
|
||||
bestvi = RcVec3f.Of(bestTile.data.verts, vi);
|
||||
}
|
||||
|
@ -3322,9 +3325,9 @@ namespace DotRecast.Detour
|
|||
}
|
||||
|
||||
// Calc hit normal.
|
||||
if (bestvi != null && bestvj != null)
|
||||
if (hasBestV)
|
||||
{
|
||||
var tangent = bestvi.Value.Subtract(bestvj.Value);
|
||||
var tangent = bestvi.Subtract(bestvj);
|
||||
hitNormal.x = tangent.z;
|
||||
hitNormal.y = 0;
|
||||
hitNormal.z = -tangent.x;
|
||||
|
|
|
@ -517,18 +517,21 @@ public class RecastDemo : IRecastDemoChannel
|
|||
|
||||
if (_sample.IsChanged())
|
||||
{
|
||||
RcVec3f? bminN = null;
|
||||
RcVec3f? bmaxN = null;
|
||||
bool hasBound = false;
|
||||
RcVec3f bminN = RcVec3f.Zero;
|
||||
RcVec3f bmaxN = RcVec3f.Zero;
|
||||
if (_sample.GetInputGeom() != null)
|
||||
{
|
||||
bminN = _sample.GetInputGeom().GetMeshBoundsMin();
|
||||
bmaxN = _sample.GetInputGeom().GetMeshBoundsMax();
|
||||
hasBound = true;
|
||||
}
|
||||
else if (_sample.GetNavMesh() != null)
|
||||
{
|
||||
RcVec3f[] bounds = NavMeshUtils.GetNavMeshBounds(_sample.GetNavMesh());
|
||||
bminN = bounds[0];
|
||||
bmaxN = bounds[1];
|
||||
hasBound = true;
|
||||
}
|
||||
else if (0 < _sample.GetRecastResults().Count)
|
||||
{
|
||||
|
@ -536,31 +539,33 @@ public class RecastDemo : IRecastDemoChannel
|
|||
{
|
||||
if (result.GetSolidHeightfield() != null)
|
||||
{
|
||||
if (bminN == null)
|
||||
if (!hasBound)
|
||||
{
|
||||
bminN = RcVec3f.Of(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
|
||||
bmaxN = RcVec3f.Of(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity);
|
||||
}
|
||||
|
||||
bminN = RcVec3f.Of(
|
||||
Math.Min(bminN.Value.x, result.GetSolidHeightfield().bmin.x),
|
||||
Math.Min(bminN.Value.y, result.GetSolidHeightfield().bmin.y),
|
||||
Math.Min(bminN.Value.z, result.GetSolidHeightfield().bmin.z)
|
||||
Math.Min(bminN.x, result.GetSolidHeightfield().bmin.x),
|
||||
Math.Min(bminN.y, result.GetSolidHeightfield().bmin.y),
|
||||
Math.Min(bminN.z, result.GetSolidHeightfield().bmin.z)
|
||||
);
|
||||
|
||||
bmaxN = RcVec3f.Of(
|
||||
Math.Max(bmaxN.Value.x, result.GetSolidHeightfield().bmax.x),
|
||||
Math.Max(bmaxN.Value.y, result.GetSolidHeightfield().bmax.y),
|
||||
Math.Max(bmaxN.Value.z, result.GetSolidHeightfield().bmax.z)
|
||||
Math.Max(bmaxN.x, result.GetSolidHeightfield().bmax.x),
|
||||
Math.Max(bmaxN.y, result.GetSolidHeightfield().bmax.y),
|
||||
Math.Max(bmaxN.z, result.GetSolidHeightfield().bmax.z)
|
||||
);
|
||||
|
||||
hasBound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bminN != null && bmaxN != null)
|
||||
if (hasBound)
|
||||
{
|
||||
RcVec3f bmin = bminN.Value;
|
||||
RcVec3f bmax = bmaxN.Value;
|
||||
RcVec3f bmin = bminN;
|
||||
RcVec3f bmax = bmaxN;
|
||||
|
||||
camr = (float)(Math.Sqrt(
|
||||
Sqr(bmax.x - bmin.x) + Sqr(bmax.y - bmin.y) + Sqr(bmax.z - bmin.z))
|
||||
|
|
|
@ -102,23 +102,24 @@ public class CrowdProfilingTool
|
|||
}
|
||||
}
|
||||
|
||||
RcVec3f? pos = null;
|
||||
var status = DtStatus.DT_FAILURE;
|
||||
var randomPt = RcVec3f.Zero;
|
||||
switch (type)
|
||||
{
|
||||
case CrowdAgentType.MOB:
|
||||
pos = GetMobPosition(navquery, filter);
|
||||
status = GetMobPosition(navquery, filter, out randomPt);
|
||||
break;
|
||||
case CrowdAgentType.VILLAGER:
|
||||
pos = GetVillagerPosition(navquery, filter);
|
||||
status = GetVillagerPosition(navquery, filter, out randomPt);
|
||||
break;
|
||||
case CrowdAgentType.TRAVELLER:
|
||||
pos = GetVillagerPosition(navquery, filter);
|
||||
status = GetVillagerPosition(navquery, filter, out randomPt);
|
||||
break;
|
||||
}
|
||||
|
||||
if (pos != null)
|
||||
if (status.Succeeded())
|
||||
{
|
||||
AddAgent(pos.Value, type);
|
||||
AddAgent(randomPt, type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -142,31 +143,21 @@ public class CrowdProfilingTool
|
|||
}
|
||||
}
|
||||
|
||||
private RcVec3f? GetMobPosition(DtNavMeshQuery navquery, IDtQueryFilter filter)
|
||||
private DtStatus GetMobPosition(DtNavMeshQuery navquery, IDtQueryFilter filter, out RcVec3f randomPt)
|
||||
{
|
||||
var status = navquery.FindRandomPoint(filter, rnd, out var randomRef, out var randomPt);
|
||||
if (status.Succeeded())
|
||||
{
|
||||
return randomPt;
|
||||
return navquery.FindRandomPoint(filter, rnd, out var randomRef, out randomPt);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
private DtStatus GetVillagerPosition(DtNavMeshQuery navquery, IDtQueryFilter filter, out RcVec3f randomPt)
|
||||
{
|
||||
randomPt = RcVec3f.Zero;
|
||||
|
||||
if (0 >= _polyPoints.Count)
|
||||
return DtStatus.DT_FAILURE;
|
||||
|
||||
private RcVec3f? GetVillagerPosition(DtNavMeshQuery navquery, IDtQueryFilter filter)
|
||||
{
|
||||
if (0 < _polyPoints.Count)
|
||||
{
|
||||
int zone = (int)(rnd.Next() * _polyPoints.Count);
|
||||
var status = navquery.FindRandomPointWithinCircle(_polyPoints[zone].refs, _polyPoints[zone].pt, zoneRadius, filter, rnd,
|
||||
out var randomRef, out var randomPt);
|
||||
if (status.Succeeded())
|
||||
{
|
||||
return randomPt;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
return navquery.FindRandomPointWithinCircle(_polyPoints[zone].refs, _polyPoints[zone].pt, zoneRadius, filter, rnd,
|
||||
out var randomRef, out randomPt);
|
||||
}
|
||||
|
||||
private void CreateZones()
|
||||
|
|
Loading…
Reference in New Issue