void render_sun_lamp(struct lamp *lamp, mat4 clip_from_view, mat4 view_from_world, mat4 lamp_transform) { static int prog = 0; static int uni_viewport; static int uni_lamp_direction; static int uni_lamp_color; static const vec3 lamp_direction_init = { 0, 0, 1 }; vec2 viewport; vec3 lamp_direction_world; vec3 lamp_direction_view; vec3 lamp_direction; vec3 lamp_color; if (!prog) { prog = compile_shader(quad_vert_src, sun_frag_src); uni_viewport = glGetUniformLocation(prog, "viewport"); uni_lamp_direction = glGetUniformLocation(prog, "lamp_direction"); uni_lamp_color = glGetUniformLocation(prog, "lamp_color"); } viewport[0] = fbo_w; viewport[1] = fbo_h; mat_vec_mul_n(lamp_direction_world, lamp_transform, lamp_direction_init); mat_vec_mul_n(lamp_direction_view, view_from_world, lamp_direction_world); vec_normalize(lamp_direction, lamp_direction_view); vec_scale(lamp_color, lamp->color, lamp->energy); glUseProgram(prog); glUniform2fv(uni_viewport, 1, viewport); glUniform3fv(uni_lamp_direction, 1, lamp_direction); glUniform3fv(uni_lamp_color, 1, lamp_color); draw_fullscreen_quad(); }
void model_iqm_animate (struct iqm_model *model, struct iqm_animations *animations, int a, int f, float t) { int i; a %= animations->num_anims; f %= animations->anims[a]->count; printf ("anim %d frame %d\n", a, f); int *table = _match_bones (model, animations->anims[a]); _get_delta (model, animations->anims[a], table, f); if (model->dnorm == NULL) { model->dnorm = malloc (model->num_vertices * 3 * sizeof(float)); } if (model->dpos == NULL) { model->dpos = malloc (model->num_vertices * 3 * sizeof(float)); } for (i=0; i<model->num_vertices; i++) { unsigned char *bi = &model->blend_index[i*4]; //unsigned char *bw = &model->blend_weight[i*4]; mat_vec_mul (model->dpos + i*3, model->skeleton->bones[bi[0]].diff, model->pos + i*3); mat_vec_mul_n (model->dnorm + i*3, model->skeleton->bones[bi[0]].diff, model->norm + i*3); } }
void render_spot_lamp(struct lamp *lamp, mat4 clip_from_view, mat4 view_from_world, mat4 lamp_transform) { static int prog = 0; static int uni_viewport; static int uni_view_from_clip; static int uni_lamp_position; static int uni_lamp_direction; static int uni_lamp_color; static int uni_lamp_distance; static int uni_spot_size; static int uni_spot_blend; static int uni_use_sphere; static const vec3 lamp_direction_init = { 0, 0, 1 }; mat4 view_from_clip; vec2 viewport; vec3 lamp_position; vec3 lamp_direction_world; vec3 lamp_direction_view; vec3 lamp_direction; vec3 lamp_color; float spot_size; float spot_blend; if (!prog) { prog = compile_shader(quad_vert_src, spot_frag_src); uni_viewport = glGetUniformLocation(prog, "viewport"); uni_view_from_clip = glGetUniformLocation(prog, "view_from_clip"); uni_lamp_position = glGetUniformLocation(prog, "lamp_position"); uni_lamp_direction = glGetUniformLocation(prog, "lamp_direction"); uni_lamp_color = glGetUniformLocation(prog, "lamp_color"); uni_lamp_distance = glGetUniformLocation(prog, "lamp_distance"); uni_spot_size = glGetUniformLocation(prog, "spot_size"); uni_spot_blend = glGetUniformLocation(prog, "spot_blend"); uni_use_sphere = glGetUniformLocation(prog, "use_sphere"); } mat_invert(view_from_clip, clip_from_view); viewport[0] = fbo_w; viewport[1] = fbo_h; mat_vec_mul(lamp_position, view_from_world, lamp_transform + 12); mat_vec_mul_n(lamp_direction_world, lamp_transform, lamp_direction_init); mat_vec_mul_n(lamp_direction_view, view_from_world, lamp_direction_world); vec_normalize(lamp_direction, lamp_direction_view); vec_scale(lamp_color, lamp->color, lamp->energy); spot_size = cos(M_PI * lamp->spot_angle / 360.0); spot_blend = (1.0 - spot_size) * lamp->spot_blend; glUseProgram(prog); glUniform2fv(uni_viewport, 1, viewport); glUniformMatrix4fv(uni_view_from_clip, 1, 0, view_from_clip); glUniform3fv(uni_lamp_position, 1, lamp_position); glUniform3fv(uni_lamp_direction, 1, lamp_direction); glUniform3fv(uni_lamp_color, 1, lamp_color); glUniform1f(uni_lamp_distance, lamp->distance); glUniform1f(uni_spot_size, spot_size); glUniform1f(uni_spot_blend, spot_blend); glUniform1i(uni_use_sphere, lamp->use_sphere); draw_fullscreen_quad(); }