Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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)
            {

            }
        }