Пример #1
0
        public KCL(byte[] Data)
        {
            EndianBinaryReader er = new EndianBinaryReader(new MemoryStream(Data), Endianness.LittleEndian);

            try
            {
                Header = new MKDSKCLHeader(er);
                er.BaseStream.Position = Header.VerticesOffset;
                uint nr = (Header.NormalsOffset - Header.VerticesOffset) / 0xC;
                Vertices = new Vector3[nr];
                for (int i = 0; i < nr; i++)
                {
                    Vertices[i] = er.ReadVecFx32();
                }

                er.BaseStream.Position = Header.NormalsOffset;
                nr      = (Header.PlanesOffset - Header.NormalsOffset) / 0x6;
                Normals = new Vector3[nr];
                for (int i = 0; i < nr; i++)
                {
                    Normals[i] = er.ReadVecFx16();
                }

                er.BaseStream.Position = Header.PlanesOffset;
                nr     = (Header.OctreeOffset - Header.PlanesOffset) / 0x10;
                Planes = new KCLPlane[nr];
                for (int i = 0; i < nr; i++)
                {
                    Planes[i] = new KCLPlane(er);
                }

                er.BaseStream.Position = Header.OctreeOffset;
                int nodes = (int)(
                    ((~Header.XMask >> (int)Header.CoordShift) + 1) *
                    ((~Header.YMask >> (int)Header.CoordShift) + 1) *
                    ((~Header.ZMask >> (int)Header.CoordShift) + 1));
                Octree = new KCLOctree(er, nodes);
            }
            finally
            {
                er.Close();
            }
        }
Пример #2
0
 public bool CreateFromFile()
 {
     System.Windows.Forms.OpenFileDialog f = new System.Windows.Forms.OpenFileDialog();
     f.Filter = OBJ.Identifier.GetFileFilter();
     if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
         f.FileName.Length > 0)
     {
         OBJ           o        = new OBJ(File.ReadAllBytes(f.FileName));
         List <String> matnames = new List <string>();
         foreach (var v in o.Faces)
         {
             if (!matnames.Contains(v.Material))
             {
                 matnames.Add(v.Material);
             }
         }
         UI.KCLCollisionTypeSelector ty = new UI.KCLCollisionTypeSelector(matnames.ToArray());
         ty.DialogResult = System.Windows.Forms.DialogResult.None;
         ty.ShowDialog();
         while (ty.DialogResult != System.Windows.Forms.DialogResult.OK)
         {
             ;
         }
         Dictionary <string, ushort> Mapping;
         Dictionary <string, bool>   Colli;
         Mapping = ty.Mapping;
         Colli   = ty.Colli;
         List <Vector3>  Vertex    = new List <Vector3>();
         List <Vector3>  Normals   = new List <Vector3>();
         List <KCLPlane> planes    = new List <KCLPlane>();
         List <Triangle> Triangles = new List <Triangle>();
         foreach (var v in o.Faces)
         {
             if (Colli[v.Material])
             {
                 Triangle t  = new Triangle(o.Vertices[v.VertexIndieces[0]], o.Vertices[v.VertexIndieces[1]], o.Vertices[v.VertexIndieces[2]]);
                 Vector3  qq = (t.PointB - t.PointA).Cross(t.PointC - t.PointA);
                 if ((qq.X * qq.X + qq.Y * qq.Y + qq.Z * qq.Z) < 0.01)
                 {
                     continue;
                 }
                 KCLPlane p = new KCLPlane();
                 p.CollisionType = (ushort)(((Mapping[v.Material] & 0xFF) << 8) | (Mapping[v.Material] >> 8));
                 Vector3 a = (t.PointC - t.PointA).Cross(t.Normal);
                 a.Normalize();
                 a = -a;
                 Vector3 b = (t.PointB - t.PointA).Cross(t.Normal);
                 b.Normalize();
                 Vector3 c = (t.PointC - t.PointB).Cross(t.Normal);
                 c.Normalize();
                 p.Length = (t.PointC - t.PointA).Dot(c);
                 int q = ContainsVector3(t.PointA, Vertex);
                 if (q == -1)
                 {
                     p.VertexIndex = (ushort)Vertex.Count; Vertex.Add(t.PointA);
                 }
                 else
                 {
                     p.VertexIndex = (ushort)q;
                 }
                 q = ContainsVector3(t.Normal, Normals);
                 if (q == -1)
                 {
                     p.NormalIndex = (ushort)Normals.Count; Normals.Add(t.Normal);
                 }
                 else
                 {
                     p.NormalIndex = (ushort)q;
                 }
                 q = ContainsVector3(a, Normals);
                 if (q == -1)
                 {
                     p.NormalAIndex = (ushort)Normals.Count; Normals.Add(a);
                 }
                 else
                 {
                     p.NormalAIndex = (ushort)q;
                 }
                 q = ContainsVector3(b, Normals);
                 if (q == -1)
                 {
                     p.NormalBIndex = (ushort)Normals.Count; Normals.Add(b);
                 }
                 else
                 {
                     p.NormalBIndex = (ushort)q;
                 }
                 q = ContainsVector3(c, Normals);
                 if (q == -1)
                 {
                     p.NormalCIndex = (ushort)Normals.Count; Normals.Add(c);
                 }
                 else
                 {
                     p.NormalCIndex = (ushort)q;
                 }
                 planes.Add(p);
                 Triangles.Add(t);
             }
         }
         Vertices     = Vertex.ToArray();
         this.Normals = Normals.ToArray();
         Planes       = planes.ToArray();
         Header       = new MKDSKCLHeader();
         Octree       = KCLOctree.FromTriangles(Triangles.ToArray(), Header, 2048, 128, 128, 50);
         return(true);
     }
     return(false);
 }
