コード例 #1
0
ファイル: render.c プロジェクト: ccxvii/mio
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();
}
コード例 #2
0
ファイル: model-iqm.c プロジェクト: mksn/objview
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);
    }
}
コード例 #3
0
ファイル: render.c プロジェクト: ccxvii/mio
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();
}