Ejemplo n.º 1
0
inline void vertex_buffer_object<Ta, Te>::draw() const
{
    if( m_elements.is_valid() )
        draw_elements( 0, m_elements.count() );
    else
        draw_vertices( 0, m_vertices.count() );
}
Ejemplo n.º 2
0
void DeferredShading::draw_box(const Vec3 &min, const Vec3 &max)
{
	const Vec3 vs[] = {
		Vec3(min.x, min.y, min.z),
		Vec3(max.x, min.y, min.z),
		Vec3(min.x, max.y, min.z),
		Vec3(max.x, max.y, min.z),
		Vec3(min.x, min.y, max.z),
		Vec3(max.x, min.y, max.z),
		Vec3(min.x, max.y, max.z),
		Vec3(max.x, max.y, max.z),
	};

	// quad vertices
	// a b
	// c d
	// (when quad normal looks towards viewer)
	auto quad = [&](const Vec3 &a, const Vec3 &b, const Vec3 &c, const Vec3 &d) {
		vertex_buf.append({b, a, c});
		vertex_buf.append({d, b, c});
	};

	vertex_buf.clear();
	quad(vs[5], vs[4], vs[1], vs[0]);
	quad(vs[4], vs[6], vs[0], vs[2]);
	quad(vs[6], vs[7], vs[2], vs[3]);
	quad(vs[7], vs[5], vs[3], vs[1]);
	quad(vs[7], vs[6], vs[5], vs[4]);
	quad(vs[1], vs[0], vs[3], vs[2]);

	quad(vs[4], vs[5], vs[0], vs[1]);
	quad(vs[6], vs[4], vs[2], vs[0]);
	quad(vs[7], vs[6], vs[3], vs[2]);
	quad(vs[5], vs[7], vs[1], vs[3]);
	quad(vs[6], vs[7], vs[4], vs[5]);
	quad(vs[0], vs[1], vs[2], vs[3]);

	draw_vertices(vertex_stream, vertex_buf);
}
Ejemplo n.º 3
0
void DeferredShading::draw_frustum(const Frustum &f)
{
	Vec3 far[4];
	copy(Slice<Vec3>(far), Slice<const Vec3>(f.far));
	Vec3 near[4];
	copy(Slice<Vec3>(near), Slice<const Vec3>(f.near));
	Vec3 middle(0);
	for (int i = 0; i < 4; i++) {
		middle += near[i];
		middle += far[i];
	}
	middle /= Vec3(8);

	for (int i = 0; i < 4; i++) {
		Vec3 tmp;

		tmp = near[i] - middle;
		tmp *= Vec3(0.9);
		near[i] = middle + tmp;

		tmp = far[i] - middle;
		tmp *= Vec3(0.9);
		far[i] = middle + tmp;
	}

	/*
	for (int i = 0; i < 4; i++) {
		const Vec3 dir = Normalize(near[i] - far[i]);
		near[i] = far[i] + dir * Vec3(1500.0);
	}
	*/
	vertex_buf.clear();
	// quad vertices
	// a b
	// c d
	// (when quad normal looks towards viewer)
	auto quad = [&](const Vec3 &a, const Vec3 &b, const Vec3 &c, const Vec3 &d) {
		vertex_buf.append({b, a, c});
		vertex_buf.append({d, b, c});
	};

	// far
	quad(far[FPC_TOP_LEFT], far[FPC_TOP_RIGHT],
		far[FPC_BOTTOM_LEFT], far[FPC_BOTTOM_RIGHT]);
	// near
	quad(near[FPC_TOP_RIGHT], near[FPC_TOP_LEFT],
		near[FPC_BOTTOM_RIGHT], far[FPC_BOTTOM_LEFT]);
	// left
	quad(near[FPC_TOP_LEFT], far[FPC_TOP_LEFT],
		near[FPC_BOTTOM_LEFT], far[FPC_BOTTOM_LEFT]);
	// right
	quad(far[FPC_TOP_RIGHT], near[FPC_TOP_RIGHT],
		far[FPC_BOTTOM_RIGHT], near[FPC_BOTTOM_RIGHT]);
	// bottom
	quad(far[FPC_BOTTOM_LEFT], far[FPC_BOTTOM_RIGHT],
		near[FPC_BOTTOM_LEFT], near[FPC_BOTTOM_RIGHT]);
	// top
	quad(near[FPC_TOP_LEFT], near[FPC_TOP_RIGHT],
		far[FPC_TOP_LEFT], far[FPC_TOP_RIGHT]);
	draw_vertices(vertex_stream, vertex_buf);
}