#include <algorithm>
#include <msp/gl/extensions/arb_occlusion_query.h>
+#include <msp/gl/extensions/arb_occlusion_query2.h>
#include "camera.h"
#include "occludedscene.h"
+#include "programbuilder.h"
#include "renderer.h"
#include "sphere.h"
using namespace std;
-namespace {
-
-const char vshader[] =
- "void main()\n"
- "{\n"
- " gl_Position = gl_ProjectionMatrix*gl_ModelViewMatrix*gl_Vertex;\n"
- "}";
-
-const char fshader[] =
- "void main()\n"
- "{\n"
- " gl_FragColor = vec4(1.0);\n"
- "}";
-
-}
-
namespace Msp {
namespace GL {
OccludedScene::OccludedScene():
bounding_mesh((VERTEX3, NORMAL3)),
- bounding_shader(vshader, fshader),
+ bounding_shader(ProgramBuilder::StandardFeatures()),
occluder_min_size(0.25f),
cache_dirty(false)
{
static Require req(ARB_occlusion_query);
+ static Require req2(ARB_occlusion_query2);
/* Use a slightly larger radius to ensure that all parts of the renderable
fit inside the icosahedron */
for(OccludedArray::const_iterator i=occluded_cache.begin(); (i!=occluded_cache.end() && i->in_frustum); ++i)
if(!i->occluder)
{
- glBeginQuery(GL_SAMPLES_PASSED, i->query);
+ glBeginQuery(GL_ANY_SAMPLES_PASSED, i->query);
Renderer::Push push2(renderer);
renderer.transform(Matrix(*i->renderable->get_matrix())
.translate(i->bounding_sphere->get_center())
.scale(i->bounding_sphere->get_radius()));
bounding_mesh.draw(renderer);
- glEndQuery(GL_SAMPLES_PASSED);
+ glEndQuery(GL_ANY_SAMPLES_PASSED);
}
glColorMask(true, true, true, true);
for(OccludedArray::const_iterator i=occluded_cache.begin(); (i!=occluded_cache.end() && i->in_frustum); ++i)
if(!i->occluder)
{
- int samples_passed;
- glGetQueryObjectiv(i->query, GL_QUERY_RESULT, &samples_passed);
- if(samples_passed>0)
+ unsigned any_passed = 0;
+ glGetQueryObjectuiv(i->query, GL_QUERY_RESULT, &any_passed);
+ if(any_passed)
renderer.render(*i->renderable, tag);
}
}