Exemplo n.º 1
0
void gear_draw(gear_t* self, a3d_mat4f_t* mvp, a3d_mat4f_t* mvm)
{
	assert(self);
	LOGD("debug");

	a3d_mat3f_t nm;
	a3d_mat4f_normalmatrix(mvm, &nm);

	a3d_vec3f_t light_position;
	a3d_vec3f_load(&light_position, 5.0f, 5.0f, 10.0);
	a3d_vec3f_normalize(&light_position);   // TODO - optimize

	// front, back, front teeth and back teeth
	glUseProgram(self->face_program);
	glEnableVertexAttribArray(self->face_attribute_vertex);

	// compute color for flat shaded surface
	a3d_vec3f_t normal_front;
	a3d_vec4f_t color;
	a3d_vec3f_load(&normal_front, 0.0f, 0.0f, 1.0f);
	a3d_mat3f_mulv(&nm, &normal_front);
	a3d_vec3f_normalize(&normal_front);
	a3d_vec4f_load(&color, 0.2f, 0.2f, 0.2f, 1.0f);   // ambient
	GLfloat ndotlp = a3d_vec3f_dot(&normal_front, &light_position);
	if(ndotlp > 0.0f)
	{
		a3d_vec4f_t diffuse;
		a3d_vec4f_load(&diffuse, ndotlp, ndotlp, ndotlp, 0.0f);
		a3d_vec4f_addv(&color, &diffuse);       // ambient + diffuse
		a3d_vec4f_mulv(&color, &self->color);   // color * (ambient + diffuse)
	}
	else
	{
		a3d_vec4f_mulv(&color, &self->color);
	}

	glUniform4fv(self->face_uniform_color, 1, (GLfloat*) &color);
	glUniformMatrix4fv(self->face_uniform_mvp, 1, GL_FALSE, (GLfloat*) mvp);
	glBindBuffer(GL_ARRAY_BUFFER, self->front_vid);
	glVertexAttribPointer(self->face_attribute_vertex, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glDrawArrays(GL_TRIANGLE_STRIP, 0, self->front_ec);

	glBindBuffer(GL_ARRAY_BUFFER, self->front_teeth_vid);
	glVertexAttribPointer(self->face_attribute_vertex, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glDrawArrays(GL_TRIANGLES, 0, self->front_teeth_ec);

	// compute color for flat shaded surface
	a3d_vec3f_t normal_back;
	a3d_vec3f_load(&normal_back, 0.0f, 0.0f, -1.0f);
	a3d_mat3f_mulv(&nm, &normal_back);
	a3d_vec3f_normalize(&normal_back);
	a3d_vec4f_load(&color, 0.2f, 0.2f, 0.2f, 1.0f);   // reload ambient
	ndotlp = a3d_vec3f_dot(&normal_back, &light_position);
	if(ndotlp > 0.0f)
	{
		a3d_vec4f_t diffuse;
		a3d_vec4f_load(&diffuse, ndotlp, ndotlp, ndotlp, 0.0f);
		a3d_vec4f_addv(&color, &diffuse);       // ambient + diffuse
		a3d_vec4f_mulv(&color, &self->color);   // color * (ambient + diffuse)
	}
	else
	{
		a3d_vec4f_mulv(&color, &self->color);
	}

	glUniform4fv(self->face_uniform_color, 1, (GLfloat*) &color);
	glBindBuffer(GL_ARRAY_BUFFER, self->back_vid);
	glVertexAttribPointer(self->face_attribute_vertex, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glDrawArrays(GL_TRIANGLE_STRIP, 0, self->back_ec);

	glBindBuffer(GL_ARRAY_BUFFER, self->back_teeth_vid);
	glVertexAttribPointer(self->face_attribute_vertex, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glDrawArrays(GL_TRIANGLES, 0, self->back_teeth_ec);

	glDisableVertexAttribArray(self->face_attribute_vertex);

	// outward teeth
	glUseProgram(self->outward_program);
	glEnableVertexAttribArray(self->outward_attribute_vertex);
	glEnableVertexAttribArray(self->outward_attribute_normal);

	glUniform4fv(self->outward_uniform_color, 1, (GLfloat*) &self->color);
	glUniformMatrix3fv(self->outward_uniform_nm, 1, GL_FALSE, (GLfloat*) &nm);
	glUniformMatrix4fv(self->outward_uniform_mvp, 1, GL_FALSE, (GLfloat*) mvp);
	glBindBuffer(GL_ARRAY_BUFFER, self->outward_vid);
	glVertexAttribPointer(self->outward_attribute_vertex, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glBindBuffer(GL_ARRAY_BUFFER, self->outward_nid);
	glVertexAttribPointer(self->outward_attribute_normal, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glDrawArrays(GL_TRIANGLE_STRIP, 0, self->outward_ec);

	glDisableVertexAttribArray(self->outward_attribute_normal);
	glDisableVertexAttribArray(self->outward_attribute_vertex);

	// cylinder
	glUseProgram(self->cylinder_program);
	glEnableVertexAttribArray(self->cylinder_attribute_vertex);
	glEnableVertexAttribArray(self->cylinder_attribute_normal);

	glUniform4fv(self->cylinder_uniform_color, 1, (GLfloat*) &self->color);
	glUniformMatrix3fv(self->cylinder_uniform_nm, 1, GL_FALSE, (GLfloat*) &nm);
	glUniformMatrix4fv(self->cylinder_uniform_mvp, 1, GL_FALSE, (GLfloat*) mvp);
	glBindBuffer(GL_ARRAY_BUFFER, self->cylinder_vid);
	glVertexAttribPointer(self->cylinder_attribute_vertex, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glBindBuffer(GL_ARRAY_BUFFER, self->cylinder_nid);
	glVertexAttribPointer(self->cylinder_attribute_normal, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glDrawArrays(GL_TRIANGLE_STRIP, 0, self->cylinder_ec);

	glDisableVertexAttribArray(self->cylinder_attribute_normal);
	glDisableVertexAttribArray(self->cylinder_attribute_vertex);
	glUseProgram(0);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
}
Exemplo n.º 2
0
a3d_widget_t* a3d_widget_new(struct a3d_screen_s* screen,
                             int wsize,
                             int anchor,
                             int wrapx, int wrapy,
                             int stretch_mode,
                             float stretch_factor,
                             int style_border,
                             int style_line,
                             a3d_vec4f_t* color_line,
                             a3d_vec4f_t* color_fill,
                             a3d_widget_reflow_fn reflow_fn,
                             a3d_widget_size_fn size_fn,
                             a3d_widget_click_fn click_fn,
                             a3d_widget_layout_fn layout_fn,
                             a3d_widget_drag_fn drag_fn,
                             a3d_widget_draw_fn draw_fn,
                             a3d_widget_fade_fn fade_fn,
                             a3d_widget_refresh_fn refresh_fn)
{
	// reflow_fn, size_fn, click_fn, layout_fn, refresh_fn and draw_fn may be NULL
	assert(screen);
	assert(color_line);
	assert(color_fill);
	LOGD("debug wsize=%i, anchor=%i, wrapx=%i, wrapy=%i",
	     wsize, anchor, wrapx, wrapy);
	LOGD("debug stretch_mode=%i, stretch_factor=%f, style_border=%i, style_line=%i",
	     stretch_mode, stretch_factor, style_border, style_line);
	LOGD("debug color_line: r=%f, g=%f, b=%f, a=%f",
	     color_line->r, color_line->g, color_line->b, color_line->a);
	LOGD("debug color_fill: r=%f, g=%f, b=%f, a=%f",
	     color_fill->r, color_fill->g, color_fill->b, color_fill->a);

	if(wsize == 0)
	{
		wsize = sizeof(a3d_widget_t);
	}

	a3d_widget_t* self = (a3d_widget_t*) malloc(wsize);
	if(self == NULL)
	{
		LOGE("malloc failed");
		return NULL;
	}

	self->screen         = screen;
	self->priv           = NULL;
	self->drag_dx        = 0.0f;
	self->drag_dy        = 0.0f;
	self->anchor         = anchor;
	self->wrapx          = wrapx;
	self->wrapy          = wrapy;
	self->stretch_mode   = stretch_mode;
	self->stretch_factor = stretch_factor;
	self->style_border   = style_border;
	self->style_line     = style_line;
	self->scroll_bar     = 0;
	self->reflow_fn      = reflow_fn;
	self->size_fn        = size_fn;
	self->click_fn       = click_fn;
	self->keyPress_fn    = NULL;
	self->layout_fn      = layout_fn;
	self->drag_fn        = drag_fn;
	self->refresh_fn     = refresh_fn;
	self->draw_fn        = draw_fn;
	self->fade_fn        = fade_fn;
	self->fade           = 0.0f;
	self->sound_fx       = 1;

	a3d_rect4f_init(&self->rect_draw, 0.0f, 0.0f, 0.0f, 0.0f);
	a3d_rect4f_init(&self->rect_clip, 0.0f, 0.0f, 0.0f, 0.0f);
	a3d_rect4f_init(&self->rect_border, 0.0f, 0.0f, 0.0f, 0.0f);
	a3d_vec4f_copy(color_line, &self->color_line);
	a3d_vec4f_copy(color_fill, &self->color_fill);
	a3d_vec4f_load(&self->color_fill2,  0.0f, 0.0f, 0.0f, 0.0f);
	a3d_vec4f_load(&self->color_scroll0, 0.0f, 0.0f, 0.0f, 0.0f);
	a3d_vec4f_load(&self->color_scroll1, 0.0f, 0.0f, 0.0f, 0.0f);
	self->tone_y2    = 0.0f;

	glGenBuffers(1, &self->id_vtx_rect);
	glGenBuffers(1, &self->id_vtx_line);
	glGenBuffers(1, &self->scroll_id_vtx_rect);

	if(a3d_widget_shaders(self) == 0)
	{
		goto fail_shaders;
	}

	// success
	return self;

	// failure
	fail_shaders:
		free(self);
	return NULL;
}