void ProcessTexMapChunk(ThreeDSChunk chunk, MaterialD3S m) { while (chunk.BytesRead < chunk.Length) { ThreeDSChunk child = new ThreeDSChunk(reader); switch ((ChunkType)child.ID) { case ChunkType.MappingFilename: string name = ProcessString(child); Console.WriteLine(" Texture File: {0}", name); //FileStream fStream; Bitmap bmp; try { //fStream = new FileStream(base_dir + name, FileMode.Open, FileAccess.Read); bmp = new Bitmap(base_dir + name); } catch (Exception e) { // couldn't find the file Console.WriteLine(" ERROR: could not load file '{0}'", base_dir + name); break; } // Flip image (needed so texture are the correct way around!) bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); System.Drawing.Imaging.BitmapData imgData = bmp.LockBits(new Rectangle(new Point(0, 0), bmp.Size), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); // System.Drawing.Imaging.PixelFormat.Format24bppRgb ); m.BindTexture(imgData.Width, imgData.Height, imgData.Scan0); bmp.UnlockBits(imgData); bmp.Dispose(); /* BinaryReader br = new BinaryReader(fStream); br.ReadBytes ( 14 ); // skip file header uint offset = br.ReadUInt32 ( ); //br.ReadBytes ( 4 ); // skip image header uint biWidth = br.ReadUInt32 (); uint biHeight = br.ReadUInt32 (); Console.WriteLine ( "w {0} h {1}", biWidth, biHeight ); br.ReadBytes ( (int) offset - 12 ); // skip rest of image header byte[,,] tex = new byte [ biHeight , biWidth , 4 ]; for ( int ii=0 ; ii < biHeight ; ii++ ) { for ( int jj=0 ; jj < biWidth ; jj++ ) { tex [ ii, jj, 0 ] = br.ReadByte(); tex [ ii, jj, 1 ] = br.ReadByte(); tex [ ii, jj, 2 ] = br.ReadByte(); tex [ ii, jj, 3 ] = 255; //Console.Write ( ii + " " ); } } br.Close(); fStream.Close(); m.BindTexture ( (int) biWidth, (int) biHeight, tex ); */ break; default: SkipChunk(child, (int)(chunk.Length - chunk.BytesRead - child.BytesRead)); break; } chunk.BytesRead += child.BytesRead; } }
void ProcessMaterialChunk(ThreeDSChunk chunk) { string name = string.Empty; MaterialD3S m = new MaterialD3S(); while (chunk.BytesRead < chunk.Length) { ThreeDSChunk child = new ThreeDSChunk(reader); switch ((ChunkType)child.ID) { case ChunkType.MaterialName: name = ProcessString(child); Console.WriteLine("Material: {0}", name); break; case ChunkType.AmbientColor: m.Ambient = ProcessColorChunk(child); break; case ChunkType.DiffuseColor: m.Diffuse = ProcessColorChunk(child); break; case ChunkType.SpecularColor: m.Specular = ProcessColorChunk(child); break; case ChunkType.C_MATSHININESS: m.Shininess = ProcessPercentageChunk(child); //Console.WriteLine ( "SHININESS: {0}", m.Shininess ); break; case ChunkType.TextureMap: ProcessPercentageChunk(child); //SkipChunk ( child ); ProcessTexMapChunk(child, m); break; default: SkipChunk(child); break; } chunk.BytesRead += child.BytesRead; } materials.Add(name, m); }