forked from bit/DotRecastNetSim
inline Vector3f
This commit is contained in:
parent
425e1887f6
commit
3f72b8e916
|
@ -64,34 +64,6 @@ namespace DotRecast.Core
|
|||
return u * g + (1f - u) * f;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// Derives the square of the scalar length of the vector. (len * len)
|
||||
/// @param[in] v The vector. [(x, y, z)]
|
||||
/// @return The square of the scalar length of the vector.
|
||||
public static float VLenSqr(Vector3f v)
|
||||
{
|
||||
return v.x * v.x + v.y * v.y + v.z * v.z;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// Normalizes the vector.
|
||||
/// @param[in,out] v The vector to normalize. [(x, y, z)]
|
||||
public static void VNormalize(float[] v)
|
||||
{
|
||||
float d = (float)(1.0f / Math.Sqrt(Sqr(v[0]) + Sqr(v[1]) + Sqr(v[2])));
|
||||
if (d != 0)
|
||||
{
|
||||
v[0] *= d;
|
||||
v[1] *= d;
|
||||
v[2] *= d;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Performs a 'sloppy' colocation check of the specified points.
|
||||
/// @param[in] p0 A point. [(x, y, z)]
|
||||
/// @param[in] p1 A point. [(x, y, z)]
|
||||
|
@ -111,22 +83,7 @@ namespace DotRecast.Core
|
|||
}
|
||||
|
||||
|
||||
/// Derives the xz-plane 2D perp product of the two vectors. (uz*vx - ux*vz)
|
||||
/// @param[in] u The LHV vector [(x, y, z)]
|
||||
/// @param[in] v The RHV vector [(x, y, z)]
|
||||
/// @return The dot product on the xz-plane.
|
||||
///
|
||||
/// The vectors are projected onto the xz-plane, so the y-values are
|
||||
/// ignored.
|
||||
public static float VPerp2D(float[] u, float[] v)
|
||||
{
|
||||
return u[2] * v[0] - u[0] * v[2];
|
||||
}
|
||||
|
||||
public static float VPerp2D(Vector3f u, Vector3f v)
|
||||
{
|
||||
return u.z * v.x - u.x * v.z;
|
||||
}
|
||||
|
||||
|
||||
/// @}
|
||||
|
@ -474,8 +431,8 @@ namespace DotRecast.Core
|
|||
Vector3f vpi = Vector3f.Of(verts, i * 3);
|
||||
var edge = vpi.Subtract(vpj);
|
||||
var diff = p0v.Subtract(vpj);
|
||||
float n = VPerp2D(edge, diff);
|
||||
float d = VPerp2D(dir, edge);
|
||||
float n = Vector3f.Perp2D(edge, diff);
|
||||
float d = Vector3f.Perp2D(dir, edge);
|
||||
if (Math.Abs(d) < EPS)
|
||||
{
|
||||
// S is nearly parallel to this edge
|
||||
|
|
|
@ -206,6 +206,8 @@ namespace DotRecast.Core
|
|||
return hash;
|
||||
}
|
||||
|
||||
/// Normalizes the vector.
|
||||
/// @param[in,out] v The vector to normalize. [(x, y, z)]
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void Normalize()
|
||||
{
|
||||
|
@ -446,5 +448,29 @@ namespace DotRecast.Core
|
|||
float dz = verts[i + 2] - p.z;
|
||||
return dx * dx + dz * dz;
|
||||
}
|
||||
|
||||
/// Derives the xz-plane 2D perp product of the two vectors. (uz*vx - ux*vz)
|
||||
/// @param[in] u The LHV vector [(x, y, z)]
|
||||
/// @param[in] v The RHV vector [(x, y, z)]
|
||||
/// @return The dot product on the xz-plane.
|
||||
///
|
||||
/// The vectors are projected onto the xz-plane, so the y-values are
|
||||
/// ignored.
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static float Perp2D(Vector3f u, Vector3f v)
|
||||
{
|
||||
return u.z * v.x - u.x * v.z;
|
||||
}
|
||||
|
||||
/// Derives the square of the scalar length of the vector. (len * len)
|
||||
/// @param[in] v The vector. [(x, y, z)]
|
||||
/// @return The square of the scalar length of the vector.
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static float LenSqr(Vector3f v)
|
||||
{
|
||||
return v.x * v.x + v.y * v.y + v.z * v.z;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -924,7 +924,7 @@ namespace DotRecast.Detour.Crowd
|
|||
}
|
||||
|
||||
diff.y = 0;
|
||||
float distSqr = VLenSqr(diff);
|
||||
float distSqr = Vector3f.LenSqr(diff);
|
||||
if (distSqr > Sqr(range))
|
||||
{
|
||||
continue;
|
||||
|
@ -1094,7 +1094,7 @@ namespace DotRecast.Detour.Crowd
|
|||
Vector3f diff = ag.npos.Subtract(nei.npos);
|
||||
diff.y = 0;
|
||||
|
||||
float distSqr = VLenSqr(diff);
|
||||
float distSqr = Vector3f.LenSqr(diff);
|
||||
if (distSqr < 0.00001f)
|
||||
{
|
||||
continue;
|
||||
|
@ -1117,7 +1117,7 @@ namespace DotRecast.Detour.Crowd
|
|||
// Adjust desired velocity.
|
||||
dvel = Vector3f.Mad(dvel, disp, 1.0f / w);
|
||||
// Clamp desired velocity to desired speed.
|
||||
float speedSqr = VLenSqr(dvel);
|
||||
float speedSqr = Vector3f.LenSqr(dvel);
|
||||
float desiredSqr = Sqr(ag.desiredSpeed);
|
||||
if (speedSqr > desiredSqr)
|
||||
{
|
||||
|
@ -1248,7 +1248,7 @@ namespace DotRecast.Detour.Crowd
|
|||
Vector3f diff = ag.npos.Subtract(nei.npos);
|
||||
diff.y = 0;
|
||||
|
||||
float dist = VLenSqr(diff);
|
||||
float dist = Vector3f.LenSqr(diff);
|
||||
if (dist > Sqr(ag.option.radius + nei.option.radius))
|
||||
{
|
||||
continue;
|
||||
|
|
|
@ -179,16 +179,16 @@ namespace DotRecast.Detour.Crowd
|
|||
{
|
||||
Vector3f v = bq.Subtract(bp);
|
||||
Vector3f w = ap.Subtract(bp);
|
||||
float d = VPerp2D(u, v);
|
||||
float d = Vector3f.Perp2D(u, v);
|
||||
if (Math.Abs(d) < 1e-6f)
|
||||
return new IsectRaySegResult(false, 0f);
|
||||
|
||||
d = 1.0f / d;
|
||||
float t = VPerp2D(v, w) * d;
|
||||
float t = Vector3f.Perp2D(v, w) * d;
|
||||
if (t < 0 || t > 1)
|
||||
return new IsectRaySegResult(false, 0f);
|
||||
|
||||
float s = VPerp2D(u, w) * d;
|
||||
float s = Vector3f.Perp2D(u, w) * d;
|
||||
if (s < 0 || s > 1)
|
||||
return new IsectRaySegResult(false, 0f);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ namespace DotRecast.Detour
|
|||
}
|
||||
else
|
||||
{
|
||||
d = VLenSqr(diff);
|
||||
d = Vector3f.LenSqr(diff);
|
||||
}
|
||||
|
||||
if (d < nearestDistanceSqr)
|
||||
|
|
|
@ -1382,7 +1382,7 @@ namespace DotRecast.Detour
|
|||
}
|
||||
else
|
||||
{
|
||||
d = VLenSqr(diff);
|
||||
d = Vector3f.LenSqr(diff);
|
||||
}
|
||||
|
||||
if (d < nearestDistanceSqr)
|
||||
|
|
|
@ -54,7 +54,7 @@ public class RecastDemo
|
|||
private IInputContext _input;
|
||||
private ImGuiController _imgui;
|
||||
private RecastDemoCanvas _canvas;
|
||||
|
||||
|
||||
private int width = 1000;
|
||||
private int height = 900;
|
||||
|
||||
|
@ -485,28 +485,29 @@ public class RecastDemo
|
|||
}
|
||||
else if (settingsUI.IsNavMeshInputTrigerred())
|
||||
{
|
||||
// try (MemoryStack stack = StackPush()) {
|
||||
// PointerBuffer aFilterPatterns = stack.MallocPointer(4);
|
||||
// aFilterPatterns.Put(stack.UTF8("*.bin"));
|
||||
// aFilterPatterns.Put(stack.UTF8("*.zip"));
|
||||
// aFilterPatterns.Put(stack.UTF8("*.bytes"));
|
||||
// aFilterPatterns.Put(stack.UTF8("*.navmesh"));
|
||||
// aFilterPatterns.Flip();
|
||||
// string filename = TinyFileDialogs.Tinyfd_openFileDialog("Open Nav Mesh File", "", aFilterPatterns,
|
||||
// "Nav Mesh File", false);
|
||||
// if (filename != null) {
|
||||
// File file = new File(filename);
|
||||
// if (file.Exists()) {
|
||||
// try {
|
||||
// LoadNavMesh(file, filename);
|
||||
// geom = null;
|
||||
// } catch (Exception e) {
|
||||
// Console.WriteLine(e);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// try (MemoryStack stack = StackPush()) {
|
||||
// PointerBuffer aFilterPatterns = stack.MallocPointer(4);
|
||||
// aFilterPatterns.Put(stack.UTF8("*.bin"));
|
||||
// aFilterPatterns.Put(stack.UTF8("*.zip"));
|
||||
// aFilterPatterns.Put(stack.UTF8("*.bytes"));
|
||||
// aFilterPatterns.Put(stack.UTF8("*.navmesh"));
|
||||
// aFilterPatterns.Flip();
|
||||
// string filename = TinyFileDialogs.Tinyfd_openFileDialog("Open Nav Mesh File", "", aFilterPatterns,
|
||||
// "Nav Mesh File", false);
|
||||
// if (filename != null) {
|
||||
// File file = new File(filename);
|
||||
// if (file.Exists()) {
|
||||
// try {
|
||||
// LoadNavMesh(file, filename);
|
||||
// geom = null;
|
||||
// } catch (Exception e) {
|
||||
// Console.WriteLine(e);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
if (settingsUI.IsBuildTriggered() && sample.GetInputGeom() != null)
|
||||
{
|
||||
if (!building)
|
||||
|
@ -597,9 +598,9 @@ public class RecastDemo
|
|||
hit = PolyMeshRaycast.Raycast(sample.GetRecastResults(), rayStart, rayEnd);
|
||||
}
|
||||
|
||||
float[] rayDir = new float[] { rayEnd.x - rayStart.x, rayEnd.y - rayStart.y, rayEnd.z - rayStart.z };
|
||||
Vector3f rayDir = Vector3f.Of(rayEnd.x - rayStart.x, rayEnd.y - rayStart.y, rayEnd.z - rayStart.z);
|
||||
Tool rayTool = toolsUI.GetTool();
|
||||
VNormalize(rayDir);
|
||||
rayDir.Normalize();
|
||||
if (rayTool != null)
|
||||
{
|
||||
rayTool.HandleClickRay(rayStart, rayDir, processHitTestShift);
|
||||
|
@ -737,4 +738,4 @@ public class RecastDemo
|
|||
|
||||
window.SwapBuffers();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -229,14 +229,14 @@ public class DynamicUpdateTool : Tool
|
|||
private Tuple<ICollider, IColliderGizmo> CylinderCollider(Vector3f p)
|
||||
{
|
||||
float radius = 0.7f + (float)random.NextDouble() * 4f;
|
||||
float[] a = new float[] { (1f - 2 * (float)random.NextDouble()), 0.01f + (float)random.NextDouble(), (1f - 2 * (float)random.NextDouble()) };
|
||||
VNormalize(a);
|
||||
Vector3f a = Vector3f.Of(1f - 2 * (float)random.NextDouble(), 0.01f + (float)random.NextDouble(), 1f - 2 * (float)random.NextDouble());
|
||||
a.Normalize();
|
||||
float len = 2f + (float)random.NextDouble() * 20f;
|
||||
a[0] *= len;
|
||||
a[1] *= len;
|
||||
a[2] *= len;
|
||||
Vector3f start = Vector3f.Of(p.x, p.y, p.z);
|
||||
Vector3f end = Vector3f.Of(p.x + a[0], p.y + a[1], p.z + a[2]);
|
||||
Vector3f end = Vector3f.Of(p.x + a.x, p.y + a.y, p.z + a.z);
|
||||
return Tuple.Create<ICollider, IColliderGizmo>(new CylinderCollider(start, end, radius, SampleAreaModifications.SAMPLE_POLYAREA_TYPE_WATER,
|
||||
dynaMesh.config.walkableClimb), GizmoFactory.Cylinder(start, end, radius));
|
||||
}
|
||||
|
@ -349,7 +349,7 @@ public class DynamicUpdateTool : Tool
|
|||
}
|
||||
|
||||
|
||||
public override void HandleClickRay(Vector3f start, float[] dir, bool shift)
|
||||
public override void HandleClickRay(Vector3f start, Vector3f dir, bool shift)
|
||||
{
|
||||
if (mode == DynamicUpdateToolMode.COLLIDERS)
|
||||
{
|
||||
|
@ -369,7 +369,7 @@ public class DynamicUpdateTool : Tool
|
|||
}
|
||||
}
|
||||
|
||||
private bool Hit(Vector3f point, float[] dir, float[] bounds)
|
||||
private bool Hit(Vector3f point, Vector3f dir, float[] bounds)
|
||||
{
|
||||
float cx = 0.5f * (bounds[0] + bounds[3]);
|
||||
float cy = 0.5f * (bounds[1] + bounds[4]);
|
||||
|
@ -387,7 +387,7 @@ public class DynamicUpdateTool : Tool
|
|||
return true;
|
||||
}
|
||||
|
||||
float b = mx * dir[0] + my * dir[1] + mz * dir[2];
|
||||
float b = mx * dir.x + my * dir.y + mz * dir.z;
|
||||
if (b > 0.0f)
|
||||
{
|
||||
return false;
|
||||
|
|
|
@ -38,7 +38,7 @@ public abstract class Tool
|
|||
|
||||
public abstract string GetName();
|
||||
|
||||
public virtual void HandleClickRay(Vector3f start, float[] direction, bool shift)
|
||||
public virtual void HandleClickRay(Vector3f start, Vector3f direction, bool shift)
|
||||
{
|
||||
// ...
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue