private Func <int, int, Vector3Float> vertexFunc; // 64 bits public MinimalTriangle(Func <int, int, Vector3Float> vertexFunc, int faceIndex) { this.FaceIndex = faceIndex; this.vertexFunc = vertexFunc; var planeNormal = (vertex(1) - vertex(0)).Cross(vertex(2) - vertex(0)).GetNormal(); double distanceFromOrigin = vertex(0).Dot(planeNormal); Plane = new PlaneFloat(new Vector3Float(planeNormal), (float)distanceFromOrigin); center = new Vector3Float((vertex(0) + vertex(1) + vertex(2)) / 3); var aabbMinXYZ = vertex(0).ComponentMin(vertex(1)).ComponentMin(vertex(2)); var aabbMaxXYZ = vertex(0).ComponentMax(vertex(1)).ComponentMax(vertex(2)); var aabb = new AxisAlignedBoundingBox(aabbMinXYZ, aabbMaxXYZ); aabbSize = new Vector3Float(aabb.Size); var normalLengths = new[] { Math.Abs(planeNormal.X), Math.Abs(planeNormal.Y), Math.Abs(planeNormal.Z) }; MajorAxis = (byte)normalLengths.Select((v, i) => new { Axis = i, Value = Math.Abs(v) }).OrderBy(o => o.Value).Last().Axis; for (int i = 0; i < 3; i++) { boundsOnMajorAxis.Left = Math.Min(vertex(i)[xForMajorAxis], boundsOnMajorAxis.Left); boundsOnMajorAxis.Right = Math.Max(vertex(i)[xForMajorAxis], boundsOnMajorAxis.Right); boundsOnMajorAxis.Bottom = Math.Min(vertex(i)[yForMajorAxis], boundsOnMajorAxis.Bottom); boundsOnMajorAxis.Top = Math.Max(vertex(i)[yForMajorAxis], boundsOnMajorAxis.Top); } }
public TriangleShape(Vector3 vertex0, Vector3 vertex1, Vector3 vertex2, MaterialAbstract material) { Vector3 planeNormal = Vector3Ex.Cross(vertex1 - vertex0, vertex2 - vertex0).GetNormal(); double distanceFromOrigin = Vector3Ex.Dot(vertex0, planeNormal); Plane = new PlaneFloat(new Vector3Float(planeNormal), (float)distanceFromOrigin); Material = material; vertices[0] = new Vector3Float(vertex0); vertices[1] = new Vector3Float(vertex1); vertices[2] = new Vector3Float(vertex2); center = new Vector3Float((vertex0 + vertex1 + vertex2) / 3); var normalLengths = new [] { Math.Abs(planeNormal.X), Math.Abs(planeNormal.Y), Math.Abs(planeNormal.Z) }; MajorAxis = (byte)normalLengths.Select((v, i) => new { Axis = i, Value = Math.Abs(v) }).OrderBy(o => o.Value).Last().Axis; for (int i = 0; i < 3; i++) { boundsOnMajorAxis.Left = Math.Min(vertices[i][xForMajorAxis], boundsOnMajorAxis.Left); boundsOnMajorAxis.Right = Math.Max(vertices[i][xForMajorAxis], boundsOnMajorAxis.Right); boundsOnMajorAxis.Bottom = Math.Min(vertices[i][yForMajorAxis], boundsOnMajorAxis.Bottom); boundsOnMajorAxis.Top = Math.Max(vertices[i][yForMajorAxis], boundsOnMajorAxis.Top); } aabbMinXYZ = vertices[0].ComponentMin(vertices[1]).ComponentMin(vertices[2]); aabbMaxXYZ = vertices[0].ComponentMax(vertices[1]).ComponentMax(vertices[2]); }
public TriangleShape(Vector3 vertex0, Vector3 vertex1, Vector3 vertex2, MaterialAbstract material) { Vector3 planeNormal = Vector3.Cross(vertex1 - vertex0, vertex2 - vertex0).GetNormal(); double distanceFromOrigin = Vector3.Dot(vertex0, planeNormal); plane = new PlaneFloat(new Vector3Float(planeNormal), (float)distanceFromOrigin); Material = material; vertices[0] = new Vector3Float(vertex0); vertices[1] = new Vector3Float(vertex1); vertices[2] = new Vector3Float(vertex2); center = new Vector3Float((vertex0 + vertex1 + vertex2) / 3); if (Math.Abs(planeNormal.x) > Math.Abs(planeNormal.y)) { if (Math.Abs(planeNormal.x) > Math.Abs(planeNormal.z)) { // mostly facing x axis majorAxis = 0; } else if (Math.Abs(planeNormal.y) > Math.Abs(planeNormal.z)) { // mostly facing z majorAxis = 2; } } else if (Math.Abs(planeNormal.y) > Math.Abs(planeNormal.z)) { // mostly facing y majorAxis = 1; } else { // mostly facing z majorAxis = 2; } for (int i = 0; i < 3; i++) { boundsOnMajorAxis.Left = Math.Min(vertices[i][xForMajorAxis], boundsOnMajorAxis.Left); boundsOnMajorAxis.Right = Math.Max(vertices[i][xForMajorAxis], boundsOnMajorAxis.Right); boundsOnMajorAxis.Bottom = Math.Min(vertices[i][yForMajorAxis], boundsOnMajorAxis.Bottom); boundsOnMajorAxis.Top = Math.Max(vertices[i][yForMajorAxis], boundsOnMajorAxis.Top); } }