public static Triangle[] ToTriangles(Quad quad) { Triangle[] tris = new Triangle[2]; VertexDeclaration quadDecl = quad.p0.VertexDeclaration; tris[0] = new Triangle(); tris[1] = new Triangle(); for (int i = 0; i < 3; ++i) { tris[0][i] = new Vertex(quadDecl); tris[1][i] = new Vertex(quadDecl); } tris[0].p0.FromArray(quad[0].ToArray()); tris[0].p1.FromArray(quad[1].ToArray()); tris[0].p2.FromArray(quad[2].ToArray()); tris[1].p0.FromArray(quad[0].ToArray()); tris[1].p1.FromArray(quad[2].ToArray()); tris[1].p2.FromArray(quad[3].ToArray()); return tris; }
private void PopulateMesh() { int offset = 0; tris = new Triangle[triCount]; int triPos = 0; for (int i = 0; i < polyVertexCount.Length; ++i) { IPoly poly; if (polyVertexCount[i] == 3) poly = new Triangle(); else poly = new Quad(); for (int j = 0; j < polyVertexCount[i]; ++j) { float[] datArray = new float[_vertexDeclaration.Stride]; int index = 0; foreach (KeyValuePair<string, Semantic> inputSemantic in semantics) { var channel = _vertexDeclaration.GetChannel(inputSemantic.Key); index = indices[(semantics.Count * offset) + inputSemantic.Value.Offset]; float[] sourceData = sources[inputSemantic.Value.SourceName].data; int sourceStride = sources[inputSemantic.Value.SourceName].stride; PopulateArray(sourceData, index * sourceStride, datArray, channel.Offset, channel.Stride); } poly[j] = new Vertex(_vertexDeclaration); poly[j].FromArray(datArray); ++offset; } if (polyVertexCount[i] == 4) { Triangle[] quadTris = PrimitiveHelper.ToTriangles(poly as Quad); quadTris.CopyTo(tris, triPos); triPos += 2; } else { tris[triPos] = (Triangle)poly; ++triPos; } } }
private float[] GenerateTangents(Triangle tri, int vertexNum) { int posOffset = _vertexDeclaration.GetChannel("VERTEX").Offset; int texOffset = _vertexDeclaration.GetChannel("TEXCOORD").Offset; int p1 = (vertexNum + 1) % 3; int p2 = (vertexNum + 2) % 3; Vector3 vec1 = VectorMethods.FromArray3(tri[p1].Data, posOffset); vec1 -= VectorMethods.FromArray3(tri[vertexNum].Data, posOffset); Vector3 vec2 = VectorMethods.FromArray3(tri[p2].Data, posOffset); vec2 -= VectorMethods.FromArray3(tri[vertexNum].Data, posOffset); Vector2 tc1 = VectorMethods.FromArray2(tri[p1].Data, texOffset) - VectorMethods.FromArray2(tri[vertexNum].Data, texOffset); Vector2 tc2 = VectorMethods.FromArray2(tri[p2].Data, texOffset) - VectorMethods.FromArray2(tri[vertexNum].Data, texOffset); Vector3 bitangent = (tc2.Y * vec1) - (tc1.Y * vec2); Vector3 tangent = (-tc2.X * vec1) + (tc1.X * vec2); float[] tangents = new float[6]; tangent.ToArray().CopyTo(tangents, 0, 0); bitangent.ToArray().CopyTo(tangents, 0, 3); return tangents; }