public void AddUVs() { Vector2 uv1 = new Vector2(0, 1); Vector2 uv2 = new Vector2(0.5f, 0.1328f); Vector2 uv3 = new Vector2(1, 1); for (int i = 0; i < indices.Length; i += 3) { MeshAttr.SetUV(ref mesh.vertices[i], ref uv1); MeshAttr.SetUV(ref mesh.vertices[i + 1], ref uv2); MeshAttr.SetUV(ref mesh.vertices[i + 2], ref uv3); } }
/// <summary> /// Adds a triangle with vertex format Position, Normal and UV, calculating the normal from the origin, and /// using a defined UV of top center, bottom left, bottom right. /// </summary> /// <typeparam name="AltVertex"></typeparam> /// <param name="newVerts"></param> /// <param name="newIndices"></param> /// <param name="v1"></param> /// <param name="v2"></param> /// <param name="v3"></param> /// <param name="isAnticlockwise"></param> public void AddTriangle <AltVertex>(ref List <AltVertex> newVerts, ref List <uint> newIndices, ref Vector3 v1, ref Vector3 v2, ref Vector3 v3, bool isAnticlockwise) where AltVertex : struct, IVertex { AltVertex[] triVerts = new AltVertex[3]; triVerts.Initialize(); MeshAttr.SetPosition(ref triVerts[0], ref v1); MeshAttr.SetPosition(ref triVerts[1], ref v2); MeshAttr.SetPosition(ref triVerts[2], ref v3); Vector3 v1N = v1; v1N.Normalize(); for (int i = 0; i < 3; i++) { MeshAttr.SetNormal(ref triVerts[i], ref v1N); } Vector2 uv0 = new Vector2(0.5f, 1); Vector2 uv1 = new Vector2(0, 0); Vector2 uv2 = new Vector2(1, 0); MeshAttr.SetUV(ref triVerts[0], ref uv0); MeshAttr.SetUV(ref triVerts[1], ref uv1); MeshAttr.SetUV(ref triVerts[2], ref uv2); int index = newVerts.Count; for (int i = 0; i < 3; i++) { newVerts.Add(triVerts[i]); } if (isAnticlockwise) { newIndices.Add((uint)index); newIndices.Add((uint)index + 1); newIndices.Add((uint)index + 2); } else { newIndices.Add((uint)index); newIndices.Add((uint)index + 2); newIndices.Add((uint)index + 1); } }
/// <summary> /// Adds a triangle based on the current mesh with the vertex format Position, Normal, UV and Color. /// It sets the normal for each vertex to the original position vector, /// UV is set to top center, bottom left, bottom right, with original vert being top center /// It sets color of all verts to the color of the original vertex. /// </summary> /// <typeparam name="AltVertex"></typeparam> /// <param name="newVerts">The new set of vertices</param> /// <param name="newIndices">The new set of indices</param> /// <param name="v1index">The index of the vertex in the original mesh</param> /// <param name="v2">the position of the first new vertex</param> /// <param name="v3">the position of the second new vertex</param> /// <param name="color">The new vertex color</param>" public void AddTriangle2 <AltVertex>(ref List <AltVertex> newVerts, ref List <uint> newIndices, int v1index, ref Vector3 v2, ref Vector3 v3, Vector4 color) where AltVertex : struct, IVertex { AltVertex[] triVerts = new AltVertex[3]; triVerts.Initialize(); Vector3 v1Pos = MeshAttr.GetPosition(ref mesh.vertices[v1index]); MeshAttr.SetPosition(ref triVerts[0], ref v1Pos); MeshAttr.SetPosition(ref triVerts[1], ref v2); MeshAttr.SetPosition(ref triVerts[2], ref v3); v1Pos.Normalize(); for (int i = 0; i < 3; i++) { MeshAttr.SetNormal(ref triVerts[i], ref v1Pos); } Vector2 uv0 = new Vector2(0.5f, 1); Vector2 uv1 = new Vector2(0, 0); Vector2 uv2 = new Vector2(1, 0); MeshAttr.SetUV(ref triVerts[0], ref uv0); MeshAttr.SetUV(ref triVerts[1], ref uv1); MeshAttr.SetUV(ref triVerts[2], ref uv2); MeshAttr.SetColor(ref triVerts[0], ref color); MeshAttr.SetColor(ref triVerts[1], ref color); MeshAttr.SetColor(ref triVerts[2], ref color); newVerts[v1index] = triVerts[0]; int index = newVerts.Count; newVerts.Add(triVerts[1]); newVerts.Add(triVerts[2]); newIndices.Add((uint)v1index); newIndices.Add((uint)index++); newIndices.Add((uint)index++); }