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();
}
예제 #3
0
/**
    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;
}
예제 #4
0
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);
    }
}
예제 #5
0
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);
}
예제 #6
0
파일: glo.c 프로젝트: guarascript/guash
/**
 * 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;
}
예제 #7
0
파일: Mesh.cpp 프로젝트: jazzboysc/RTGI
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();
}