/// <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 }
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()); }