Che m_pApi sia solo un'interfaccia istanziata con C3dsreader o Ccolladareader è indice di buon design. Permette di isolare i dettagli implementativi e ragionare a interfaccie e non a implementazioni.
Detto questo: trasformare una funzione da ricorsiva a iterativa è possibile, ma spesso si rivela poco saggia e contro producente. Lo pseudo codice che ho postato, trasformato in iterativo diventa ingestibile dopo pochi nodi figli che andrebbero analizzati, con la stessa logica del padre, in una lunga catena di if e for annidati.
Tanto per capirsi:
codice:
void check_nodes(const Node& nd) {
if (nd.hasChildNodes()) {
NodeList ndlist = nd.getChildNodes();
for (long sz=0; sz<ndlist.getLength(); ++sz) {
Node znd = ndlist.getItem(sz);
if (znd.hasChildNodes()) {
NodeList ndlist_a = znd.getChildNodes();
for (long sz_a=0; sz_a<ndlist_a.getLength(); ++sz_a) {
Node znd_a = ndlist_a.getItem(sz_a);
if (znd_a.hasChildNodes()) {
NodeList ndlist_b = znd_a.getChildNodes();
for (long sz_b=0; sz_b<ndlist_b.getLength(); ++sz_b) {
Node znd_c = ndlist_b.getItem(sz_a);
if (znd_c.hasChildNodes()) {
// etc.
}
}
}
}
}
}
}
}
e questo supponendo di avere un nodo con almeno un figlio che ha un nodo con almeno un figlio etc.
Giudica tu se conviene avere una funzione ricorsiva o iterativa.
ma per ciclare i nodi nello scene graph ho una funzione ricorsiva , che non so controlare dalla logica di importazione(Cimporter)
Cioè? Che funzione ricorsiva?
Considera comunque che CImporter::ImportVertex() può richiamare una procedura ricorsiva ad hoc e tramite quella analizzare l'albero di vertex e sotto vertex vari.
Es.
codice:
void CImporter::ImportVertex()
{
//chiamo la funzione di reset dei vertici
m_pApi->VertexReset();
this->privateImportVertex();
}
//--------------------------------
void CImporter::privateImportVertex() {
if ( m_pApi->NextVertex() ) {
float x,y,z;
if( m_pApi->ImportVertex(&x,&y,&z) ) {
Vertex* v = new Vertex();
v->_x = x;
v->_y = y;
v->_z = z;
v->_nx = 0.;
v->_ny = 0.;
v->_nz = 0.;
m_CurrMeshVertexes.push_back(v);
}
this->privateImportVertex();
}
}