00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef PX_PHYSICS_METADATA_H
00032 #define PX_PHYSICS_METADATA_H
00033
00037 #include "foundation/Px.h"
00038 #include "foundation/PxIO.h"
00039 #include "PxMetaDataFlags.h"
00040
00041
00042 #if !PX_DOXYGEN
00043 namespace physx
00044 {
00045 #endif
00046
00052 struct PxMetaDataEntry
00053 {
00054 const char* type;
00055 const char* name;
00056 PxU32 offset;
00057 PxU32 size;
00058 PxU32 count;
00059 PxU32 offsetSize;
00060 PxU32 flags;
00061 PxU32 alignment;
00062 };
00063
00064 #define PX_STORE_METADATA(stream, metaData) stream.write(&metaData, sizeof(PxMetaDataEntry))
00065
00066 #define PX_SIZE_OF(Class, Member) sizeof((reinterpret_cast<Class*>(0))->Member)
00067
00071 #define PX_DEF_BIN_METADATA_ITEM(stream, Class, type, name, flags) \
00072 { \
00073 PxMetaDataEntry tmp = { #type, #name, PxU32(PX_OFFSET_OF_RT(Class, name)), PX_SIZE_OF(Class, name), \
00074 1, 0, flags, 0}; \
00075 PX_STORE_METADATA(stream, tmp); \
00076 }
00077
00082 #define PX_DEF_BIN_METADATA_ITEMS(stream, Class, type, name, flags, count) \
00083 { \
00084 PxMetaDataEntry tmp = { #type, #name, PxU32(PX_OFFSET_OF_RT(Class, name)), PX_SIZE_OF(Class, name), \
00085 count, 0, flags, 0}; \
00086 PX_STORE_METADATA(stream, tmp); \
00087 }
00088
00094 #define PX_DEF_BIN_METADATA_ITEMS_AUTO(stream, Class, type, name, flags) \
00095 { \
00096 PxMetaDataEntry tmp = { #type, #name, PxU32(PX_OFFSET_OF_RT(Class, name)), PX_SIZE_OF(Class, name), \
00097 sizeof((reinterpret_cast<Class*>(0))->name)/sizeof(type), 0, flags, 0}; \
00098 PX_STORE_METADATA(stream, tmp); \
00099 }
00100
00104 #define PX_DEF_BIN_METADATA_CLASS(stream, Class) \
00105 { \
00106 PxMetaDataEntry tmp = { #Class, 0, 0, sizeof(Class), 0, 0, PxMetaDataFlag::eCLASS, 0 }; \
00107 PX_STORE_METADATA(stream, tmp); \
00108 }
00109
00113 #define PX_DEF_BIN_METADATA_VCLASS(stream, Class) \
00114 { \
00115 PxMetaDataEntry tmp = { #Class, 0, 0, sizeof(Class), 0, 0, PxMetaDataFlag::eCLASS|PxMetaDataFlag::eVIRTUAL, 0}; \
00116 PX_STORE_METADATA(stream, tmp); \
00117 }
00118
00122 #define PX_DEF_BIN_METADATA_TYPEDEF(stream, newType, oldType) \
00123 { \
00124 PxMetaDataEntry tmp = { #newType, #oldType, 0, 0, 0, 0, PxMetaDataFlag::eTYPEDEF, 0 }; \
00125 PX_STORE_METADATA(stream, tmp); \
00126 }
00127
00131 #define PX_DEF_BIN_METADATA_BASE_CLASS(stream, Class, BaseClass) \
00132 { \
00133 Class* myClass = reinterpret_cast<Class*>(42); \
00134 BaseClass* s = static_cast<BaseClass*>(myClass); \
00135 const PxU32 offset = PxU32(size_t(s) - size_t(myClass)); \
00136 PxMetaDataEntry tmp = { #Class, #BaseClass, offset, sizeof(Class), 0, 0, PxMetaDataFlag::eCLASS, 0 }; \
00137 PX_STORE_METADATA(stream, tmp); \
00138 }
00139
00143 #define PX_DEF_BIN_METADATA_UNION(stream, Class, name) \
00144 { \
00145 PxMetaDataEntry tmp = { #Class, 0, PxU32(PX_OFFSET_OF_RT(Class, name)), PX_SIZE_OF(Class, name), \
00146 1, 0, PxMetaDataFlag::eUNION, 0 }; \
00147 PX_STORE_METADATA(stream, tmp); \
00148 }
00149
00153 #define PX_DEF_BIN_METADATA_UNION_TYPE(stream, Class, type, enumValue) \
00154 { \
00155 PxMetaDataEntry tmp = { #Class, #type, enumValue, 0, 0, 0, PxMetaDataFlag::eUNION, 0 }; \
00156 PX_STORE_METADATA(stream, tmp); \
00157 }
00158
00162 #define PX_DEF_BIN_METADATA_EXTRA_ITEM(stream, Class, type, control, align) \
00163 { \
00164 PxMetaDataEntry tmp = { #type, 0, PxU32(PX_OFFSET_OF_RT(Class, control)), sizeof(type), 0, PxU32(PX_SIZE_OF(Class, control)), \
00165 PxMetaDataFlag::eEXTRA_DATA|PxMetaDataFlag::eEXTRA_ITEM, align }; \
00166 PX_STORE_METADATA(stream, tmp); \
00167 }
00168
00172 #define PX_DEF_BIN_METADATA_EXTRA_ITEMS(stream, Class, type, control, count, flags, align) \
00173 { \
00174 PxMetaDataEntry tmp = { #type, 0, PxU32(PX_OFFSET_OF_RT(Class, control)), PxU32(PX_SIZE_OF(Class, control)), \
00175 PxU32(PX_OFFSET_OF_RT(Class, count)), PxU32(PX_SIZE_OF(Class, count)), \
00176 PxMetaDataFlag::eEXTRA_DATA|PxMetaDataFlag::eEXTRA_ITEMS|flags, align }; \
00177 PX_STORE_METADATA(stream, tmp); \
00178 }
00179
00185 #define PX_DEF_BIN_METADATA_EXTRA_ITEMS_MASKED_CONTROL(stream, Class, type, control, controlMask ,count, flags, align) \
00186 { \
00187 PxMetaDataEntry tmp = { #type, 0, PxU32(PX_OFFSET_OF_RT(Class, control)), PxU32(PX_SIZE_OF(Class, control)), \
00188 PxU32(PX_OFFSET_OF_RT(Class, count)), PxU32(PX_SIZE_OF(Class, count)), \
00189 PxMetaDataFlag::eCONTROL_MASK|PxMetaDataFlag::eEXTRA_DATA|PxMetaDataFlag::eEXTRA_ITEMS|flags|(controlMask & PxMetaDataFlag::eCONTROL_MASK_RANGE) << 16, \
00190 align}; \
00191 PX_STORE_METADATA(stream, tmp); \
00192 }
00193
00198 #define PX_DEF_BIN_METADATA_EXTRA_ARRAY(stream, Class, type, dyn_count, align, flags) \
00199 { \
00200 PxMetaDataEntry tmp = { #type, 0, PxU32(PX_OFFSET_OF_RT(Class, dyn_count)), PX_SIZE_OF(Class, dyn_count), align, 0, \
00201 PxMetaDataFlag::eEXTRA_DATA|flags, align }; \
00202 PX_STORE_METADATA(stream, tmp); \
00203 }
00204
00208 #define PX_DEF_BIN_METADATA_EXTRA_NAME(stream, Class, control, align) \
00209 { \
00210 PxMetaDataEntry tmp = { "char", "string", 0, 0, 0, 0, PxMetaDataFlag::eEXTRA_DATA|PxMetaDataFlag::eEXTRA_NAME, align }; \
00211 PX_STORE_METADATA(stream, tmp); \
00212 }
00213
00217 #define PX_DEF_BIN_METADATA_EXTRA_ALIGN(stream, Class, align) \
00218 { \
00219 PxMetaDataEntry tmp = { "PxU8", "Alignment", 0, 0, 0, 0, PxMetaDataFlag::eEXTRA_DATA|PxMetaDataFlag::eALIGNMENT, align}; \
00220 PX_STORE_METADATA(stream, tmp); \
00221 }
00222
00223 #if !PX_DOXYGEN
00224 }
00225 #endif
00226
00228 #endif