/* * public void DumpChunks(bDNA dna) * { * bFile_dumpChunks(_native, dna._native); * } */ public byte[] FindLibPointer(long ptr) { byte[] data; if (LibPointers.TryGetValue(ptr, out data)) { return(data); } return(null); }
protected override void ReadChunks() { bool brokenDna = (Flags & FileFlags.BrokenDna) != 0; _dataStart = SizeOfBlenderHeader; long chunkPtr = _dataStart; Stream stream = ChunkReader.BaseStream; stream.Position = chunkPtr; ChunkInd chunk = GetNextBlock(ChunkReader); while (chunk.Code != DnaID.Dna) { long chunkDataOffset = chunkPtr + ChunkUtils.GetChunkSize(Flags); if (!brokenDna || chunk.Code != DnaID.QuantizedBvh) { // One behind if (chunk.Code == DnaID.Sdna) { break; } byte[] chunkData; if (chunk.StructIndex >= 0) { _chunks.Add(chunk); chunkData = ReadChunkData(chunk, chunkDataOffset); switch (chunk.Code) { case DnaID.CollisionObject: CollisionObjects.Add(chunkData); break; case DnaID.Constraint: Constraints.Add(chunkData); break; case DnaID.DynamicsWorld: DynamicsWorldInfo.Add(chunkData); break; case DnaID.MultiBody: MultiBodies.Add(chunkData); break; case DnaID.SoftBody: case DnaID.TriangleInfoMap: throw new NotImplementedException(); case DnaID.QuantizedBvh: Bvhs.Add(chunkData); break; case DnaID.RigidBody: RigidBodies.Add(chunkData); break; case DnaID.Shape: CollisionShapes.Add(chunkData); break; } } else { #if DEBUG Console.WriteLine("unknown chunk " + chunk.Code); #endif chunkData = new byte[chunk.Length]; ChunkReader.Read(chunkData, 0, chunk.Length); } LibPointers.Add(chunk.OldPtr, chunkData); } else { #if DEBUG Console.WriteLine("skipping B3_QUANTIZED_BVH_CODE due to broken DNA"); #endif } chunkPtr = chunkDataOffset + chunk.Length; stream.Position = chunkPtr; chunk = GetNextBlock(ChunkReader); if (chunk.Length < 0) { break; } } }