Пример #1
0
        public static float Distance(RecastVertex left, RecastVertex right)
        {
            float dx = right.X - left.X;
            float dy = right.Y - left.Y;
            float dz = right.Z - left.Z;

            return((float)Math.Sqrt(dx * dx + dy * dy + dz * dz));
        }
Пример #2
0
        public static float SquareDistance(RecastVertex left, RecastVertex right)
        {
            float dx = right.X - left.X;
            float dy = right.Y - left.Y;
            float dz = right.Z - left.Z;

            return(dx * dx + dy * dy + dz * dz);
        }
Пример #3
0
 public static RecastVertex Cross(RecastVertex left, RecastVertex right)
 {
     return(new RecastVertex
     {
         X = left.Y * right.Z - left.Z * right.Y,
         Y = left.Z * right.X - left.X * right.Z,
         Z = left.X * right.Y - left.Y * right.X
     });
 }
Пример #4
0
 public static RecastVertex Max(RecastVertex left, RecastVertex right)
 {
     return(new RecastVertex
     {
         X = Math.Max(left.X, right.X),
         Y = Math.Max(left.Y, right.Y),
         Z = Math.Max(left.Z, right.Z)
     });
 }
Пример #5
0
 public static RecastVertex Mult(RecastVertex left, RecastVertex right, int scale)
 {
     return(new RecastVertex
     {
         X = left.X + (right.X * scale),
         Y = left.Y + (right.Y * scale),
         Z = left.Z + (right.Z * scale)
     });
 }
Пример #6
0
 public static RecastVertex Mult(RecastVertex left, int scale)
 {
     return(new RecastVertex
     {
         X = left.X * scale,
         Y = left.Y * scale,
         Z = left.Z * scale
     });
 }
Пример #7
0
 public static RecastVertex Sub(RecastVertex left, RecastVertex right)
 {
     return(new RecastVertex
     {
         X = left.X - right.X,
         Y = left.Y - right.Y,
         Z = left.Z - right.Z
     });
 }
Пример #8
0
 public static RecastVertex Add(RecastVertex left, RecastVertex right)
 {
     return(new RecastVertex
     {
         X = left.X + right.X,
         Y = left.Y + right.Y,
         Z = left.Z + right.Z
     });
 }
Пример #9
0
 public void AddOffMeshConnection(RecastVertex start, RecastVertex end, float radius, bool biDirectional,
                                  short area, int flags)
 {
     OffMeshConnectionVerts.AddRange(new [] { start.X, start.Y, start.Z, end.X, end.Y, end.Z });
     OffMeshConnectionRadii.Add(radius);
     OffMeshConnectionDirections.Add(biDirectional ? 1 : 0);
     OffMeshConnectionAreas.Add(area);
     OffMeshConnectionFlags.Add(flags);
     OffMeshConnectionIds.Add(1000 + OffMeshConnectionCount++);
 }
Пример #10
0
        private void CalcTriNormal(RecastVertex v0, RecastVertex v1, RecastVertex v2, out float[] norm)
        {
            RecastVertex e0, e1, n;

            e0 = RecastVertex.Sub(v1, v0);
            e1 = RecastVertex.Sub(v2, v0);
            n  = RecastVertex.Cross(e0, e1);
            n.Normalize();
            norm = n.ToArray();
        }
Пример #11
0
 public bool Equals(RecastVertex other)
 {
     if (ReferenceEquals(null, other))
     {
         return(false);
     }
     if (ReferenceEquals(this, other))
     {
         return(true);
     }
     return(other.X.Equals(X) && other.Y.Equals(Y) && other.Z.Equals(Z));
 }
Пример #12
0
 public void CalculateBounds()
 {
     if (Vertexes.Count != 0)
     {
         MinBounds = Vertexes[0];
         MaxBounds = Vertexes[0];
         foreach (RecastVertex recastVertex in Vertexes)
         {
             MinBounds = RecastVertex.Min(MinBounds, recastVertex);
             MaxBounds = RecastVertex.Max(MaxBounds, recastVertex);
         }
     }
 }