Пример #3
0
 public KCL()
 {
     Header = new MKDSKCLHeader();
 }
Пример #4
0
        public void FromOBJ(OBJ Model, Dictionary <string, ushort> TypeMapping, Dictionary <string, bool> CollideMapping)
        {
            List <Vector3>  Vertex    = new List <Vector3>();
            List <Vector3>  Normals   = new List <Vector3>();
            List <KCLPlane> planes    = new List <KCLPlane>();
            List <Triangle> Triangles = new List <Triangle>();

            foreach (var v in Model.Faces)
            {
                if (CollideMapping[v.Material])
                {
                    Triangle t  = new Triangle(Model.Vertices[v.VertexIndieces[0]], Model.Vertices[v.VertexIndieces[1]], Model.Vertices[v.VertexIndieces[2]]);
                    Vector3  qq = (t.PointB - t.PointA).Cross(t.PointC - t.PointA);
                    if ((qq.X * qq.X + qq.Y * qq.Y + qq.Z * qq.Z) < 0.01)
                    {
                        continue;
                    }
                    KCLPlane p = new KCLPlane();
                    p.CollisionType = (ushort)(((TypeMapping[v.Material] & 0xFF) << 8) | (TypeMapping[v.Material] >> 8));
                    Vector3 a = (t.PointC - t.PointA).Cross(t.Normal);
                    a.Normalize();
                    a = -a;
                    Vector3 b = (t.PointB - t.PointA).Cross(t.Normal);
                    b.Normalize();
                    Vector3 c = (t.PointC - t.PointB).Cross(t.Normal);
                    c.Normalize();
                    p.Length = (t.PointC - t.PointA).Dot(c);
                    int q = ContainsVector3(t.PointA, Vertex);
                    if (q == -1)
                    {
                        p.VertexIndex = (ushort)Vertex.Count; Vertex.Add(t.PointA);
                    }
                    else
                    {
                        p.VertexIndex = (ushort)q;
                    }
                    q = ContainsVector3(t.Normal, Normals);
                    if (q == -1)
                    {
                        p.NormalIndex = (ushort)Normals.Count; Normals.Add(t.Normal);
                    }
                    else
                    {
                        p.NormalIndex = (ushort)q;
                    }
                    q = ContainsVector3(a, Normals);
                    if (q == -1)
                    {
                        p.NormalAIndex = (ushort)Normals.Count; Normals.Add(a);
                    }
                    else
                    {
                        p.NormalAIndex = (ushort)q;
                    }
                    q = ContainsVector3(b, Normals);
                    if (q == -1)
                    {
                        p.NormalBIndex = (ushort)Normals.Count; Normals.Add(b);
                    }
                    else
                    {
                        p.NormalBIndex = (ushort)q;
                    }
                    q = ContainsVector3(c, Normals);
                    if (q == -1)
                    {
                        p.NormalCIndex = (ushort)Normals.Count; Normals.Add(c);
                    }
                    else
                    {
                        p.NormalCIndex = (ushort)q;
                    }
                    planes.Add(p);
                    Triangles.Add(t);
                }
            }
            Vertices     = Vertex.ToArray();
            this.Normals = Normals.ToArray();
            Planes       = planes.ToArray();
            Header       = new MKDSKCLHeader();
            //Octree = KCLOctree.FromTriangles(Triangles.ToArray(), Header, 2048, 128, 32, 10);
            Octree = KCLOctree.FromTriangles(Triangles.ToArray(), Header, 2048, 128, 128, 50);
        }