1 /* 2 Copyright (c) 2008-2009 NetAllied Systems GmbH 3 4 This file is part of COLLADASaxFrameworkLoader. 5 6 Licensed under the MIT Open Source License, 7 for details please see LICENSE file or the website 8 http://www.opensource.org/licenses/mit-license.php 9 */ 10 11 #include "COLLADASaxFWLStableHeaders.h" 12 #include "COLLADASaxFWLVersionParser.h" 13 #include "COLLADASaxFWLFileLoader.h" 14 #include "COLLADASaxFWLRootParser14.h" 15 #include "COLLADASaxFWLRootParser15.h" 16 17 #include "GeneratedSaxParserUtils.h" 18 19 namespace COLLADASaxFWL 20 { 21 const StringHash HASH_NAMESPACE_COLLADA_14 = 221035537; 22 const StringHash HASH_NAMESPACE_COLLADA_15 = 234671633; 23 const StringHash HASH_ELEMENT_COLLADA = 138479041; 24 const StringHash HASH_ATTRIBUTE_XMLNS = 8340307; 25 26 size_t XMLPARSER_BUFFERSIZE = 64*1024; 27 28 enum LibraryFlags 29 { 30 COLLADA_NO_FLAGS = 0, 31 COLLADA_ASSET = 1<< 0, 32 COLLADA_LIBRARY_ANIMATION_CLIPS = 1<< 1, 33 COLLADA_LIBRARY_ANIMATIONS = 1<< 2, 34 COLLADA_LIBRARY_ARTICULATED_SYSTEMS = 1<< 3, 35 COLLADA_LIBRARY_CAMERAS = 1<< 4, 36 COLLADA_LIBRARY_CONTROLLERS = 1<< 5, 37 COLLADA_LIBRARY_EFFECTS = 1<< 6, 38 COLLADA_LIBRARY_FORCE_FIELDS = 1<< 7, 39 COLLADA_LIBRARY_FORMULAS = 1<< 8, 40 COLLADA_LIBRARY_GEOMETRIES = 1<< 9, 41 COLLADA_LIBRARY_IMAGES = 1<<10, 42 COLLADA_LIBRARY_JOINTS = 1<<11, 43 COLLADA_LIBRARY_KINEMATICS_MODELS = 1<<12, 44 COLLADA_LIBRARY_KINEMATICS_SCENES = 1<<13, 45 COLLADA_LIBRARY_LIGHTS = 1<<14, 46 COLLADA_LIBRARY_MATERIALS = 1<<15, 47 COLLADA_LIBRARY_NODES = 1<<16, 48 COLLADA_LIBRARY_PHYSICS_MATERIALS = 1<<17, 49 COLLADA_LIBRARY_PHYSICS_MODELS = 1<<18, 50 COLLADA_LIBRARY_PHYSICS_SCENES = 1<<19, 51 COLLADA_LIBRARY_VISUAL_SCENES = 1<<20, 52 COLLADA_SCENE = 1<<21 53 }; 54 55 struct LibraryFlagsFunctionMapPair14 56 { 57 LibraryFlags flag; 58 const COLLADASaxFWL14::ColladaParserAutoGen14Private::ElementFunctionMap& functionMap; 59 }; 60 61 struct LibraryFlagsFunctionMapPair15 62 { 63 LibraryFlags flag; 64 const COLLADASaxFWL15::ColladaParserAutoGen15Private::ElementFunctionMap& functionMap; 65 }; 66 67 68 // COLLADA 1.4 69 LibraryFlagsFunctionMapPair14 COLLADA_ASSET_PAIR_14 = {COLLADA_ASSET, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__asset__allChildren() }; 70 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_ANIMATION_CLIPS_PAIR_14 = {COLLADA_LIBRARY_ANIMATION_CLIPS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_animation_clips__allChildren() }; 71 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_ANIMATIONS_PAIR_14 = {COLLADA_LIBRARY_ANIMATIONS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_animations__allChildren() }; 72 // LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_ARTICULATED_SYSTEMS_PAIR_14 = {COLLADA_LIBRARY_ARTICULATED_SYSTEMS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_articulated_systems__allChildren() }; 73 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_CAMERAS_PAIR_14 = {COLLADA_LIBRARY_CAMERAS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_cameras__allChildren() }; 74 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_CONTROLLERS_PAIR_14 = {COLLADA_LIBRARY_CONTROLLERS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_controllers__allChildren() }; 75 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_EFFECTS_PAIR_14 = {COLLADA_LIBRARY_EFFECTS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_effects__allChildren() }; 76 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_FORCE_FIELDS_PAIR_14 = {COLLADA_LIBRARY_FORCE_FIELDS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_force_fields__allChildren() }; 77 // LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_FORMULAS_PAIR_14 = {COLLADA_LIBRARY_FORMULAS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_formulas__allChildren() }; 78 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_GEOMETRIES_PAIR_14 = {COLLADA_LIBRARY_GEOMETRIES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_geometries__allChildren() }; 79 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_IMAGES_PAIR_14 = {COLLADA_LIBRARY_IMAGES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_images__allChildren() }; 80 // LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_JOINTS_PAIR_14 = {COLLADA_LIBRARY_JOINTS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_joints__allChildren() }; 81 // LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_KINEMATICS_MODELS_PAIR_14 = {COLLADA_LIBRARY_KINEMATICS_MODELS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_kinematics_models__allChildren() }; 82 // LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_KINEMATICS_SCENES_PAIR_14 = {COLLADA_LIBRARY_KINEMATICS_SCENES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_kinematics_scenes__allChildren() }; 83 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_LIGHTS_PAIR_14 = {COLLADA_LIBRARY_LIGHTS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_lights__allChildren() }; 84 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_MATERIALS_PAIR_14 = {COLLADA_LIBRARY_MATERIALS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_materials__allChildren() }; 85 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_NODES_PAIR_14 = {COLLADA_LIBRARY_NODES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_nodes__allChildren() }; 86 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_PHYSICS_MATERIALS_PAIR_14 = {COLLADA_LIBRARY_PHYSICS_MATERIALS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_physics_materials__allChildren() }; 87 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_PHYSICS_MODELS_PAIR_14 = {COLLADA_LIBRARY_PHYSICS_MODELS, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_physics_models__allChildren() }; 88 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_PHYSICS_SCENES_PAIR_14 = {COLLADA_LIBRARY_PHYSICS_SCENES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_physics_scenes__allChildren() }; 89 LibraryFlagsFunctionMapPair14 COLLADA_LIBRARY_VISUAL_SCENES_PAIR_14 = {COLLADA_LIBRARY_VISUAL_SCENES, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__library_visual_scenes__allChildren() }; 90 LibraryFlagsFunctionMapPair14 COLLADA_SCENE_PAIR_14 = {COLLADA_SCENE, COLLADASaxFWL14::FunctionMapFactory::createFunctionMap__scene__allChildren() }; 91 92 93 // COLLADA 1.5 94 LibraryFlagsFunctionMapPair15 COLLADA_ASSET_PAIR_15 = {COLLADA_ASSET, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__asset__allChildren() }; 95 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_ANIMATION_CLIPS_PAIR_15 = {COLLADA_LIBRARY_ANIMATION_CLIPS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_animation_clips__allChildren() }; 96 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_ANIMATIONS_PAIR_15 = {COLLADA_LIBRARY_ANIMATIONS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_animations__allChildren() }; 97 // LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_ARTICULATED_SYSTEMS_PAIR_15 = {COLLADA_LIBRARY_ARTICULATED_SYSTEMS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_articulated_systems__allChildren() }; 98 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_CAMERAS_PAIR_15 = {COLLADA_LIBRARY_CAMERAS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_cameras__allChildren() }; 99 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_CONTROLLERS_PAIR_15 = {COLLADA_LIBRARY_CONTROLLERS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_controllers__allChildren() }; 100 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_EFFECTS_PAIR_15 = {COLLADA_LIBRARY_EFFECTS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_effects__allChildren() }; 101 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_FORCE_FIELDS_PAIR_15 = {COLLADA_LIBRARY_FORCE_FIELDS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_force_fields__allChildren() }; 102 // LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_FORMULAS_PAIR_15 = {COLLADA_LIBRARY_FORMULAS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_formulas__allChildren() }; 103 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_GEOMETRIES_PAIR_15 = {COLLADA_LIBRARY_GEOMETRIES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_geometries__allChildren() }; 104 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_IMAGES_PAIR_15 = {COLLADA_LIBRARY_IMAGES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_images__allChildren() }; 105 // LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_JOINTS_PAIR_15 = {COLLADA_LIBRARY_JOINTS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_joints__allChildren() }; 106 // LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_KINEMATICS_MODELS_PAIR_15 = {COLLADA_LIBRARY_KINEMATICS_MODELS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_kinematics_models__allChildren() }; 107 // LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_KINEMATICS_SCENES_PAIR_15 = {COLLADA_LIBRARY_KINEMATICS_SCENES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_kinematics_scenes__allChildren() }; 108 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_LIGHTS_PAIR_15 = {COLLADA_LIBRARY_LIGHTS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_lights__allChildren() }; 109 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_MATERIALS_PAIR_15 = {COLLADA_LIBRARY_MATERIALS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_materials__allChildren() }; 110 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_NODES_PAIR_15 = {COLLADA_LIBRARY_NODES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_nodes__allChildren() }; 111 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_PHYSICS_MATERIALS_PAIR_15 = {COLLADA_LIBRARY_PHYSICS_MATERIALS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_physics_materials__allChildren() }; 112 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_PHYSICS_MODELS_PAIR_15 = {COLLADA_LIBRARY_PHYSICS_MODELS, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_physics_models__allChildren() }; 113 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_PHYSICS_SCENES_PAIR_15 = {COLLADA_LIBRARY_PHYSICS_SCENES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_physics_scenes__allChildren() }; 114 LibraryFlagsFunctionMapPair15 COLLADA_LIBRARY_VISUAL_SCENES_PAIR_15 = {COLLADA_LIBRARY_VISUAL_SCENES, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__library_visual_scenes__allChildren() }; 115 LibraryFlagsFunctionMapPair15 COLLADA_SCENE_PAIR_15 = {COLLADA_SCENE, COLLADASaxFWL15::FunctionMapFactory::createFunctionMap__scene__allChildren() }; 116 117 118 LibraryFlagsFunctionMapPair14 libraryFlagsFunctionMapMap14[] = {COLLADA_ASSET_PAIR_14, 119 COLLADA_LIBRARY_ANIMATION_CLIPS_PAIR_14, 120 COLLADA_LIBRARY_ANIMATIONS_PAIR_14, 121 COLLADA_LIBRARY_CAMERAS_PAIR_14, 122 COLLADA_LIBRARY_CONTROLLERS_PAIR_14, 123 COLLADA_LIBRARY_EFFECTS_PAIR_14, 124 COLLADA_LIBRARY_FORCE_FIELDS_PAIR_14, 125 COLLADA_LIBRARY_GEOMETRIES_PAIR_14, 126 COLLADA_LIBRARY_IMAGES_PAIR_14, 127 COLLADA_LIBRARY_LIGHTS_PAIR_14, 128 COLLADA_LIBRARY_MATERIALS_PAIR_14, 129 COLLADA_LIBRARY_NODES_PAIR_14, 130 COLLADA_LIBRARY_PHYSICS_MATERIALS_PAIR_14, 131 COLLADA_LIBRARY_PHYSICS_MODELS_PAIR_14, 132 COLLADA_LIBRARY_PHYSICS_SCENES_PAIR_14, 133 COLLADA_LIBRARY_VISUAL_SCENES_PAIR_14, 134 COLLADA_SCENE_PAIR_14}; 135 136 LibraryFlagsFunctionMapPair15 libraryFlagsFunctionMapMap15[] = {COLLADA_ASSET_PAIR_15, 137 COLLADA_LIBRARY_ANIMATION_CLIPS_PAIR_15, 138 COLLADA_LIBRARY_ANIMATIONS_PAIR_15, 139 COLLADA_LIBRARY_CAMERAS_PAIR_15, 140 COLLADA_LIBRARY_CONTROLLERS_PAIR_15, 141 COLLADA_LIBRARY_EFFECTS_PAIR_15, 142 COLLADA_LIBRARY_FORCE_FIELDS_PAIR_15, 143 COLLADA_LIBRARY_GEOMETRIES_PAIR_15, 144 COLLADA_LIBRARY_IMAGES_PAIR_15, 145 COLLADA_LIBRARY_LIGHTS_PAIR_15, 146 COLLADA_LIBRARY_MATERIALS_PAIR_15, 147 COLLADA_LIBRARY_NODES_PAIR_15, 148 COLLADA_LIBRARY_PHYSICS_MATERIALS_PAIR_15, 149 COLLADA_LIBRARY_PHYSICS_MODELS_PAIR_15, 150 COLLADA_LIBRARY_PHYSICS_SCENES_PAIR_15, 151 COLLADA_LIBRARY_VISUAL_SCENES_PAIR_15, 152 COLLADA_SCENE_PAIR_15}; 153 154 size_t libraryFlagsFunctionMapMapSize14 = sizeof(libraryFlagsFunctionMapMap14)/sizeof(LibraryFlagsFunctionMapPair14); 155 size_t libraryFlagsFunctionMapMapSize15 = sizeof(libraryFlagsFunctionMapMap15)/sizeof(LibraryFlagsFunctionMapPair15); 156 157 template<class Flags> setInFirstUnsetInSecond(int firstFlags,int secondFlags,Flags flag)158 bool setInFirstUnsetInSecond(int firstFlags, int secondFlags, Flags flag) 159 { 160 return ( (firstFlags & flag) != 0 ) && ( (secondFlags & flag) == 0 ); 161 } 162 163 //------------------------------ 164 template<class FlagsMapPair, class ElementFunctionMap> createFunctionMap(int flags,int & parsedFlags,ElementFunctionMap & functionMap,FlagsMapPair * flagsMapMap,size_t flagsMapMapSize)165 void createFunctionMap( int flags, int& parsedFlags, ElementFunctionMap& functionMap, FlagsMapPair* flagsMapMap, size_t flagsMapMapSize ) 166 { 167 // A combination of ObjectFlags, indicating which objects will have been parsed, after load() 168 // has been called. These will be contained for sure. 169 // We need this to ensure that objects that are store by the Loader ( visual scene, library nodes, 170 // effects, cameras, lights) are parsed only once. 171 int afterLoadParsedObjectFlags = parsedFlags | flags; 172 173 if ( (flags & Loader::ALL_OBJECTS_MASK ) != Loader::ALL_OBJECTS_MASK ) 174 { 175 // we need to set a customized function map, since we don't need all COLLADA libraries 176 //determine which COLLADA elements we need to parse to get all date needed to parse objects in mObjectFlags 177 int requiredFunctionMaps = 0; 178 179 if ( (flags & Loader::ASSET_FLAG) != 0 ) 180 { 181 requiredFunctionMaps|= COLLADA_ASSET; 182 } 183 184 if ( (flags & Loader::SCENE_FLAG) != 0 ) 185 { 186 requiredFunctionMaps|= COLLADA_SCENE; 187 } 188 189 if ( setInFirstUnsetInSecond(flags, parsedFlags, Loader::VISUAL_SCENES_FLAG) ) 190 { 191 requiredFunctionMaps|= COLLADA_LIBRARY_VISUAL_SCENES; 192 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS; 193 } 194 195 if ( setInFirstUnsetInSecond(flags, parsedFlags, Loader::LIBRARY_NODES_FLAG) ) 196 { 197 requiredFunctionMaps|= COLLADA_LIBRARY_NODES; 198 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS; 199 } 200 201 if ( (flags & Loader::GEOMETRY_FLAG) != 0 ) 202 { 203 requiredFunctionMaps|= COLLADA_LIBRARY_GEOMETRIES; 204 } 205 206 if ( (flags & Loader::MATERIAL_FLAG) != 0 ) 207 { 208 requiredFunctionMaps|= COLLADA_LIBRARY_MATERIALS; 209 } 210 211 if ( setInFirstUnsetInSecond(flags, parsedFlags, Loader::EFFECT_FLAG) ) 212 { 213 requiredFunctionMaps|= COLLADA_LIBRARY_EFFECTS; 214 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS; 215 } 216 217 if ( (flags & Loader::CAMERA_FLAG) != 0 ) 218 { 219 requiredFunctionMaps|= COLLADA_LIBRARY_CAMERAS; 220 //requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS; 221 } 222 223 if ( (flags & Loader::IMAGE_FLAG) != 0 ) 224 { 225 requiredFunctionMaps|= COLLADA_LIBRARY_IMAGES; 226 } 227 228 if ( (flags & Loader::LIGHT_FLAG) != 0 ) 229 { 230 requiredFunctionMaps|= COLLADA_LIBRARY_LIGHTS; 231 } 232 233 if ( (flags & Loader::ANIMATION_FLAG) != 0 ) 234 { 235 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS; 236 } 237 238 if ( (flags & Loader::ANIMATION_LIST_FLAG) != 0 ) 239 { 240 requiredFunctionMaps|= COLLADA_LIBRARY_ANIMATIONS; 241 242 requiredFunctionMaps|= COLLADA_LIBRARY_VISUAL_SCENES; 243 afterLoadParsedObjectFlags |= Loader::VISUAL_SCENES_FLAG; 244 245 requiredFunctionMaps|= COLLADA_LIBRARY_NODES; 246 afterLoadParsedObjectFlags |= Loader::LIBRARY_NODES_FLAG; 247 248 requiredFunctionMaps|= COLLADA_LIBRARY_EFFECTS; 249 afterLoadParsedObjectFlags |= Loader::EFFECT_FLAG; 250 251 //requiredFunctionMaps|= COLLADA_LIBRARY_CAMERAS; 252 //requiredFunctionMaps|= COLLADA_LIBRARY_LIGHTS; 253 } 254 255 if ( (flags & Loader::CONTROLLER_FLAG) != 0 ) 256 { 257 requiredFunctionMaps|= COLLADA_LIBRARY_CONTROLLERS; 258 259 requiredFunctionMaps|= COLLADA_LIBRARY_VISUAL_SCENES; 260 afterLoadParsedObjectFlags |= Loader::VISUAL_SCENES_FLAG; 261 262 requiredFunctionMaps|= COLLADA_LIBRARY_NODES; 263 afterLoadParsedObjectFlags |= Loader::LIBRARY_NODES_FLAG; 264 } 265 266 if ( (flags & Loader::SKIN_CONTROLLER_DATA_FLAG) != 0 ) 267 { 268 requiredFunctionMaps|= COLLADA_LIBRARY_CONTROLLERS; 269 } 270 271 272 // Fills function map 273 for ( size_t i = 0; i < flagsMapMapSize; ++i ) 274 { 275 const FlagsMapPair& libraryFlagsFunctionMapPair = flagsMapMap[i]; 276 if ( (requiredFunctionMaps & libraryFlagsFunctionMapPair.flag) != 0 ) 277 { 278 functionMap.insert(libraryFlagsFunctionMapPair.functionMap.begin(), libraryFlagsFunctionMapPair.functionMap.end()); 279 } 280 } 281 282 parsedFlags = afterLoadParsedObjectFlags; 283 } 284 } 285 286 //------------------------------ createFunctionMap14()287 void VersionParser::createFunctionMap14() 288 { 289 createFunctionMap<LibraryFlagsFunctionMapPair14, COLLADASaxFWL14::ColladaParserAutoGen14Private::ElementFunctionMap>( mFlags, mParsedFlags, mFunctionMap14, libraryFlagsFunctionMapMap14, libraryFlagsFunctionMapMapSize14 ); 290 } 291 //------------------------------ createFunctionMap15()292 void VersionParser::createFunctionMap15() 293 { 294 createFunctionMap<LibraryFlagsFunctionMapPair15, COLLADASaxFWL15::ColladaParserAutoGen15Private::ElementFunctionMap>( mFlags, mParsedFlags, mFunctionMap15, libraryFlagsFunctionMapMap15, libraryFlagsFunctionMapMapSize15 ); 295 } 296 297 //------------------------------ VersionParser(GeneratedSaxParser::IErrorHandler * errorHandler,FileLoader * fileLoader,int flags,int & parsedFlags)298 VersionParser::VersionParser(GeneratedSaxParser::IErrorHandler* errorHandler, 299 FileLoader* fileLoader, 300 int flags, 301 int& parsedFlags) 302 : GeneratedSaxParser::Parser( errorHandler ) 303 , mPrivateParser14( 0 ) 304 , mPrivateParser15( 0 ) 305 , mFileLoader( fileLoader ) 306 , mFlags( flags ) 307 , mParsedFlags( parsedFlags ) 308 { 309 310 } 311 312 //------------------------------ ~VersionParser()313 VersionParser::~VersionParser() 314 { 315 316 } 317 318 //------------------------------ createAndLaunchParser()319 bool VersionParser::createAndLaunchParser() 320 { 321 const COLLADABU::URI& fileURI = mFileLoader->getFileUri(); 322 String nativePath = fileURI.toNativePath(); 323 const char* fileName = nativePath.c_str(); 324 #if defined(GENERATEDSAXPARSER_XMLPARSER_LIBXML) 325 GeneratedSaxParser::LibxmlSaxParser versionSaxParser( this ); 326 #elif defined(GENERATEDSAXPARSER_XMLPARSER_EXPAT) 327 GeneratedSaxParser::ExpatSaxParser versionSaxParser( this, XMLPARSER_BUFFERSIZE ); 328 #endif 329 bool success = versionSaxParser.parseFile( fileName ); 330 331 // mFileLoader->postProcess(); 332 333 delete mPrivateParser14; 334 delete mPrivateParser15; 335 336 mFileLoader->setPrivateParser( (COLLADASaxFWL14::ColladaParserAutoGen14Private*)0 ); 337 mFileLoader->setPrivateParser( (COLLADASaxFWL15::ColladaParserAutoGen15Private*)0 ); 338 339 return success; 340 } 341 342 //------------------------------ createAndLaunchParser(const char * buffer,int length)343 bool VersionParser::createAndLaunchParser( const char* buffer, int length ) 344 { 345 const COLLADABU::URI& uri = mFileLoader->getFileUri(); 346 const char* uriString = uri.originalStr().c_str(); 347 // const char* uriString = uri.getURIString().c_str(); 348 #if defined(GENERATEDSAXPARSER_XMLPARSER_LIBXML) 349 GeneratedSaxParser::LibxmlSaxParser versionSaxParser( this ); 350 #elif defined(GENERATEDSAXPARSER_XMLPARSER_EXPAT) 351 GeneratedSaxParser::ExpatSaxParser versionSaxParser( this, XMLPARSER_BUFFERSIZE ); 352 #endif 353 bool success = versionSaxParser.parseBuffer( uriString, buffer, length ); 354 355 // mFileLoader->postProcess(); 356 357 delete mPrivateParser14; 358 delete mPrivateParser15; 359 360 mFileLoader->setPrivateParser( (COLLADASaxFWL14::ColladaParserAutoGen14Private*)0 ); 361 mFileLoader->setPrivateParser( (COLLADASaxFWL15::ColladaParserAutoGen15Private*)0 ); 362 363 return success; 364 } 365 366 //------------------------------ elementBegin(const ParserChar * elementName,const ParserAttributes & attributes)367 bool VersionParser::elementBegin( const ParserChar* elementName, const ParserAttributes& attributes ) 368 { 369 StringHashPair hashPair = GeneratedSaxParser::Utils::calculateStringHashWithNamespace( elementName ); 370 StringHash elementHash = hashPair.second; 371 372 if ( elementHash == HASH_ELEMENT_COLLADA ) 373 { 374 if ( attributes.attributes ) 375 { 376 const ParserChar** attributeArray = attributes.attributes; 377 while (true) 378 { 379 const ParserChar * attribute = *attributeArray; 380 if ( !attribute ) 381 break; 382 StringHashPair hashPair = GeneratedSaxParser::Utils::calculateStringHashWithNamespace(attribute); 383 attributeArray++; 384 if ( !attributeArray ) 385 return false; 386 const ParserChar* attributeValue = *attributeArray; 387 attributeArray++; 388 389 StringHash prefix = hashPair.first; 390 StringHash name = hashPair.second; 391 if ( (prefix == 0 && name == HASH_ATTRIBUTE_XMLNS) || prefix == HASH_ATTRIBUTE_XMLNS ) 392 { 393 StringHash attrVal = GeneratedSaxParser::Utils::calculateStringHash( attributeValue ); 394 if ( attrVal == HASH_NAMESPACE_COLLADA_14 ) 395 { 396 mFileLoader->setCOLLADAVersion(COLLADA_14); 397 return parse14( elementName, attributes ); 398 } 399 else if ( attrVal == HASH_NAMESPACE_COLLADA_15 ) 400 { 401 mFileLoader->setCOLLADAVersion(COLLADA_15); 402 return parse15( elementName, attributes ); 403 } 404 } 405 } 406 } 407 return false; 408 } 409 410 return true; 411 } 412 413 //------------------------------ elementEnd(const ParserChar * elementName)414 bool VersionParser::elementEnd( const ParserChar* elementName ) 415 { 416 return true; 417 } 418 419 //------------------------------ textData(const ParserChar * text,size_t textLength)420 bool VersionParser::textData( const ParserChar* text, size_t textLength ) 421 { 422 return true; 423 } 424 425 //------------------------------ parse14(const ParserChar * elementName,const ParserAttributes & attributes)426 bool VersionParser::parse14( const ParserChar* elementName, const ParserAttributes& attributes ) 427 { 428 createFunctionMap14(); 429 430 // note: rootParser is created with new because it is deleted in IFilePartLoader::~IFilePartLoader() 431 RootParser14* rootParser = new RootParser14( mFileLoader ); 432 mFileLoader->setParserImpl( rootParser ); 433 mPrivateParser14 = new COLLADASaxFWL14::ColladaParserAutoGen14Private( rootParser, (GeneratedSaxParser::IErrorHandler*)mFileLoader->getErrorHandler() ); 434 mFileLoader->setPrivateParser( mPrivateParser14 ); 435 436 //privateParser.setCallbackObject( &rootParser ); 437 mPrivateParser14->registerUnknownElementHandler( &mFileLoader->mExtraDataElementHandler ); 438 439 if ( !mFunctionMap14.empty() ) 440 { 441 mPrivateParser14->setElementFunctionMap( &mFunctionMap14 ); 442 } 443 444 getSaxParser()->setParser( mPrivateParser14 ); 445 446 return mPrivateParser14->elementBegin( elementName, attributes ); 447 } 448 //------------------------------ parse15(const ParserChar * elementName,const ParserAttributes & attributes)449 bool VersionParser::parse15( const ParserChar* elementName, const ParserAttributes& attributes ) 450 { 451 createFunctionMap15(); 452 453 // note: rootParser is created with new because it is deleted in IFilePartLoader::~IFilePartLoader() 454 RootParser15* rootParser = new RootParser15( mFileLoader ); 455 mFileLoader->setParserImpl( rootParser ); 456 mPrivateParser15 = new COLLADASaxFWL15::ColladaParserAutoGen15Private( rootParser, (GeneratedSaxParser::IErrorHandler*)mFileLoader->getErrorHandler() ); 457 mFileLoader->setPrivateParser( mPrivateParser15 ); 458 459 //privateParser.setCallbackObject( &rootParser ); 460 mPrivateParser15->registerUnknownElementHandler( &mFileLoader->mExtraDataElementHandler ); 461 462 if ( !mFunctionMap15.empty() ) 463 { 464 mPrivateParser15->setElementFunctionMap( &mFunctionMap15 ); 465 } 466 467 getSaxParser()->setParser( mPrivateParser15 ); 468 469 return mPrivateParser15->elementBegin( elementName, attributes ); 470 } 471 472 //------------------------------ getElementHash(size_t level) const473 COLLADASaxFWL14::StringHash VersionParser::getElementHash( size_t level /*= 0 */ ) const 474 { 475 if ( mPrivateParser14 ) 476 { 477 return mPrivateParser14->getElementHash( level ); 478 } 479 if ( mPrivateParser15 ) 480 { 481 return mPrivateParser15->getElementHash( level ); 482 } 483 return 0; 484 } 485 } 486