public TextureChunkController(NSFController nsfcontroller, TextureChunk texturechunk) : base(nsfcontroller, texturechunk) { this.texturechunk = texturechunk; Node.Text = string.Format("Texture Chunk ({0})", Entry.EIDToString(texturechunk.EID)); Node.ImageKey = "texturechunk"; Node.SelectedImageKey = "texturechunk"; }
public void SaveP3D(string path) { BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create)); String message; // Write header writer.Write(MagicWord); writer.Write((byte)0x02); writer.Write(Size.GetXSize()); writer.Write(Size.GetYSize()); writer.Write(Size.GetZSize()); // Write textures chunk message = TextureChunk.WriteChunk(writer); if (!message.Equals(String.Empty)) { MessageBox.Show("Saving failed while writing Textures Chunk, Message: " + message); return; } // Write lights chunk message = LightsChunk.WriteChunk(writer); if (!message.Equals(String.Empty)) { MessageBox.Show("Saving failed while writing Lights Chunk, Message: " + message); return; } // Write meshes chunk //MeshesChunk.CalculateMeshChunkSize(); message = MeshesChunk.WriteChunk(writer); if (!message.Equals(String.Empty)) { MessageBox.Show("Saving failed while writing Meshes Chunk, Message: " + message); return; } // Write userdata chunk message = UserDataChunk.WriteChunk(writer); if (!message.Equals(String.Empty)) { MessageBox.Show("Saving failed while writing User Data Chunk, Message: " + message); return; } writer.Close(); }
/// <summary> /// Reads the chunks for entry. /// </summary> /// <param name="reader">The reader.</param> /// <param name="entry">The entry.</param> private void ReadChunksForEntry(BinaryReader reader, BA2TextureFileEntry entry) { var chunks = new TextureChunk[entry.NumberOfChunks]; for (int i = 0; i < entry.NumberOfChunks; i++) { TextureChunk chunk = new TextureChunk() { Offset = reader.ReadUInt64(), PackedLength = reader.ReadUInt32(), UnpackedLength = reader.ReadUInt32(), StartMipmap = reader.ReadUInt16(), EndMipmap = reader.ReadUInt16(), Unknown = reader.ReadUInt32() }; chunks[i] = chunk; } entry.Chunks = chunks; }
public void Load(byte[] data) { int dataOffset = 0; var header = new Header(); header.Load(data, ref dataOffset); for (int i = 0; i < header.ChunkCount; i++) { BaseChunk baseChunk; //Read the first four bytes to get the tag. string tagName = FSHelpers.ReadString(data, dataOffset, 4); switch (tagName) { case "INF1": baseChunk = new InfoChunk(); Info = baseChunk as InfoChunk; break; case "VTX1": baseChunk = new VertexChunk(); Vertexes = baseChunk as VertexChunk; break; case "EVP1": baseChunk = new EnvelopeChunk(); Envelopes = baseChunk as EnvelopeChunk; break; case "DRW1": baseChunk = new DrawChunk(); Draw = baseChunk as DrawChunk; break; case "JNT1": baseChunk = new JointChunk(); Joints = baseChunk as JointChunk; break; case "SHP1": baseChunk = new ShapeChunk(); Shapes = baseChunk as ShapeChunk; break; case "TEX1": baseChunk = new TextureChunk(); Textures = baseChunk as TextureChunk; break; case "MAT3": baseChunk = new Material3Chunk(); Materials = baseChunk as Material3Chunk; break; case "ANK1": default: Console.WriteLine("Found unknown chunk {0}!", tagName); baseChunk = new DefaultChunk(); break; } baseChunk.Load(data, ref dataOffset); } }
public TextureChunkBox(TextureChunk chunk) { tbcTabs = new TabControl(); tbcTabs.Dock = DockStyle.Fill; { MysteryBox mystery = new MysteryBox(chunk.Data); mystery.Dock = DockStyle.Fill; TabPage page = new TabPage("Hex"); page.Controls.Add(mystery); tbcTabs.TabPages.Add(page); } { Bitmap bitmap = new Bitmap(512, 128, PixelFormat.Format16bppArgb1555); Rectangle brect = new Rectangle(Point.Empty, bitmap.Size); BitmapData bdata = bitmap.LockBits(brect, ImageLockMode.WriteOnly, PixelFormat.Format16bppArgb1555); try { for (int y = 0; y < 128; y++) { for (int x = 0; x < 512; x++) { byte color = chunk.Data[x + y * 512]; color >>= 3; short color16 = PixelConv.Pack1555(1, color, color, color); System.Runtime.InteropServices.Marshal.WriteInt16(bdata.Scan0, x * 2 + y * bdata.Stride, color16); } } } finally { bitmap.UnlockBits(bdata); } PictureBox picture = new PictureBox(); picture.Dock = DockStyle.Fill; picture.Image = bitmap; TabPage page = new TabPage("Monochrome 8"); page.Controls.Add(picture); tbcTabs.TabPages.Add(page); tbcTabs.SelectedTab = page; } { Bitmap bitmap = new Bitmap(256, 128, PixelFormat.Format16bppArgb1555); Rectangle brect = new Rectangle(Point.Empty, bitmap.Size); BitmapData bdata = bitmap.LockBits(brect, ImageLockMode.WriteOnly, PixelFormat.Format16bppArgb1555); try { for (int y = 0; y < 128; y++) { for (int x = 0; x < 256; x++) { short color = BitConv.FromInt16(chunk.Data, x * 2 + y * 512); byte alpha; byte red; byte green; byte blue; PixelConv.Unpack1555(color, out alpha, out blue, out green, out red); color = PixelConv.Pack1555(1, red, green, blue); System.Runtime.InteropServices.Marshal.WriteInt16(bdata.Scan0, x * 2 + y * bdata.Stride, color); } } } finally { bitmap.UnlockBits(bdata); } PictureBox picture = new PictureBox(); picture.Dock = DockStyle.Fill; picture.Image = bitmap; TabPage page = new TabPage("BGR555"); page.Controls.Add(picture); tbcTabs.TabPages.Add(page); } Controls.Add(tbcTabs); }
///<summary> ///Initializes all the chunk classes and adds them to a hashtable ///for lookup and retrieval based on their chunk ID; ///</summary> private void initializeChunks() { Chunk meshChunk = new MeshChunk(); Chunk hierarchyChunk = new HierarchyChunk(); Chunk hierarchyHeaderChunk = new HierarchyHeaderChunk(); Chunk pivotsChunk = new PivotsChunk(); Chunk pivotFixupsChunk = new PivotFixupsChunk(); Chunk hlodChunk = new HlodChunk(); Chunk hlodHeaderChunk = new HlodHeaderChunk(); Chunk hlodLodArrayChunk = new HlodLodArrayChunk(); Chunk hlodSubObjectArrayHeaderChunk = new HlodSubObjectArrayHeaderChunk(); Chunk hlodSubObjectChunk = new HlodSubObjectChunk(); Chunk hlodProxyArrayChunk = new HLodProxyArrayChunk(); Chunk meshHeader3Chunk = new MeshHeader3Chunk(); Chunk verticesChunk = new VerticesChunk(); Chunk vertexNormalsChunk = new VertexNormalsChunk(); Chunk trianglesChunk = new TrianglesChunk(); Chunk vertexShadeIndicesChunk = new VertexShadeIndicesChunk(); Chunk materialInfoChunk = new MaterialInfoChunk(); Chunk vertexMaterialsChunk = new VertexMaterialsChunk(); Chunk vertexMaterialChunk = new VertexMaterialChunk(); Chunk vertexMaterialNameChunk = new VertexMaterialNameChunk(); Chunk vertexMaterialInfoChunk = new VertexMaterialInfoChunk(); Chunk shadersChunk = new ShadersChunk(); Chunk texturesChunk = new TexturesChunk(); Chunk textureChunk = new TextureChunk(); Chunk textureNameChunk = new TextureNameChunk(); Chunk textureInfoChunk = new TextureInfoChunk(); Chunk materialPassChunk = new MaterialPassChunk(); Chunk vertexMaterialIdsChunk = new VertexMaterialIdsChunk(); Chunk shaderIdsChunk = new ShaderIdsChunk(); Chunk textureStageChunk = new TextureStageChunk(); Chunk textureIdsChunk = new TextureIdsChunk(); Chunk stageTexCoordsChunk = new StageTexCoordsChunk(); Chunk aabTreeChunk = new AabTreeChunk(); Chunk aabTreeHeaderChunk = new AabTreeHeaderChunk(); Chunk aabTreePolyIndicesChunk = new AabTreePolyIndicesChunk(); Chunk aabTreeNodesChunk = new AabTreeNodesChunk(); Chunk aggregateChunk = new AggregateChunk(); Chunk aggregateHeaderChunk = new AggregateHeaderChunk(); Chunk aggregateInfoChunk = new AggregateInfoChunk(); Chunk aggregateClassInfoChunk = new AggregateClassInfoChunk(); Chunk textureReplacerChunk = new TextureReplacerChunk(); Chunk vertexMapperArgs0Chunk = new VertexMapperArgs0Chunk(); Chunk vertexMapperArgs1Chunk = new VertexMapperArgs1Chunk(); Chunk animationChunk = new AnimationChunk(); Chunk animationHeaderChunk = new AnimationHeaderChunk(); Chunk animationChannelChunk = new AnimationChannelChunk(); Chunk bitChannelChunk = new BitChannelChunk(); Chunk emitterChunk = new EmitterChunk(); Chunk emitterHeaderChunk = new EmitterHeaderChunk(); Chunk emitterUserDataChunk = new EmitterUserDataChunk(); Chunk emitterInfoChunk = new EmitterInfoChunk(); Chunk emitterInfo2Chunk = new EmitterInfo2Chunk(); Chunk emitterPropsChunk = new EmitterPropsChunk(); Chunk emitterRotationKeyframesChunk = new EmitterRotationKeyFramesChunk(); Chunk emitterFrameKeyFramesChunk = new EmitterFrameKeyFramesChunk(); Chunk emitterBlurTimeKeyFramesChunk = new EmitterBlurTimeKeyFramesChunk(); Chunk emitterLinePropertiesChunk = new EmitterLinePropertiesChunk(); Chunk vertexInfluencesChunk = new VertexInfluencesChunk(); Chunk dcgChunk = new DcgChunk(); Chunk hModelChunk = new HModelChunk(); Chunk hModelHeaderChunk = new HModelHeaderChunk(); Chunk hModelAuxDataChunk = new HModelAuxDataChunk(); Chunk nodeChunk = new NodeChunk(); Chunk compressedAnimationChunk = new CompressedAnimationChunk(); Chunk compressedAnimationHeaderChunk = new CompressedAnimationHeaderChunk(); Chunk compressedAnimationChannelChunk = new CompressedAnimationChannelChunk(); Chunk compressedBitChannelChunk = new CompressedBitChannelChunk(); Chunk hLodAggregateArrayChunk = new HLodAggregateArrayChunk(); Chunk prelitUnlitChunk = new PrelitUnlitChunk(); Chunk prelitVertexChunk = new PrelitVertexChunk(); Chunk prelitLightMultiPassChunk = new PrelitLightMultiPassChunk(); Chunk prelitLightMultiTextureChunk = new PrelitLightMultiTextureChunk(); Chunk meshUserTextChunk = new MeshUserTextChunk(); Chunk collectionChunk = new CollectionChunk(); Chunk collectionHeaderChunk = new CollectionHeaderChunk(); Chunk collectionObjectNameChunk = new CollectionObjectNameChunk(); Chunk placeholderChunk = new PlaceholderChunk(); Chunk transformNodeChunk = new TransformNodeChunk(); Chunk dazzleChunk = new DazzleChunk(); Chunk dazzleNameChunk = new DazzleNameChunk(); Chunk dazzleTypeNameChunk = new DazzleTypeNameChunk(); Chunk boxChunk = new BoxChunk(); Chunk deformChunk = new DeformChunk(); Chunk deformSetChunk = new DeformSetChunk(); Chunk deformKeyframeChunk = new DeformKeyframeChunk(); Chunk deformDataChunk = new DeformDataChunk(); //Animation chunkMap.Add((int)ChunkHeader.W3D_CHUNK_ANIMATION, animationChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_ANIMATION_HEADER, animationHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_ANIMATION_CHANNEL, animationChannelChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_BIT_CHANNEL, bitChannelChunk); // Aggregate chunkMap.Add((int)ChunkHeader.W3D_CHUNK_AGGREGATE, aggregateChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_AGGREGATE_HEADER, aggregateHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_AGGREGATE_INFO, aggregateInfoChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_AGGREGATE_CLASS_INFO, aggregateClassInfoChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_TEXTURE_REPLACER_INFO, textureReplacerChunk); //Collection chunkMap.Add((int)ChunkHeader.W3D_CHUNK_COLLECTION, collectionChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_COLLECTION_HEADER, collectionHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_COLLECTION_OBJ_NAME, collectionObjectNameChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_PLACEHOLDER, placeholderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_TRANSFORM_NODE, transformNodeChunk); //Compressed Animation chunkMap.Add((int)ChunkHeader.W3D_CHUNK_COMPRESSED_ANIMATION, compressedAnimationChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_COMPRESSED_ANIMATION_HEADER, compressedAnimationHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_COMPRESSED_ANIMATION_CHANNEL, compressedAnimationChannelChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_COMPRESSED_BIT_CHANNEL, compressedBitChannelChunk); //Dazzle chunkMap.Add((int)ChunkHeader.W3D_CHUNK_DAZZLE, dazzleChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_DAZZLE_NAME, dazzleNameChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_DAZZLE_TYPENAME, dazzleTypeNameChunk); //Deform chunkMap.Add((int)ChunkHeader.W3D_CHUNK_DEFORM, deformChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_DEFORM_SET, deformSetChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_DEFORM_KEYFRAME, deformKeyframeChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_DEFORM_DATA, deformDataChunk); //Emitter chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER, emitterChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER_HEADER, emitterHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER_USER_DATA, emitterUserDataChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER_INFO, emitterInfoChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER_INFOV2, emitterInfo2Chunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER_PROPS, emitterPropsChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER_LINE_PROPERTIES, emitterLinePropertiesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER_ROTATION_KEYFRAMES, emitterRotationKeyframesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER_FRAME_KEYFRAMES, emitterFrameKeyFramesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_EMITTER_BLUR_TIME_KEYFRAMES, emitterBlurTimeKeyFramesChunk); // Mesh chunkMap.Add((int)ChunkHeader.W3D_CHUNK_MESH, meshChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_MESH_HEADER3, meshHeader3Chunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTICES, verticesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_NORMALS, vertexNormalsChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_TRIANGLES, trianglesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_SHADE_INDICES, vertexShadeIndicesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_MATERIAL_INFO, materialInfoChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_MESH_USER_TEXT, meshUserTextChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_MATERIALS, vertexMaterialsChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_MATERIAL, vertexMaterialChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_MATERIAL_NAME, vertexMaterialNameChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_MATERIAL_INFO, vertexMaterialInfoChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_SHADERS, shadersChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_TEXTURES, texturesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_TEXTURE, textureChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_TEXTURE_NAME, textureNameChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_TEXTURE_INFO, textureInfoChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_MATERIAL_PASS, materialPassChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_TEXTURE_STAGE, textureStageChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_TEXTURE_IDS, textureIdsChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_STAGE_TEXCOORDS, stageTexCoordsChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_MATERIAL_IDS, vertexMaterialIdsChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_MAPPER_ARGS0, vertexMapperArgs0Chunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_MAPPER_ARGS1, vertexMapperArgs1Chunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_SHADER_IDS, shaderIdsChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_VERTEX_INFLUENCES, vertexInfluencesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_AABTREE, aabTreeChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_AABTREE_HEADER, aabTreeHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_AABTREE_POLYINDICES, aabTreePolyIndicesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_AABTREE_NODES, aabTreeNodesChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_DCG, dcgChunk); //Primitives chunkMap.Add((int)ChunkHeader.W3D_CHUNK_BOX, boxChunk); //Hierarchy chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HIERARCHY, hierarchyChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HIERARCHY_HEADER, hierarchyHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_PIVOTS, pivotsChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_PIVOT_FIXUPS, pivotFixupsChunk); //HLod chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HLOD, hlodChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HLOD_HEADER, hlodHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HLOD_LOD_ARRAY, hlodLodArrayChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HLOD_SUB_OBJECT_ARRAY_HEADER, hlodSubObjectArrayHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HLOD_SUB_OBJECT, hlodSubObjectChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HLOD_AGGREGATE_ARRAY, hLodAggregateArrayChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HLOD_PROXY_ARRAY, hlodProxyArrayChunk); //HModel chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HMODEL, hModelChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HMODEL_HEADER, hModelHeaderChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_HMODEL_AUX_DATA, hModelAuxDataChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_NODE, nodeChunk); //Optional chunkMap.Add((int)ChunkHeader.W3D_CHUNK_PRELIT_UNLIT, prelitUnlitChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_PRELIT_VERTEX, prelitVertexChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_PRELIT_LIGHTMAP_MULTI_PASS, prelitLightMultiPassChunk); chunkMap.Add((int)ChunkHeader.W3D_CHUNK_PRELIT_LIGHTMAP_MULTI_TEXTURE, prelitLightMultiTextureChunk); }
public async Task LoadP3D(Stream data) { using (var reader = new BinaryReader(data)) { reader.BaseStream.Position = 0; bool success; byte[] magicWord = reader.ReadBytes(3); if (!Utility.ByteArrayCompare(magicWord, MagicWord)) { MessageBox.Show("Magic word isn't valid, got " + Encoding.ASCII.GetString(magicWord) + " Should be: " + Encoding.ASCII.GetString(MagicWord)); return; } Version = reader.ReadByte(); //MessageBox.Show("Version: " + version.ToString()); Size = new Extent { XSize = reader.ReadSingle(), YSize = reader.ReadSingle(), ZSize = reader.ReadSingle(), IsImportedSize = true }; //MessageBox.Show(size.xSize.ToString() + " - " + size.ySize.ToString() + " - " + size.zSize.ToString()); StatusUpdated(new StatusUpdatedEventArguments("Loading textures info from file", 25)); await Task.Delay(0).ConfigureAwait(false); TextureChunk = new TextureChunk(this); byte[] texHeader = reader.ReadBytes(3); if (!Utility.ByteArrayCompare(texHeader, TextureChunk.ChunkIdTemplate)) { StatusUpdated(new StatusUpdatedEventArguments("Failed to load file", 0)); MessageBox.Show("Expected TEX chunk header, got " + Encoding.ASCII.GetString(texHeader)); return; } TextureChunk.Size = reader.ReadInt32(); TextureChunk.TexNum = reader.ReadByte(); success = TextureChunk.ReadChunk(reader); if (!success) { StatusUpdated(new StatusUpdatedEventArguments("Failed to load file", 0)); MessageBox.Show("Couldn't parse Textures chunk"); return; } StatusUpdated(new StatusUpdatedEventArguments("Loading lights from file", 40)); await Task.Delay(0).ConfigureAwait(false); LightsChunk = new LightsChunk(this); byte[] lightsHeader = reader.ReadBytes(6); if (!Utility.ByteArrayCompare(lightsHeader, LightsChunk.ChunkIdTemplate)) { StatusUpdated(new StatusUpdatedEventArguments("Failed to load file", 0)); MessageBox.Show("Expected LIGHTS chunk header, got " + Encoding.ASCII.GetString(lightsHeader)); return; } LightsChunk.Size = reader.ReadInt32(); LightsChunk.LightsNum = reader.ReadInt16(); success = LightsChunk.ReadChunk(reader); if (!success) { StatusUpdated(new StatusUpdatedEventArguments("Failed to load file", 0)); MessageBox.Show("Couldn't parse Lights chunk"); return; } StatusUpdated(new StatusUpdatedEventArguments("Loading meshes from file", 40)); await Task.Delay(0).ConfigureAwait(false); MeshesChunk = new MeshesChunk(this); byte[] meshesHeader = reader.ReadBytes(6); if (!Utility.ByteArrayCompare(meshesHeader, MeshesChunk.ChunkIdTemplate)) { StatusUpdated(new StatusUpdatedEventArguments("Failed to load file", 0)); MessageBox.Show("Expected MESHES chunk header, got " + Encoding.ASCII.GetString(meshesHeader)); return; } MeshesChunk.Size = reader.ReadInt32(); MeshesChunk.MeshesNum = reader.ReadInt16(); success = await MeshesChunk.ReadChunk(reader); if (!success) { StatusUpdated(new StatusUpdatedEventArguments("Failed to load file", 0)); MessageBox.Show("Couldn't parse Meshes chunk"); return; } MeshesChunk.SeparateSubMeshesEdges(); MeshesChunk.SeparateUVVertices(); MeshesChunk.ClearUnusedVertices(); StatusUpdated(new StatusUpdatedEventArguments("Loading userdata from file", 80)); await Task.Delay(0).ConfigureAwait(false); UserDataChunk = new UserDataChunk(this); byte[] userDataHeader = reader.ReadBytes(4); if (!Utility.ByteArrayCompare(userDataHeader, UserDataChunk.ChunkIdTemplate)) { StatusUpdated(new StatusUpdatedEventArguments("Failed to load file", 0)); MessageBox.Show("Expected USER chunk header, got " + Encoding.ASCII.GetString(userDataHeader)); return; } UserDataChunk.Size = reader.ReadInt32(); UserDataChunk.UserData = reader.ReadBytes(UserDataChunk.Size); StatusUpdated(new StatusUpdatedEventArguments("Finished loading", 100)); await Task.Delay(0).ConfigureAwait(false); reader.Close(); } }
// public void LoadP3DAssimp(Scene scene) // { // Version = 0x02; // Size = new Extent(); // // TextureChunk = new TextureChunk(this); // foreach (Material mat in scene.Materials) // { // if (!TextureChunk.IsTextureInList(mat.TextureDiffuse.FilePath.ToLower())) // { // TextureChunk.TextureNames.Add(new TextureName(TextureChunk,mat.TextureDiffuse.FilePath.ToLower())); // } // } // TextureChunk.CalculateSizeFromTexturesList(); // TextureChunk.CalculateTexNum(); // // LightsChunk = new LightsChunk(this); // foreach (Assimp.Light light in scene.Lights) // { // string name = light.Name; // float x = light.Position.X; // float y = light.Position.Y; // float z = light.Position.Z; // float radius = 1; //ASSIMP doesn't save point light radius // int color = LightsChunk.ColorFromRGB(Convert.ToInt32(light.ColorDiffuse.R*255), Convert.ToInt32(light.ColorDiffuse.G * 255), Convert.ToInt32(light.ColorDiffuse.B * 255)); // bool corona = false; // bool lensFlare = false; // bool lightUpEnv = true; // LightsChunk.Lights.Add(new DataTypes.Light(LightsChunk, name, x, y, z, radius, color, corona, lensFlare, lightUpEnv)); // } // LightsChunk.CalculateSizeFromLightsList(); // LightsChunk.CalculateLightsNum(); // // MeshesChunk = new MeshesChunk(this); // MeshesChunk.MeshesNum = Convert.ToInt16(scene.MeshCount); // MeshesChunk.Size = 0; // //MessageBox.Show(scene.RootNode.Name); // foreach (Assimp.Mesh mesh in scene.Meshes) // { // //MessageBox.Show(); // } // } public void Load3DS(Lib3dsFile scene) { Version = 0x02; Size = new Extent(); TextureChunk = new TextureChunk(this); foreach (Lib3dsMaterial mat in scene.materials) { if (mat.texture1_map.name.ToLower().Equals(String.Empty)) { continue; } if (!TextureChunk.IsTextureInList(mat.texture1_map.name.ToLower())) { TextureChunk.TextureNames.Add(new TextureName(TextureChunk, mat.texture1_map.name.ToLower())); } } if (TextureChunk.TextureNames.Count == 0) { TextureChunk.TextureNames.Add(new TextureName(TextureChunk, "colwhite.tga")); } TextureChunk.CalculateSizeFromTexturesList(); TextureChunk.CalculateTexNum(); LightsChunk = new LightsChunk(this); foreach (Lib3dsLight light in scene.lights) { string name = light.name; float x = light.position[0]; float y = light.position[2]; float z = light.position[1]; float radius = light.inner_range; int color = LightsChunk.ColorFromRGB(Convert.ToInt32(light.color[0] * 255), Convert.ToInt32(light.color[1] * 255), Convert.ToInt32(light.color[2] * 255)); bool corona = false; bool lensFlare = false; bool lightUpEnv = true; LightsChunk.Lights.Add(new DataTypes.Light(LightsChunk, name, x, y, z, radius, color, corona, lensFlare, lightUpEnv)); } LightsChunk.CalculateSizeFromLightsList(); LightsChunk.CalculateLightsNum(); MeshesChunk = new MeshesChunk(this); MeshesChunk.MeshesNum = Convert.ToInt16(scene.meshes.Count); MeshesChunk.Size = 0; //MessageBox.Show(scene.RootNode.Name); foreach (Lib3dsMesh mesh in scene.meshes) { Mesh newMesh = new Mesh(MeshesChunk); newMesh.Parse3DSMesh(scene, mesh); newMesh.SortPolygonsAndGenerateTextureInfo(); newMesh.SeparateHardEdges(); newMesh.SeparateUVVertices(); newMesh.CalculateExtent(); MeshesChunk.Meshes.Add(newMesh); } //MeshesChunk.SeparateSubMeshesEdges(); MeshesChunk.ClearUnusedVertices(); MeshesChunk.CheckFlagsValidity(); MeshesChunk.CalculateMeshChunkSize(); P3DVertex origin = MeshesChunk.CalculateMeshesLocalPos(); MeshesChunk.MoveMeshesToOrigin(); LightsChunk.CalculateLightsPostionRelativeToOrigin(origin); Size.CalculateExtentFromMeshes(MeshesChunk.Meshes); UserDataChunk = new UserDataChunk(this); UserDataChunk.Size = 4; UserDataChunk.UserData = new byte[] { 0, 0, 0, 0 }; }
public TextureName(TextureChunk parent, string name) { Parent = parent; Name = name; Application.Current.Dispatcher.BeginInvoke((Action)(() => addTreeItem())); }