]> git.tdb.fi Git - libs/gl.git/blobdiff - source/rendertarget.cpp
Fix a texture data indexing bug in AmbientOcclusion
[libs/gl.git] / source / rendertarget.cpp
index 376af04877a4b324dd53518203b489c662b034c2..239180f5e52b9032807a6a9943ecf468e736bc18 100644 (file)
@@ -46,7 +46,7 @@ RenderTargetFormat RenderTargetFormat::operator,(PixelFormat f) const
        }
        else
        {
-               if(unsized!=RGB && unsized!=RGBA)
+               if(unsized!=RED && unsized!=RG && unsized!=RGB && unsized!=RGBA)
                        throw invalid_argument("RenderTargetformat::operator,");
                if(size>3)
                        --size;
@@ -59,7 +59,7 @@ RenderTargetFormat RenderTargetFormat::operator,(PixelFormat f) const
        return result;
 }
 
-int RenderTargetFormat::index(RenderOutput o)
+int RenderTargetFormat::index(RenderOutput o) const
 {
        unsigned type = get_output_type(o);
        unsigned i = 0;
@@ -72,7 +72,6 @@ int RenderTargetFormat::index(RenderOutput o)
 
 PixelFormat get_output_pixelformat(unsigned char o)
 {
-       unsigned ncomp = (o&3)+1;
        unsigned size = ((o>>2)&3);
        PixelFormat base;
        if(get_output_type(o)>=get_output_type(RENDER_DEPTH))
@@ -83,7 +82,8 @@ PixelFormat get_output_pixelformat(unsigned char o)
        }
        else
        {
-               base = (ncomp==4 ? RGBA : RGB);
+               static PixelFormat base_formats[4] = { RED, RG, RGB, RGBA };
+               base = base_formats[o&3];
                if(size==3)
                        ++size;
        }
@@ -133,7 +133,7 @@ void RenderTarget::init(unsigned w, unsigned h, unsigned s, const RenderTargetFo
                else
                {
                        tgt.texture = new Texture2D;
-                       tgt.texture->storage(pf, width, height);
+                       tgt.texture->storage(pf, width, height, 1);
                        tgt.texture->set_filter(NEAREST);
                        tgt.texture->set_wrap(CLAMP_TO_EDGE);
                        fbo.attach(att, *tgt.texture);
@@ -155,7 +155,16 @@ RenderTarget::~RenderTarget()
        }
 }
 
-const Texture2D &RenderTarget::get_target_texture(unsigned i)
+void RenderTarget::set_texture_filter(TextureFilter filt)
+{
+       if(!samples)
+       {
+               for(vector<TargetBuffer>::iterator i=buffers.begin(); i!=buffers.end(); ++i)
+                       i->texture->set_filter(filt);
+       }
+}
+
+const Texture2D &RenderTarget::get_target_texture(unsigned i) const
 {
        if(i>=buffers.size())
                throw out_of_range("RenderTarget::get_target_texture");
@@ -165,7 +174,7 @@ const Texture2D &RenderTarget::get_target_texture(unsigned i)
        return *buffers[i].texture;
 }
 
-const Texture2D &RenderTarget::get_target_texture(RenderOutput o)
+const Texture2D &RenderTarget::get_target_texture(RenderOutput o) const
 {
        int index = format.index(o);
        if(index<0)