コード例 #1
0
        /// <summary>
        /// Exports the effect of the specified material.
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="m">The material.</param>
        private void ExportEffect(XmlWriter writer, Material m)
        {
            if (m == null)
            {
                return;
            }

            string id = this.effects[m];

            writer.WriteStartElement("effect");
            writer.WriteAttributeString("id", id);
            writer.WriteAttributeString("name", id);
            writer.WriteStartElement("profile_COMMON");
            writer.WriteStartElement("technique");
            writer.WriteAttributeString("sid", "common");
            writer.WriteStartElement("phong");

            var emissiveMaterial = MaterialHelper.GetFirst <EmissiveMaterial>(m);

            if (emissiveMaterial != null)
            {
                this.WritePhongMaterial(writer, "emission", emissiveMaterial.Color);
            }

            var diffuseMaterial = MaterialHelper.GetFirst <DiffuseMaterial>(m);

            if (diffuseMaterial != null)
            {
                this.WritePhongMaterial(writer, "diffuse", diffuseMaterial.Color);
            }

            var specularMaterial = MaterialHelper.GetFirst <SpecularMaterial>(m);

            if (specularMaterial != null)
            {
                this.WritePhongMaterial(writer, "specular", specularMaterial.Color);
            }

            writer.WriteEndElement(); // phong
            writer.WriteEndElement(); // technique
            writer.WriteEndElement(); // profile_COMMON
            writer.WriteEndElement(); // effect
        }
コード例 #2
0
        private void AddEdge(ModelUIElement3D element, Point3D center, double x, double y, double z, Vector3D faceNormal)
        {
            var builder = new MeshBuilder(false, true);

            builder.AddBox(center, x, y, z);

            var geometry = builder.ToMesh();

            geometry.Freeze();

            var model = new GeometryModel3D {
                Geometry = geometry, Material = MaterialHelper.CreateMaterial(EdgeBrush)
            };

            element.Model = model;

            faceNormals.Add(element, faceNormal);
            faceUpVectors.Add(element, ModelUpDirection);
        }
コード例 #3
0
        /// <summary>
        /// Calculates the texture of the specified model.
        /// </summary>
        /// <param name="model">
        /// The model.
        /// </param>
        /// <param name="mesh">
        /// The mesh.
        /// </param>
        public override void Calculate(TerrainModel model, MeshGeometry3D mesh)
        {
            var normals   = MeshGeometryHelper.CalculateNormals(mesh);
            var texcoords = new PointCollection();

            for (int i = 0; i < normals.Count; i++)
            {
                double slopedir = Math.Atan2(normals[i].Y, normals[i].X) * 180 / Math.PI;
                if (slopedir < 0)
                {
                    slopedir += 360;
                }

                double u = slopedir / 360;
                texcoords.Add(new Point(u, u));
            }

            this.TextureCoordinates = texcoords;
            this.Material           = MaterialHelper.CreateMaterial(this.Brush);
        }
コード例 #4
0
ファイル: StLReader.cs プロジェクト: levi1994/LitDev
        /// <summary>
        /// The read triangle a.
        /// </summary>
        /// <param name="normal">
        /// The normal.
        /// </param>
        private void ReadFacetA(string normal)
        {
            Vector3D n      = this.ParseNormalA(normal);
            var      points = new List <Point3D>();

            this.ReadLineA("outer");
            while (true)
            {
                var     line = this.ReadLineA();
                Point3D point;
                if (this.TryParseVertex(line, out point))
                {
                    points.Add(point);
                    continue;
                }

                string id, values;
                SplitLine(line, out id, out values);

                if (id == "endloop")
                {
                    break;
                }
            }

            this.ReadLineA("endfacet");

            if (this.Materials.Count < this.index + 1)
            {
                this.Materials.Add(MaterialHelper.CreateMaterial(Brushes.Blue));
            }

            if (this.Meshes.Count < this.index + 1)
            {
                this.Meshes.Add(new MeshBuilder(true, true));
            }

            this.Meshes[this.index].AddPolygon(points);

            // todo: add normals
        }
