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