void templateAppDraw(void)
{
    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    GFX_set_matrix_mode(MODELVIEW_MATRIX);
    GFX_load_identity();
    if (view_delta.x || view_delta.y) {
	if (view_delta.y)
	    next_rotz -= view_delta.y;
	if (view_delta.x) {
	    next_rotx -= view_delta.x;
	    next_rotx = CLAMP(next_rotx, 0.0f, 90.0f);
	}
	view_delta.x = view_delta.y = 0.0f;
    }
    rotx = rotx * 0.9f + next_rotx * 0.1f;
    rotz = rotz * 0.9f + next_rotz * 0.1f;
    eye.x = center.x + distance * cosf(rotx * DEG_TO_RAD) * sinf(rotz * DEG_TO_RAD);
    eye.y = center.y - distance * cosf(rotx * DEG_TO_RAD) * cosf(rotz * DEG_TO_RAD);
    eye.z = center.z + distance * sinf(rotx * DEG_TO_RAD);
    rotx = rotx * 0.9f + next_rotx * 0.1f;
    rotz = rotz * 0.9f + next_rotz * 0.1f;
    center.x = maze->location.x;
    center.y = maze->location.y;
    center.z = maze->location.z;
    GFX_look_at(&eye, &center, &up);
    PROGRAM_draw(program);
    glUniform1i(PROGRAM_get_uniform_location(program, (char *)"DIFFUSE"), 1);
    unsigned int i = 0;
    while (i != obj->n_objmesh) {
	OBJMESH *objmesh = &obj->objmesh[i];
	GFX_push_matrix();
	mat4 mat;
	objmesh->btrigidbody->getWorldTransform().getOpenGLMatrix((float *)&mat);
	memcpy(&objmesh->location, (vec3 *) & mat.m[3], sizeof(vec3));
	GFX_multiply_matrix(&mat);
	glUniformMatrix4fv(PROGRAM_get_uniform_location(program, (char *)"MODELVIEWPROJECTIONMATRIX"), 1, GL_FALSE, (float *)GFX_get_modelview_projection_matrix());
	OBJ_draw_mesh(obj, i);
	GFX_pop_matrix();
	++i;
    }
    NAVIGATION_draw(navigation);
    dynamicsworld->stepSimulation(1.0f / 60.0f);
}
Пример #2
0
void templateAppDraw( void ) {

	glClearColor( 0.5f, 0.5f, 0.5f, 1.0f );
	glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );


	GFX_set_matrix_mode( MODELVIEW_MATRIX );
	GFX_load_identity();


	if( view_delta.x || view_delta.y ) { 

		if( view_delta.y ) next_rotz -= view_delta.y;

		if( view_delta.x ) { 
			next_rotx -= view_delta.x;
			next_rotx = CLAMP( next_rotx, 0.0f, 90.0f ); 
		}
		
		view_delta.x =
		view_delta.y = 0.0f;
	}

	rotx = rotx * 0.9f + next_rotx * 0.1f;
	rotz = rotz * 0.9f + next_rotz * 0.1f;



	eye.x = center.x + 
			distance * 
			cosf( rotx * DEG_TO_RAD ) * 
			sinf( rotz * DEG_TO_RAD );
	
	eye.y = center.y - 
			distance *
			cosf( rotx * DEG_TO_RAD ) *
			cosf( rotz * DEG_TO_RAD );
	
	
	eye.z = center.z +
			distance *
			sinf( rotx * DEG_TO_RAD );
			
			
	rotx = rotx * 0.9f + next_rotx * 0.1f;
	rotz = rotz * 0.9f + next_rotz * 0.1f;


	center.x = maze->location.x;
	center.y = maze->location.y;
	center.z = maze->location.z;


	GFX_look_at( &eye,
				 &center,
				 &up );


	if( double_tap ) { 
		
		vec3 location;
		
		if( GFX_unproject( view_location.x,
						   viewport_matrix[ 3 ] - view_location.y,
						   1.0f,
						   GFX_get_modelview_matrix(),
						   GFX_get_projection_matrix(),
						   viewport_matrix,
						   &location.x,
						   &location.y,
						   &location.z  ) ) {

			btVector3 ray_from( eye.x,
							    eye.y,
							    eye.z ),

					  ray_to( location.x + eye.x,
							  location.y + eye.y,
							  location.z + eye.z );

			btCollisionWorld::ClosestRayResultCallback collision_ray( ray_from,
																	  ray_to );
			
			dynamicsworld->rayTest( ray_from,
									ray_to,
									collision_ray );
			
			if( collision_ray.hasHit() &&
				collision_ray.m_collisionObject == maze->btrigidbody ) { 

				collision_ray.m_hitNormalWorld.normalize();

				if( collision_ray.m_hitNormalWorld.z() == 1.0f ) {
			
					navigationpath_player.start_location.x = player->location.x;
					navigationpath_player.start_location.y = player->location.y;
					navigationpath_player.start_location.z = player->location.z;

					navigationpath_player.end_location.x = collision_ray.m_hitPointWorld.x();
					navigationpath_player.end_location.y = collision_ray.m_hitPointWorld.y();
					navigationpath_player.end_location.z = collision_ray.m_hitPointWorld.z();
				
					if( NAVIGATION_get_path( navigation,
											&navigationpath_player,
											&navigationpathdata_player ) ) {
						
						player_next_point = 1;

						unsigned int i = 0;
						
						while( i != navigationpathdata_player.path_point_count + 1 ) { 
						
							console_print( "%d: %f %f %f\n",
										   i,
										   navigationpathdata_player.path_point_array[ i ].x,
										   navigationpathdata_player.path_point_array[ i ].y,
										   navigationpathdata_player.path_point_array[ i ].z );
							++i; 
						}
						
						printf( "\n" );
					}
				}
			}
		}

		double_tap = 0;
	}
	
	
	if( navigationpathdata_player.path_point_count ) {

		move_entity( player,
					 &navigationpathdata_player,
					 &player_next_point,
					 3.0f );
	}	
	
	
	PROGRAM_draw( program );

	glUniform1i( PROGRAM_get_uniform_location( program, ( char * )"DIFFUSE" ), 1 );

	unsigned int i = 0;

	while( i != obj->n_objmesh ) {

		OBJMESH *objmesh = &obj->objmesh[ i ];

		GFX_push_matrix();

		mat4 mat;

		objmesh->btrigidbody->getWorldTransform().getOpenGLMatrix( ( float * )&mat );

		memcpy( &objmesh->location, ( vec3 * )&mat.m[ 3 ], sizeof( vec3 ) );

		GFX_multiply_matrix( &mat );

		glUniformMatrix4fv( PROGRAM_get_uniform_location( program, ( char * )"MODELVIEWPROJECTIONMATRIX" ),
							1,
							GL_FALSE,
							( float * )GFX_get_modelview_projection_matrix() );

		OBJ_draw_mesh( obj, i );

		GFX_pop_matrix();

		++i;
	}
	
	NAVIGATION_draw( navigation );
	
	dynamicsworld->stepSimulation( 1.0f / 60.0f );
}