X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fzsortedscene.cpp;fp=source%2Fzsortedscene.cpp;h=da406b7ef0074f19a0e125c328d93595ed43d03d;hp=0000000000000000000000000000000000000000;hb=c87860db3b23a98eda1adfe59acddffdb6eb8420;hpb=78328c5f6e4dcbe883a3f5e4fe0974ab490be3f7 diff --git a/source/zsortedscene.cpp b/source/zsortedscene.cpp new file mode 100644 index 00000000..da406b7e --- /dev/null +++ b/source/zsortedscene.cpp @@ -0,0 +1,67 @@ +#include "camera.h" +#include "renderer.h" +#include "zsortedscene.h" + +using namespace std; + +namespace Msp { +namespace GL { + +ZSortedScene::ZSortedScene(): + order(BACK_TO_FRONT), + reference(FURTHEST) +{ } + +void ZSortedScene::set_order(SortOrder o) +{ + order = o; +} + +void ZSortedScene::set_reference(DepthReference r) +{ + reference = r; +} + +void ZSortedScene::render(Renderer &renderer, const Tag &tag) const +{ + const Camera *camera = renderer.get_camera(); + if(!camera) + return SimpleScene::render(renderer, tag); + + const Matrix &view_matrix = camera->get_matrix(); + + std::vector sorted_renderables; + sorted_renderables.reserve(renderables.size()); + + float radius_factor = 1.0f-reference; + float sign = order*2.0f-1.0f; + + setup_cullers(renderer); + for(RenderableSet::const_iterator i=renderables.begin(); i!=renderables.end(); ++i) + if(!cull(renderer, **i)) + { + float z = 0; + if(const Matrix *model_matrix = (*i)->get_matrix()) + { + if(const Geometry::BoundingSphere *bsphere = (*i)->get_bounding_sphere()) + z = (view_matrix**model_matrix*Vector4(bsphere->get_center(), 1.0f)).z+bsphere->get_radius()*radius_factor; + else + z = (view_matrix**model_matrix*Vector4(0.0f, 0.0f, 0.0f, 1.0f)).z; + } + sorted_renderables.push_back(DepthRenderable(z*sign, *i)); + } + + sort(sorted_renderables.begin(), sorted_renderables.end()); + + for(vector::const_iterator i=sorted_renderables.begin(); i!=sorted_renderables.end(); ++i) + i->renderable->render(renderer, tag); +} + + +ZSortedScene::DepthRenderable::DepthRenderable(float d, const Renderable *r): + depth(d), + renderable(r) +{ } + +} // namespace GL +} // namespace Msp