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 "COLLADASaxFWLSceneLoader.h" 13 #include "COLLADASaxFWLLoader.h" 14 15 #include "COLLADAFWIWriter.h" 16 #include "COLLADAFWVisualScene.h" 17 #include "COLLADASaxFWLFileLoader.h" 18 19 20 namespace COLLADASaxFWL 21 { 22 23 //------------------------------ SceneLoader(IFilePartLoader * callingFilePartLoader)24 SceneLoader::SceneLoader ( IFilePartLoader* callingFilePartLoader ) 25 : FilePartLoader(callingFilePartLoader) 26 , mCurrentScene ( new COLLADAFW::Scene (createUniqueId(COLLADAFW::Scene::ID())) ) 27 , mCurrentInstanceKinematicsScene(0) 28 , mCurrentBindJointAxis(0) 29 , mCurrentCharacterData() 30 { 31 } 32 33 //------------------------------ ~SceneLoader()34 SceneLoader::~SceneLoader () 35 { 36 } 37 38 //------------------------------ getUniqueId()39 const COLLADAFW::UniqueId& SceneLoader::getUniqueId () 40 { 41 if ( mCurrentScene ) 42 return mCurrentScene->getUniqueId (); 43 return COLLADAFW::UniqueId::INVALID; 44 } 45 46 //------------------------------ begin__instance_visual_scene(const instance_visual_scene__AttributeData & attributeData)47 bool SceneLoader::begin__instance_visual_scene ( const instance_visual_scene__AttributeData& attributeData ) 48 { 49 COLLADAFW::UniqueId visualSceneUniqueId = createUniqueIdFromUrl ( attributeData.url, COLLADAFW::VisualScene::ID() ); 50 COLLADAFW::UniqueId instanceVisualSceneUniqueId = createUniqueId ( COLLADAFW::InstanceVisualScene::ID() ); 51 mCurrentScene->setInstanceVisualScene ( FW_NEW COLLADAFW::InstanceVisualScene(instanceVisualSceneUniqueId, visualSceneUniqueId) ); 52 53 return true; 54 } 55 56 //------------------------------ end__instance_visual_scene()57 bool SceneLoader::end__instance_visual_scene () 58 { 59 return true; 60 } 61 62 //------------------------------ end__scene()63 bool SceneLoader::end__scene() 64 { 65 bool success = true; 66 if ( (getObjectFlags() & Loader::SCENE_FLAG) != 0 ) 67 { 68 success = writer()->writeScene ( mCurrentScene ); 69 } 70 delete mCurrentScene; 71 finish(); 72 return success; 73 } 74 75 //------------------------------ begin__instance_kinematics_scene(const instance_kinematics_scene__AttributeData & attributeData)76 bool SceneLoader::begin__instance_kinematics_scene( const instance_kinematics_scene__AttributeData& attributeData ) 77 { 78 mCurrentInstanceKinematicsScene = new KinematicsInstanceKinematicsScene(); 79 const COLLADABU::URI& fileUri = getFileLoader()->getFileUri(); 80 COLLADABU::URI url(fileUri, attributeData.url.getURIString()); 81 mCurrentInstanceKinematicsScene->setUrl( url); 82 return true; 83 } 84 85 //------------------------------ end__instance_kinematics_scene()86 bool SceneLoader::end__instance_kinematics_scene() 87 { 88 getFileLoader()->addInstanceKinematicsScene( mCurrentInstanceKinematicsScene ); 89 mCurrentInstanceKinematicsScene = 0; 90 if ( !mBoundNodes.empty() ) 91 { 92 size_t boundNodesCount = mBoundNodes.size(); 93 COLLADAFW::InstanceKinematicsScene* instanceKinematicsScene = FW_NEW COLLADAFW::InstanceKinematicsScene(createUniqueId(COLLADAFW::InstanceKinematicsScene::ID()), COLLADAFW::UniqueId::INVALID); 94 mCurrentScene->setInstanceKinematicsScene( instanceKinematicsScene ); 95 COLLADAFW::UniqueIdArray& boundNodes = instanceKinematicsScene->getBoundNodes(); 96 boundNodes.allocMemory(boundNodesCount); 97 boundNodes.setCount(boundNodesCount); 98 UniqueIdSet::const_iterator it = mBoundNodes.begin(); 99 for ( size_t i = 0; it != mBoundNodes.end(); ++it, ++i ) 100 { 101 boundNodes[i] = *it; 102 } 103 } 104 105 return true; 106 } 107 108 //------------------------------ end__bind_kinematics_model()109 bool SceneLoader::end__bind_kinematics_model() 110 { 111 mCurrentCharacterData.clear(); 112 return true; 113 } 114 115 //------------------------------ begin__bind_joint_axis(const bind_joint_axis__AttributeData & attributeData)116 bool SceneLoader::begin__bind_joint_axis( const bind_joint_axis__AttributeData& attributeData ) 117 { 118 119 mCurrentBindJointAxis = new KinematicsBindJointAxis(String(attributeData.target)); 120 121 const ParserChar* target = attributeData.target; 122 if ( target ) 123 { 124 //find first occurrence of a "/" in target 125 const ParserChar* p = target; 126 while ( (*p!=0) && (*p!='/') ) 127 { 128 ++p; 129 } 130 const COLLADAFW::UniqueId nodeUniqueId = getUniqueIdById(String(target, p-target).c_str()); 131 if ( nodeUniqueId.isValid() ) 132 { 133 mBoundNodes.insert(nodeUniqueId); 134 } 135 } 136 return true; 137 } 138 139 //------------------------------ end__bind_joint_axis()140 bool SceneLoader::end__bind_joint_axis() 141 { 142 mCurrentInstanceKinematicsScene->addBindJointAxis( mCurrentBindJointAxis ); 143 mCurrentBindJointAxis = 0; 144 return true; 145 } 146 147 //------------------------------ begin__axis____common_sidref_or_param_type()148 bool SceneLoader::begin__axis____common_sidref_or_param_type() 149 { 150 return true; 151 } 152 153 //------------------------------ end__axis____common_sidref_or_param_type()154 bool SceneLoader::end__axis____common_sidref_or_param_type() 155 { 156 mCurrentBindJointAxis->getAxis().setParamValue(mCurrentCharacterData); 157 mCurrentCharacterData.clear(); 158 return true; 159 } 160 161 //------------------------------ begin__value____common_float_or_param_type()162 bool SceneLoader::begin__value____common_float_or_param_type() 163 { 164 return true; 165 } 166 167 //------------------------------ end__value____common_float_or_param_type()168 bool SceneLoader::end__value____common_float_or_param_type() 169 { 170 mCurrentBindJointAxis->getValue().setParamValue(mCurrentCharacterData); 171 mCurrentCharacterData.clear(); 172 return true; 173 } 174 175 //------------------------------ begin__param____common_param_type()176 bool SceneLoader::begin__param____common_param_type() 177 { 178 return true; 179 } 180 181 //------------------------------ end__param____common_param_type()182 bool SceneLoader::end__param____common_param_type() 183 { 184 return true; 185 } 186 187 //------------------------------ data__param____common_param_type(const ParserChar * value,size_t length)188 bool SceneLoader::data__param____common_param_type( const ParserChar* value, size_t length ) 189 { 190 mCurrentCharacterData.append( value, length ); 191 return true; 192 } 193 194 } // namespace COLLADASaxFWL 195