framework2
264 строки · 7.8 Кб
1//
2// ofxFBXNode.cpp
3// ofxFBX-Example-Importer
4//
5// Created by Nick Hardeman on 10/31/13.
6//
7//
8
9#include "ofxFBXNode.h"
10
11//----------------------------------------
12ofxFBXNode::ofxFBXNode() {
13// parent = NULL;
14// globalParent = NULL;
15// origScale = glm::vec3(1,1,1);
16}
17
18//----------------------------------------
19ofxFBXNode::~ofxFBXNode() {
20if( getParent() != NULL ) {
21clearParent();
22}
23if( mParentNode ) {
24mParentNode.reset();
25}
26clearChildren();
27}
28
29//----------------------------------------
30ofxFBXSource::Node::NodeType ofxFBXNode::getType() {
31return ofxFBXSource::Node::OFX_FBX_NULL;
32}
33
34//----------------------------------------
35void ofxFBXNode::setup( shared_ptr<ofxFBXSource::Node> anode ) {
36name = anode->getName();
37mSrcNode = anode;
38if( mSrcNode ) {
39setTransform( anode );
40}
41}
42
43//----------------------------------------
44void ofxFBXNode::setTransform( shared_ptr<ofxFBXSource::Node> anode ) {
45setTransform( anode.get() );
46}
47
48//----------------------------------------
49void ofxFBXNode::setTransform( ofxFBXSource::Node* anode ) {
50setPosition( anode->getPosition() );
51setOrientation( anode->getOrientationQuat() );
52setScale( anode->getScale() );
53}
54
55//----------------------------------------
56string ofxFBXNode::getName() {
57return name;
58}
59
60//----------------------------------------
61string ofxFBXNode::getFbxTypeString() {
62if(mSrcNode) {
63return mSrcNode->getFbxTypeString();
64}
65return "Unknown";
66}
67
68//----------------------------------------
69void ofxFBXNode::setParentNode( shared_ptr<ofxFBXNode> anode ) {
70mParentNode = anode;
71}
72
73//----------------------------------------
74bool ofxFBXNode::hasParentNode() {
75if( !mParentNode ) return false;
76return true;
77}
78
79//----------------------------------------
80shared_ptr<ofxFBXNode> ofxFBXNode::getParentNode() {
81return mParentNode;
82}
83
84//----------------------------------------
85void ofxFBXNode::clearChildren() {
86mKids.clear();
87}
88
89//----------------------------------------
90void ofxFBXNode::addChild( shared_ptr<ofxFBXNode> akiddo ) {
91mKids.push_back( akiddo );
92}
93
94//----------------------------------------
95int ofxFBXNode::getNumChildren() {
96return mKids.size();
97}
98
99//----------------------------------------
100vector< shared_ptr<ofxFBXNode> >& ofxFBXNode::getChildren() {
101return mKids;
102}
103
104//--------------------------------------------------------------
105string ofxFBXNode::getAsString( int aLevel ) {
106stringstream oStr;// = "";
107for( int i = 0; i < aLevel; i++ ) {
108oStr << " ";
109}
110if( aLevel > 0 ) {
111oStr <<" '";
112}
113if( mKids.size() ) {
114oStr << "+ ";
115} else {
116oStr << "- ";
117}
118// string pname = "";
119// if( getParent() != NULL ) {
120// pname = " parent: " + parentBoneName;
121// }
122
123if( !mSrcNode ) {
124return oStr.str();
125}
126
127oStr << mSrcNode->getTypeAsString() << ": " << getName() << " fbx type: " << mSrcNode->getFbxTypeString();
128if( getNumChildren() > 0 ) {
129oStr << " kids: " << mKids.size();
130}
131// if(mSrcNode->usingKeyFrames()) {
132// oStr << " num keys: " << mSrcNode->getKey.size();
133// }
134oStr << endl;// "\n";
135
136for( auto& kid : mKids ) {
137oStr << kid->getAsString( aLevel + 1);
138}
139
140return oStr.str();
141}
142
143#pragma mark - Search
144//--------------------------------------------------------------
145shared_ptr<ofxFBXNode> ofxFBXNode::getNodeforName( shared_ptr<ofxFBXNode>& aBSelf, string aPath, bool bStrict ) {
146vector< string > tsearches;
147if( ofIsStringInString( aPath, ":" ) ) {
148tsearches = ofSplitString( aPath, ":" );
149} else {
150tsearches.push_back( aPath );
151if(aBSelf) {
152if(bStrict) {
153if( aBSelf->getName() == aPath ) {
154// cout << "FOUND SELF" << endl;
155return aBSelf;
156}
157} else {
158if( ofIsStringInString( aBSelf->getName(), aPath )) {
159// cout << "FOUND SELF" << endl;
160return aBSelf;
161}
162}
163}
164}
165
166shared_ptr<ofxFBXNode> temp;// = aBSelf;
167_getNodeForNameRecursive( tsearches, temp, mKids, bStrict );
168return temp;
169}
170
171//--------------------------------------------------------------
172shared_ptr<ofxFBXNode> ofxFBXNode::getKidforName( string aPath, bool bStrict ) {
173
174vector< string > tsearches;
175if( ofIsStringInString( aPath, ":" ) ) {
176tsearches = ofSplitString( aPath, ":" );
177} else {
178tsearches.push_back( aPath );
179}
180
181shared_ptr<ofxFBXNode> temp;
182_getNodeForNameRecursive( tsearches, temp, mKids, bStrict );
183return temp;
184}
185
186//--------------------------------------------------------------
187void ofxFBXNode::_getNodeForNameRecursive( vector<string>& aNamesToFind, shared_ptr<ofxFBXNode>& aTarget, vector< shared_ptr<ofxFBXNode> >& aElements, bool bStrict ) {
188
189for( int i = 0; i < aElements.size(); i++ ) {
190bool bFound = false;
191if(bStrict) {
192if( aElements[i]->getName() == aNamesToFind[0] ) {
193bFound = true;
194}
195} else {
196if( ofIsStringInString( aElements[i]->getName(), aNamesToFind[0] )) {
197// cout << "Found--- " << aNamesToFind[0] << " num names: " << aNamesToFind.size() << endl;
198bFound = true;
199}
200}
201
202if( bFound == true ) {
203aNamesToFind.erase( aNamesToFind.begin() );
204if( aNamesToFind.size() == 0 ) {//}|| aElements[i]->getNumChildren() < 1 ) {
205bool bgood = false;
206if( aElements[i] ) {
207bgood = true;
208}
209// cout << "going to return one of the elements " << aNamesToFind.size() << " good: " << bgood << " " << endl;
210aTarget = aElements[i];
211break;
212} else {
213if( aElements[i]->getNumChildren() > 0 ) {
214// shared_ptr<ofxFBXNode> tgroup = dynamic_pointer_cast< ofxSvgGroup >( aElements[i] );
215_getNodeForNameRecursive( aNamesToFind, aTarget, aElements[i]->getChildren(), bStrict );
216break;
217}
218}
219}
220}
221}
222
223//--------------------------------------------------------------
224void ofxFBXNode::_getKidsForTypeRecursive( int atype, string aNameToContain, vector< shared_ptr<ofxFBXNode> >& aFoundElements, vector< shared_ptr<ofxFBXNode> >& aElements ) {
225
226for( int i = 0; i < aElements.size(); i++ ) {
227
228if( aElements[i]->getType() == atype ) {
229bool bFound = false;
230if( aNameToContain != "" ) {
231if( ofIsStringInString( aElements[i]->getName(), aNameToContain )) {
232bFound = true;
233}
234} else {
235bFound = true;
236}
237if( bFound ) {
238aFoundElements.push_back( aElements[i] );
239}
240}
241
242if( aElements[i]->getNumChildren() > 0 ) {
243_getKidsForTypeRecursive( atype, aNameToContain, aFoundElements, aElements[i]->getChildren() );
244}
245}
246}
247
248//--------------------------------------------------------------
249vector< shared_ptr<ofxFBXNode> > ofxFBXNode::getAllChildren() {
250vector< shared_ptr<ofxFBXNode> > rnodes;
251_getKidsRecursive( rnodes, mKids );
252return rnodes;
253}
254
255//--------------------------------------------------------------
256void ofxFBXNode::_getKidsRecursive( vector< shared_ptr<ofxFBXNode> >& aFoundElements, vector< shared_ptr<ofxFBXNode> >& aElements ) {
257for( int i = 0; i < aElements.size(); i++ ) {
258aFoundElements.push_back( aElements[i] );
259
260if( aElements[i]->getNumChildren() > 0 ) {
261_getKidsRecursive( aFoundElements, aElements[i]->getChildren() );
262}
263}
264}
265