public static Vector2 InterpolateUV(this VertexTriangle triangle, Vector3 screenPosition) { float w1, w2, w3; triangle.InterpolateWeight(screenPosition, out w1, out w2, out w3); return(w1 * triangle.Vertexs[0].UV + w2 * triangle.Vertexs[1].UV + w3 * triangle.Vertexs[2].UV); }
public static void GetInCubeVertexs(this VertexTriangle triangle, List <Vertex> outVertex) { foreach (var vertex in triangle.Vertexs) { if (MathTool.IsInCube(vertex.WorldPosition, 1, -1, 1, -1, 1, -1) == false) { outVertex.Add(vertex); } } }
public static bool IsContain(this VertexTriangle triangle, Vector3 screenPosition) { double d1 = MathTool.Sign(screenPosition - triangle.Vertexs[1].WorldPosition, triangle.Vertexs[0].WorldPosition - triangle.Vertexs[1].WorldPosition); double d2 = MathTool.Sign(screenPosition - triangle.Vertexs[2].WorldPosition, triangle.Vertexs[1].WorldPosition - triangle.Vertexs[2].WorldPosition); double d3 = MathTool.Sign(screenPosition - triangle.Vertexs[0].WorldPosition, triangle.Vertexs[2].WorldPosition - triangle.Vertexs[0].WorldPosition); bool hasNeg = (d1 < 0) || (d2 < 0) || (d3 < 0); bool hasPos = (d1 > 0) || (d2 > 0) || (d3 > 0); return(!(hasNeg && hasPos)); }
public static void InterpolateWeight(this VertexTriangle triangle, Vector3 screenPosition, out float w1, out float w2, out float w3) { Vector3 v3Tov2 = triangle.Vertexs[1].WorldPosition - triangle.Vertexs[2].WorldPosition; Vector3 v2Tov1 = triangle.Vertexs[0].WorldPosition - triangle.Vertexs[1].WorldPosition; Vector3 v1Tov3 = triangle.Vertexs[2].WorldPosition - triangle.Vertexs[0].WorldPosition; Vector3 v3ToP = screenPosition - triangle.Vertexs[2].WorldPosition; w1 = (v3Tov2.Y * v3ToP.X + -v3Tov2.X * v3ToP.Y) / (v3Tov2.Y * -v1Tov3.X + -v3Tov2.X * -v1Tov3.Y); w2 = (v1Tov3.Y * v3ToP.X + -v1Tov3.X * v3ToP.Y) / (v3Tov2.Y * -v1Tov3.X + -v3Tov2.X * -v1Tov3.Y); w3 = 1 - w1 - w2; }
public static VertexTriangle Clone(this VertexTriangle triangle) { VertexTriangle clone = new VertexTriangle(); for (int i = 0; i < triangle.Vertexs.Length; i++) { var v = triangle.Vertexs[i].Clone(); v.Owner = clone; clone.Vertexs[i] = v; } return(clone); }
public static Color InterpolateColor(this VertexTriangle triangle, Vector3 screenPosition) { float w1, w2, w3; triangle.InterpolateWeight(screenPosition, out w1, out w2, out w3); float colorR = w1 * triangle.Vertexs[0].Color.R + w2 * triangle.Vertexs[1].Color.R + w3 * triangle.Vertexs[2].Color.R; float colorG = w1 * triangle.Vertexs[0].Color.G + w2 * triangle.Vertexs[1].Color.G + w3 * triangle.Vertexs[2].Color.G; float colorB = w1 * triangle.Vertexs[0].Color.B + w2 * triangle.Vertexs[1].Color.B + w3 * triangle.Vertexs[2].Color.B; return(Color.FromArgb((int)colorR, (int)colorG, (int)colorB)); }
public static void SetVertexs(this VertexTriangle triangle, List <Vertex> list) { if (list.Count != 3) { return; } for (int i = 0; i < 3; i++) { list[i].Owner = triangle; triangle.Vertexs[i] = list[i]; } }
public static void GetMinRect(this VertexTriangle triangle, out int minX, out int maxX, out int minY, out int maxY) { minX = int.MaxValue; maxX = int.MinValue; minY = int.MaxValue; maxY = int.MinValue; foreach (var v in triangle.Vertexs) { MathTool.CompareMinMax(v.WorldPosition.X, ref minX, ref maxX); MathTool.CompareMinMax(v.WorldPosition.Y, ref minY, ref maxY); } }
public Triangle() { List <Vertex> vertex = new List <Vertex>(); vertex.Add(new Vertex() { WorldPosition = new Vector3(0, 0, 100), Color = Color.Green }); vertex.Add(new Vertex() { WorldPosition = new Vector3(_scale.X, 0, 100), Color = Color.Red }); vertex.Add(new Vertex() { WorldPosition = new Vector3(_scale.X / 2, _unitHeight * _scale.Y, 100), Color = Color.Blue }); Triangles = new VertexTriangle[1]; Triangles[0] = new VertexTriangle(); Triangles[0].SetVertexs(vertex); }