Ich bin grad etwas ratlos was Pointer angeht. Eigentlich wollte ich mir eine "float *getData()" Methode schreiben, die mir einen Pointer auf irgendwelche von den Parametern abhängige Daten zurückgibt. Die Methode gibt mir allerdings immer einen Pointer auf dieselbe Stelle zurück. Interessanterweise aber nur solange bis ich mir den Pointer nicht nur ausserhalb der Methode auf die Console ausgebe, sondern auch innerhalb. Dann hab ich nämlich sowohl in der Methode als auch ausserhalb der Methode unterschiedliche Pointer. Aber leider nochimmer nicht die richtigen. Die richtigen bekomme ich dann, wenn ich den Methodenaufruf bleiben lasse und stattdessen direkt den Code innerhalb der Methode verwende.
getData sieht folgendermaßen aus:
Code:
float *getData(Scene *scene, MeshNode *meshNode, SubMesh *subMesh, string name){
float *data = NULL;
if(name == "world"){
data = reinterpret_cast<float*>(&meshNode->getDerivedTransform());
}else if(name == "view"){
data = reinterpret_cast<float*>(&scene->getActiveCamera()->getDerivedTransform());
}else if(name == "proj"){
data = reinterpret_cast<float*>(&scene->getActiveCamera()->getPerspectiveMatrix());
}else if(name == "vertex"){
data = reinterpret_cast<float*>(subMesh->getValue("position") );
}else if(name == "normal"){
data = reinterpret_cast<float*>(subMesh->getValue("normal") );
}
// Wenn data ausgegeben wird, dann liefert getData() für unterschiedliche namen unterschiedliche Pointer.
// cout << data << endl;
return data;
}
Wenn ich jetzt getData folgendermaßen verwende:
Code:
float *data = getData(scene, meshNode, subMesh, uniform.name);
Logger::instance()->logInfo << StringUtils::rightPad(uniform.name + ":", 10) << uUniform << "\t" << data << endl;
dann bekomme ich diese Ausgabe:
Zitat
INFO: [ SinglePassAutoMapMaterial.cpp (293)]: === AUTOMAP ===
INFO: [ SinglePassAutoMapMaterial.cpp (300)]: proj: 0 0034F8BC
INFO: [ SinglePassAutoMapMaterial.cpp (300)]: view: 1 0034F8BC
INFO: [ SinglePassAutoMapMaterial.cpp (300)]: world: 2 0034F8BC
INFO: [ SinglePassAutoMapMaterial.cpp (342)]: ==========
...
Alle 3 Pointer sind ident. Wenn ich das cout in getData aus dem Kommentar nehme, dann sieht die Ausgabe so aus:
Zitat
INFO: [ main.cpp (100)]: fps: 9.24413
INFO: [ SinglePassAutoMapMaterial.cpp (293)]: === AUTOMAP ===
0038F3CC
INFO: [ SinglePassAutoMapMaterial.cpp (300)]: proj: 0 0038F3CC
0038F38C
INFO: [ SinglePassAutoMapMaterial.cpp (300)]: view: 1 0038F38C
0038F34C
INFO: [ SinglePassAutoMapMaterial.cpp (300)]: world: 2 0038F34C
INFO: [ SinglePassAutoMapMaterial.cpp (342)]: ==========
...
Die Pointer sind jetzt verschieden aber die richtigen Pointer bekomme ich erst dann, wenn ich den getData Code direkt verwende:
Code:
// Mit getData()
GLuint uUniform = glGetUniformLocation(shaderHandle, uniform.name.c_str());
float *data = getData(scene, meshNode, subMesh, uniform.name);
Logger::instance()->logInfo << StringUtils::rightPad(uniform.name + ":", 10) << uUniform << "\t" << data << endl;
// direkt
if(uniform.name == "world"){
data = reinterpret_cast<float*>(&meshNode->getDerivedTransform());
}else if(uniform.name == "view"){
data = reinterpret_cast<float*>(&scene->getActiveCamera()->getDerivedTransform());
}else if(uniform.name == "proj"){
data = reinterpret_cast<float*>(&scene->getActiveCamera()->getPerspectiveMatrix());
}else if(uniform.name == "vertex"){
data = reinterpret_cast<float*>(subMesh->getValue("position") );
}else if(uniform.name == "normal"){
data = reinterpret_cast<float*>(subMesh->getValue("normal") );
}
Logger::instance()->logInfo << StringUtils::rightPad(uniform.name + ":", 10) << uUniform << "\t" << data << endl;
Die Ausgabe dazu:
Zitat
INFO: [ SinglePassAutoMapMaterial.cpp (293)]: === AUTOMAP ===
0039F75C
INFO: [ SinglePassAutoMapMaterial.cpp (300)]: proj: 0 0039F75C getData()
INFO: [ SinglePassAutoMapMaterial.cpp (313)]: proj: 0 0039F9C4 direkt
0039F71C
INFO: [ SinglePassAutoMapMaterial.cpp (300)]: view: 1 0039F71C getData()
INFO: [ SinglePassAutoMapMaterial.cpp (313)]: view: 1 0039FA44 direkt
0039F6DC
INFO: [ SinglePassAutoMapMaterial.cpp (300)]: world: 2 0039F6DC getData()
INFO: [ SinglePassAutoMapMaterial.cpp (313)]: world: 2 0039FA04 direkt
INFO: [ SinglePassAutoMapMaterial.cpp (341)]: ==========
...
Ich wäre sehr dankbar wenn mir jemand erklären könnte was da passiert.