bool COBJNode::Load(char* filename) { #if CAVEMOD /*init DLarr */ for (int i=0; i<10; i++){ DLarr[i]=-1; } #endif if ( _model_p == NULL ) { // model still not loaded // read model from file _model_p = glmReadOBJ(filename); if(_model_p == NULL) return false; // translate model to the origin and scale it // to fit in a unit cube around the origin = "unitize" glmUnitize(_model_p); // precompute normal vectors glmFacetNormals(_model_p); glmVertexNormals(_model_p, 90.0); #if CAVEMOD // do not create DL... create on first update instead //_modelDL = glmList(_model_p, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE); #else // create display list _modelDL = glmList(_model_p, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE); #endif } return true; }
void COBJNode::Update(void) { // Draw the geometry //printf("CAVE_INDEX %i\n", CAVE_INDEX); // save all attributes glPushAttrib(GL_ALL_ATTRIB_BITS); glEnable(GL_NORMALIZE); #if CAVEMOD // if defined DL for this thread if (DLarr[CAVE_INDEX]==-1){ // insert in arr DLarr[CAVE_INDEX]=glmList(_model_p, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE); } glCallList(DLarr[CAVE_INDEX]); //glCallList(_modelDL); #else // draw model glCallList(_modelDL); #endif // restore attributes glPopAttrib(); // update the children CGeometryNode::Update(); }
/** Loads an OBJ models from a file **/ Model ResourceLoader::loadObjModel(QString filePath) { Model m; m.model = glmReadOBJ(filePath.toStdString().c_str()); glmUnitize(m.model); m.idx = glmList(m.model, GLM_SMOOTH); return m; }
void lists(void) { GLfloat ambient[] = { 0.2, 0.2, 0.2, 1.0 }; GLfloat diffuse[] = { 0.8, 0.8, 0.8, 1.0 }; GLfloat specular[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat shininess = 65.0; glMaterialfv(GL_FRONT, GL_AMBIENT, ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, specular); glMaterialf(GL_FRONT, GL_SHININESS, shininess); if (model_list) glDeleteLists(model_list, 1); /* generate a list */ if (material_mode == 0) { if (facet_normal) model_list = glmList(model, GLM_FLAT); else model_list = glmList(model, GLM_SMOOTH); } else if (material_mode == 1) { if (facet_normal) model_list = glmList(model, GLM_FLAT | GLM_COLOR); else model_list = glmList(model, GLM_SMOOTH | GLM_COLOR); } else if (material_mode == 2) { if (facet_normal) model_list = glmList(model, GLM_FLAT | GLM_MATERIAL); else model_list = glmList(model, GLM_SMOOTH | GLM_MATERIAL); } }
void House::makeHouseDispList() { // glNewList(_displayListCar, GL_COMPILE); int mode = GLM_NONE; mode = mode | GLM_SMOOTH; mode = mode | GLM_2_SIDED; mode = mode | GLM_MATERIAL; mode = mode | GLM_TEXTURE; _displayListHouse = glmList(hmodel, mode); }
/** * Group: * C * * Function: * Gua_Status Glo_FunctionWrapper(void *nspace, Gua_Short argc, Gua_Object *argv, Gua_Object *object, Gua_String error) * * Description: * Function wrapper. * * Arguments: * nspace, a pointer to a structure Gua_Namespace. Must do a cast before use it; * argc, the number of arguments to pass to the function; * argv, an array containing the arguments to the function; * argv[0] is the function name; * object, a structure containing the return object of the function; * error, a pointer to the error message. * * Results: * The return object of the wrapped function. */ Gua_Status Glo_FunctionWrapper(void *nspace, Gua_Short argc, Gua_Object *argv, Gua_Object *object, Gua_String error) { GLint arg2i; GLint arg3i; GLfloat arg3f; GLMmodel *model; GLuint model_list; Gua_Object o; FILE *fp; Gua_String errMessage; arg2i = 0; arg3f = 0.0; model = NULL; model_list = 0; if (argc == 0) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s\n", "no function specified"); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } /** * Group: * Scripting * * Function: * gloLoadObj(file, modifiers, degree) * * Description: * Load an OBJ file and returns an OpenGL list. * * Examples: * output == annProcess(ann, input, dim_in_j, dim_out_j). */ if (strcmp(Gua_ObjectToString(argv[0]), "gloLoadObj") == 0) { if (argc != 4) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "wrong number of arguments for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (Gua_ObjectType(argv[1]) != OBJECT_TYPE_STRING) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 1 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (!((Gua_ObjectType(argv[2]) == OBJECT_TYPE_INTEGER) || (Gua_ObjectType(argv[2]) == OBJECT_TYPE_REAL))) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 2 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (!((Gua_ObjectType(argv[3]) == OBJECT_TYPE_INTEGER) || (Gua_ObjectType(argv[3]) == OBJECT_TYPE_REAL))) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 3 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (Gua_ObjectType(argv[2]) == OBJECT_TYPE_INTEGER) { arg2i = Gua_ObjectToInteger(argv[2]); } else if (Gua_ObjectType(argv[2]) == OBJECT_TYPE_REAL) { arg2i = roundl(Gua_ObjectToReal(argv[2])); } if (Gua_ObjectType(argv[3]) == OBJECT_TYPE_INTEGER) { arg3f = Gua_ObjectToInteger(argv[3]); } else if (Gua_ObjectType(argv[3]) == OBJECT_TYPE_REAL) { arg3f = Gua_ObjectToReal(argv[3]); } /* * Reads the model data, defines its vertices normals * and create an OpenGL list to reference the object. */ model = glmReadOBJ(Gua_ObjectToString(argv[1])); glmUnitize(model); glmFacetNormals(model); glmVertexNormals(model, arg3f); model_list = glmList(model, arg2i); Gua_IntegerToPObject(object, model_list); /** * Group: * Scripting * * Function: * gloLoadPPM(file, "width", "height") * * Description: * Load a PPM image file. * * Examples: * texture = gloLoadPPM($texture_file, "texture_width", "texture_height"). */ } else if (strcmp(Gua_ObjectToString(argv[0]), "gloLoadPPM") == 0) { if (argc != 4) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "wrong number of arguments for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (Gua_ObjectType(argv[1]) != OBJECT_TYPE_STRING) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 1 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (Gua_ObjectType(argv[2]) != OBJECT_TYPE_STRING) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 1 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (Gua_ObjectType(argv[3]) != OBJECT_TYPE_STRING) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 1 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } Gua_LinkByteArrayToPObject(object, (Gua_String)Glo_LoadPPM(Gua_ObjectToString(argv[1]), &arg2i, &arg3i), arg2i * arg3i * 3); Gua_IntegerToObject(o, arg2i); Gua_SetStoredObject(o); if (Gua_SetVariable((Gua_Namespace *)nspace, Gua_ObjectToString(argv[2]), &o, SCOPE_STACK) != GUA_OK) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "can't set variable", Gua_ObjectToString(argv[2])); strcat(error, errMessage); Gua_Free(errMessage); } Gua_IntegerToObject(o, arg3i); Gua_SetStoredObject(o); if (Gua_SetVariable((Gua_Namespace *)nspace, Gua_ObjectToString(argv[3]), &o, SCOPE_STACK) != GUA_OK) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "can't set variable", Gua_ObjectToString(argv[3])); strcat(error, errMessage); Gua_Free(errMessage); } /** * Group: * Scripting * * Function: * gloSavePPM(texture, file, width, height) * * Description: * Save a PPM image file. * * Examples: * gloSavePPM(texture, "/tmp/texture.ppm", $texture_width, $texture_height). */ } else if (strcmp(Gua_ObjectToString(argv[0]), "gloSavePPM") == 0) { if (argc != 5) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "wrong number of arguments for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (Gua_ObjectType(argv[1]) != OBJECT_TYPE_STRING) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 1 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (Gua_ObjectType(argv[2]) != OBJECT_TYPE_STRING) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 2 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (!((Gua_ObjectType(argv[3]) == OBJECT_TYPE_INTEGER) || (Gua_ObjectType(argv[3]) == OBJECT_TYPE_REAL))) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 3 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } if (!((Gua_ObjectType(argv[4]) == OBJECT_TYPE_INTEGER) || (Gua_ObjectType(argv[4]) == OBJECT_TYPE_REAL))) { errMessage = (Gua_String) Gua_Alloc(sizeof(char) * MAX_ERROR_MSG_SIZE + 1); sprintf(errMessage, "%s %-.20s...\n", "illegal argument 4 for function", Gua_ObjectToString(argv[0])); strcat(error, errMessage); Gua_Free(errMessage); return GUA_ERROR; } /* * Open the PPM image file. */ fp = fopen(Gua_ObjectToString(argv[2]), "w+"); if (fp != NULL) { /* * Writes the PPM file header. */ fputs("P6\n", fp); fprintf(fp, "%ld %ld\n", Gua_ObjectToInteger(argv[3]), Gua_ObjectToInteger(argv[4])); fputs("255\n", fp); /* * Writes the raw image data. */ fwrite(Gua_ObjectToString(argv[1]), sizeof(char), Gua_ObjectToInteger(argv[3]) * Gua_ObjectToInteger(argv[4]) * 3, fp); fclose(fp); } } return GUA_OK; }
void Mesh::Preprocess( Scene *s ) { if (displayListID>0) return; if (modelType == TYPE_HEM_FILE) { if (renderMode == MESH_RENDER_AS_DISPLAY_LIST) { displayListID = hem->CreateOpenGLDisplayList( WITH_NORMALS ); if (objectOptionFlags & OBJECT_OPTION_USE_LOWRES) displayListID_low = hem_lowRes->CreateOpenGLDisplayList( WITH_NORMALS ); if (flags & OBJECT_FLAGS_ALLOWDRAWEDGESONLY) hem->CreateOpenGLDisplayList( USE_LINES | WITH_NORMALS | WITH_ADJACENT_FACE_NORMS ); if ( (flags & OBJECT_FLAGS_ALLOWDRAWEDGESONLY) && (objectOptionFlags & OBJECT_OPTION_USE_LOWRES) ) hem_lowRes->CreateOpenGLDisplayList( USE_LINES | WITH_NORMALS | WITH_ADJACENT_FACE_NORMS ); } else if (renderMode == MESH_RENDER_AS_VBO_VERTEX_ARRAY) { interleavedVertDataVBO = hem->CreateOpenGLVBO( WITH_NORMALS ); if (flags & OBJECT_FLAGS_ALLOWDRAWEDGESONLY) hem->CreateOpenGLVBO( USE_LINES | WITH_NORMALS | WITH_ADJACENT_FACE_NORMS ); if (objectOptionFlags & OBJECT_OPTION_USE_LOWRES) interleavedVertDataVBO_low = hem_lowRes->CreateOpenGLVBO( WITH_NORMALS ); if ( (flags & OBJECT_FLAGS_ALLOWDRAWEDGESONLY) && (objectOptionFlags & OBJECT_OPTION_USE_LOWRES) ) hem_lowRes->CreateOpenGLVBO( USE_LINES | WITH_NORMALS | WITH_ADJACENT_FACE_NORMS ); } } else if (modelType == TYPE_OBJ_FILE || modelType == TYPE_SMF_FILE) { if (renderMode == MESH_RENDER_AS_DISPLAY_LIST) { displayListID = glmList( glm, GLM_SMOOTH ); if (objectOptionFlags & OBJECT_OPTION_USE_LOWRES) displayListID_low = glmList( glm_lowRes, GLM_SMOOTH ); } else if (renderMode == MESH_RENDER_AS_VBO_VERTEX_ARRAY) { // Setup element vertex array for vertex buffer objects unsigned int *arrayIndices = (unsigned int *)malloc( glm->numtriangles * 3 * sizeof( unsigned int ) ); for (unsigned int i=0; i<glm->numtriangles; i++) { arrayIndices[3*i+0] = glm->triangles[i].vindices[0]; arrayIndices[3*i+1] = glm->triangles[i].vindices[1]; arrayIndices[3*i+2] = glm->triangles[i].vindices[2]; } glGenBuffers( 1, &elementVBO ); glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, elementVBO ); glBufferData( GL_ELEMENT_ARRAY_BUFFER, glm->numtriangles*3*sizeof(unsigned int), arrayIndices, GL_STATIC_DRAW ); glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); free( arrayIndices ); // Setup data array for vertex buffer objects unsigned int dataSize = (glm->numvertices+1)*6*sizeof(float); float *floatData = (float *)malloc( dataSize ); float *fptr = floatData; for (unsigned int i=0; i<(glm->numvertices+1)*3; i+=3) { *(fptr++) = glm->normArray[i]; *(fptr++) = glm->normArray[i+1]; *(fptr++) = glm->normArray[i+2]; *(fptr++) = glm->vertices[i]; *(fptr++) = glm->vertices[i+1]; *(fptr++) = glm->vertices[i+2]; } glGenBuffers( 1, &interleavedVertDataVBO ); glBindBuffer( GL_ARRAY_BUFFER, interleavedVertDataVBO ); glBufferData( GL_ARRAY_BUFFER, dataSize, floatData, GL_STATIC_DRAW ); glBindBuffer( GL_ARRAY_BUFFER, 0 ); free( floatData ); elementCount = glm->numtriangles*3; if (objectOptionFlags & OBJECT_OPTION_USE_LOWRES) { // Setup element vertex array for vertex buffer objects arrayIndices = (unsigned int *)malloc( glm_lowRes->numtriangles * 3 * sizeof( unsigned int ) ); for (unsigned int i=0; i<glm_lowRes->numtriangles; i++) { arrayIndices[3*i+0] = glm_lowRes->triangles[i].vindices[0]; arrayIndices[3*i+1] = glm_lowRes->triangles[i].vindices[1]; arrayIndices[3*i+2] = glm_lowRes->triangles[i].vindices[2]; } glGenBuffers( 1, &elementVBO_low ); glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, elementVBO_low ); glBufferData( GL_ELEMENT_ARRAY_BUFFER, glm_lowRes->numtriangles*3*sizeof(unsigned int), arrayIndices, GL_STATIC_DRAW ); glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); free( arrayIndices ); // Setup data array for vertex buffer objects dataSize = (glm_lowRes->numvertices+1)*6*sizeof(float); floatData = (float *)malloc( dataSize ); fptr = floatData; for (unsigned int i=0; i<(glm_lowRes->numvertices+1)*3; i+=3) { *(fptr++) = glm_lowRes->normArray[i]; *(fptr++) = glm_lowRes->normArray[i+1]; *(fptr++) = glm_lowRes->normArray[i+2]; *(fptr++) = glm_lowRes->vertices[i]; *(fptr++) = glm_lowRes->vertices[i+1]; *(fptr++) = glm_lowRes->vertices[i+2]; } glGenBuffers( 1, &interleavedVertDataVBO_low ); glBindBuffer( GL_ARRAY_BUFFER, interleavedVertDataVBO_low ); glBufferData( GL_ARRAY_BUFFER, dataSize, floatData, GL_STATIC_DRAW ); glBindBuffer( GL_ARRAY_BUFFER, 0 ); free( floatData ); elementCount_low = glm_lowRes->numtriangles*3; } } } if (glm) glmDelete( glm ); //if (hem) hem->FreeNonGLMemory(); }