コード例 #5
0
        private void AddCorners()
        {
            var a          = Size / 2;
            var sideLength = a / 2;

            Point3D[] points =
            {
                new Point3D(-1, -1, -1), new Point3D(1, -1, -1), new Point3D(1, 1, -1), new Point3D(-1, 1, -1),
                new Point3D(-1, -1,  1), new Point3D(1, -1,  1), new Point3D(1, 1,  1), new Point3D(-1, 1, 1)
            };

            foreach (var p in points)
            {
                var builder = new MeshBuilder(false, true);

                Point3D center = p.Multiply(a);
                builder.AddBox(center, sideLength, sideLength, sideLength);
                var geometry = builder.ToMesh();
                geometry.Freeze();

                var model = new GeometryModel3D {
                    Geometry = geometry, Material = MaterialHelper.CreateMaterial(CornerBrush)
                };
                var element = new ModelUIElement3D {
                    Model = model
                };

                faceNormals.Add(element, p.ToVector3D());
                faceUpVectors.Add(element, ModelUpDirection);

                element.MouseLeftButtonDown += FaceMouseLeftButtonDown;
                element.MouseEnter          += CornersMouseEnters;
                element.MouseLeave          += CornersMouseLeave;

                Children.Add(element);
                CornerModels.Add(element);
            }
        }
コード例 #6
0
ファイル: StLReader.cs プロジェクト: levi1994/LitDev
        /// <summary>
        /// Reads a binary stream.
        /// </summary>
        /// <param name="s">
        /// The s.
        /// </param>
        public void ReadB(Stream s)
        {
            long length = this.BinaryReader.BaseStream.Length;

            if (length < 84)
            {
                throw new FileFormatException("Incomplete file");
            }

            string header          = this.ReadHeaderB();
            uint   numberTriangles = this.ReadNumberTrianglesB();

            this.index = 0;
            this.Meshes.Add(new MeshBuilder(true, true));
            this.Materials.Add(MaterialHelper.CreateMaterial(Brushes.Blue));

            for (int i = 0; i < numberTriangles; i++)
            {
                this.ReadTriangleB();
            }

            this.BinaryReader.Close();
        }
コード例 #7
0
        private Material CreateTextMaterial(Brush b, string text)
        {
            var grid = new Grid {
                Width = 20, Height = 20, Background = b
            };

            grid.Children.Add(
                new TextBlock
            {
                Text = text,
                VerticalAlignment   = VerticalAlignment.Center,
                HorizontalAlignment = HorizontalAlignment.Center,
                FontSize            = 15,
                Foreground          = Brushes.White
            });
            grid.Arrange(new Rect(new Point(0, 0), new Size(20, 20)));

            var bmp = new RenderTargetBitmap((int)grid.Width, (int)grid.Height, 96, 96, PixelFormats.Default);

            bmp.Render(grid);

            return(MaterialHelper.CreateMaterial(new ImageBrush(bmp)));
        }
コード例 #8
0
        private void AddCorners()
        {
            var a          = Size / 2;
            var sideLength = a / 2;
            int counter    = 0;

            foreach (var p in cornerPoints)
            {
                var builder = new MeshBuilder(false, true);

                Point3D center = p.Multiply(a);
                builder.AddBox(center, sideLength, sideLength, sideLength);
                var geometry = builder.ToMesh();
                geometry.Freeze();

                var model = new GeometryModel3D {
                    Geometry = geometry, Material = MaterialHelper.CreateMaterial(CornerBrush)
                };
                var element = CornerModels[counter++];
                element.Model = model;
                faceNormals.Add(element, p.ToVector3D());
                faceUpVectors.Add(element, ModelUpDirection);
            }
        }
コード例 #9
0
 private void EnableDisableEdgeClicks()
 {
     foreach (var item in EdgeModels)
     {
         Children.Remove(item);
     }
     foreach (var item in CornerModels)
     {
         Children.Remove(item);
     }
     if (EnableEdgeClicks)
     {
         foreach (var item in EdgeModels)
         {
             (item.Model as GeometryModel3D).Material = MaterialHelper.CreateMaterial(EdgeBrush);
             Children.Add(item);
         }
         foreach (var item in CornerModels)
         {
             (item.Model as GeometryModel3D).Material = MaterialHelper.CreateMaterial(CornerBrush);
             Children.Add(item);
         }
     }
 }
