public static PackedGeometry Pack(IndexedFaceSet ifs)
        {
            PackedGeometry    packed;
            TextureCoordinate texCoordinate;
            Coordinate        coordinate;
            Color             colorNode;
            ColorRGBA         colorRGBANode;

            packed = new PackedGeometry();
            //packed.Texturing = ifs.texCoordinate != null;// || parentShape.texturingEnabled;

            texCoordinate = (TextureCoordinate)ifs.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(TextureCoordinate));
            coordinate    = (Coordinate)ifs.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(Coordinate));
            colorNode     = (Color)ifs.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(Color));
            colorRGBANode = (ColorRGBA)ifs.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(ColorRGBA));

            packed.RGBA             = colorRGBANode != null;
            packed.RGB              = colorNode != null;
            packed.Coloring         = packed.RGBA || packed.RGB;
            packed.generateColorMap = packed.Coloring;

            if (packed.RGB && !packed.RGBA)
            {
                packed.color = X3DTypeConverters.Floats(colorNode.color);
            }
            else if (packed.RGBA && !packed.RGB)
            {
                packed.color = X3DTypeConverters.Floats(colorRGBANode.color);
            }

            if (texCoordinate != null && !string.IsNullOrEmpty(ifs.texCoordIndex))
            {
                packed._texIndices = X3DTypeConverters.ParseIndicies(ifs.texCoordIndex);
                packed._texCoords  = X3DTypeConverters.MFVec2f(texCoordinate.point);
                packed.Texturing   = true;
            }

            if (coordinate != null && !string.IsNullOrEmpty(ifs.coordIndex))
            {
                packed._indices = X3DTypeConverters.ParseIndicies(ifs.coordIndex);
                packed._coords  = X3DTypeConverters.MFVec3f(coordinate.point);

                if (!string.IsNullOrEmpty(ifs.colorIndex))
                {
                    packed._colorIndicies = X3DTypeConverters.ParseIndicies(ifs.colorIndex);
                }

                if (ifs.coordIndex.Contains(RESTART_INDEX.ToString()))
                {
                    packed.restartIndex = RESTART_INDEX;
                }

                packed.Interleave();
            }

            return(packed);
        }
예제 #2
0
        /// <summary>
        /// QL4BIM GeometryOperation Function
        /// </summary>
        /// <param name="elements"></param>
        /// <param name="xModelContext"></param>
        /// <returns></returns>
        public static List <TriangleMesh> CreateTriangleMeshes(List <IIfcProduct> elements, Xbim3DModelContext xModelContext)
        {
            var resList = new List <TriangleMesh>();

            foreach (var item in elements)
            {
                //  var mesh = GeometryHandler.WriteTriangles(item, xModelContext, new XbimMatrix3D())

                var mesh = GeometryHandler.WriteAllTriangles(item, xModelContext, new XbimMatrix3D());


                // Transformation
                // var vertices = jObject.SelectToken("vertices").ToList().Select(value => value.Value<double>()).ToArray();
                // var indices = jObject.SelectToken("faces").ToList().Select(value => value.Value<int>()).ToArray();
                // var faceSet = new IndexedFaceSet(item.Id.ToString(), indices, vertices);

                var vertices = new List <Tuple <double, double, double> >();

                // var posList = new List<double>();
                foreach (var pos in mesh.Positions)
                {
                    vertices.Add(new Tuple <double, double, double>(pos.X, pos.Y, pos.Z));
                    // posList.Add(pos.X);
                    // posList.Add(pos.Y);
                    // posList.Add(pos.Z);
                }

                var indices = new List <Tuple <int, int, int> >();
                for (int i = 0; i < mesh.TriangleIndices.Count; i = i + 3)
                {
                    indices.Add(new Tuple <int, int, int>(mesh.TriangleIndices[i], mesh.TriangleIndices[i + 1], mesh.TriangleIndices[i + 2]));
                }

                if (vertices.Count == 0 || indices.Count == 0)
                {
                    continue;
                }

                var faceSet = new IndexedFaceSet(vertices.ToArray(), indices.ToArray(), item.GlobalId.ToString(), 1);

                // var faceSet = new IndexedFaceSet(item.GlobalId.ToString(), mesh.TriangleIndices.ToArray(), posList.ToArray());
                resList.Add(faceSet.CreateMesh());
            }

            return(resList);
        }
        private List <TriangleMesh> CreateTriangleMeshes(ModelInfo modelInfo)
        {
            var elements1 = modelInfo.GetCurrentElements();
            var resList   = new List <TriangleMesh>();

            foreach (var item in elements1)
            {
                var jObject = item.AttributeGroups["geometry"]["threejs"] as JObject;
                if (jObject == null)
                {
                    continue;
                }

                // Transformation
                var vertices = jObject.SelectToken("vertices").ToList().Select(value => value.Value <double>()).ToArray();
                var indices  = jObject.SelectToken("faces").ToList().Select(value => value.Value <int>()).ToArray();
                // var faceSet = new IndexedFaceSet(item.Id.ToString(), indices, vertices);
                var faceSet = new IndexedFaceSet(item.Id.ToString(), indices, vertices);
                resList.Add(faceSet.CreateMesh());
            }

            return(resList);
        }
