private void ExportDrawable(TextWriter sw, Drawable drawable) { foreach (var model in drawable.Models) { ExportModel(sw, model, drawable); } }
private void ExportModel(TextWriter sw, Model model, Drawable drawable) { foreach (var geometry in model.Geometries) { foreach (var mesh in geometry.Meshes) { if (_selectedNodes[mesh]) { Vertex[] vertices = mesh.DecodeVertexData(); ushort[] indices = mesh.DecodeIndexData(); string materialName = "material_" + mesh.MaterialIndex + "_" + drawable.Materials[mesh.MaterialIndex].ShaderName; for (int i = 0; i < mesh.FaceCount; i++) { Vertex v1 = vertices[indices[i*3 + 0]]; Vertex v2 = vertices[indices[i*3 + 1]]; Vertex v3 = vertices[indices[i*3 + 2]]; sw.WriteLine(materialName); ExportVertex(sw, mesh, v1); ExportVertex(sw, mesh, v2); ExportVertex(sw, mesh, v3); } } } } }
internal static ModelNode GenerateModel(Drawable drawable, TextureFile[] textures) { var random = new Random(); var materials = new Material[drawable.Materials.Count]; for (int i = 0; i < materials.Length; i++) { Brush brush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, (byte)random.Next(0, 255), (byte)random.Next(0, 255), (byte)random.Next(0, 255))); var drawableMat = drawable.Materials[i]; var texture = drawableMat.Parameters[(int)ParamNameHash.Texture] as MaterialParamTexture; if (texture != null) { // 1. Try looking in the embedded texture file (if any) var textureObj = FindTexture(drawable.AttachedTexture, texture.TextureName); // 2. Try looking in any attached external texture dictionaries if (textureObj == null) { foreach (var file in textures) { textureObj = FindTexture(file, texture.TextureName); if (textureObj != null) { break; } } } // Generate a brush if we were successful if (textureObj != null) { var bitmap = textureObj.Decode() as Bitmap; var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap( bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); // For memory leak work around bitmapSource.Freeze(); brush = new ImageBrush(bitmapSource); (brush as ImageBrush).ViewportUnits = BrushMappingMode.Absolute; (brush as ImageBrush).TileMode = TileMode.Tile; bitmap.Dispose(); } } materials[i] = new DiffuseMaterial(brush); } var drawableModelGroup = new Model3DGroup(); var drawableModelNode = new ModelNode {DataModel = drawable, Model3D = drawableModelGroup, Name = "Drawable", NoCount = true}; foreach (var model in drawable.Models) { var modelGroup = new Model3DGroup(); var modelNode = new ModelNode {DataModel = model, Model3D = modelGroup, Name = "Model"}; drawableModelNode.Children.Add(modelNode); foreach (var geometry in model.Geometries) { var geometryIndex = 0; var geometryGroup = new Model3DGroup(); var geometryNode = new ModelNode { DataModel = geometry, Model3D = geometryGroup, Name = "Geometry" }; modelNode.Children.Add(geometryNode); foreach (var mesh in geometry.Meshes) { var mesh3D = new MeshGeometry3D(); var meshNode = new ModelNode { DataModel = mesh, Model3D = null, Name = "Mesh" }; geometryNode.Children.Add(meshNode); Data.Vertex[] vertices = mesh.DecodeVertexData(); foreach (var vertex in vertices) { mesh3D.Positions.Add(new Point3D(vertex.Position.X, vertex.Position.Y, vertex.Position.Z)); if (mesh.VertexHasNormal) { mesh3D.Normals.Add(new Vector3D(vertex.Normal.X, vertex.Normal.Y, vertex.Normal.Z)); } if (mesh.VertexHasTexture) { mesh3D.TextureCoordinates.Add(new Point(vertex.TextureCoordinates[0].X, vertex.TextureCoordinates[0].Y)); } } ushort[] indices = mesh.DecodeIndexData(); for (int i = 0; i < mesh.FaceCount; i++) { mesh3D.TriangleIndices.Add(indices[i * 3 + 0]); mesh3D.TriangleIndices.Add(indices[i * 3 + 1]); mesh3D.TriangleIndices.Add(indices[i * 3 + 2]); } var material = materials[geometry.Meshes[geometryIndex].MaterialIndex]; var model3D = new GeometryModel3D(mesh3D, material); geometryGroup.Children.Add(model3D); meshNode.Model3D = model3D; geometryIndex++; } modelGroup.Children.Add(geometryGroup); } drawableModelGroup.Children.Add(modelGroup); } return drawableModelNode; }