2
Copyright (c) 2009 NetAllied Systems GmbH
4
This file is part of dae2ogre.
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
11
#include "DAE2OgreStableHeaders.h"
12
#include "DAE2OgreSceneGraphWriter.h"
18
//------------------------------
19
SceneGraphWriter::SceneGraphWriter( OgreWriter* ogreWriter, const COLLADAFW::VisualScene& visualScene, const OgreWriter::LibraryNodesList& libraryNodesList )
20
: BaseWriter( ogreWriter )
21
, mVisualScene(visualScene)
22
, mLibraryNodesList(libraryNodesList)
26
//------------------------------
27
SceneGraphWriter::~SceneGraphWriter()
31
//------------------------------
32
bool SceneGraphWriter::write( )
34
createUniqueIdNodeMap();
36
NodeInfo nodeInfo( COLLADABU::Math::Matrix4::IDENTITY );
37
mNodeInfoStack.push( nodeInfo );
39
writeNodes( mVisualScene.getRootNodes());
43
//------------------------------
44
bool SceneGraphWriter::writeNodes( const COLLADAFW::NodePointerArray& nodesToWriter )
46
for ( size_t i = 0, count = nodesToWriter.getCount(); i < count; ++i)
48
writeNode(nodesToWriter[i]);
53
//------------------------------
54
bool SceneGraphWriter::writeNode(const COLLADAFW::Node* nodeToWriter )
57
const NodeInfo& parentNodeInfo = mNodeInfoStack.top();
58
const COLLADABU::Math::Matrix4& parentWorldMatrix = parentNodeInfo.worldTransformation;
59
COLLADABU::Math::Matrix4 worldMatrix = parentWorldMatrix * nodeToWriter->getTransformationMatrix();
60
NodeInfo nodeInfo( worldMatrix );
61
mNodeInfoStack.push(nodeInfo);
63
writeNodes(nodeToWriter->getChildNodes());
65
storeInstanceGeometries( nodeToWriter->getInstanceGeometries(), worldMatrix);
67
writeInstanceNodes( nodeToWriter->getInstanceNodes() );
75
//------------------------------
76
void SceneGraphWriter::storeInstanceGeometries( const COLLADAFW::InstanceGeometryPointerArray& instanceGeometries,
77
const COLLADABU::Math::Matrix4& worldMatrix )
79
for ( size_t i = 0, count = instanceGeometries.getCount(); i < count; ++i)
81
COLLADAFW::InstanceGeometry* instanceGeometry = instanceGeometries[i];
82
OgreWriter::InstanceGeometryInfo instanceGeometryInfo( instanceGeometry, worldMatrix );
83
addGeometryUniqueIdInstanceGeometryInfoPair(instanceGeometry->getInstanciatedObjectId(), instanceGeometryInfo);
87
//------------------------------
88
void SceneGraphWriter::writeInstanceNodes( const COLLADAFW::InstanceNodePointerArray& instanceNodes)
90
for ( size_t i = 0, count = instanceNodes.getCount(); i < count; ++i)
92
const COLLADAFW::InstanceNode* instanceNode = instanceNodes[i];
93
const COLLADAFW::UniqueId& referencedNodeUniqueId = instanceNode->getInstanciatedObjectId();
94
UniqueIdNodeMap::const_iterator it = mUniqueIdNodeMap.find( referencedNodeUniqueId );
95
if ( it != mUniqueIdNodeMap.end() )
97
const COLLADAFW::Node* referencedNode = it->second;
98
writeNode( referencedNode );
103
//------------------------------
104
void SceneGraphWriter::createUniqueIdNodeMap( COLLADAFW::Node* node )
106
mUniqueIdNodeMap[node->getUniqueId()] = node;
107
createUniqueIdNodeMap( node->getChildNodes() );
110
//------------------------------
111
void SceneGraphWriter::createUniqueIdNodeMap( const COLLADAFW::NodePointerArray& nodes )
113
for ( size_t i = 0, cout = nodes.getCount(); i < cout; ++i)
115
COLLADAFW::Node* node = nodes[i];
116
createUniqueIdNodeMap( node );
120
//------------------------------
121
void SceneGraphWriter::createUniqueIdNodeMap()
123
createUniqueIdNodeMap( mVisualScene.getRootNodes() );
124
OgreWriter::LibraryNodesList::const_iterator it = mLibraryNodesList.begin();
125
for ( ; it != mLibraryNodesList.end(); ++it )
127
const COLLADAFW::LibraryNodes& libraryNodes = *it;
128
createUniqueIdNodeMap( libraryNodes.getNodes() );
132
} // namespace DAE2Ogre