123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- #ifndef INCLUDED_ASSBIN_CHUNKS_H
- #define INCLUDED_ASSBIN_CHUNKS_H
- #define ASSBIN_VERSION_MAJOR 1
- #define ASSBIN_VERSION_MINOR 0
- /**
- @page assfile .ASS File formats
- @section over Overview
- Assimp provides its own interchange format, which is intended to applications which need
- to serialize 3D-models and to reload them quickly. Assimp's file formats are designed to
- be read by Assimp itself. They encode additional information needed by Assimp to optimize
- its postprocessing pipeline. If you once apply specific steps to a scene, then save it
- and reread it from an ASS format using the same post processing settings, they won't
- be executed again.
- The format comes in two flavours: XML and binary - both of them hold a complete dump of
- the 'aiScene' data structure returned by the APIs. The focus for the binary format
- (<tt>.assbin</tt>) is fast loading. Optional deflate compression helps reduce file size. The XML
- flavour, <tt>.assxml</tt> or simply .xml, is just a plain-to-xml conversion of aiScene.
- ASSBIN is Assimp's binary interchange format. assimp_cmd (<tt><root>/tools/assimp_cmd</tt>) is able to
- write it and the core library provides a loader for it.
- @section assxml XML File format
- The format is pretty much self-explanatory due to its similarity to the in-memory aiScene structure.
- With few exceptions, C structures are wrapped in XML elements.
- The DTD for ASSXML can be found in <tt><root>/doc/AssXML_Scheme.xml</tt>. Or have look
- at the output files generated by assimp_cmd.
- @section assbin Binary file format
- The ASSBIN file format is composed of chunks to represent the hierarchical aiScene data structure.
- This makes the format extensible and allows backward-compatibility with future data structure
- versions. The <tt><root>/code/assbin_chunks.h</tt> header contains some magic constants
- for use by stand-alone ASSBIN loaders. Also, Assimp's own file writer can be found
- in <tt><root>/tools/assimp_cmd/WriteDump.cpp</tt> (yes, the 'b' is no typo ...).
- @verbatim
- -------------------------------------------------------------------------------
- 1. File structure:
- -------------------------------------------------------------------------------
- ----------------------
- | Header (512 bytes) |
- ----------------------
- | Variable chunks |
- ----------------------
- -------------------------------------------------------------------------------
- 2. Definitions:
- -------------------------------------------------------------------------------
- integer is four bytes wide, stored in little-endian byte order.
- short is two bytes wide, stored in little-endian byte order.
- byte is a single byte.
- string is an integer n followed by n UTF-8 characters, not terminated by zero
- float is an IEEE 754 single-precision floating-point value
- double is an IEEE 754 double-precision floating-point value
- t[n] is an array of n elements of type t
- -------------------------------------------------------------------------------
- 2. Header:
- -------------------------------------------------------------------------------
- byte[44] Magic identification string for ASSBIN files.
- 'ASSIMP.binary'
- integer Major version of the Assimp library which wrote the file
- integer Minor version of the Assimp library which wrote the file
- match these against ASSBIN_VERSION_MAJOR and ASSBIN_VERSION_MINOR
- integer SVN revision of the Assimp library (intended for our internal
- debugging - if you write Ass files from your own APPs, set this value to 0.
- integer Assimp compile flags
- short 0 for normal files, 1 for shortened dumps for regression tests
- these should have the file extension assbin.regress
- short 1 if the data after the header is compressed with the DEFLATE algorithm,
- 0 for uncompressed files.
- For compressed files, the first integer after the header is
- always the uncompressed data size
- byte[256] Zero-terminated source file name, UTF-8
- byte[128] Zero-terminated command line parameters passed to assimp_cmd, UTF-8
- byte[64] Reserved for future use
- ---> Total length: 512 bytes
- -------------------------------------------------------------------------------
- 3. Chunks:
- -------------------------------------------------------------------------------
- integer Magic chunk ID (ASSBIN_CHUNK_XXX)
- integer Chunk data length, in bytes
- (unknown chunks are possible, a good reader skips over them)
- (chunk-data-length does not include the first two integers)
- byte[n] chunk-data-length bytes of data, depending on the chunk type
- Chunks can contain nested chunks. Nested chunks are ALWAYS at the end of the chunk,
- their size is included in chunk-data-length.
- The chunk layout for all ASSIMP data structures is derived from their C declarations.
- The general 'rule' to get from Assimp headers to the serialized layout is:
- 1. POD members (i.e. aiMesh::mPrimitiveTypes, aiMesh::mNumVertices),
- in order of declaration.
- 2. Array-members (aiMesh::mFaces, aiMesh::mVertices, aiBone::mWeights),
- in order of declaration.
- 2. Object array members (i.e aiMesh::mBones, aiScene::mMeshes) are stored in
- subchunks directly following the data written in 1.) and 2.)
- Of course, there are some exceptions to this general order:
- [[aiScene]]
- - The root node holding the scene structure is naturally stored in
- a ASSBIN_CHUNK_AINODE subchunk following 1.) and 2.) (which is
- empty for aiScene).
- [[aiMesh]]
- - mTextureCoords and mNumUVComponents are serialized as follows:
- [number of used uv channels times]
- integer mNumUVComponents[n]
- float mTextureCoords[n][3]
- -> more than AI_MAX_TEXCOORD_CHANNELS can be stored. This allows Assimp
- builds with different settings for AI_MAX_TEXCOORD_CHANNELS to exchange
- data.
- -> the on-disk format always uses 3 floats to write UV coordinates.
- If mNumUVComponents[0] is 1, the corresponding mTextureCoords array
- consists of 3 floats.
- - The array member block of aiMesh is prefixed with an integer that specifies
- the kinds of vertex components actually present in the mesh. This is a
- bitwise combination of the ASSBIN_MESH_HAS_xxx constants.
- [[aiFace]]
- - mNumIndices is stored as short
- - mIndices are written as short, if aiMesh::mNumVertices<65536
- [[aiNode]]
- - mParent is omitted
- [[aiLight]]
- - mAttenuationXXX not written if aiLight::mType == aiLightSource_DIRECTIONAL
- - mAngleXXX not written if aiLight::mType != aiLightSource_SPOT
- [[aiMaterial]]
- - mNumAllocated is omitted, for obvious reasons :-)
- @endverbatim*/
- #define ASSBIN_HEADER_LENGTH 512
- // these are the magic chunk identifiers for the binary ASS file format
- #define ASSBIN_CHUNK_AICAMERA 0x1234
- #define ASSBIN_CHUNK_AILIGHT 0x1235
- #define ASSBIN_CHUNK_AITEXTURE 0x1236
- #define ASSBIN_CHUNK_AIMESH 0x1237
- #define ASSBIN_CHUNK_AINODEANIM 0x1238
- #define ASSBIN_CHUNK_AISCENE 0x1239
- #define ASSBIN_CHUNK_AIBONE 0x123a
- #define ASSBIN_CHUNK_AIANIMATION 0x123b
- #define ASSBIN_CHUNK_AINODE 0x123c
- #define ASSBIN_CHUNK_AIMATERIAL 0x123d
- #define ASSBIN_CHUNK_AIMATERIALPROPERTY 0x123e
- #define ASSBIN_MESH_HAS_POSITIONS 0x1
- #define ASSBIN_MESH_HAS_NORMALS 0x2
- #define ASSBIN_MESH_HAS_TANGENTS_AND_BITANGENTS 0x4
- #define ASSBIN_MESH_HAS_TEXCOORD_BASE 0x100
- #define ASSBIN_MESH_HAS_COLOR_BASE 0x10000
- #define ASSBIN_MESH_HAS_TEXCOORD(n) (ASSBIN_MESH_HAS_TEXCOORD_BASE << n)
- #define ASSBIN_MESH_HAS_COLOR(n) (ASSBIN_MESH_HAS_COLOR_BASE << n)
- #endif // INCLUDED_ASSBIN_CHUNKS_H
|