public void AddTriangulation(MyBimTriangulation triang)
 {
     triangulations.Add(triang);
 }
    /// <summary>
    /// read geomotry data from wexbim file
    /// </summary>
    /// <param name="fileName"></param>
    public static void ReadWexbimFile(string fileName)
    {
        Vector3 offsite;

        using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
        {
            using (var br = new BinaryReader(fs))
            {
                var magicalNum    = br.ReadInt32();
                var version       = br.ReadByte();
                var shapeCount    = br.ReadInt32();
                var vertexCount   = br.ReadInt32();
                var triangleCount = br.ReadInt32();
                var matrixCount   = br.ReadInt32();
                var productCount  = br.ReadInt32();
                var styleCount    = br.ReadInt32();
                var scale         = br.ReadSingle();
                var regionCount   = br.ReadInt16();

                //Region
                for (int i = 0; i < regionCount; i++)
                {
                    var population  = br.ReadInt32();
                    var centreX     = br.ReadSingle(); centreX /= scale;
                    var centreY     = br.ReadSingle(); centreY /= scale;
                    var centreZ     = br.ReadSingle(); centreZ /= scale;
                    var boundsBytes = br.ReadBytes(6 * sizeof(float));
                    var bounds      = XbimRect3D.FromArray(boundsBytes);
                    bounds.X     /= scale; bounds.Y /= scale; bounds.Z /= scale;
                    bounds.SizeX /= scale; bounds.SizeY /= scale; bounds.SizeZ /= scale;
                    MyBimGeomorty.regions.Add(new MyBimRegion(population, centreX, centreY, centreZ, (float)bounds.SizeX, (float)bounds.SizeY, (float)bounds.SizeZ));
                }
                offsite = MyBimGeomorty.regions[0].position;

                //texture
                for (int i = 0; i < styleCount; i++)
                {
                    var styleId = br.ReadInt32();
                    var red     = br.ReadSingle();
                    var green   = br.ReadSingle();
                    var blue    = br.ReadSingle();
                    var alpha   = br.ReadSingle();
                    MyBimGeomorty.colors.Add(new MyBimColor(styleId, red, green, blue, alpha));
                }

                //product
                for (int i = 0; i < productCount; i++)
                {
                    var        entityLabel = br.ReadInt32();
                    var        typeId      = br.ReadInt16();
                    var        boxBytes    = br.ReadBytes(6 * sizeof(float));
                    XbimRect3D bb          = XbimRect3D.FromArray(boxBytes);
                    //float x = (float)bb.X, y = (float)bb.Y, z = (float)bb.Z;
                    //float sizeX = (float)bb.SizeX, sizeY = (float)bb.SizeY, sizeZ = (float)bb.SizeZ;
                    MyBimGeomorty.products.Add(new MyBimProduct(entityLabel, typeId));
                }

                //shape
                for (int i = 0; i < shapeCount; i++)
                {
                    var shapeRepetition = br.ReadInt32();
                    MyBimShapeInstance si;
                    if (shapeRepetition > 1)
                    {
                        List <MyBimShapeInstance> curShapeInstances = new List <MyBimShapeInstance>();
                        for (int j = 0; j < shapeRepetition; j++)
                        {
                            var ifcProductLabel = br.ReadInt32();
                            var ifcTypeId       = br.ReadInt16();
                            var instanceLabel   = br.ReadInt32();
                            var styleLabel      = br.ReadInt32();
                            var transform       = XbimMatrix3D.FromArray(br.ReadBytes(sizeof(double) * 16));

                            si = new MyBimShapeInstance(ifcProductLabel, ifcTypeId, instanceLabel, styleLabel, transform);
                            //MyBimGeomorty.shapeInstances.Add(si);
                            curShapeInstances.Add(si);
                            var p = MyBimGeomorty.products.Find(product => product.entityLabel == ifcProductLabel);
                            p.AddShapeInstance(si);
                        }
                        var triangulation = br.ReadShapeTriangulation();

                        foreach (var csi in curShapeInstances)
                        {
                            var tri = new MyBimTriangulation(triangulation, offsite, scale, csi.transform, true);
                            csi.AddTriangulation(tri);
                            //MyBimGeomorty.triangulations.Add(tri);
                        }
                    }
                    else if (shapeRepetition == 1)
                    {
                        var ifcProductLabel = br.ReadInt32();
                        var ifcTypeId       = br.ReadInt16();
                        var instanceLabel   = br.ReadInt32();
                        var styleLabel      = br.ReadInt32();

                        si = new MyBimShapeInstance(ifcProductLabel, ifcTypeId, instanceLabel, styleLabel);
                        //MyBimGeomorty.shapeInstances.Add(si);
                        var p = MyBimGeomorty.products.Find(product => product.entityLabel == ifcProductLabel);
                        p.AddShapeInstance(si);

                        XbimShapeTriangulation triangulation = br.ReadShapeTriangulation();
                        var tri = new MyBimTriangulation(triangulation, offsite, scale);
                        //MyBimGeomorty.triangulations.Add(tri);

                        si.AddTriangulation(tri);
                    }
                }
            }
        }
    }