public static Kn5Node.Vertex Transform(this Kn5Node.Vertex v, Mat4x4 m, double offsetAlongNormal = 0d) { var posVec = Vec3.Transform(v.Position, m); var normalVec = Vec3.TransformNormal(v.Normal, m); if (offsetAlongNormal != 0d) { posVec += Vec3.Normalize(normalVec) * (float)offsetAlongNormal; } v.Position = posVec; v.Normal = normalVec; v.Tangent = Vec3.TransformNormal(v.Tangent, m); return(v); }
private long VertexHashCode(Kn5Node.Vertex v) { long r = v.Position.GetHashCode(); if (_considerNormal) { r = (r * 397) ^ v.Normal.GetHashCode(); } if (_considerTexCoords) { r = (r * 397) ^ v.Tex.GetHashCode(); } return(r); }
public void AddVertex(Kn5Node.Vertex v) { if (_vertices.Count >= 65536) { throw new Exception("Limit exceeded"); } var hash = VertexHashCode(v); if (_knownVertices.TryGetValue(hash, out var knownIndex)) { _indices.Add(knownIndex); } else { var newIndex = (ushort)_vertices.Count; _indices.Add(newIndex); _knownVertices[hash] = newIndex; _vertices.Add(v); } }
private static void FixVertice(ref Kn5Node.Vertex v, Vector3 normalToSet) { v.Normal[0] = normalToSet.X; v.Normal[1] = normalToSet.Y; v.Normal[2] = normalToSet.Z; }
private static void FixVertice(ref Kn5Node.Vertex v, Vector3 normalToSet) { v.Normal.X = normalToSet.X; v.Normal.Y = normalToSet.Y; v.Normal.Z = normalToSet.Z; }