Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
 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;
 }
Пример #5
0
 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;
 }