- fix some issues with the SimpleOpenGl sample:

* Material's shininess would not be set if strength wasn't defined too;
 * Two-sided culling was working the opposite way, GL_CULL_FACE actually removes back faces when enabled;
 * GL_COLOR_MATERIAL should not be enabled for mesh->mColors since it replaces other materials, it now sets vertex color only. Also, it now uses glColor4fv directly. 
Thanks to Ricardo Costa for the patch (http://sourceforge.net/projects/assimp/forums/forum/817653/topic/4502991).
- some doc and formatting fixes in the very same sample.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@973 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/1/head
aramis_acg 2011-04-25 11:29:07 +00:00
parent 4aed392d03
commit a5210b2765
1 changed files with 20 additions and 31 deletions

View File

@ -76,7 +76,6 @@ void get_bounding_box_for_node (const struct aiNode* nd,
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void get_bounding_box (struct aiVector3D* min, struct aiVector3D* max) void get_bounding_box (struct aiVector3D* min, struct aiVector3D* max)
{ {
struct aiMatrix4x4 trafo; struct aiMatrix4x4 trafo;
@ -88,7 +87,6 @@ void get_bounding_box (struct aiVector3D* min, struct aiVector3D* max)
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void color4_to_float4(const struct aiColor4D *c, float f[4]) void color4_to_float4(const struct aiColor4D *c, float f[4])
{ {
f[0] = c->r; f[0] = c->r;
@ -98,7 +96,6 @@ void color4_to_float4(const struct aiColor4D *c, float f[4])
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void set_float4(float f[4], float a, float b, float c, float d) void set_float4(float f[4], float a, float b, float c, float d)
{ {
f[0] = a; f[0] = a;
@ -145,10 +142,14 @@ void apply_material(const struct aiMaterial *mtl)
max = 1; max = 1;
ret1 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS, &shininess, &max); ret1 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS, &shininess, &max);
max = 1; if(ret1 == AI_SUCCESS) {
ret2 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS_STRENGTH, &strength, &max); max = 1;
if((ret1 == AI_SUCCESS) && (ret2 == AI_SUCCESS)) ret2 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS_STRENGTH, &strength, &max);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess * strength); if(ret2 == AI_SUCCESS)
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess * strength);
else
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
}
else { else {
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0f); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0f);
set_float4(c, 0.0f, 0.0f, 0.0f, 0.0f); set_float4(c, 0.0f, 0.0f, 0.0f, 0.0f);
@ -164,17 +165,9 @@ void apply_material(const struct aiMaterial *mtl)
max = 1; max = 1;
if((AI_SUCCESS == aiGetMaterialIntegerArray(mtl, AI_MATKEY_TWOSIDED, &two_sided, &max)) && two_sided) if((AI_SUCCESS == aiGetMaterialIntegerArray(mtl, AI_MATKEY_TWOSIDED, &two_sided, &max)) && two_sided)
glEnable(GL_CULL_FACE);
else
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
} else
glEnable(GL_CULL_FACE);
// ----------------------------------------------------------------------------
// Can't send color down as a pointer to aiColor4D because AI colors are ABGR.
void Color4f(const struct aiColor4D *color)
{
glColor4f(color->r, color->g, color->b, color->a);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -201,12 +194,6 @@ void recursive_render (const struct aiScene *sc, const struct aiNode* nd)
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
} }
if(mesh->mColors[0] != NULL) {
glEnable(GL_COLOR_MATERIAL);
} else {
glDisable(GL_COLOR_MATERIAL);
}
for (t = 0; t < mesh->mNumFaces; ++t) { for (t = 0; t < mesh->mNumFaces; ++t) {
const struct aiFace* face = &mesh->mFaces[t]; const struct aiFace* face = &mesh->mFaces[t];
GLenum face_mode; GLenum face_mode;
@ -223,7 +210,7 @@ void recursive_render (const struct aiScene *sc, const struct aiNode* nd)
for(i = 0; i < face->mNumIndices; i++) { for(i = 0; i < face->mNumIndices; i++) {
int index = face->mIndices[i]; int index = face->mIndices[i];
if(mesh->mColors[0] != NULL) if(mesh->mColors[0] != NULL)
Color4f(&mesh->mColors[0][index]); glColor4fv((GLfloat*)&mesh->mColors[0][index]);
if(mesh->mNormals != NULL) if(mesh->mNormals != NULL)
glNormal3fv(&mesh->mNormals[index].x); glNormal3fv(&mesh->mNormals[index].x);
glVertex3fv(&mesh->mVertices[index].x); glVertex3fv(&mesh->mVertices[index].x);
@ -301,8 +288,8 @@ void display(void)
int loadasset (const char* path) int loadasset (const char* path)
{ {
// we are taking one of the postprocessing presets to avoid // we are taking one of the postprocessing presets to avoid
// writing 20 single postprocessing flags here. // spelling out 20+ single postprocessing flags here.
scene = aiImportFile(path,aiProcessPreset_TargetRealtime_Quality); scene = aiImportFile(path,aiProcessPreset_TargetRealtime_MaxQuality);
if (scene) { if (scene) {
get_bounding_box(&scene_min,&scene_max); get_bounding_box(&scene_min,&scene_max);
@ -329,18 +316,20 @@ int main(int argc, char **argv)
glutReshapeFunc(reshape); glutReshapeFunc(reshape);
// get a handle to the predefined STDOUT log stream and attach // get a handle to the predefined STDOUT log stream and attach
// it to the logging system. It will be active for all further // it to the logging system. It remains active for all further
// calls to aiImportFile(Ex) and aiApplyPostProcessing. // calls to aiImportFile(Ex) and aiApplyPostProcessing.
stream = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT,NULL); stream = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT,NULL);
aiAttachLogStream(&stream); aiAttachLogStream(&stream);
// ... exactly the same, but this stream will now write the // ... same procedure, but this stream now writes the
// log file to assimp_log.txt // log messages to assimp_log.txt
stream = aiGetPredefinedLogStream(aiDefaultLogStream_FILE,"assimp_log.txt"); stream = aiGetPredefinedLogStream(aiDefaultLogStream_FILE,"assimp_log.txt");
aiAttachLogStream(&stream); aiAttachLogStream(&stream);
// the model name can be specified on the command line. we try to locate // the model name can be specified on the command line. If none
// one of the more expressive test models from the repository. // is specified, we try to locate one of the more expressive test
// models from the repository (/models-nonbsd may be missing in
// some distributions so we need a fallback from /models!).
if( 0 != loadasset( argc >= 2 ? argv[1] : "../../test/models-nonbsd/X/dwarf.x")) { if( 0 != loadasset( argc >= 2 ? argv[1] : "../../test/models-nonbsd/X/dwarf.x")) {
if( argc != 1 || 0 != loadasset( "../../../../test/models-nonbsd/X/dwarf.x") && 0 != loadasset( "../../test/models/X/Testwuson.X")) { if( argc != 1 || 0 != loadasset( "../../../../test/models-nonbsd/X/dwarf.x") && 0 != loadasset( "../../test/models/X/Testwuson.X")) {
return -1; return -1;