コード例 #10
0
ファイル: LwoReader.cs プロジェクト: levi1994/LitDev
        /// <summary>
        /// Read a surface.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="size">The size.</param>
        private void ReadSurface(BinaryReader reader, int size)
        {
            this.Surfaces  = new List <string>();
            this.Meshes    = new List <MeshBuilder>();
            this.Materials = new List <Material>();

            string name  = this.ReadString(reader, size);
            var    names = name.Split('\0');

            for (int i = 0; i < names.Length; i++)
            {
                string n = names[i];
                this.Surfaces.Add(n);
                this.Meshes.Add(new MeshBuilder(false, false));
                this.Materials.Add(MaterialHelper.CreateMaterial(Brushes.Blue));

                // If the length of the string (including the null) is odd, an extra null byte is added.
                // Then skip the next empty string.
                if ((n.Length + 1) % 2 == 1)
                {
                    i++;
                }
            }
        }
コード例 #11
0
        private void CornersMouseEnters(object sender, MouseEventArgs e)
        {
            ModelUIElement3D s = sender as ModelUIElement3D;

            (s.Model as GeometryModel3D).Material = MaterialHelper.CreateMaterial(Colors.Goldenrod);
        }
コード例 #12
0
        private void EdgesMouseLeaves(object sender, MouseEventArgs e)
        {
            ModelUIElement3D s = sender as ModelUIElement3D;

            (s.Model as GeometryModel3D).Material = MaterialHelper.CreateMaterial(Colors.Silver);
        }
コード例 #13
0
        /// <summary>
        /// Reads a triangle from a binary STL file.
        /// </summary>
        /// <param name="reader">
        /// The reader.
        /// </param>
        private void ReadTriangle(BinaryReader reader)
        {
            float ni = ReadFloat(reader);
            float nj = ReadFloat(reader);
            float nk = ReadFloat(reader);

#pragma warning disable 168
            var n = new Vector3D(ni, nj, nk);
#pragma warning restore 168

            float x1 = ReadFloat(reader);
            float y1 = ReadFloat(reader);
            float z1 = ReadFloat(reader);
            var   v1 = new Point3D(x1, y1, z1);

            float x2 = ReadFloat(reader);
            float y2 = ReadFloat(reader);
            float z2 = ReadFloat(reader);
            var   v2 = new Point3D(x2, y2, z2);

            float x3 = ReadFloat(reader);
            float y3 = ReadFloat(reader);
            float z3 = ReadFloat(reader);
            var   v3 = new Point3D(x3, y3, z3);

            var attrib   = Convert.ToString(ReadUInt16(reader), 2).PadLeft(16, '0').ToCharArray();
            var hasColor = attrib[0].Equals('1');

            if (hasColor)
            {
                int blue = attrib[15].Equals('1') ? 1 : 0;
                blue = attrib[14].Equals('1') ? blue + 2 : blue;
                blue = attrib[13].Equals('1') ? blue + 4 : blue;
                blue = attrib[12].Equals('1') ? blue + 8 : blue;
                blue = attrib[11].Equals('1') ? blue + 16 : blue;
                int b = blue * 8;

                int green = attrib[10].Equals('1') ? 1 : 0;
                green = attrib[9].Equals('1') ? green + 2 : green;
                green = attrib[8].Equals('1') ? green + 4 : green;
                green = attrib[7].Equals('1') ? green + 8 : green;
                green = attrib[6].Equals('1') ? green + 16 : green;
                int g = green * 8;

                int red = attrib[5].Equals('1') ? 1 : 0;
                red = attrib[4].Equals('1') ? red + 2 : red;
                red = attrib[3].Equals('1') ? red + 4 : red;
                red = attrib[2].Equals('1') ? red + 8 : red;
                red = attrib[1].Equals('1') ? red + 16 : red;
                int r = red * 8;

                var currentColor = Color.FromRgb(Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b));

                if (!Color.Equals(this.lastColor, currentColor))
                {
                    this.lastColor = currentColor;
                    this.index++;
                }

                if (this.Materials.Count < this.index + 1)
                {
                    this.Materials.Add(MaterialHelper.CreateMaterial(currentColor));
                }
            }
            else
            {
                if (this.Materials.Count < this.index + 1)
                {
                    this.Materials.Add(this.DefaultMaterial);
                }
            }

            if (this.Meshes.Count < this.index + 1)
            {
                this.Meshes.Add(new MeshBuilder(true, true));
            }

            this.Meshes[this.index].AddTriangle(v1, v2, v3);

            // todo: add normal
        }
