示例#1
0
        /// <summary>
        /// Creates a CollisionMoppCode instance using data from the moppstream
        /// </summary>
        /// <param name="moppStream">A havok 6.5.0 moppcode block</param>
        /// <returns></returns>
        private static CollisionMoppCode SynthesizeMoppBlock(MemoryStream moppStream)
        {
            BinaryReader      binaryReader = new BinaryReader(moppStream);
            CollisionMoppCode resource     = new CollisionMoppCode()
            {
                Size          = 0,
                Count         = 0x80,
                Address       = 4,
                Offset        = new RealQuaternion(binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle(), binaryReader.ReadSingle()),
                DataSize      = binaryReader.ReadInt32(),
                DataBuildType = -101
            };

            resource.DataCapacityAndFlags = (uint)resource.DataSize;

            return(resource);
        }
示例#2
0
        /// <summary>
        /// GenerateForBlenderPhmoJson
        /// </summary>
        /// <param name="jsonString">String containing blender exported JSON using the jsonPhmoExporter plugin.</param>
        /// <returns>A memory stream with Havok 6.5.0 moppcode block</returns>
        public static MemoryStream GenerateForBlenderPhmoJson(string jsonString)
        {
            JsonToMopp   jtm        = new JsonToMopp();
            MemoryStream moppStream = jtm.CreateMopp(jsonString);

            moppStream.Position = 0;
            CollisionMoppCode resource = SynthesizeMoppBlock(moppStream);

            MemoryStream outStream = null;

        #if !DEBUG
            try
            {
        #endif
            var resourceWriter = new EndianWriter(new MemoryStream(), EndianFormat.LittleEndian);
            var dataContext    = new DataSerializationContext(null, resourceWriter);
            var block          = dataContext.CreateBlock();
            var info           = TagStructure.GetTagStructureInfo(resource.GetType(), CacheVersion.HaloOnline235640);

            new TagSerializer(CacheVersion.HaloOnline235640).Serialize(dataContext, resource);

            block.Stream.Position = 0;
            outStream             = block.Stream;
        #if !DEBUG
        }
        catch
        {
            return(null);
        }
        #endif

            outStream.Position = 48;      //position of Data member. Data will be inlined
            moppStream.CopyTo(outStream); //remainder of moppStream is mopp program
            outStream.Position = 0;
            return(outStream);            //this is the one with serialized data in it
        }