天天看点

ogre 不常用类记录之Serializer

一、Serializer

位置:OgreSerializer.h

主功能:读写文件

从它继承的类有:MeshSerializerImpl,SkeletonSerializer,GpuNamedConstantsSerializer。同时它又是继承自SerializerAlloc(一种内存管理模式,MaterialSerializer也继承自它)。

也就是ogre里涉及的文件,包括mesh、gpu program 、骨骼文件,都是通过它读的,除了材质文件(.material)。

说明:

里面采用了自己的方式,以免让别人读出来。

头,识别是哪种。

virtual void writeFileHeader(void);
 virtual void writeChunkHeader(uint16 id, size_t size);
 virtual void readFileHeader(DataStreamPtr& stream);
 virtual unsigned short readChunk(DataStreamPtr& stream);
           

具体一般格式的读写

void writeFloats(const float* const pfloat, size_t count);
        void writeFloats(const double* const pfloat, size_t count);
        void writeShorts(const uint16* const pShort, size_t count);
        void writeInts(const uint32* const pInt, size_t count); 
        void writeBools(const bool* const pLong, size_t count);
        void writeObject(const Vector3& vec);
        void writeObject(const Quaternion& q);

        void writeString(const String& string);
        void writeData(const void* const buf, size_t size, size_t count);


void readBools(DataStreamPtr& stream, bool* pDest, size_t count);
        void readFloats(DataStreamPtr& stream, float* pDest, size_t count);
        void readFloats(DataStreamPtr& stream, double* pDest, size_t count);
        void readShorts(DataStreamPtr& stream, uint16* pDest, size_t count);
        void readInts(DataStreamPtr& stream, uint32* pDest, size_t count);
        void readObject(DataStreamPtr& stream, Vector3& pDest);
        void readObject(DataStreamPtr& stream, Quaternion& pDest);

        String readString(DataStreamPtr& stream);
        String readString(DataStreamPtr& stream, size_t numChars);
           

内部特殊处理的函数

virtual void flipToLittleEndian(void* pData, size_t size, size_t count = );
 virtual void flipFromLittleEndian(void* pData, size_t size, size_t count = );
           

追到跟的特殊处理方式:

void Serializer::flipEndian(void * pData, size_t size)
    {
        char swapByte;
        for(unsigned int byteIndex = ; byteIndex < size/; byteIndex++)
        {
            swapByte = *(char *)((size_t)pData + byteIndex);
            *(char *)((size_t)pData + byteIndex) = *(char *)((size_t)pData + size - byteIndex - );
            *(char *)((size_t)pData + size - byteIndex - ) = swapByte;
        }
    }
           

其实这儿没必要深究啦,做插件的话会用这个类的函数就行。

继续阅读