コード例 #14
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MapTexture"/> class.
 /// </summary>
 /// <param name="source">
 /// The source.
 /// </param>
 public MapTexture(string source)
 {
     this.Material = MaterialHelper.CreateImageMaterial(source, 1);
 }
コード例 #15
0
ファイル: StLReader.cs プロジェクト: levi1994/LitDev
        /// <summary>
        /// The read triangle b.
        /// </summary>
        private void ReadTriangleB()
        {
            Color current;
            bool  hasColor  = false;
            bool  sameColor = true;

            float ni = this.ReadFloatB();
            float nj = this.ReadFloatB();
            float nk = this.ReadFloatB();
            var   n  = new Vector3D(ni, nj, nk);

            float v1x = this.ReadFloatB();
            float v1y = this.ReadFloatB();
            float v1z = this.ReadFloatB();
            var   v1  = new Point3D(v1x, v1y, v1z);

            float v2x = this.ReadFloatB();
            float v2y = this.ReadFloatB();
            float v2z = this.ReadFloatB();
            var   v2  = new Point3D(v2x, v2y, v2z);

            float v3x = this.ReadFloatB();
            float v3y = this.ReadFloatB();
            float v3z = this.ReadFloatB();
            var   v3  = new Point3D(v3x, v3y, v3z);

            // UInt16 attrib = ReadUInt16();
            var attrib = Convert.ToString(this.ReadUInt16B(), 2).PadLeft(16, '0').ToCharArray();

            hasColor = attrib[0].Equals('1');

            if (hasColor)
            {
                int blue = attrib[15].Equals('1') ? 1 : 0;
                blue = attrib[14].Equals('1') ? blue + 2 : blue;
                blue = attrib[13].Equals('1') ? blue + 4 : blue;
                blue = attrib[12].Equals('1') ? blue + 8 : blue;
                blue = attrib[11].Equals('1') ? blue + 16 : blue;
                int b = blue * 8;

                int green = attrib[10].Equals('1') ? 1 : 0;
                green = attrib[9].Equals('1') ? green + 2 : green;
                green = attrib[8].Equals('1') ? green + 4 : green;
                green = attrib[7].Equals('1') ? green + 8 : green;
                green = attrib[6].Equals('1') ? green + 16 : green;
                int g = green * 8;

                int red = attrib[5].Equals('1') ? 1 : 0;
                red = attrib[4].Equals('1') ? red + 2 : red;
                red = attrib[3].Equals('1') ? red + 4 : red;
                red = attrib[2].Equals('1') ? red + 8 : red;
                red = attrib[1].Equals('1') ? red + 16 : red;
                int r = red * 8;

                current   = Color.FromRgb(Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b));
                sameColor = Color.Equals(this.last, current);

                if (!sameColor)
                {
                    this.last = current;
                    this.index++;
                }

                if (this.Materials.Count < this.index + 1)
                {
                    this.Materials.Add(MaterialHelper.CreateMaterial(current));
                }
            }
            else
            {
                if (this.Materials.Count < this.index + 1)
                {
                    this.Materials.Add(MaterialHelper.CreateMaterial(Brushes.Blue));
                }
            }

            if (this.Meshes.Count < this.index + 1)
            {
                this.Meshes.Add(new MeshBuilder(true, true));
            }

            this.Meshes[this.index].AddTriangle(v1, v2, v3);
        }
コード例 #16
0
 /// <summary>
 /// The Fill property was changed.
 /// </summary>
 protected virtual void OnFillChanged()
 {
     this.Material     = MaterialHelper.CreateMaterial(this.Fill);
     this.BackMaterial = this.Material;
 }
コード例 #17
0
 /// <summary>
 ///   Handles changes in the Color property (this will override the materials).
 /// </summary>
 private void ColorChanged()
 {
     this.Material     = MaterialHelper.CreateMaterial(this.Color);
     this.BackMaterial = this.Material;
 }
コード例 #18
0
 /// <summary>
 /// Initializes a new instance of the <see cref="StLReader"/> class.
 /// </summary>
 public StLReader()
 {
     this.Meshes          = new List <MeshBuilder>();
     this.Materials       = new List <Material>();
     this.DefaultMaterial = MaterialHelper.CreateMaterial(Brushes.Blue);
 }