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() ); }
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); }
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); }