예제 #4
0
 public static void AddShape(IndexedFaceSet ifs)
 {
     Shapes.Add(ifs);
     MarkAsDirty(RedrawTypeRequired.RecalculateViewPrimitives);
 }
        private List<TriangleMesh> CreateTriangleMeshes(ModelInfo modelInfo)
        {
            var elements1 = modelInfo.GetCurrentElements();
            var resList = new List<TriangleMesh>();

            foreach (var item in elements1)
            {
                var jObject = item.AttributeGroups["geometry"]["threejs"] as JObject;
                if (jObject == null) continue;

                // var vertices = jObject.SelectToken("vertices").ToList().Select(value => value.Value<double>()).ToArray();

                // Transformation 
                var vertices = jObject.SelectToken("vertices").ToList().Select(value => value.Value<double>()).ToArray();
                var indices = jObject.SelectToken("faces").ToList().Select(value => value.Value<int>()).ToArray();
                // var faceSet = new IndexedFaceSet(item.Id.ToString(), indices, vertices);
                var faceSet = new IndexedFaceSet(item.Id.ToString(), indices, vertices);
                resList.Add(faceSet.CreateMesh());
            }

            return resList;
        }
예제 #6
0
        /// <summary>Parses the x3d file that this X3dFile represents and extracts the IndexedFaces and CameraPosition.</summary>
        public void Parse(double scale)
        {
            IndexedFaces = new List <IndexedFaceSet>();

            StreamReader sr = new StreamReader(FullPath);
            string       s  = "";

            while (s != "</head>" && !sr.EndOfStream)
            {
                s = sr.ReadLine();
            }
            //while (f.CanRead)
            //{
            //    f.read
            //}

            XmlTextReader reader = new XmlTextReader(sr);

            string name         = "";
            string coordIndices = "";
            string points       = "";

            while (reader.Read())
            {
                //Console.WriteLine(reader.Name);
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:     // The node is an element.
                    if (reader.Name == "Transform")
                    {
                        name = reader["DEF"];
                    }
                    else if (reader.Name == "IndexedFaceSet")
                    {
                        coordIndices = reader["coordIndex"];
                    }
                    else if (reader.Name == "Coordinate")
                    {
                        points = reader["point"];
                    }
                    else if (reader.Name == "Viewpoint")
                    {
                        string[] camera = reader["position"].Split(' ');
                        CameraPosition = new Coord(double.Parse(camera[1]) * scale, double.Parse(camera[2]) * scale, -double.Parse(camera[0]) * scale);
                        //CameraPosition = new Coord(double.Parse(camera[0]) * scale, double.Parse(camera[1]) * scale, double.Parse(camera[2]) * scale);
                    }
                    break;
                }


                if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "IndexedFaceSet")
                {
                    IndexedFaceSet ifs = new IndexedFaceSet(name, coordIndices, points, scale);
                    IndexedFaces.Add(ifs);
                }
                if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "Scene")
                {
                    break;
                }
            }
        }
예제 #7
0
 public void AddShape(IndexedFaceSet ifs)
 {
     Drawing.AddShape(ifs);
 }
예제 #8
0
        private static TriangleMesh CreateTriangleMeshes(string id, double[] vertices, int[] indices)
        {
            var faceSet = new IndexedFaceSet(id, indices, vertices);

            return(faceSet.CreateMesh());
        }