Пример #13
0
        private void RasterizeTriangle(List <RecastVertex> vertexes, int v0, int v1, int v2, short area, float ics, float ich, int flagMergeThr)
        {
            int          w = Width;
            int          h = Height;
            RecastVertex tempMin, tempMax;

            float by = Bmax[1] - Bmin[1];

            tempMin = new RecastVertex(vertexes[v0]);
            tempMax = new RecastVertex(vertexes[v0]);
            tempMin = RecastVertex.Min(tempMin, vertexes[v1]);
            tempMin = RecastVertex.Min(tempMin, vertexes[v2]);
            tempMax = RecastVertex.Max(tempMax, vertexes[v1]);
            tempMax = RecastVertex.Max(tempMax, vertexes[v2]);

            if (!OverlapBounds(Bmin, Bmax, tempMin.ToArray(), tempMax.ToArray()))
            {
                return;
            }

            int x0 = (int)((tempMin[0] - Bmin[0]) * ics);
            int y0 = (int)((tempMin[2] - Bmin[2]) * ics);
            int x1 = (int)((tempMax[0] - Bmin[0]) * ics);
            int y1 = (int)((tempMax[2] - Bmin[2]) * ics);

            x0 = Math.Max(0, Math.Min(x0, w - 1));
            y0 = Math.Max(0, Math.Min(y0, h - 1));
            x1 = Math.Max(0, Math.Min(x1, w - 1));
            y1 = Math.Max(0, Math.Min(y1, h - 1));

            float[] inArray = new float[7 * 3], outArray = new float[7 * 3], inrowArray = new float[7 * 3];

            for (int y = y0; y <= y1; y++)
            {
                Array.Copy(vertexes[v0].ToArray(), 0, inArray, 0, 3);
                Array.Copy(vertexes[v1].ToArray(), 0, inArray, 1 * 3, 3);
                Array.Copy(vertexes[v2].ToArray(), 0, inArray, 2 * 3, 3);
                int   nvrow = 3;
                float cz    = Bmin[2] + y * Cs;
                nvrow = ClipPoly(inArray, nvrow, ref outArray, 0, 1, -cz);
                if (nvrow < 3)
                {
                    continue;
                }
                nvrow = ClipPoly(outArray, nvrow, ref inrowArray, 0, -1, cz + Cs);
                if (nvrow < 3)
                {
                    continue;
                }

                for (int x = x0; x <= x1; x++)
                {
                    int   nv = nvrow;
                    float cx = Bmin[0] + x * Cs;
                    nv = ClipPoly(inrowArray, nv, ref outArray, 1, 0, -cx);
                    if (nv < 3)
                    {
                        continue;
                    }
                    nv = ClipPoly(outArray, nv, ref inArray, -1, 0, cx + Cs);
                    if (nv < 3)
                    {
                        continue;
                    }

                    float smin = inArray[1], smax = inArray[1];
                    for (int i = 1; i < nv; i++)
                    {
                        smin = Math.Min(smin, inArray[i * 3 + 1]);
                        smax = Math.Max(smax, inArray[i * 3 + 1]);
                    }
                    smin -= Bmin[1];
                    smax -= Bmin[1];

                    if (smax.CompareTo(0.0f) < 0 || smin.CompareTo(by) > 0)
                    {
                        continue;
                    }
                    if (smin.CompareTo(0.0f) < 0)
                    {
                        smin = 0;
                    }
                    if (smax.CompareTo(by) > 0)
                    {
                        smax = by;
                    }

                    int ismin = Math.Max(0, Math.Min((int)Math.Floor(smin * ich), short.MaxValue));
                    int ismax = Math.Max(ismin + 1, Math.Min((int)Math.Floor(smax * ich), short.MaxValue));

                    AddSpan(x, y, ismin, ismax, area, flagMergeThr);
                }
            }
        }
Пример #14
0
 public RecastVertex(RecastVertex copy) : this()
 {
     X = copy.X;
     Y = copy.Y;
     Z = copy.Z;
 }
Пример #15
0
 public static float Dot(RecastVertex left, RecastVertex right)
 {
     return(left.X * right.X + left.Y * right.Y + left.Z * right.Z);
 }