summaryrefslogtreecommitdiff
path: root/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h')
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h
new file mode 100644
index 0000000000..861056806d
--- /dev/null
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h
@@ -0,0 +1,165 @@
+/*
+bParse
+Copyright (c) 2006-2009 Charlie C & Erwin Coumans http://gamekit.googlecode.com
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef __BFILE_H__
+#define __BFILE_H__
+
+#include "b3Common.h"
+#include "b3Chunk.h"
+#include <stdio.h>
+
+namespace bParse {
+
+ // ----------------------------------------------------- //
+ enum bFileFlags
+ {
+ FD_INVALID =0,
+ FD_OK =1,
+ FD_VOID_IS_8 =2,
+ FD_ENDIAN_SWAP =4,
+ FD_FILE_64 =8,
+ FD_BITS_VARIES =16,
+ FD_VERSION_VARIES = 32,
+ FD_DOUBLE_PRECISION =64,
+ FD_BROKEN_DNA = 128
+ };
+
+ enum bFileVerboseMode
+ {
+ FD_VERBOSE_EXPORT_XML = 1,
+ FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS = 2,
+ FD_VERBOSE_DUMP_CHUNKS = 4,
+ FD_VERBOSE_DUMP_FILE_INFO=8,
+ };
+ // ----------------------------------------------------- //
+ class bFile
+ {
+ protected:
+
+ char m_headerString[7];
+
+ bool mOwnsBuffer;
+ char* mFileBuffer;
+ int mFileLen;
+ int mVersion;
+
+
+ bPtrMap mLibPointers;
+
+ int mDataStart;
+ bDNA* mFileDNA;
+ bDNA* mMemoryDNA;
+
+ b3AlignedObjectArray<char*> m_pointerFixupArray;
+ b3AlignedObjectArray<char*> m_pointerPtrFixupArray;
+
+ b3AlignedObjectArray<bChunkInd> m_chunks;
+ b3HashMap<b3HashPtr, bChunkInd> m_chunkPtrPtrMap;
+
+ //
+
+ bPtrMap mDataPointers;
+
+
+ int mFlags;
+
+ // ////////////////////////////////////////////////////////////////////////////
+
+ // buffer offset util
+ int getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags);
+ void safeSwapPtr(char *dst, const char *src);
+
+ virtual void parseHeader();
+
+ virtual void parseData() = 0;
+
+ void resolvePointersMismatch();
+ void resolvePointersChunk(const bChunkInd& dataChunk, int verboseMode);
+
+ int resolvePointersStructRecursive(char *strcPtr, int old_dna, int verboseMode, int recursion);
+ //void swapPtr(char *dst, char *src);
+
+ void parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers);
+ void getMatchingFileDNA(short* old, const char* lookupName, const char* lookupType, char *strcData, char *data, bool fixupPointers);
+ char* getFileElement(short *firstStruct, char *lookupName, char *lookupType, char *data, short **foundPos);
+
+
+ void swap(char *head, class bChunkInd& ch, bool ignoreEndianFlag);
+ void swapData(char *data, short type, int arraySize, bool ignoreEndianFlag);
+ void swapStruct(int dna_nr, char *data, bool ignoreEndianFlag);
+ void swapLen(char *dataPtr);
+ void swapDNA(char* ptr);
+
+
+ char* readStruct(char *head, class bChunkInd& chunk);
+ char *getAsString(int code);
+
+ void parseInternal(int verboseMode, char* memDna,int memDnaLength);
+
+ public:
+ bFile(const char *filename, const char headerString[7]);
+
+ //todo: make memoryBuffer const char
+ //bFile( const char *memoryBuffer, int len);
+ bFile( char *memoryBuffer, int len, const char headerString[7]);
+ virtual ~bFile();
+
+ bDNA* getFileDNA()
+ {
+ return mFileDNA;
+ }
+
+ virtual void addDataBlock(char* dataBlock) = 0;
+
+ int getFlags() const
+ {
+ return mFlags;
+ }
+
+ bPtrMap& getLibPointers()
+ {
+ return mLibPointers;
+ }
+
+ void* findLibPointer(void *ptr);
+
+ bool ok();
+
+ virtual void parse(int verboseMode) = 0;
+
+ virtual int write(const char* fileName, bool fixupPointers=false) = 0;
+
+ virtual void writeChunks(FILE* fp, bool fixupPointers );
+
+ virtual void writeDNA(FILE* fp) = 0;
+
+ void updateOldPointers();
+ void resolvePointers(int verboseMode);
+
+ void dumpChunks(bDNA* dna);
+
+ int getVersion() const
+ {
+ return mVersion;
+ }
+ //pre-swap the endianness, so that data loaded on a target with different endianness doesn't need to be swapped
+ void preSwap();
+ void writeFile(const char* fileName);
+
+ };
+}
+
+
+#endif//__BFILE_H__