forked from mirror/DotRecast
remove Results
This commit is contained in:
parent
03b9a987dd
commit
fc83bca454
|
@ -155,44 +155,53 @@ namespace DotRecast.Detour.Crowd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SweepCircleCircleResult SweepCircleCircle(RcVec3f c0, float r0, RcVec3f v, RcVec3f c1, float r1)
|
private bool SweepCircleCircle(RcVec3f c0, float r0, RcVec3f v, RcVec3f c1, float r1, out float tmin, out float tmax)
|
||||||
{
|
{
|
||||||
const float EPS = 0.0001f;
|
const float EPS = 0.0001f;
|
||||||
|
|
||||||
|
tmin = 0;
|
||||||
|
tmax = 0;
|
||||||
|
|
||||||
RcVec3f s = c1.Subtract(c0);
|
RcVec3f s = c1.Subtract(c0);
|
||||||
float r = r0 + r1;
|
float r = r0 + r1;
|
||||||
float c = s.Dot2D(s) - r * r;
|
float c = s.Dot2D(s) - r * r;
|
||||||
float a = v.Dot2D(v);
|
float a = v.Dot2D(v);
|
||||||
if (a < EPS)
|
if (a < EPS)
|
||||||
return new SweepCircleCircleResult(false, 0f, 0f); // not moving
|
return false; // not moving
|
||||||
|
|
||||||
// Overlap, calc time to exit.
|
// Overlap, calc time to exit.
|
||||||
float b = v.Dot2D(s);
|
float b = v.Dot2D(s);
|
||||||
float d = b * b - a * c;
|
float d = b * b - a * c;
|
||||||
if (d < 0.0f)
|
if (d < 0.0f)
|
||||||
return new SweepCircleCircleResult(false, 0f, 0f); // no intersection.
|
return false; // no intersection.
|
||||||
|
|
||||||
a = 1.0f / a;
|
a = 1.0f / a;
|
||||||
float rd = (float)Math.Sqrt(d);
|
float rd = (float)Math.Sqrt(d);
|
||||||
return new SweepCircleCircleResult(true, (b - rd) * a, (b + rd) * a);
|
|
||||||
|
tmin = (b - rd) * a;
|
||||||
|
tmax = (b + rd) * a;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
IsectRaySegResult IsectRaySeg(RcVec3f ap, RcVec3f u, RcVec3f bp, RcVec3f bq)
|
private bool IsectRaySeg(RcVec3f ap, RcVec3f u, RcVec3f bp, RcVec3f bq, ref float t)
|
||||||
{
|
{
|
||||||
RcVec3f v = bq.Subtract(bp);
|
RcVec3f v = bq.Subtract(bp);
|
||||||
RcVec3f w = ap.Subtract(bp);
|
RcVec3f w = ap.Subtract(bp);
|
||||||
float d = RcVec3f.Perp2D(u, v);
|
float d = RcVec3f.Perp2D(u, v);
|
||||||
if (Math.Abs(d) < 1e-6f)
|
if (Math.Abs(d) < 1e-6f)
|
||||||
return new IsectRaySegResult(false, 0f);
|
return false;
|
||||||
|
|
||||||
d = 1.0f / d;
|
d = 1.0f / d;
|
||||||
float t = RcVec3f.Perp2D(v, w) * d;
|
t = RcVec3f.Perp2D(v, w) * d;
|
||||||
if (t < 0 || t > 1)
|
if (t < 0 || t > 1)
|
||||||
return new IsectRaySegResult(false, 0f);
|
return false;
|
||||||
|
|
||||||
float s = RcVec3f.Perp2D(u, w) * d;
|
float s = RcVec3f.Perp2D(u, w) * d;
|
||||||
if (s < 0 || s > 1)
|
if (s < 0 || s > 1)
|
||||||
return new IsectRaySegResult(false, 0f);
|
return false;
|
||||||
|
|
||||||
return new IsectRaySegResult(true, t);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -237,10 +246,8 @@ namespace DotRecast.Detour.Crowd
|
||||||
side += Clamp(Math.Min(cir.dp.Dot2D(vab) * 0.5f + 0.5f, cir.np.Dot2D(vab) * 2), 0.0f, 1.0f);
|
side += Clamp(Math.Min(cir.dp.Dot2D(vab) * 0.5f + 0.5f, cir.np.Dot2D(vab) * 2), 0.0f, 1.0f);
|
||||||
nside++;
|
nside++;
|
||||||
|
|
||||||
SweepCircleCircleResult sres = SweepCircleCircle(pos, rad, vab, cir.p, cir.rad);
|
if (!SweepCircleCircle(pos, rad, vab, cir.p, cir.rad, out var htmin, out var htmax))
|
||||||
if (!sres.intersection)
|
|
||||||
continue;
|
continue;
|
||||||
float htmin = sres.htmin, htmax = sres.htmax;
|
|
||||||
|
|
||||||
// Handle overlapping obstacles.
|
// Handle overlapping obstacles.
|
||||||
if (htmin < 0.0f && htmax > 0.0f)
|
if (htmin < 0.0f && htmax > 0.0f)
|
||||||
|
@ -281,11 +288,8 @@ namespace DotRecast.Detour.Crowd
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var ires = IsectRaySeg(pos, vcand, seg.p, seg.q);
|
if (!IsectRaySeg(pos, vcand, seg.p, seg.q, ref htmin))
|
||||||
if (!ires.result)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
htmin = ires.htmin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoid less when facing walls.
|
// Avoid less when facing walls.
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
namespace DotRecast.Detour.Crowd
|
|
||||||
{
|
|
||||||
public struct IsectRaySegResult
|
|
||||||
{
|
|
||||||
public readonly bool result;
|
|
||||||
public readonly float htmin;
|
|
||||||
|
|
||||||
public IsectRaySegResult(bool result, float htmin)
|
|
||||||
{
|
|
||||||
this.result = result;
|
|
||||||
this.htmin = htmin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,36 +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.Detour.Crowd
|
|
||||||
{
|
|
||||||
public struct SweepCircleCircleResult
|
|
||||||
{
|
|
||||||
public readonly bool intersection;
|
|
||||||
public readonly float htmin;
|
|
||||||
public readonly float htmax;
|
|
||||||
|
|
||||||
public SweepCircleCircleResult(bool intersection, float htmin, float htmax)
|
|
||||||
{
|
|
||||||
this.intersection = intersection;
|
|
||||||
this.htmin = htmin;
|
|
||||||
this.htmax = htmax;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue