public bool parseAnimation(AnimationChunk a, LuaObject data) { parseChunkHeader(a, data); a.duration = data.get <float>("duration"); a.skeletonName = data.get <string>("skeleton"); a.numBones = data.get <int>("numBones"); LuaObject events = data["events"]; for (int i = 0; i < events.count(); i++) { LuaObject e = events[i + 1]; AnimationEvent aniEvent = new AnimationEvent(); aniEvent.time = e.get <int>("time"); aniEvent.name = e.get <string>("name"); a.events.Add(aniEvent); } //create an animiation channel for each bone for (int i = 0; i < a.numBones; i++) { a.channels.Add(new AnimationChannel()); } LuaObject channels = data["channels"]; for (int i = 0; i < a.numBones; i++) { LuaObject channelData = channels[i + 1]; int idx = 1; while (idx < channelData.count()) { JointPose jp = new JointPose(); jp.time = (float)channelData[idx++]; jp.position = new Vector3(channelData[idx++], channelData[idx++], channelData[idx++]); jp.rotation = new Quaternion(channelData[idx++], channelData[idx++], channelData[idx++], channelData[idx++]); a.channels[i].poses.Add(jp); } } return(true); }
///<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 bool loadFile(string filename) { LuaState vm = new LuaState(); LuaExt.extendLua(vm); try { if (vm.doFile(filename) == false) { Warn.print("Unable to open BOB file {0}", filename); return(false); } LuaObject data = vm.findObject("BOB"); if (data == null) { Warn.print("Unable to find BOB data in file {0}", filename); return(false); } myVersion = data.get <UInt32>("version"); //read the registry LuaObject registry = data.get <LuaObject>("registry"); parseRegistry(registry); //read the chunks LuaObject chunks = data.get <LuaObject>("chunks"); for (int i = 1; i <= chunks.count(); i++) { LuaObject chunkData = chunks[i]; switch (chunkData.get <String>("type")) { case "model": ModelChunk model = new ModelChunk(); parseModel(model, chunkData); myChunks.Add(model); break; case "skeleton": SkeletonChunk skeleton = new SkeletonChunk(); parseSkeleton(skeleton, chunkData); myChunks.Add(skeleton); break; case "animation": AnimationChunk animation = new AnimationChunk(); parseAnimation(animation, chunkData); myChunks.Add(animation); break; case "texture": Warn.print("Skipping .BOB texture"); break; case "particle": Warn.print("Skipping .BOB particle system"); break; case "audio": Warn.print("Skipping .BOB audio"); break; default: Warn.print("Unknown type: {0}", chunkData.get <String>("type")); break; } } } catch (Exception ex) { throw new Exception("Error while loading BOB model from definition file ( " + filename + " ).", ex); } return(true); }