/// <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;
#if !NETFX_CORE
                var currentColor = Color.FromRgb(Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b));
#else
                var currentColor = new Color(r / 255f, g / 255f, b / 255f);
#endif
                if (!Color.Equals(this.lastColor, currentColor))
                {
                    this.lastColor = currentColor;
                    this.index++;
                }

                if (this.Materials.Count < this.index + 1)
                {
                    this.Materials.Add(new PhongMaterialCore()
                    {
                        DiffuseColor = currentColor.ToColor4()
                    });
                }
            }
            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
        }
示例#2
0
        public PBRViewModel(IEffectsManager manager)
        {
            EffectsManager = manager;
            this.Camera    = new PerspectiveCamera {
                Position = new Point3D(0, 60, 60), LookDirection = new Vector3D(0, -60, -60), UpDirection = new Vector3D(0, 1, 0)
            };
            var builder = new MeshBuilder();

            builder.AddSphere(Vector3.Zero, 2);
            SphereModel = builder.ToMesh();
            var normalMap = TextureModel.Create(new System.Uri("TextureNoise1_dot3.dds", System.UriKind.RelativeOrAbsolute).ToString());

            for (int i = -Row; i < Row; ++i)
            {
                for (int j = -Col; j < Col; ++j)
                {
                    var m = new PBRMaterial()
                    {
                        AlbedoColor          = albedoColor.ToColor4(),
                        RoughnessFactor      = 1.0 / (2 * Row) * Math.Abs(i + Row),
                        MetallicFactor       = 1.0 / (2 * Col) * Math.Abs(j + Col),
                        RenderEnvironmentMap = true,
                        EnableAutoTangent    = true,
                        NormalMap            = normalMap,
                        RenderShadowMap      = true
                    };
                    materials.Add(m);
                    Models.Add(new MeshGeometryModel3D()
                    {
                        CullMode         = SharpDX.Direct3D11.CullMode.Back,
                        Geometry         = SphereModel,
                        Material         = m,
                        IsThrowingShadow = true,
                        Transform        = new Media3D.TranslateTransform3D(new Vector3D(i * 6, 0, j * 6))
                    });
                }
            }
            builder = new MeshBuilder();
            builder.AddSphere(Vector3.Zero, 8, 12, 12);
            Model    = builder.ToMesh();
            Material = new PBRMaterial()
            {
                AlbedoColor              = albedoColor.ToColor4(),
                RenderEnvironmentMap     = true,
                AlbedoMap                = TextureModel.Create("Engraved_Metal_COLOR.jpg"),
                NormalMap                = TextureModel.Create("Engraved_Metal_NORM.jpg"),
                DisplacementMap          = TextureModel.Create("Engraved_Metal_DISP.png"),
                RoughnessMetallicMap     = TextureModel.Create("Engraved_Metal_RMC.png"),
                DisplacementMapScaleMask = new Vector4(0.1f, 0.1f, 0.1f, 0),
                EnableAutoTangent        = true, EnableTessellation = true, MaxDistanceTessellationFactor = 2, MinDistanceTessellationFactor = 4
            };
            ModelTransform = new Media3D.MatrixTransform3D(Matrix.Translation(0, 30, 0).ToMatrix3D());

            builder = new MeshBuilder();
            builder.AddBox(Vector3.Zero, 100, 0.5, 100);
            var floorGeo = builder.ToMesh();

            for (int i = 0; i < floorGeo.TextureCoordinates.Count; ++i)
            {
                floorGeo.TextureCoordinates[i] *= 5;
            }
            FloorModel    = floorGeo;
            FloorMaterial = new PBRMaterial()
            {
                AlbedoMap                = TextureModel.Create("Wood_Planks_COLOR.jpg"),
                NormalMap                = TextureModel.Create("Wood_Planks_NORM.jpg"),
                DisplacementMap          = TextureModel.Create("Wood_Planks_DISP.png"),
                RoughnessMetallicMap     = TextureModel.Create("Wood_Planks_RMA.png"),
                AmbientOcculsionMap      = TextureModel.Create("Wood_Planks_RMA.png"),
                DisplacementMapScaleMask = new Vector4(1f, 1f, 1f, 0),
                RoughnessFactor          = 0.8,
                MetallicFactor           = 0.2,
                RenderShadowMap          = true,
                EnableAutoTangent        = true,
            };
            FloorModelTransform = new Media3D.MatrixTransform3D(Matrix.Translation(0, -5, 0).ToMatrix3D());
        }