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); } }
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); }
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); }
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; }
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); }
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); }
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); }