git-svn-id: svn://db.shs.com.ru/libs@661 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -93,9 +93,7 @@ void Framebuffer::resize(int width, int height, bool force) {
|
||||
}
|
||||
f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
if (pbo.isInit()) {
|
||||
pbo.bind(f);
|
||||
pbo.resize(f, width*height*4);
|
||||
pbo.release(f);
|
||||
enablePixelBuffer();
|
||||
}
|
||||
is_changed = false;
|
||||
}
|
||||
@@ -119,7 +117,7 @@ void Framebuffer::queryPoint(int index, QPoint p) {
|
||||
}
|
||||
|
||||
|
||||
void Framebuffer::queryPoints(int index, QRect rect_) {
|
||||
void Framebuffer::queryPoints(int index, QRect rect_, GLenum pixel_format) {
|
||||
pbo_queried = 0;
|
||||
if (index < 0 || index >= colors.size()) return;
|
||||
rect_ &= rect();
|
||||
@@ -127,7 +125,7 @@ void Framebuffer::queryPoints(int index, QRect rect_) {
|
||||
f->glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
|
||||
f->glReadBuffer(GL_COLOR_ATTACHMENT0 + index);
|
||||
pbo.bind(f);
|
||||
f->glReadPixels(rect_.x(), height() - rect_.bottom(), rect_.width(), rect_.height(), GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
||||
f->glReadPixels(rect_.x(), height() - rect_.bottom(), rect_.width(), rect_.height(), GL_RGBA, pixel_format, 0);
|
||||
pbo_queried = rect_.width() * rect_.height();
|
||||
pbo.release(f);
|
||||
}
|
||||
@@ -151,7 +149,7 @@ uint Framebuffer::getPoint() const {
|
||||
}
|
||||
|
||||
|
||||
QVector<uint> Framebuffer::getPoints() const {
|
||||
QVector<uint> Framebuffer::getPointsByte() const {
|
||||
QVector<uint> ret;
|
||||
if (!pbo.isInit() || (pbo_queried == 0)) return ret;
|
||||
ret.resize(pbo_queried);
|
||||
@@ -165,6 +163,20 @@ QVector<uint> Framebuffer::getPoints() const {
|
||||
}
|
||||
|
||||
|
||||
QVector<QVector4D> Framebuffer::getPointsFloat() const {
|
||||
QVector<QVector4D> ret;
|
||||
if (!pbo.isInit() || (pbo_queried == 0)) return ret;
|
||||
ret.resize(pbo_queried);
|
||||
pbo.bind(f);
|
||||
void * map = pbo.map(f, GL_MAP_READ_BIT, pbo_queried * sizeof(QVector4D));
|
||||
if (map)
|
||||
memcpy(ret.data(), map, pbo_queried * sizeof(QVector4D));
|
||||
pbo.unmap(f);
|
||||
pbo.release(f);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
QImage Framebuffer::getImage() const {
|
||||
QImage ret;
|
||||
if (!pbo.isInit() || (pbo_queried == 0)) return ret;
|
||||
@@ -258,6 +270,9 @@ void Framebuffer::unsetWriteBuffers() {
|
||||
|
||||
void Framebuffer::enablePixelBuffer() {
|
||||
pbo.init(f);
|
||||
pbo.bind(f);
|
||||
pbo.resize(f, width()*height()*4*4);
|
||||
pbo.release(f);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -35,6 +35,7 @@ public:
|
||||
//GLenum colorFormat() const {return color_format;}
|
||||
GLuint depthTexture() const {return tex_d;}
|
||||
GLenum target() const {return target_;}
|
||||
bool isInit() const {return fbo != 0;}
|
||||
int width() const {return wid;}
|
||||
int height() const {return hei;}
|
||||
QSize size() const {return QSize(wid, hei);}
|
||||
@@ -42,10 +43,11 @@ public:
|
||||
QImage grab() const;
|
||||
QVector<float> grabF(int index) const;
|
||||
void queryPoint(int index, QPoint p);
|
||||
void queryPoints(int index, QRect rect);
|
||||
void queryPoints(int index, QRect rect, GLenum pixel_format = GL_UNSIGNED_BYTE);
|
||||
void queryImage(int index);
|
||||
uint getPoint() const;
|
||||
QVector<uint> getPoints() const;
|
||||
QVector<uint> getPointsByte() const;
|
||||
QVector<QVector4D> getPointsFloat() const;
|
||||
QImage getImage() const;
|
||||
int queriedPoints() const {return pbo_queried;}
|
||||
void blit(int index_from, GLuint fb_to, int index_to, QRect from, QRect to, GLbitfield mask = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST) const;
|
||||
|
||||
@@ -31,6 +31,7 @@ public:
|
||||
int levelsCount() const {return fbo.size();}
|
||||
int lastLevel() const {return fbo.size() - 1;}
|
||||
Framebuffer & plane(int level) {return *fbo[level];}
|
||||
Framebuffer & lastPlane() {return *fbo[lastLevel()];}
|
||||
int width (int level) const {return fbo[level]->wid;}
|
||||
int height(int level) const {return fbo[level]->hei;}
|
||||
QSize size(int level) const {return fbo[level]->size();}
|
||||
|
||||
Reference in New Issue
Block a user