2
Copyright (c) 2010 yaoyansi<yaoyansi2@yahoo.com.cn>
4
This file is part of dae23ds_lib3ds.
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 "DAE23dsStableHeaders.h"
12
#include "DAE23dsSceneGraphHandler.h"
13
//#include "DAE23dsMeshBase.h"
18
//------------------------------
19
SceneGraphHandler::SceneGraphHandler( const COLLADAFW::VisualScene* visualScene )
20
: mVisualScene( visualScene )
24
//------------------------------
25
SceneGraphHandler::~SceneGraphHandler()
29
//------------------------------
30
bool SceneGraphHandler::handle()
32
NodeInfo nodeInfo( COLLADABU::Math::Matrix4::IDENTITY );
33
mNodeInfoStack.push( nodeInfo );
35
handleNodes( mVisualScene->getRootNodes());
40
//------------------------------
41
bool SceneGraphHandler::handleNodes( const COLLADAFW::NodePointerArray& nodesToWriter)
43
for ( size_t i = 0, count = nodesToWriter.getCount(); i < count; ++i)
45
handleNode(nodesToWriter[i]);
50
//------------------------------
51
bool SceneGraphHandler::handleNode(const COLLADAFW::Node* nodeToWriter)
53
const NodeInfo& parentNodeInfo = mNodeInfoStack.top();
54
const COLLADABU::Math::Matrix4& parentWorldMatrix = parentNodeInfo.worldTransformation;
55
COLLADABU::Math::Matrix4 worldMatrix = parentWorldMatrix * nodeToWriter->getTransformationMatrix();
56
NodeInfo nodeInfo( worldMatrix );
57
mNodeInfoStack.push(nodeInfo);
59
handleInstanceGeometries( nodeToWriter, worldMatrix );
60
handleInstanceLights( nodeToWriter, worldMatrix );
62
handleNodes(nodeToWriter->getChildNodes());
64
handleInstanceNodes( nodeToWriter->getInstanceNodes() );
70
//------------------------------
71
void SceneGraphHandler::handleInstanceGeometries( const COLLADAFW::Node* node, const COLLADABU::Math::Matrix4& matrix )
73
const COLLADAFW::InstanceGeometryPointerArray& instanceGeometries = node->getInstanceGeometries();
74
for ( size_t i = 0, count = instanceGeometries.getCount(); i < count; ++i)
76
COLLADAFW::InstanceGeometry* instanceGeometry = instanceGeometries[i];
78
Writer::InstanceGeometryInfo instanceGeometryInfo( instanceGeometry, matrix/*, getNextInstanceNumber(instanceGeometry) */);
80
const COLLADAFW::UniqueId& meshUniqueId = instanceGeometry->getInstanciatedObjectId();
82
// std::cout <<"----------------------------------------------"<<std::endl;
83
// std::cout <<"instanceGeometry(name="<<instanceGeometry->getName()
84
// <<",objid="<<instanceGeometry->getObjectId()
85
// <<",clsid="<<instanceGeometry->getClassId()
86
// <<",uid="<<instanceGeometry->getUniqueId().toAscii()
87
// <<",iobjid="<<instanceGeometry->getInstanciatedObjectId().toAscii()
89
// std::cout<<"meshdata(uid="<<meshdata.meshUniqueId.getClassId()<<","
90
// <<meshdata.meshUniqueId.getObjectId()<<","
91
// <<meshdata.meshUniqueId.toAscii()<<","
92
// <<meshdata.name<<","
95
const COLLADAFW::MaterialBindingArray & mba = instanceGeometry->getMaterialBindings();
96
for(size_t i=0; i<mba.getCount(); ++i)
98
std::cout <<"material id="<<mba[i].getMaterialId()<<","
99
<<"name="<<mba[i].getName()<<","
100
<<"ReferencedMat="<<mba[i].getReferencedMaterial().toAscii()
104
addInstanceGeometryInstanceGeometryInfoPair(instanceGeometry->getInstanciatedObjectId(), instanceGeometryInfo);
108
//------------------------------
109
void SceneGraphHandler::handleInstanceNodes( const COLLADAFW::InstanceNodePointerArray& instanceNodes)
111
std::cout <<"SceneGraphHandler::handleInstanceNodes(size="<<instanceNodes.getCount()<<")"<<std::endl;
113
for ( size_t i = 0, count = instanceNodes.getCount(); i < count; ++i)
115
const COLLADAFW::InstanceNode* instanceNode = instanceNodes[i];
116
const COLLADAFW::UniqueId& referencedNodeUniqueId = instanceNode->getInstanciatedObjectId();
118
std::cout <<"instance node(name="<<instanceNode->getName()
119
<<",uid="<<instanceNode->getUniqueId().toAscii()
120
<<",oid="<<instanceNode->getObjectId()
121
<<",iid="<<instanceNode->getInstanciatedObjectId().toAscii()
125
Writer::UniqueIdNodeMap::const_iterator it = Writer::getInstance()->getUniqueIdNodeMap().find( referencedNodeUniqueId );
126
if ( it != Writer::getInstance()->getUniqueIdNodeMap().end() )
128
const COLLADAFW::Node* referencedNode = it->second;
129
handleNode( referencedNode );
134
//------------------------------------
135
void SceneGraphHandler::handleInstanceLights( const COLLADAFW::Node* node, const COLLADABU::Math::Matrix4& matrix )
137
const COLLADAFW::InstanceLightPointerArray& instanceLights = node->getInstanceLights();
138
for ( size_t i = 0, count = instanceLights.getCount(); i < count; ++i)
140
COLLADAFW::InstanceLight* instanceLight = instanceLights[i];
142
const COLLADAFW::UniqueId& uid = instanceLight->getInstanciatedObjectId();
144
std::cout <<"----------------------------------------------"<<std::endl;
145
std::cout<<"light uid="<< uid.toAscii()<<std::endl;
147
std::map<COLLADAFW::UniqueId, const COLLADAFW::Light*>::const_iterator it
148
= Writer::getInstance()->lightMap.find(uid);
149
if(it==Writer::getInstance()->lightMap.end())//not found
153
const COLLADAFW::Light *light = it->second;
154
std::cout<<"light name="<< light->getName()<<std::endl;
155
std::cout<<"light type="<< light->getLightType()<<std::endl;
156
std::cout<<"light color="<< light->getColor().getRed()<<","<< light->getColor().getGreen()<<","<<light->getColor().getBlue()<<std::endl;
157
std::cout<<"light const attenuation="<< light->getConstantAttenuation().getValue()<<std::endl;
158
std::cout<<"light linear attenuation="<< light->getLinearAttenuation().getValue()<<std::endl;
159
std::cout<<"light quadratic attenuation="<< light->getQuadraticAttenuation().getValue()<<std::endl;
160
std::cout<<"light fallOffAngle="<< light->getFallOffAngle().getValue()<<std::endl;
161
std::cout<<"light fallOffExp="<< light->getFallOffExponent().getValue()<<std::endl;
163
COLLADABU::Math::Vector3 translation(matrix.getTrans());
164
//----------------------------------------------
165
Lib3dsLight *_3dslight = lib3ds_light_new(light->getName().c_str());
167
//_3dslight->object_flags=
168
_3dslight->spot_light = (light->getLightType()==COLLADAFW::Light::SPOT_LIGHT)?true:false;
169
//_3dslight->see_cone=
170
_3dslight->color[0]=light->getColor().getRed();
171
_3dslight->color[1]=light->getColor().getGreen();
172
_3dslight->color[2]=light->getColor().getBlue();
174
//_3dslight->position[0]=_3dslight->position[1]=_3dslight->position[2]=0.0;
175
_3dslight->position[0]=translation.x;
176
_3dslight->position[1]=translation.y;
177
_3dslight->position[2]=translation.z;
179
_3dslight->target[0]=_3dslight->target[1]=_3dslight->target[2]=0.0;
182
//_3dslight->outer_range
183
//_3dslight->inner_range
184
//_3dslight->multiplier
185
_3dslight->attenuation = light->getLinearAttenuation().getValue();
186
//_3dslight->rectangular_spot =
187
//_3dslight->shadowed
188
//_3dslight->shadow_bias
189
//_3dslight->shadow_filter
190
//_3dslight->shadow_size
191
_3dslight->spot_aspect = light->getFallOffAngle().getValue();
192
//_3dslight->use_projector
193
//_3dslight->projector
194
//_3dslight->spot_overshoot
195
//_3dslight->ray_shadows
196
//_3dslight->ray_bias
197
//_3dslight->hotspot=
198
_3dslight->falloff = light->getFallOffExponent().getValue();
201
//----------------------------------------------
202
if(light->getLightType()==COLLADAFW::Light::SPOT_LIGHT)
204
Lib3dsSpotlightNode* node = lib3ds_node_new_spotlight(_3dslight);
205
for(size_t i=0; i<4; ++i)
207
for(size_t j=0; j<4; ++j)
209
node->base.matrix[i][j] = matrix.getElement(i,j);
210
std::cout << node->base.matrix[i][j]<<", ";
212
std::cout <<std::endl;
214
lib3ds_file_insert_light(Writer::getInstance()->get3dsFile(), _3dslight, -1);
216
else if(light->getLightType()==COLLADAFW::Light::POINT_LIGHT)
218
Lib3dsOmnilightNode* node = lib3ds_node_new_omnilight(_3dslight);
219
for(size_t i=0; i<4; ++i)
221
for(size_t j=0; j<4; ++j)
223
node->base.matrix[i][j] = matrix.getElement(i,j);
224
std::cout << node->base.matrix[i][j]<<", ";
226
std::cout <<std::endl;
228
lib3ds_file_insert_light(Writer::getInstance()->get3dsFile(), _3dslight, -1);
230
lib3ds_file_insert_light(Writer::getInstance()->get3dsFile(), _3dslight, -1);
235
void SceneGraphHandler::addInstanceGeometryInstanceGeometryInfoPair( const COLLADAFW::UniqueId& geoId, const Writer::InstanceGeometryInfo& instanceGeoInfo )
237
if ( !Writer::getInstance()->getApplyTransformationsToMeshes() )
239
// if we apply transformations to meshes, we need each instance as often as it occurs
240
Writer::InstanceGeometryInfoSet& set = Writer::getInstance()->getInstanceGeometryInfoSet();
241
if ( set.count(instanceGeoInfo) != 0 )
247
set.insert( instanceGeoInfo );
251
Writer::GeometryUniqueIdInstanceGeometryInfoMap& map
252
= Writer::getInstance()->getGeometryUniqueIdInstanceGeometryInfoMap();
253
map.insert(std::make_pair(geoId, instanceGeoInfo));
256
} // namespace DAE23ds