예제 #1
0
void mouse_get_3d_ray(Vec3D *position,Vec3D *vector)
{
  Vec3D cam,pos1,pos2,rotation;
  GraphicsView view;
  
  graphics_get_view(&view);
  camera_get_position(&cam);
  
  gluUnProject(__mouse.x, __mouse.y, 0.99f, view.modelView, view.projectionX, view.viewPort, &pos1.x, &pos1.y, &pos1.z);
  gluUnProject(__mouse.x, __mouse.y, 1, view.modelView, view.projectionX, view.viewPort, &pos2.x, &pos2.y, &pos2.z);

  pos2.y *= -1;
  pos1.y *= -1;
  vec3d_add(pos1,cam,pos1);
  vec3d_add(pos2,cam,pos2);
  
  if (position)
  {
    vec3d_cpy((*position),pos1);
  }
  if (vector)
  {
    vec3d_sub((*vector),pos2,pos1);
    vec3d_normalize(vector);
    camera_get_rotation(&rotation);
    vec3d_rotate_about_x(vector,rotation.x);
    vec3d_rotate_about_y(vector,rotation.y);
    vec3d_rotate_about_z(vector,rotation.z);
  }
}
예제 #2
0
파일: view_draw.c 프로젝트: prophile/dim3
void view_draw(int tick)
{
	obj_type		*obj,*camera_obj;
	weapon_type		*weap;

		// get player object and held weapon
		
	obj=object_find_uid(server.player_obj_uid);
	weap=weapon_find_current(obj);

		// camera render

	view.render=&view_camera_render;
	
		// set view camera
	
	camera_obj=object_find_uid(camera.obj_uid);
	camera_get_position(&view.render->camera.pnt,&view.render->camera.ang);

	view.render->camera.fov=camera.plane.fov;
	view.render->camera.flip=FALSE;
	view.render->camera.under_liquid_idx=camera_check_liquid(&view.render->camera.pnt);
	
	view.render->no_shadow=FALSE;
	view.render->force_camera_obj=FALSE;

		// camera adjustments
	
	if (camera.mode==cv_fpp) {
		view_calculate_scope(tick,obj,camera_obj);
		view_calculate_recoil(obj);
	}
	
	view_calculate_shakes(tick,obj);
	view_calculate_sways(tick,obj);
	view_calculate_bump(obj);
	
		// build the scene
		
	view_draw_scene_build(tick);
	
		// do any back frame rendering
		
	gl_back_render_frame_start(tick);

		// render the scene

	view_draw_scene_render(tick,obj,weap);

		// draw tints and fades
		
	view_draw_liquid_tint(view.render->camera.under_liquid_idx);
	view_draw_effect_tint(tick,obj);

	fade_screen_draw(tick);
	fade_object_draw(tick,obj);
}
예제 #3
0
파일: view_draw.c 프로젝트: prophile/dim3
bool view_draw_node(int tick,node_type *node,int pixel_size)
{
	d3pnt			pnt;
	d3ang			ang;

		// switch out to node render
		
	glViewport(0,0,pixel_size,pixel_size);
	view.render=&view_node_render;
	
		// camera position
		
	memmove(&view.render->camera.pnt,&node->pnt,sizeof(d3pnt));

	if (!node->follow_camera) {
		memmove(&view.render->camera.ang,&node->ang,sizeof(d3ang));
	}
	else {
		camera_get_position(&pnt,&ang);

		view.render->camera.ang.x=angle_find(node->pnt.y,node->pnt.z,pnt.y,pnt.z);
		view.render->camera.ang.y=angle_find(node->pnt.x,node->pnt.z,pnt.x,pnt.z);
		view.render->camera.ang.z=angle_find(node->pnt.x,node->pnt.y,pnt.x,pnt.y);
	}

	view.render->camera.fov=camera.plane.fov;
	view.render->camera.flip=TRUE;
	view.render->camera.under_liquid_idx=-1;
	
	view.render->no_shadow=TRUE;
	view.render->force_camera_obj=TRUE;

		// draw the scene
	
	glClearColor(0.0f,0.0f,0.0f,1.0f);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
		
		// build the scene
		
	view_draw_scene_build(tick);

		// render the scene

	view_draw_scene_render(tick,NULL,NULL);

		// restore the normal rendering
		
	glViewport(render_info.view_x,render_info.view_y,setup.screen.x_sz,setup.screen.y_sz);
	view.render=&view_camera_render;
	
	return(TRUE);
}
예제 #4
0
파일: camera.c 프로젝트: prophile/dim3
void camera_get_angle_from(d3pnt *pt,d3ang *ang)
{
	int				dist;
	d3pnt			pnt;
	d3ang			temp_ang;

		// get camera position

	camera_get_position(&pnt,&temp_ang);

		// find angle

	dist=distance_2D_get(0,0,(pnt.x-pt->x),(pnt.z-pt->z));
	ang->x=-angle_find(0,0,(pnt.y-pt->y),dist);

	ang->y=angle_find(pt->x,pt->z,pnt.x,pnt.z);

	ang->z=0.0f;
}
예제 #5
0
void mouse_draw_dot()
{
	Vec3D position,cam;
	GraphicsView view;

	graphics_get_view(&view);
	camera_get_position(&cam);

	gluUnProject(__mouse.x, 768-__mouse.y, 0.99f, view.modelView, view.projection, view.viewPort, &position.x, &position.y, &position.z);
	
	position.x += cam.x;
	position.y += cam.y;
	position.z += cam.z;
	
	draw_dot_3D(position,
                  9,
                  vec3d(0,0,0),
                  1);
	draw_dot_3D(position,
                  6,
                  vec3d(1,1,1),
                  1);
}
예제 #6
0
void font_draw_text_custom(
    char    *text,
    int   x,
    int   y,
    Vec3D color,
    float alpha,
    Font *font
  )
{
  Vec3D pos,pos2,pos3,pos4,cam;
  int w,h;
  char *renderText = NULL;
  GLuint image;
  SDL_Surface *temp1 = NULL;
  SDL_Surface *temp = NULL;
  SDL_Surface *fontpic = NULL;
  SDL_Color colortype;
  GraphicsView view;

  if (!font_initialized())return;

  if((text == NULL) || 
      (strlen(text) <= 0))
  {
    slog("font:passed empty string for text draw.");
    return;
  }
  if (font == NULL)
  {
    slog("font: no font provided for draw.");
    return;
  }
  if (font->_font == NULL)
  {
    slog("font: bad Font provided for draw.");
    return;
  }
  camera_get_position(&cam);
  graphics_get_view(&view);
  colortype.r = 255 * color.x;
  colortype.g = 255 * color.y;
  colortype.b = 255 * color.z;
  colortype.a = SDL_ALPHA_OPAQUE;
  renderText = font_clean_control_characters(text);
  if (!renderText)
  {
    temp = TTF_RenderText_Blended(font->_font, text,colortype);
  }
  else
  {
    temp = TTF_RenderText_Blended(font->_font, renderText,colortype);
    free(renderText);
  }
  if (temp == NULL)
  {
    slog("font: unable to render text from SDL_ttf\n");
      return;
  }
  w = temp->w;
  h = temp->h;
  /*Creates an opengl compatable RGBA surface*/
  fontpic = SDL_CreateRGBSurface(0,w, h,view.depth,view.rMask,view.gMask,view.bMask,view.aMask);	
  /*Copies pixel data from the image to surface*/
  SDL_BlitSurface(temp, NULL, fontpic, NULL);
  SDL_FreeSurface(temp);

  glGenTextures(1, &image);
  glBindTexture(GL_TEXTURE_2D,image);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);  
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, fontpic->pixels); 
  SDL_FreeSurface(fontpic);
  glEnable(GL_TEXTURE_2D);
	
  x=x+w;
  y=y+h;


  opengl_get_gl_coordinate(
    x,
    y,
    0.99f,
    view.modelView,
    view.projection,
    view.viewPort,
    &pos.x,
    &pos.y,
    &pos.z
  );

  opengl_get_gl_coordinate(
    x,
    y-h,
    0.99f,
    view.modelView,
    view.projection,
    view.viewPort,
    &pos2.x,
    &pos2.y,
    &pos2.z
  );

  opengl_get_gl_coordinate(
    x-w,
    y-h,
    0.99f,
    view.modelView,
    view.projection,
    view.viewPort,
    &pos3.x,
    &pos3.y,
    &pos3.z
  );

  opengl_get_gl_coordinate(
    x-w,
    y,
    0.99f,
    view.modelView,
    view.projection,
    view.viewPort,
    &pos4.x,
    &pos4.y,
    &pos4.z
  );


  glEnable(GL_BLEND);
  glDisable(GL_DEPTH_TEST);
  glBegin( GL_QUADS );

  glTexCoord2f(0.0,0.0);
  glVertex3f(pos3.x + cam.x,pos3.y + cam.y,pos3.z + cam.z);

  glTexCoord2f(0.0,1.0);
  glVertex3f( pos4.x + cam.x,pos4.y + cam.y,pos4.z + cam.z);
	
  glTexCoord2f(1.0,1.0);
  glVertex3f( pos.x + cam.x,pos.y + cam.y,pos.z + cam.z);
	
  glTexCoord2f(1.0,0.0);
  glVertex3f( pos2.x + cam.x,pos2.y + cam.y,pos2.z + cam.z);
	
  glEnd( );
  glEnable(GL_DEPTH_TEST);
  
  glDisable(GL_TEXTURE_2D);
  glDisable(GL_BLEND);
  glDeleteTextures(1, &image);
}
예제 #7
0
파일: render.c 프로젝트: RealSfera/VRender
void render_update(double last_frame_time)
{
	static int isolevel_offset = 1;
	matrix4f model_inv_mat4;
	matrix3f model_inv_mat3;
	vector3f camera_pos;
	
	IF_FAILED(init);
	
	mat4(modelmat, 1.0f);
	
	last_time = last_frame_time;
	
	// обновляем камеру (позицию и т.п)
	update_camera(last_frame_time);
	
	// поулчаем параметры камеры
	camera_pos = camera_get_position(&camera);
	camera_get_view_matrix(&camera, viewmat);
	camera_get_projection_matrix(&camera, projectionmat);
	
	// обновляем вращение объекта (arcball)
	update_object_orientation();
	mat4_mult2(modelmat, rotmat, modelmat);
	
	// смещаем объект
	matrix4f translatemat;
	mat4_translate(translatemat, -0.5f, -0.5f, -0.5f);
	mat4_mult2(modelmat, modelmat, translatemat);
	
	// вращаем источник света
	if(light_animate) {
		light_rot_angle += light_rot_step;
		if(light_rot_angle > 360.0f) light_rot_angle = 0.0f;
	}
	
	matrix4f light_mat;
	mat4_rotate_axis(light_mat, light_rot_angle, vec3f(0.0f, 1.0f, 0.0f));
	new_light_position = mat4_mult_vec3(light_mat, light_position);
	
	
	// изменяем изо-уровень
	if(isolevel_animate) {
		
		isolevel += isolevel_step * isolevel_offset;
		
		if(isolevel_begin <= isolevel_end) {
			if(isolevel >= isolevel_end)
				isolevel_offset = -1;
			else if(isolevel < isolevel_begin)
				isolevel_offset = 1;
		} else {
			if(isolevel < isolevel_end)
				isolevel_offset = 1;
			else if(isolevel >= isolevel_begin)
				isolevel_offset = -1;
		}
		
	}
	
	mat4_inverse(model_inv_mat4, modelmat);
	mat4_submat(model_inv_mat3, 3, 3, model_inv_mat4);
	
	// обновляем вершинные буферы
	if(isolevel_animate)
		render_update_mc();
	
	shader_program_bind(&program);
	
	// устанавливаем юниформы
	glUniformMatrix4fv(uniform_modelmat, 1, GL_TRUE, (const GLfloat *) modelmat);
	glUniformMatrix4fv(uniform_viewmat, 1, GL_TRUE, (const GLfloat *) viewmat);
	glUniformMatrix4fv(uniform_projectionmat, 1, GL_TRUE, (const GLfloat *) projectionmat);
	glUniformMatrix3fv(uniform_model_inv, 1, GL_TRUE, (const GLfloat *) model_inv_mat3);
	glUniform3f(uniform_light_pos, new_light_position.x, new_light_position.y, new_light_position.z);
	glUniform3f(uniform_viewer_pos, camera_pos.x, camera_pos.y, camera_pos.z);

	glUniform1f(uniform_coef_ambient, coef_ambient);
	glUniform1f(uniform_coef_diffuse, coef_diffuse);
	glUniform1f(uniform_coef_specular, coef_specular);
	glUniform1f(uniform_material_shininess, material_shininess);
	glUniform1f(uniform_coef_gamma, coef_gamma);
	glUniform3f(uniform_material_front_color, material_front_color.x, material_front_color.y, material_front_color.z);
	glUniform3f(uniform_material_back_color, material_back_color.x, material_back_color.y, material_back_color.z);
	glUniform3f(uniform_light_color, light_color.x, light_color.y, light_color.z);
	glUniform3f(uniform_light_spec_color, light_spec_color.x, light_spec_color.y, light_spec_color.z);
	
	shader_program_unbind(&program);

}