Exemplo n.º 1
0
        private TessellatedSolid CreateSolid(AMF_Object amfObject, AMF_Instance amfInstance = null)
        {
            List <Color> colors = null;

            if (amfObject.color != null)
            {
                colors = new List <Color>();
                var solidColor = new Color(amfObject.color);
                foreach (var amfTriangle in amfObject.mesh.volume.Triangles)
                {
                    colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor);
                }
            }
            else if (amfObject.mesh.volume.color != null)
            {
                colors = new List <Color>();
                var solidColor = new Color(amfObject.mesh.volume.color);
                foreach (var amfTriangle in amfObject.mesh.volume.Triangles)
                {
                    colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor);
                }
            }
            else if (amfObject.mesh.volume.Triangles.Any(t => t.color != null))
            {
                colors = new List <Color>();
                var solidColor = new Color(Constants.DefaultColor);
                foreach (var amfTriangle in amfObject.mesh.volume.Triangles)
                {
                    colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor);
                }
            }
            var name      = this.Name;
            var nameIndex =
                amfObject.metadata.FindIndex(md => md != null && md.type.Equals("name", StringComparison.CurrentCultureIgnoreCase));

            if (nameIndex != -1)
            {
                name = amfObject.metadata[nameIndex].Value;
                amfObject.metadata.RemoveAt(nameIndex);
            }
            var vertices = amfObject.mesh.vertices.Vertices.Select(v => v.coordinates.AsArray).ToList();

            if (amfInstance != null &&
                (amfInstance.deltaxSpecified || amfInstance.deltaySpecified || amfInstance.deltazSpecified ||
                 amfInstance.rxSpecified || amfInstance.rySpecified || amfInstance.rzSpecified))
            {
                var tMatrix =
                    StarMath.RotationX(amfInstance.rx)
                    .multiply(StarMath.RotationY(amfInstance.ry))
                    .multiply(StarMath.RotationZ(amfInstance.rz));
                tMatrix =
                    StarMath.Translate(amfInstance.deltax, amfInstance.deltay, amfInstance.deltaz).multiply(tMatrix);
                foreach (var coord in vertices)
                {
                    var coordWith1 = new[] { coord[0], coord[1], coord[2], 1.0 };
                    coordWith1 = tMatrix.multiply(coordWith1);
                    coord[0]   = coordWith1[0];
                    coord[1]   = coordWith1[1];
                    coord[2]   = coordWith1[2];
                }
            }
            return(new TessellatedSolid(vertices,
                                        amfObject.mesh.volume.Triangles.Select(t => t.VertexIndices).ToList(),
                                        colors, this.Units, name + "_" + amfObject.id, this.FileName,
                                        amfObject.metadata.Select(md => md.ToString()).ToList(), this.Language));
        }
Exemplo n.º 2
0
        private TessellatedSolid CreateSolid(AMF_Object amfObject, AMF_Instance amfInstance = null)
        {
            List <Color> colors = null;

            if (amfObject.color != null)
            {
                colors = new List <Color>();
                var solidColor = new Color(amfObject.color);
                foreach (var amfTriangle in amfObject.mesh.volume.Triangles)
                {
                    colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor);
                }
            }
            else if (amfObject.mesh.volume.color != null)
            {
                colors = new List <Color>();
                var solidColor = new Color(amfObject.mesh.volume.color);
                foreach (var amfTriangle in amfObject.mesh.volume.Triangles)
                {
                    colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor);
                }
            }
            else if (amfObject.mesh.volume.Triangles.Any(t => t.color != null))
            {
                colors = new List <Color>();
                var solidColor = new Color(Constants.DefaultColor);
                foreach (var amfTriangle in amfObject.mesh.volume.Triangles)
                {
                    colors.Add(amfTriangle.color != null ? new Color(amfTriangle.color) : solidColor);
                }
            }
            var name      = this.Name;
            var nameIndex =
                amfObject.metadata.FindIndex(md => md != null && md.type.Equals("name", StringComparison.CurrentCultureIgnoreCase));

            if (nameIndex != -1)
            {
                name = amfObject.metadata[nameIndex].Value;
                amfObject.metadata.RemoveAt(nameIndex);
            }
            var vertices = amfObject.mesh.vertices.Vertices.Select(v => v.coordinates.AsVector3).ToList();

            if (amfInstance != null &&
                (amfInstance.deltaxSpecified || amfInstance.deltaySpecified || amfInstance.deltazSpecified ||
                 amfInstance.rxSpecified || amfInstance.rySpecified || amfInstance.rzSpecified))
            {
                var tMatrix =
                    Matrix4x4.CreateRotationX(Constants.DegreesToRadiansFactor * amfInstance.rx)
                    * Matrix4x4.CreateRotationY(Constants.DegreesToRadiansFactor * amfInstance.ry)
                    * Matrix4x4.CreateRotationZ(Constants.DegreesToRadiansFactor * amfInstance.rz);
                //do matrix multiplication go the other way?
                tMatrix = tMatrix * Matrix4x4.CreateTranslation(amfInstance.deltax, amfInstance.deltay, amfInstance.deltaz);
                for (int i = 0; i < vertices.Count; i++)
                {
                    vertices[i] = vertices[i].Transform(tMatrix);
                }
            }
            return(new TessellatedSolid(vertices, amfObject.mesh.volume.Triangles.Select(t => t.VertexIndices).ToList(),
                                        true, colors, this.Units, name + "_" + amfObject.id, this.FileName,
                                        amfObject.metadata.Select(md => md.ToString()).ToList(), this.Language));
        }