void RenderBatchTriangle::draw_glyph_subpixel(Canvas &canvas, const Rectf &src, const Rectf &dest, const Colorf &color, const Texture2D &texture)
{
	int texindex = set_batcher_active(canvas, texture, true, color);

	vertices[position+0].position = to_position(dest.left, dest.top);
	vertices[position+1].position = to_position(dest.right, dest.top);
	vertices[position+2].position = to_position(dest.left, dest.bottom);
	vertices[position+3].position = to_position(dest.right, dest.top);
	vertices[position+4].position = to_position(dest.right, dest.bottom);
	vertices[position+5].position = to_position(dest.left, dest.bottom);
	float src_left = (src.left)/tex_sizes[texindex].width;
	float src_top = (src.top) / tex_sizes[texindex].height;
	float src_right = (src.right)/tex_sizes[texindex].width;
	float src_bottom = (src.bottom) / tex_sizes[texindex].height;
	vertices[position+0].texcoord = Vec2f(src_left, src_top);
	vertices[position+1].texcoord = Vec2f(src_right, src_top);
	vertices[position+2].texcoord = Vec2f(src_left, src_bottom);
	vertices[position+3].texcoord = Vec2f(src_right, src_top);
	vertices[position+4].texcoord = Vec2f(src_right, src_bottom);
	vertices[position+5].texcoord = Vec2f(src_left, src_bottom);
	for (int i=0; i<6; i++)
	{
		vertices[position+i].color = Vec4f(1.0f, 1.0f, 1.0f, 1.0f);
		vertices[position+i].texindex = texindex;
	}
	position += 6;
}
void CL_RenderBatch3D::draw_image(CL_GraphicContext &gc, const CL_Rectf &src, const CL_Rectf &dest, const CL_Colorf &color, const CL_Texture &texture)
{
	int texindex = set_batcher_active(gc, texture);
	vertices[position+0].position = to_position(dest.left, dest.top);
	vertices[position+1].position = to_position(dest.right, dest.top);
	vertices[position+2].position = to_position(dest.left, dest.bottom);
	vertices[position+3].position = to_position(dest.right, dest.top);
	vertices[position+4].position = to_position(dest.right, dest.bottom);
	vertices[position+5].position = to_position(dest.left, dest.bottom);
	float src_left = (src.left)/tex_sizes[texindex].width;
	float src_top = (src.top) / tex_sizes[texindex].height;
	float src_right = (src.right)/tex_sizes[texindex].width;
	float src_bottom = (src.bottom) / tex_sizes[texindex].height;
	vertices[position+0].texcoord = CL_Vec2f(src_left, src_top);
	vertices[position+1].texcoord = CL_Vec2f(src_right, src_top);
	vertices[position+2].texcoord = CL_Vec2f(src_left, src_bottom);
	vertices[position+3].texcoord = CL_Vec2f(src_right, src_top);
	vertices[position+4].texcoord = CL_Vec2f(src_right, src_bottom);
	vertices[position+5].texcoord = CL_Vec2f(src_left, src_bottom);
	for (int i=0; i<6; i++)
	{
		vertices[position+i].color = CL_Vec4f(color.r, color.g, color.b, color.a);
		vertices[position+i].texindex.x = (float)texindex;
	}
	position += 6;
}
void RenderBatchTriangle::draw_image(Canvas &canvas, const Rectf &src, const Quadf &dest, const Colorf &color, const Texture2D &texture)
{
	int texindex = set_batcher_active(canvas, texture);

	vertices[position+0].position = to_position(dest.p.x, dest.p.y);
	vertices[position+1].position = to_position(dest.q.x, dest.q.y);
	vertices[position+2].position = to_position(dest.s.x, dest.s.y);
	vertices[position+3].position = to_position(dest.q.x, dest.q.y);
	vertices[position+4].position = to_position(dest.r.x, dest.r.y);
	vertices[position+5].position = to_position(dest.s.x, dest.s.y);
	float src_left = (src.left)/tex_sizes[texindex].width;
	float src_top = (src.top) / tex_sizes[texindex].height;
	float src_right = (src.right)/tex_sizes[texindex].width;
	float src_bottom = (src.bottom) / tex_sizes[texindex].height;
	vertices[position+0].texcoord = Vec2f(src_left, src_top);
	vertices[position+1].texcoord = Vec2f(src_right, src_top);
	vertices[position+2].texcoord = Vec2f(src_left, src_bottom);
	vertices[position+3].texcoord = Vec2f(src_right, src_top);
	vertices[position+4].texcoord = Vec2f(src_right, src_bottom);
	vertices[position+5].texcoord = Vec2f(src_left, src_bottom);
	for (int i=0; i<6; i++)
	{
		vertices[position+i].color = Vec4f(color.r, color.g, color.b, color.a);
		vertices[position+i].texindex = texindex;
	}
	position += 6;
}
void RenderBatchLine::draw_line_strip(Canvas &canvas, const Vec2f *line_positions, const Vec4f &line_color, int num_vertices)
{
	if (num_vertices < 2)
	{
		return;	// Invalid line strip, we ignore this. It could be null call to this function
	}

	// We convert a line strip to a line
	num_vertices -=1;
	set_batcher_active(canvas, num_vertices * 2);


	Vec4f next_start_position = to_position(line_positions->x, line_positions->y);

	for (; num_vertices > 0; num_vertices--)
	{
		vertices[position].color = line_color;
		vertices[position].position = next_start_position;
		line_positions++;
		position++;

		vertices[position].color = line_color;
		next_start_position = to_position(line_positions->x, line_positions->y);
		vertices[position].position = next_start_position;
		position++;
	}
}
void CL_RenderBatch3D::draw_sprite(CL_GraphicContext &gc, const CL_Surface_DrawParams1 *params, const CL_Texture &texture)
{
	int texindex = set_batcher_active(gc, texture);

	to_sprite_vertex(params, 0, vertices[position++], texindex);
	to_sprite_vertex(params, 1, vertices[position++], texindex);
	to_sprite_vertex(params, 2, vertices[position++], texindex);
	to_sprite_vertex(params, 1, vertices[position++], texindex);
	to_sprite_vertex(params, 3, vertices[position++], texindex);
	to_sprite_vertex(params, 2, vertices[position++], texindex);
}
void RenderBatchTriangle::draw_sprite(Canvas &canvas, const Pointf texture_position[4], const Pointf dest_position[4], const Texture2D &texture, const Colorf &color)
{
	int texindex = set_batcher_active(canvas, texture);

	to_sprite_vertex(texture_position[0], dest_position[0], vertices[position++], texindex, color);
	to_sprite_vertex(texture_position[1], dest_position[1], vertices[position++], texindex, color);
	to_sprite_vertex(texture_position[2], dest_position[2], vertices[position++], texindex, color);
	to_sprite_vertex(texture_position[1], dest_position[1], vertices[position++], texindex, color);
	to_sprite_vertex(texture_position[3], dest_position[3], vertices[position++], texindex, color);
	to_sprite_vertex(texture_position[2], dest_position[2], vertices[position++], texindex, color);
}
Example #7
0
void RenderBatchPoint::draw_point(Canvas &canvas, Vec2f *line_positions, const Vec4f &point_color, int num_vertices)
{
	set_batcher_active(canvas, num_vertices);


	for (; num_vertices > 0; num_vertices--)
	{
		vertices[position].color = point_color;
		vertices[position].position = to_position(line_positions->x, line_positions->y);
		line_positions++;
		position++;
	}

}
void RenderBatchTriangle::fill_triangles(Canvas &canvas, const Vec2f *positions, const Vec2f *texture_positions, int num_vertices, const Texture2D &texture, const Colorf *colors)
{
	int texindex = set_batcher_active(canvas, texture);

	for (; num_vertices > 0; num_vertices--)
	{
		vertices[position].color = *(colors++);
		vertices[position].position = to_position(positions->x, positions->y);
		positions++;
		vertices[position].texcoord = *(texture_positions++);
		vertices[position].texindex = texindex;
		position++;
	}
}
void RenderBatchTriangle::fill_triangle(Canvas &canvas, const Vec2f *triangle_positions, const Colorf &color, int num_vertices)
{
	int texindex = set_batcher_active(canvas, num_vertices);


	for (; num_vertices > 0; num_vertices--)
	{
		vertices[position].color = color;
		vertices[position].position = to_position(triangle_positions->x, triangle_positions->y);
		triangle_positions++;
		vertices[position].texcoord = Vec2f(0.0f, 0.0f);
		vertices[position].texindex = texindex;
		position++;
	}
}
void CL_RenderBatch3D::fill(CL_GraphicContext &gc, float x1, float y1, float x2, float y2, const CL_Colorf &color)
{
	int texindex = set_batcher_active(gc);
	vertices[position+0].position = to_position(x1, y1);
	vertices[position+1].position = to_position(x2, y1);
	vertices[position+2].position = to_position(x1, y2);
	vertices[position+3].position = to_position(x2, y1);
	vertices[position+4].position = to_position(x2, y2);
	vertices[position+5].position = to_position(x1, y2);
	for (int i=0; i<6; i++)
	{
		vertices[position+i].color = CL_Vec4f(color.r, color.g, color.b, color.a);
		vertices[position+i].texcoord = CL_Vec2f(0.0f, 0.0f);
		vertices[position+i].texindex.x = (float)texindex;
	}
	position += 6;
}
void RenderBatchTriangle::fill(Canvas &canvas, float x1, float y1, float x2, float y2, const Colorf &color)
{
	int texindex = set_batcher_active(canvas);

	vertices[position+0].position = to_position(x1, y1);
	vertices[position+1].position = to_position(x2, y1);
	vertices[position+2].position = to_position(x1, y2);
	vertices[position+3].position = to_position(x2, y1);
	vertices[position+4].position = to_position(x2, y2);
	vertices[position+5].position = to_position(x1, y2);
	for (int i=0; i<6; i++)
	{
		vertices[position+i].color = Vec4f(color.r, color.g, color.b, color.a);
		vertices[position+i].texcoord = Vec2f(0.0f, 0.0f);
		vertices[position+i].texindex = texindex;
	}
	position += 6;
}