protected override DataStructures.Models.Model LoadFromFile(IFile file) { if (importer == null) { importer = new AssimpContext(); //importer.SetConfig(new NormalSmoothingAngleConfig(66.0f)); } DataStructures.Models.Model model = new DataStructures.Models.Model(); DataStructures.Models.Bone bone = new DataStructures.Models.Bone(0, -1, null, "rootBone", CoordinateF.Zero, CoordinateF.Zero, CoordinateF.One, CoordinateF.One); model.Bones.Add(bone); Scene scene = importer.ImportFile(file.FullPathName); DataStructures.Models.Texture tex = null; if (scene.MaterialCount > 0) { //TODO: handle several textures for (int i = 0; i < scene.MaterialCount; i++) { if (string.IsNullOrEmpty(scene.Materials[i].TextureDiffuse.FilePath)) { continue; } string path = Path.Combine(Path.GetDirectoryName(file.FullPathName), scene.Materials[i].TextureDiffuse.FilePath); if (!File.Exists(path)) { path = scene.Materials[i].TextureDiffuse.FilePath; } if (File.Exists(path)) { Bitmap bmp = new Bitmap(path); tex = new DataStructures.Models.Texture { Name = path, Index = 0, Width = bmp.Width, Height = bmp.Height, Flags = 0, Image = bmp }; } break; } } if (tex == null) { Bitmap bmp = new Bitmap(64, 64); for (int i = 0; i < 64; i++) { for (int j = 0; j < 64; j++) { bmp.SetPixel(i, j, Color.DarkGray); } } tex = new DataStructures.Models.Texture { Name = "blank", Index = 0, Width = 64, Height = 64, Flags = 0, Image = bmp }; } model.Textures.Add(tex); AddNode(scene, scene.RootNode, model, tex, Matrix4x4.Identity); return(model); }
protected static void AddNode(Scene scene, Node node, DataStructures.Models.Model model, DataStructures.Models.Texture tex, Matrix4x4 parentMatrix) { Matrix4x4 selfMatrix = node.Transform * parentMatrix; foreach (var meshIndex in node.MeshIndices) { DataStructures.Models.Mesh sledgeMesh = AddMesh(model, scene.Meshes[meshIndex], selfMatrix); foreach (var v in sledgeMesh.Vertices) { v.TextureU *= tex.Width; v.TextureV *= tex.Height; } model.AddMesh("mesh", 0, sledgeMesh); } foreach (var subNode in node.Children) { AddNode(scene, subNode, model, tex, selfMatrix); } }
private static void ReadTextureInfo(IFile file, BinaryReader br, ModelData data, DataStructures.Models.Model model, int numTextures, int textureIndex) { if (data.Version == MDLVersionGoldsource) { var tempBr = br; var disp = false; if (numTextures == 0) { disp = true; var texFile = file.Parent.GetFile(file.NameWithoutExtension + "T." + file.Extension); br = new BinaryReader(texFile.Open()); br.BaseStream.Position = 180; // skip all the unused nonsense in the T file numTextures = br.ReadInt32(); textureIndex = br.ReadInt32(); var textureDataIndex = br.ReadInt32(); var numSkinRef = br.ReadInt32(); var numSkinFamilies = br.ReadInt32(); var skinIndex = br.ReadInt32(); } br.BaseStream.Position = textureIndex; for (var i = 0; i < numTextures; i++) { var name = br.ReadFixedLengthString(Encoding.ASCII, 64); var flags = br.ReadInt32(); var width = br.ReadInt32(); var height = br.ReadInt32(); var index = br.ReadInt32(); var savedPosition = br.BaseStream.Position; br.BaseStream.Position = index; var indices = br.ReadBytes(width * height); var palette = br.ReadBytes((byte.MaxValue + 1) * 3); var bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed); var pal = bmp.Palette; for (var j = 0; j <= byte.MaxValue; j++) { var k = j * 3; pal.Entries[j] = Color.FromArgb(255, palette[k], palette[k + 1], palette[k + 2]); } bmp.Palette = pal; var bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, bmp.PixelFormat); Marshal.Copy(indices, 0, bmpData.Scan0, indices.Length); bmp.UnlockBits(bmpData); var tex = new DataStructures.Models.Texture { Name = name, Index = i, Width = width, Height = height, Flags = flags, Image = bmp }; model.Textures.Add(tex); br.BaseStream.Position = savedPosition; } // if (disp) { br.BaseStream.Dispose(); br.Dispose(); br = tempBr; } } else if (data.Version >= MDLVersionSource2006) { } }