small refactoring
This commit is contained in:
@@ -86,12 +86,6 @@ QVector<QVector3D> loadFileHDR(const QString & path, QSize * size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
|
|
||||||
//#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
|
|
||||||
//#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
|
|
||||||
//#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
|
|
||||||
//#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
|
|
||||||
//#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
|
|
||||||
QVector<QVector3D> faceHDR(const QVector<QVector3D> & data, QSize sz, QSize & fsz, int face) {
|
QVector<QVector3D> faceHDR(const QVector<QVector3D> & data, QSize sz, QSize & fsz, int face) {
|
||||||
QVector<QVector3D> ret;
|
QVector<QVector3D> ret;
|
||||||
if (data.isEmpty() || sz.isNull()) return ret;
|
if (data.isEmpty() || sz.isNull()) return ret;
|
||||||
@@ -175,13 +169,6 @@ bool CubeTexture::init() {
|
|||||||
f->glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
|
f->glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
|
||||||
f->glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
f->glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
f->glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
f->glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
//glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
|
|
||||||
//glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, format_, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
|
||||||
//glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, format_, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
|
||||||
//glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, format_, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
|
||||||
//glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, format_, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
|
||||||
//glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, format_, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
|
||||||
//glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, format_, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
|
||||||
changed_ = false;
|
changed_ = false;
|
||||||
return id_ > 0;
|
return id_ > 0;
|
||||||
}
|
}
|
||||||
@@ -213,7 +200,6 @@ void CubeTexture::loadHDR(const QVector<QVector3D> & data, QSize sz) {
|
|||||||
for (int i = 0; i < 6; ++i) {
|
for (int i = 0; i < 6; ++i) {
|
||||||
fd = faceHDR(data, sz, fsz, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i);
|
fd = faceHDR(data, sz, fsz, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i);
|
||||||
//qDebug() << "load cube" << fd[0];
|
//qDebug() << "load cube" << fd[0];
|
||||||
//f->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
|
||||||
f->glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, format_, fsz.width(), fsz.height(), 0, GL_RGB, GL_FLOAT, fd.isEmpty() ? 0 : fd.constData());
|
f->glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, format_, fsz.width(), fsz.height(), 0, GL_RGB, GL_FLOAT, fd.isEmpty() ? 0 : fd.constData());
|
||||||
//qDebug() << QString::number(GetLastError(), 16);
|
//qDebug() << QString::number(GetLastError(), 16);
|
||||||
}
|
}
|
||||||
@@ -245,37 +231,3 @@ void CubeTexture::load() {
|
|||||||
changed_ = false;
|
changed_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void CubeTexture::load() {
|
|
||||||
if (isEmpty()) return;
|
|
||||||
create();
|
|
||||||
if (!path(0).isEmpty()) loadFront(path(0));
|
|
||||||
if (!path(1).isEmpty()) loadBack(path(1));
|
|
||||||
if (!path(2).isEmpty()) loadLeft(path(2));
|
|
||||||
if (!path(3).isEmpty()) loadRight(path(3));
|
|
||||||
if (!path(4).isEmpty()) loadTop(path(4));
|
|
||||||
if (!path(5).isEmpty()) loadBottom(path(5));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CubeTexture::loadFromDirectory(const QString & dir) {
|
|
||||||
QDir d(dir); QFileInfoList sl;
|
|
||||||
sl = d.entryInfoList(QStringList("front.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) loadFront(sl[0].absoluteFilePath());
|
|
||||||
sl = d.entryInfoList(QStringList("back.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) loadBack(sl[0].absoluteFilePath());
|
|
||||||
sl = d.entryInfoList(QStringList("left.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) loadLeft(sl[0].absoluteFilePath());
|
|
||||||
sl = d.entryInfoList(QStringList("right.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) loadRight(sl[0].absoluteFilePath());
|
|
||||||
sl = d.entryInfoList(QStringList("top.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) loadTop(sl[0].absoluteFilePath());
|
|
||||||
sl = d.entryInfoList(QStringList("bottom.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) loadBottom(sl[0].absoluteFilePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CubeTexture::loadPathesFromDirectory(const QString & dir) {
|
|
||||||
QDir d(dir); QFileInfoList sl;
|
|
||||||
sl = d.entryInfoList(QStringList("front.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) pathes[0] = sl[0].absoluteFilePath();
|
|
||||||
sl = d.entryInfoList(QStringList("back.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) pathes[1] = sl[0].absoluteFilePath();
|
|
||||||
sl = d.entryInfoList(QStringList("left.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) pathes[2] = sl[0].absoluteFilePath();
|
|
||||||
sl = d.entryInfoList(QStringList("right.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) pathes[3] = sl[0].absoluteFilePath();
|
|
||||||
sl = d.entryInfoList(QStringList("top.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) pathes[4] = sl[0].absoluteFilePath();
|
|
||||||
sl = d.entryInfoList(QStringList("bottom.*"), QDir::Files | QDir::NoDotAndDotDot); if (!sl.isEmpty()) pathes[5] = sl[0].absoluteFilePath();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|||||||
@@ -35,22 +35,10 @@ public:
|
|||||||
void loadHDR(const QVector<QVector3D> & data, QSize sz);
|
void loadHDR(const QVector<QVector3D> & data, QSize sz);
|
||||||
void setFileHDR(const QString & path);
|
void setFileHDR(const QString & path);
|
||||||
QString fileHDR() const {return hdr_path;}
|
QString fileHDR() const {return hdr_path;}
|
||||||
//void loadFromDirectory(const QString & dir);
|
|
||||||
//void loadFront(const QString & path) {bind(); pathes[0] = path; createGLTexture(id_, rotateQImageLeft(QImage(path)).scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation), format_, GL_TEXTURE_CUBE_MAP_POSITIVE_X);}
|
|
||||||
//void loadBack(const QString & path) {bind(); pathes[1] = path; createGLTexture(id_, rotateQImageRight(QImage(path)).scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation), format_, GL_TEXTURE_CUBE_MAP_NEGATIVE_X);}
|
|
||||||
//void loadLeft(const QString & path) {bind(); pathes[2] = path; createGLTexture(id_, QImage(path).scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation), format_, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y);}
|
|
||||||
//void loadRight(const QString & path) {bind(); pathes[3] = path; createGLTexture(id_, rotateQImage180(QImage(path)).scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation), format_, GL_TEXTURE_CUBE_MAP_POSITIVE_Y);}
|
|
||||||
//void loadTop(const QString & path) {bind(); pathes[4] = path; createGLTexture(id_, rotateQImageLeft(QImage(path)).scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation), format_, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);}
|
|
||||||
//void loadBottom(const QString & path) {bind(); pathes[5] = path; createGLTexture(id_, rotateQImageLeft(QImage(path)).scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation), format_, GL_TEXTURE_CUBE_MAP_POSITIVE_Z);}
|
|
||||||
//void load();
|
|
||||||
//bool isEmpty() const {foreach (const QString & i, pathes) if (!i.isEmpty()) return false; return true;}
|
|
||||||
GLenum format() const {return format_;}
|
GLenum format() const {return format_;}
|
||||||
void setFormat(GLenum f) {format_ = f; changed_ = true;}
|
void setFormat(GLenum f) {format_ = f; changed_ = true;}
|
||||||
GLuint id() const {return id_;}
|
GLuint id() const {return id_;}
|
||||||
bool isInit() const {return id_ != 0;}
|
bool isInit() const {return id_ != 0;}
|
||||||
//const QString & path(int side) const {return pathes[side];}
|
|
||||||
//void setPath(int side, const QString & p) {pathes[side] = p;}
|
|
||||||
//void loadPathesFromDirectory(const QString & dir);
|
|
||||||
void load();
|
void load();
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -60,7 +48,6 @@ private:
|
|||||||
GLenum format_;
|
GLenum format_;
|
||||||
GLuint id_;
|
GLuint id_;
|
||||||
QString hdr_path;
|
QString hdr_path;
|
||||||
//QVector<QString> pathes;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
|
||||||
|
|
||||||
Framebuffer::Framebuffer(QOpenGLExtraFunctions * f_, int colorAttachments_, bool withDepth, GLenum colorFormat_, GLenum _target): f(f_),
|
Framebuffer::Framebuffer(QOpenGLExtraFunctions * f_, int colorAttachments_, bool withDepth, GLenum colorFormat_, GLenum _target)
|
||||||
pbo(GL_PIXEL_PACK_BUFFER, GL_STREAM_DRAW) {
|
: f(f_), pbo(GL_PIXEL_PACK_BUFFER, GL_STREAM_DRAW) {
|
||||||
is_depth = withDepth;
|
is_depth = withDepth;
|
||||||
target_ = _target;
|
target_ = _target;
|
||||||
color_formats.fill(colorFormat_, colorAttachments_);
|
color_formats.fill(colorFormat_, colorAttachments_);
|
||||||
@@ -35,8 +35,8 @@ Framebuffer::Framebuffer(QOpenGLExtraFunctions * f_, int colorAttachments_, bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Framebuffer::Framebuffer(QOpenGLExtraFunctions * f_, QVector<GLenum> colors_, bool withDepth, GLenum _target): f(f_),
|
Framebuffer::Framebuffer(QOpenGLExtraFunctions * f_, QVector<GLenum> colors_, bool withDepth, GLenum _target)
|
||||||
pbo(GL_PIXEL_PACK_BUFFER, GL_STREAM_DRAW) {
|
: f(f_), pbo(GL_PIXEL_PACK_BUFFER, GL_STREAM_DRAW) {
|
||||||
is_depth = withDepth;
|
is_depth = withDepth;
|
||||||
target_ = _target;
|
target_ = _target;
|
||||||
color_formats = colors_;
|
color_formats = colors_;
|
||||||
@@ -73,7 +73,6 @@ void Framebuffer::resize(int width, int height, bool force) {
|
|||||||
f->glTexParameteri(target_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
f->glTexParameteri(target_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
f->glTexParameteri(target_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
f->glTexParameteri(target_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
f->glTexParameteri(target_, GL_TEXTURE_MAX_LEVEL, 4);
|
f->glTexParameteri(target_, GL_TEXTURE_MAX_LEVEL, 4);
|
||||||
//f->glTexParameteri(target_, GL_GENERATE_MIPMAP_SGIS, GL_FALSE);
|
|
||||||
f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, target_, colors[i], 0);
|
f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, target_, colors[i], 0);
|
||||||
}
|
}
|
||||||
if (is_depth) {
|
if (is_depth) {
|
||||||
@@ -88,7 +87,6 @@ void Framebuffer::resize(int width, int height, bool force) {
|
|||||||
f->glTexParameteri(target_, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
f->glTexParameteri(target_, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
f->glTexParameteri(target_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
f->glTexParameteri(target_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
f->glTexParameteri(target_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
f->glTexParameteri(target_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
//f->glTexParameteri(target_, GL_GENERATE_MIPMAP_SGIS, GL_FALSE);
|
|
||||||
f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, target_, tex_d, 0);
|
f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, target_, tex_d, 0);
|
||||||
}
|
}
|
||||||
f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
@@ -289,8 +287,6 @@ void Framebuffer::bindColorTextures() {
|
|||||||
for (int i = colors.size() - 1; i >= 0; --i) {
|
for (int i = colors.size() - 1; i >= 0; --i) {
|
||||||
f->glActiveTexture(GL_TEXTURE0 + i);
|
f->glActiveTexture(GL_TEXTURE0 + i);
|
||||||
f->glBindTexture(GL_TEXTURE_2D, colors[i]);
|
f->glBindTexture(GL_TEXTURE_2D, colors[i]);
|
||||||
//f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
//f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ public:
|
|||||||
|
|
||||||
GLuint id() const {return fbo;}
|
GLuint id() const {return fbo;}
|
||||||
GLuint colorTexture(int index = 0) const {return colors[index];}
|
GLuint colorTexture(int index = 0) const {return colors[index];}
|
||||||
//GLenum colorFormat() const {return color_format;}
|
|
||||||
GLuint depthTexture() const {return tex_d;}
|
GLuint depthTexture() const {return tex_d;}
|
||||||
GLenum target() const {return target_;}
|
GLenum target() const {return target_;}
|
||||||
bool isInit() const {return fbo != 0;}
|
bool isInit() const {return fbo != 0;}
|
||||||
@@ -61,7 +60,6 @@ public:
|
|||||||
void setWriteBuffers(const QVector<int> & indeces) {setWriteBuffers(indeces.constData(), indeces.size());}
|
void setWriteBuffers(const QVector<int> & indeces) {setWriteBuffers(indeces.constData(), indeces.size());}
|
||||||
void setWriteBuffers();
|
void setWriteBuffers();
|
||||||
void unsetWriteBuffers();
|
void unsetWriteBuffers();
|
||||||
//void setColorFormat(GLenum format) {color_format = format; is_changed = true;}
|
|
||||||
void enablePixelBuffer();
|
void enablePixelBuffer();
|
||||||
void setColorTextureFiltering(int index, GLenum filter);
|
void setColorTextureFiltering(int index, GLenum filter);
|
||||||
|
|
||||||
@@ -83,7 +81,6 @@ private:
|
|||||||
GLenum target_;
|
GLenum target_;
|
||||||
GLuint fbo, drbo, tex_d;
|
GLuint fbo, drbo, tex_d;
|
||||||
GLint prev_view[4], wid, hei;
|
GLint prev_view[4], wid, hei;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GLFRAMEBUFFER_H
|
#endif // GLFRAMEBUFFER_H
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ void Map::copyToQGLMap(QGLMap & m) const {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Material::Material(const QString _name)/*: map_reflection(512)*/ {
|
Material::Material(const QString _name) {
|
||||||
setTypes();
|
setTypes();
|
||||||
name = _name;
|
name = _name;
|
||||||
color_diffuse = Qt::white;
|
color_diffuse = Qt::white;
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ public:
|
|||||||
Map map_relief ;
|
Map map_relief ;
|
||||||
bool _changed;
|
bool _changed;
|
||||||
int _index;
|
int _index;
|
||||||
//GLCubeTexture map_reflection;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -93,13 +92,10 @@ inline QDataStream & operator <<(QDataStream & s, const Material * m) {
|
|||||||
cs.add(1, m->name).add(2, m->color_diffuse).add(4, m->color_emission)
|
cs.add(1, m->name).add(2, m->color_diffuse).add(4, m->color_emission)
|
||||||
.add(5, m->transparency).add(6, m->reflectivity).add(7, m->glass).add(8, m->map_diffuse).add(9, m->map_normal)
|
.add(5, m->transparency).add(6, m->reflectivity).add(7, m->glass).add(8, m->map_diffuse).add(9, m->map_normal)
|
||||||
.add(10, m->map_relief).add(11, m->map_metalness).add(12, m->map_roughness).add(13, m->map_emission);
|
.add(10, m->map_relief).add(11, m->map_metalness).add(12, m->map_roughness).add(13, m->map_emission);
|
||||||
s << /*qCompress*/(cs.data()); return s;
|
s << (cs.data()); return s;
|
||||||
}
|
}
|
||||||
inline QDataStream & operator >>(QDataStream & s, Material *& m) {
|
inline QDataStream & operator >>(QDataStream & s, Material *& m) {
|
||||||
m = new Material();
|
m = new Material();
|
||||||
//QByteArray ba;
|
|
||||||
//s >> ba;
|
|
||||||
//ba = qUncompres(ba);
|
|
||||||
ChunkStream cs(s);
|
ChunkStream cs(s);
|
||||||
while (!cs.atEnd()) {
|
while (!cs.atEnd()) {
|
||||||
switch (cs.read()) {
|
switch (cs.read()) {
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ Mesh::Mesh(GLenum geom_type_): geom_type(geom_type_),
|
|||||||
|
|
||||||
Mesh::~Mesh() {
|
Mesh::~Mesh() {
|
||||||
//qDebug() << "~Mesh, now" << --_count;
|
//qDebug() << "~Mesh, now" << --_count;
|
||||||
//destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -401,15 +400,12 @@ QDataStream & operator <<(QDataStream & s, const Mesh * m) {
|
|||||||
cs.add(1, m->vertices_).add(2, m->normals_).add(3, m->texcoords_)
|
cs.add(1, m->vertices_).add(2, m->normals_).add(3, m->texcoords_)
|
||||||
.add(6, m->triangles_).add(7, m->lines_).add(10, int(m->geom_type));
|
.add(6, m->triangles_).add(7, m->lines_).add(10, int(m->geom_type));
|
||||||
//qDebug() << "place VBO done" << cs.data().size() << "...";
|
//qDebug() << "place VBO done" << cs.data().size() << "...";
|
||||||
s << /*qCompress*/(cs.data()); return s;
|
s << cs.data(); return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QDataStream & operator >>(QDataStream & s, Mesh *& m) {
|
QDataStream & operator >>(QDataStream & s, Mesh *& m) {
|
||||||
m = new Mesh();
|
m = new Mesh();
|
||||||
//QByteArray ba;
|
|
||||||
//s >> ba;
|
|
||||||
//ba = qUncompress(ba);
|
|
||||||
ChunkStream cs(s);
|
ChunkStream cs(s);
|
||||||
while (!cs.atEnd()) {
|
while (!cs.atEnd()) {
|
||||||
switch (cs.read()) {
|
switch (cs.read()) {
|
||||||
|
|||||||
@@ -25,9 +25,6 @@
|
|||||||
|
|
||||||
class Mesh
|
class Mesh
|
||||||
{
|
{
|
||||||
friend class ObjectBase;
|
|
||||||
friend class Scene;
|
|
||||||
friend class Renderer;
|
|
||||||
friend QDataStream & operator <<(QDataStream & s, const Mesh * m);
|
friend QDataStream & operator <<(QDataStream & s, const Mesh * m);
|
||||||
friend QDataStream & operator >>(QDataStream & s, Mesh *& m);
|
friend QDataStream & operator >>(QDataStream & s, Mesh *& m);
|
||||||
public:
|
public:
|
||||||
@@ -36,8 +33,6 @@ public:
|
|||||||
|
|
||||||
Mesh * clone();
|
Mesh * clone();
|
||||||
|
|
||||||
//GLVBO & operator =(const GLVBO & o) {return *this;}
|
|
||||||
|
|
||||||
void init (QOpenGLExtraFunctions * f);
|
void init (QOpenGLExtraFunctions * f);
|
||||||
void destroy (QOpenGLExtraFunctions * f);
|
void destroy (QOpenGLExtraFunctions * f);
|
||||||
bool rebuffer(QOpenGLExtraFunctions * f);
|
bool rebuffer(QOpenGLExtraFunctions * f);
|
||||||
@@ -100,7 +95,6 @@ private:
|
|||||||
mutable bool hash_changed;
|
mutable bool hash_changed;
|
||||||
int vert_count;
|
int vert_count;
|
||||||
bool changed;
|
bool changed;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -248,7 +248,6 @@ Mesh * Primitive::cylinder(int segments, float radius, float height, float end_a
|
|||||||
if (end_angle < 360.) {
|
if (end_angle < 360.) {
|
||||||
Mesh * cap = Primitive::plane(radius, height);
|
Mesh * cap = Primitive::plane(radius, height);
|
||||||
cap->rotatePoints(90, 1, 0, 0);
|
cap->rotatePoints(90, 1, 0, 0);
|
||||||
//cap->rotatePoints(-90, 0, 0, 1);
|
|
||||||
cap->translatePoints(radius/2, 0, height/2);
|
cap->translatePoints(radius/2, 0, height/2);
|
||||||
ret->append(cap);
|
ret->append(cap);
|
||||||
cap->flipNormals();
|
cap->flipNormals();
|
||||||
|
|||||||
@@ -52,53 +52,4 @@ Mesh * coneFrame(int segments, float radius = 1., float height = 1.);
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
class GLPrimitivePoint: public GLObjectBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
GLPrimitivePoint(double size = 1., QVector3D pos = QVector3D()) {sz = 8.;}
|
|
||||||
virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);
|
|
||||||
private:
|
|
||||||
double sz;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class GLPrimitiveLine: public GLObjectBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
GLPrimitiveLine(QVector3D p0_ = QVector3D(), QVector3D p1_ = QVector3D()) {p0 = p0_; p1 = p1_;}
|
|
||||||
virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);
|
|
||||||
QVector3D point0() const {return p0;}
|
|
||||||
QVector3D point1() const {return p1;}
|
|
||||||
void setPoint0(const QVector3D & p) {p0 = p;}
|
|
||||||
void setPoint1(const QVector3D & p) {p1 = p;}
|
|
||||||
private:
|
|
||||||
QVector3D p0, p1;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class GLPrimitiveEllipsoid: public GLObjectBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
GLPrimitiveEllipsoid(float width = 1., float length = 1., float height = 1., int seg_wl = 10, int seg_h = 10, QVector3D pos = QVector3D());
|
|
||||||
virtual void init();
|
|
||||||
private:
|
|
||||||
void putTriangle(const QVector3D & v0, const QVector3D & v1, const QVector3D & v2);
|
|
||||||
float w, l, h;
|
|
||||||
int swl, sh;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class GLPrimitiveAxis: public GLObjectBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
GLPrimitiveAxis() {accept_fog = accept_light = cast_shadow = rec_shadow = select_ = false;}
|
|
||||||
virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif // GLPRIMITIVE_CUBE_H
|
#endif // GLPRIMITIVE_CUBE_H
|
||||||
|
|||||||
@@ -85,7 +85,6 @@ const char qgl_structs[] =
|
|||||||
"};\n"
|
"};\n"
|
||||||
"struct QGLMaterial {\n"
|
"struct QGLMaterial {\n"
|
||||||
" vec4 color_diffuse;\n"
|
" vec4 color_diffuse;\n"
|
||||||
//" vec4 color_specular;\n"
|
|
||||||
" vec4 color_emission;\n"
|
" vec4 color_emission;\n"
|
||||||
" float transparency;\n"
|
" float transparency;\n"
|
||||||
" float reflectivity;\n"
|
" float reflectivity;\n"
|
||||||
@@ -97,11 +96,6 @@ const char qgl_structs[] =
|
|||||||
" vec4 color;\n"
|
" vec4 color;\n"
|
||||||
" vec4 decay_intensity;\n"
|
" vec4 decay_intensity;\n"
|
||||||
" vec4 angles;\n"
|
" vec4 angles;\n"
|
||||||
//" sampler2DShadow shadow;\n"
|
|
||||||
//" sampler2D shadowColor\n"
|
|
||||||
//" mat4 shadowMatrix;\n"
|
|
||||||
//" vec4 shadowDir0;\n"
|
|
||||||
//" vec4 shadowDir1;\n"
|
|
||||||
"};\n"
|
"};\n"
|
||||||
"struct QGLLightPosition {\n"
|
"struct QGLLightPosition {\n"
|
||||||
" vec4 position;\n"
|
" vec4 position;\n"
|
||||||
|
|||||||
@@ -125,8 +125,6 @@ struct QGLLightParameter {
|
|||||||
QVector4D color;
|
QVector4D color;
|
||||||
QVector4D decay_intensity; // [^0, ^1, ^2, intensity]
|
QVector4D decay_intensity; // [^0, ^1, ^2, intensity]
|
||||||
QVector4D angles; // [start, cos(start), end, cos(end)]
|
QVector4D angles; // [start, cos(start), end, cos(end)]
|
||||||
//GLfloat shadow;
|
|
||||||
//GLfloat shadowMatrix[16];
|
|
||||||
};
|
};
|
||||||
struct QGLLightPosition {
|
struct QGLLightPosition {
|
||||||
QVector4D position;
|
QVector4D position;
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
class Texture2DArray
|
class Texture2DArray
|
||||||
{
|
{
|
||||||
friend class ObjectBase;
|
|
||||||
public:
|
public:
|
||||||
Texture2DArray(bool filter);
|
Texture2DArray(bool filter);
|
||||||
~Texture2DArray();
|
~Texture2DArray();
|
||||||
@@ -49,7 +48,6 @@ private:
|
|||||||
QSize size_;
|
QSize size_;
|
||||||
int layers_;
|
int layers_;
|
||||||
bool filtering_;
|
bool filtering_;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -398,7 +398,6 @@ QVector3D Transform::fromDirection(QVector3D d, float pitch) {
|
|||||||
|
|
||||||
|
|
||||||
QVector3D Transform::fromRotationMatrix(const QMatrix3x3 & m) {
|
QVector3D Transform::fromRotationMatrix(const QMatrix3x3 & m) {
|
||||||
//return QQuaternion::fromRotationMatrix(m);
|
|
||||||
float sy = sqrt(m(0,0) * m(0,0) + m(1,0) * m(1,0));
|
float sy = sqrt(m(0,0) * m(0,0) + m(1,0) * m(1,0));
|
||||||
bool singular = sy < 1.E-6; // If
|
bool singular = sy < 1.E-6; // If
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
|
|||||||
@@ -96,19 +96,9 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
inline QDataStream & operator <<(QDataStream & s, const Transform & v) {
|
inline QDataStream & operator <<(QDataStream & s, const Transform & v) {
|
||||||
//ChunkStream cs;
|
|
||||||
//cs.add(1, v.matrix());
|
|
||||||
//s << cs.data(); return s;
|
|
||||||
s << v.matrix(); return s;
|
s << v.matrix(); return s;
|
||||||
}
|
}
|
||||||
inline QDataStream & operator >>(QDataStream & s, Transform & v) {
|
inline QDataStream & operator >>(QDataStream & s, Transform & v) {
|
||||||
//ChunkStream cs(s);
|
|
||||||
//while (!cs.atEnd()) {
|
|
||||||
// switch (cs.read()) {
|
|
||||||
// case 1: v.setMatrix(cs.getData<QMatrix4x4>()); break;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//return s;
|
|
||||||
QMatrix4x4 m;
|
QMatrix4x4 m;
|
||||||
s >> m;
|
s >> m;
|
||||||
v.setMatrix(m);
|
v.setMatrix(m);
|
||||||
|
|||||||
@@ -22,9 +22,6 @@
|
|||||||
|
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
|
||||||
//__GLWidget__ * currentQGLView;
|
|
||||||
//QMutex globMutex;
|
|
||||||
|
|
||||||
|
|
||||||
QString readCharsUntilNull(QDataStream & s) {
|
QString readCharsUntilNull(QDataStream & s) {
|
||||||
QString str;
|
QString str;
|
||||||
@@ -55,7 +52,6 @@ QString findFile(const QString & file, const QStringList & pathes) {
|
|||||||
|
|
||||||
|
|
||||||
void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
|
void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
|
||||||
//glResetAllTransforms();
|
|
||||||
glSetPolygonMode(GL_FILL);
|
glSetPolygonMode(GL_FILL);
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
@@ -63,7 +59,6 @@ void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x,
|
|||||||
locv = prog ? prog->attributeLocation("qgl_Vertex") : -1,
|
locv = prog ? prog->attributeLocation("qgl_Vertex") : -1,
|
||||||
loct = prog ? prog->attributeLocation("qgl_Texture") : -1,
|
loct = prog ? prog->attributeLocation("qgl_Texture") : -1,
|
||||||
locc = prog ? prog->attributeLocation("view_corner") : -1;
|
locc = prog ? prog->attributeLocation("view_corner") : -1;
|
||||||
//if (prog) {qDebug() << locv << loct << locc;}
|
|
||||||
QOpenGLFunctions * glFuncs = QOpenGLContext::currentContext()->functions();
|
QOpenGLFunctions * glFuncs = QOpenGLContext::currentContext()->functions();
|
||||||
if (prog) {
|
if (prog) {
|
||||||
static const GLfloat cols [] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
|
static const GLfloat cols [] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
|
||||||
@@ -137,12 +132,10 @@ void qglMultMatrix(const QMatrix4x4 & m) {
|
|||||||
|
|
||||||
|
|
||||||
void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, int width, int height, const GLenum & format, const GLenum & target) {
|
void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, int width, int height, const GLenum & format, const GLenum & target) {
|
||||||
//glClearError();
|
|
||||||
if (tex == 0) {
|
if (tex == 0) {
|
||||||
f->glGenTextures(1, &tex);
|
f->glGenTextures(1, &tex);
|
||||||
f->glBindTexture(target, tex);
|
f->glBindTexture(target, tex);
|
||||||
}
|
}
|
||||||
//glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
|
||||||
if (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_COMPONENT16 || format == GL_DEPTH_COMPONENT24 || format == GL_DEPTH_COMPONENT32)
|
if (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_COMPONENT16 || format == GL_DEPTH_COMPONENT24 || format == GL_DEPTH_COMPONENT32)
|
||||||
f->glTexImage2D(target, 0, format, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, nullptr);
|
f->glTexImage2D(target, 0, format, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, nullptr);
|
||||||
else {
|
else {
|
||||||
@@ -153,7 +146,6 @@ void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, int width, int hei
|
|||||||
if (format == GL_RGB32F || format == GL_RGB16F || format == GL_RGB8 || format == GL_RGB)
|
if (format == GL_RGB32F || format == GL_RGB16F || format == GL_RGB8 || format == GL_RGB)
|
||||||
fmt = GL_RGB;
|
fmt = GL_RGB;
|
||||||
f->glTexImage2D(target, 0, format, width, height, 0, fmt, type, nullptr);
|
f->glTexImage2D(target, 0, format, width, height, 0, fmt, type, nullptr);
|
||||||
//glGenerateMipmap(target);
|
|
||||||
//qDebug() << "glTexImage2D" << width << height << QString::number(t, 16);
|
//qDebug() << "glTexImage2D" << width << height << QString::number(t, 16);
|
||||||
}
|
}
|
||||||
//qDebug() << QString::number(glGetError(), 16);
|
//qDebug() << QString::number(glGetError(), 16);
|
||||||
@@ -166,7 +158,6 @@ void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, const QImage & ima
|
|||||||
}
|
}
|
||||||
f->glBindTexture(target, tex);
|
f->glBindTexture(target, tex);
|
||||||
QImage im = image.mirrored(false, true).convertToFormat(QImage::Format_RGBA8888);
|
QImage im = image.mirrored(false, true).convertToFormat(QImage::Format_RGBA8888);
|
||||||
//const QImage & cim(im);
|
|
||||||
f->glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
f->glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
f->glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
f->glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
f->glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_REPEAT);
|
f->glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_REPEAT);
|
||||||
@@ -197,8 +188,8 @@ QMatrix4x4 glMatrixPerspective(float angle, float aspect, float near_) {
|
|||||||
ret(0, 0) = t;
|
ret(0, 0) = t;
|
||||||
ret(1, 1) = t * aspect;
|
ret(1, 1) = t * aspect;
|
||||||
}
|
}
|
||||||
ret(2, 2) = e - 1.f;//far_ / (far_ - near_) - 1.;
|
ret(2, 2) = e - 1.f;
|
||||||
ret(2, 3) = (e - 2.f) * near_;//2. * far_ * near_ / (far_ - near_);
|
ret(2, 3) = (e - 2.f) * near_;
|
||||||
ret(3, 2) = -1.f;
|
ret(3, 2) = -1.f;
|
||||||
ret(3, 3) = 0.f;
|
ret(3, 3) = 0.f;
|
||||||
return ret;
|
return ret;
|
||||||
@@ -294,7 +285,6 @@ Vector3i::Vector3i(const QString & str) {
|
|||||||
|
|
||||||
void glEnableDepth() {
|
void glEnableDepth() {
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
//glDepthFunc(GL_GREATER);
|
|
||||||
glDepthFunc(GL_LESS);
|
glDepthFunc(GL_LESS);
|
||||||
glDepthMask(GL_TRUE);
|
glDepthMask(GL_TRUE);
|
||||||
}
|
}
|
||||||
@@ -308,7 +298,6 @@ void glDisableDepth() {
|
|||||||
|
|
||||||
void glClearFramebuffer(const QColor & color, bool depth) {
|
void glClearFramebuffer(const QColor & color, bool depth) {
|
||||||
glClearColor(color.redF(), color.greenF(), color.blueF(), color.alphaF());
|
glClearColor(color.redF(), color.greenF(), color.blueF(), color.alphaF());
|
||||||
//glClearDepth(0.);
|
|
||||||
if (depth)
|
if (depth)
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
class VertexObject
|
class VertexObject
|
||||||
{
|
{
|
||||||
friend class Mesh;
|
|
||||||
public:
|
public:
|
||||||
VertexObject();
|
VertexObject();
|
||||||
~VertexObject();
|
~VertexObject();
|
||||||
@@ -57,7 +56,6 @@ private:
|
|||||||
GLuint vao_;
|
GLuint vao_;
|
||||||
Buffer buffer_obj, buffer_sel;
|
Buffer buffer_obj, buffer_sel;
|
||||||
bool buffers_binded, objects_changed, selected_changed;
|
bool buffers_binded, objects_changed, selected_changed;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
21
glcamera.cpp
21
glcamera.cpp
@@ -24,7 +24,6 @@ Camera::Camera() {
|
|||||||
type_ = glCamera;
|
type_ = glCamera;
|
||||||
fov_ = 60.;
|
fov_ = 60.;
|
||||||
roll_ = 0.;
|
roll_ = 0.;
|
||||||
//setRotationX(90.f);
|
|
||||||
depth_start = 0.1f;
|
depth_start = 0.1f;
|
||||||
mirror_x = mirror_y = false;
|
mirror_x = mirror_y = false;
|
||||||
}
|
}
|
||||||
@@ -36,20 +35,6 @@ QMatrix4x4 Camera::offsetMatrix() const {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void Camera::localTransform(QMatrix4x4 & m) {
|
|
||||||
return;
|
|
||||||
if (parent_)
|
|
||||||
m *= parent_->worldTransform();
|
|
||||||
QMatrix4x4 ret;
|
|
||||||
//qDebug() << "local camera";
|
|
||||||
ret.translate(0., 0., -distance());
|
|
||||||
ret.rotate(angles_.y(), 1., 0., 0.);
|
|
||||||
ret.rotate(angles_.x(), 0., 1., 0.);
|
|
||||||
ret.rotate(angles_.z(), 0., 0., 1.);
|
|
||||||
//m *= ret.inverted();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
void Camera::assign(const Camera & c) {
|
void Camera::assign(const Camera & c) {
|
||||||
trans = c.trans;
|
trans = c.trans;
|
||||||
@@ -64,9 +49,8 @@ void Camera::assign(const Camera & c) {
|
|||||||
|
|
||||||
ObjectBase * Camera::clone(bool withChildren) {
|
ObjectBase * Camera::clone(bool withChildren) {
|
||||||
Camera * o = new Camera(*this);
|
Camera * o = new Camera(*this);
|
||||||
//GLObjectBase::clone(withChildren);
|
|
||||||
o->is_init = false;
|
o->is_init = false;
|
||||||
o->name_ = name_;// + "_copy";
|
o->name_ = name_;
|
||||||
o->scene_ = nullptr;
|
o->scene_ = nullptr;
|
||||||
o->children_.clear();
|
o->children_.clear();
|
||||||
if (withChildren) {
|
if (withChildren) {
|
||||||
@@ -91,9 +75,6 @@ QMatrix4x4 Camera::viewMatrix() const {
|
|||||||
ret.translate(0., 0., -distance());
|
ret.translate(0., 0., -distance());
|
||||||
ret.rotate(-roll_, 0., 0., 1.);
|
ret.rotate(-roll_, 0., 0., 1.);
|
||||||
ret *= trans.matrixRotateScale().inverted();
|
ret *= trans.matrixRotateScale().inverted();
|
||||||
//ret.rotate(angles_.y(), 1., 0., 0.);
|
|
||||||
//ret.rotate(angles_.x(), 0., 1., 0.);
|
|
||||||
//pm.translate(-aim_);
|
|
||||||
if (parent_) {
|
if (parent_) {
|
||||||
QMatrix4x4 pmat = parent_->worldTransform();
|
QMatrix4x4 pmat = parent_->worldTransform();
|
||||||
offset_ = pmat.column(3).toVector3D();
|
offset_ = pmat.column(3).toVector3D();
|
||||||
|
|||||||
@@ -21,13 +21,9 @@
|
|||||||
|
|
||||||
#include "globject.h"
|
#include "globject.h"
|
||||||
|
|
||||||
//extern QMatrix4x4 globCameraMatrix;
|
|
||||||
//extern Camera * currentCamera;
|
|
||||||
|
|
||||||
class Camera: public AimedObject
|
class Camera: public AimedObject
|
||||||
{
|
{
|
||||||
friend class QGLView;
|
|
||||||
friend class GLParticlesSystem;
|
|
||||||
friend QDataStream & operator <<(QDataStream & s, const ObjectBase * p);
|
friend QDataStream & operator <<(QDataStream & s, const ObjectBase * p);
|
||||||
friend QDataStream & operator >>(QDataStream & s, ObjectBase *& p);
|
friend QDataStream & operator >>(QDataStream & s, ObjectBase *& p);
|
||||||
public:
|
public:
|
||||||
@@ -64,7 +60,6 @@ private:
|
|||||||
GLfloat depth_start;
|
GLfloat depth_start;
|
||||||
bool mirror_x;
|
bool mirror_x;
|
||||||
bool mirror_y;
|
bool mirror_y;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GLCAMERA_H
|
#endif // GLCAMERA_H
|
||||||
|
|||||||
16
globject.h
16
globject.h
@@ -27,12 +27,8 @@
|
|||||||
|
|
||||||
class ObjectBase
|
class ObjectBase
|
||||||
{
|
{
|
||||||
friend class QGLView;
|
|
||||||
friend class Scene;
|
friend class Scene;
|
||||||
friend class Renderer;
|
|
||||||
friend class RendererService;
|
|
||||||
friend class RendererSelection;
|
friend class RendererSelection;
|
||||||
friend class MouseController;
|
|
||||||
friend QDataStream & operator <<(QDataStream & s, const ObjectBase * p);
|
friend QDataStream & operator <<(QDataStream & s, const ObjectBase * p);
|
||||||
friend QDataStream & operator >>(QDataStream & s, ObjectBase *& p);
|
friend QDataStream & operator >>(QDataStream & s, ObjectBase *& p);
|
||||||
friend QDataStream & operator >>(QDataStream & s, Scene *& p);
|
friend QDataStream & operator >>(QDataStream & s, Scene *& p);
|
||||||
@@ -53,6 +49,7 @@ public:
|
|||||||
bool isInit() const {return is_init;}
|
bool isInit() const {return is_init;}
|
||||||
Type type() const {return type_;}
|
Type type() const {return type_;}
|
||||||
RenderPass pass() const;
|
RenderPass pass() const;
|
||||||
|
uint id() const {return id_;}
|
||||||
|
|
||||||
RenderMode renderMode() const {return render_mode;}
|
RenderMode renderMode() const {return render_mode;}
|
||||||
void setRenderMode(RenderMode mode) {render_mode = mode;}
|
void setRenderMode(RenderMode mode) {render_mode = mode;}
|
||||||
@@ -161,12 +158,11 @@ public:
|
|||||||
void select() {setSelected(true);}
|
void select() {setSelected(true);}
|
||||||
void deselect() {setSelected(false);}
|
void deselect() {setSelected(false);}
|
||||||
ObjectBase * selectedParent() const;
|
ObjectBase * selectedParent() const;
|
||||||
|
void setAimSelected(bool yes) {selected_aim = yes;}
|
||||||
|
bool isAimSelected() const {return selected_aim;}
|
||||||
|
|
||||||
bool isSelectable() const {return select_;}
|
bool isSelectable() const {return select_;}
|
||||||
void setSelectable(bool yes) {select_ = yes;}
|
void setSelectable(bool yes) {select_ = yes;}
|
||||||
/*
|
|
||||||
bool isWriteDepth() const {return write_depth_;}
|
|
||||||
void setWriteDepth(bool yes) {write_depth_ = yes;}*/
|
|
||||||
|
|
||||||
GLenum srcAlpha() const {return blend_src;}
|
GLenum srcAlpha() const {return blend_src;}
|
||||||
GLenum destAlpha() const {return blend_dest;}
|
GLenum destAlpha() const {return blend_dest;}
|
||||||
@@ -193,8 +189,6 @@ public:
|
|||||||
|
|
||||||
QVector3D pos_h;
|
QVector3D pos_h;
|
||||||
|
|
||||||
//QVector<GLfloat> d_vertices, d_normals, d_uvs;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void transformChanged() {}
|
virtual void transformChanged() {}
|
||||||
void addChildren(ObjectBaseList & list, ObjectBase * where);
|
void addChildren(ObjectBaseList & list, ObjectBase * where);
|
||||||
@@ -224,7 +218,6 @@ protected:
|
|||||||
Material * material_;
|
Material * material_;
|
||||||
Mesh * mesh_;
|
Mesh * mesh_;
|
||||||
QVariantMap meta;
|
QVariantMap meta;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool operator <(const ObjectBase & f, const ObjectBase & s) {return f.pos_h.z() < s.pos_h.z();}
|
inline bool operator <(const ObjectBase & f, const ObjectBase & s) {return f.pos_h.z() < s.pos_h.z();}
|
||||||
@@ -292,9 +285,6 @@ public:
|
|||||||
Type light_type;
|
Type light_type;
|
||||||
Framebuffer shadow_map;
|
Framebuffer shadow_map;
|
||||||
QMatrix4x4 shadow_matrix;
|
QMatrix4x4 shadow_matrix;
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ GLRendererBase::GLRendererBase(QGLView * view_): view(view_) {
|
|||||||
|
|
||||||
|
|
||||||
void GLRendererBase::setupLight(const Light & l, int inpass_index, int gl_index) {
|
void GLRendererBase::setupLight(const Light & l, int inpass_index, int gl_index) {
|
||||||
QVector3D lp = l.worldPos(), ld;// = (l.itransform_ * QVector4D(l.direction, 0.)).toVector3D().normalized();
|
QVector3D lp = l.worldPos(), ld;
|
||||||
GLfloat pos[] = {0.f, 0.f, 0.f, 0.f};
|
GLfloat pos[] = {0.f, 0.f, 0.f, 0.f};
|
||||||
GLfloat dir[] = {0.f, 0.f, 0.f};
|
GLfloat dir[] = {0.f, 0.f, 0.f};
|
||||||
GLfloat col[] = {0.f, 0.f, 0.f};
|
GLfloat col[] = {0.f, 0.f, 0.f};
|
||||||
@@ -43,11 +43,7 @@ void GLRendererBase::setupLight(const Light & l, int inpass_index, int gl_index)
|
|||||||
dir[0] = ld.x();
|
dir[0] = ld.x();
|
||||||
dir[1] = ld.y();
|
dir[1] = ld.y();
|
||||||
dir[2] = ld.z();
|
dir[2] = ld.z();
|
||||||
//col[0] = l.visible_ ? l.color().redF() * l.intensity : 0.f;
|
|
||||||
//col[1] = l.visible_ ? l.color().greenF() * l.intensity : 0.f;
|
|
||||||
//col[2] = l.visible_ ? l.color().blueF() * l.intensity : 0.f;
|
|
||||||
glEnable(gl_index);
|
glEnable(gl_index);
|
||||||
//glLightfv(gl_index, GL_AMBIENT, ambient);
|
|
||||||
glLightfv(gl_index, GL_DIFFUSE, col);
|
glLightfv(gl_index, GL_DIFFUSE, col);
|
||||||
glLightfv(gl_index, GL_SPECULAR, col);
|
glLightfv(gl_index, GL_SPECULAR, col);
|
||||||
glLightfv(gl_index, GL_POSITION, pos);
|
glLightfv(gl_index, GL_POSITION, pos);
|
||||||
@@ -68,23 +64,14 @@ void GLRendererBase::setupLight(const Light & l, int inpass_index, int gl_index)
|
|||||||
void GLRendererBase::setupAmbientLight(const QColor & a, bool first_pass) {
|
void GLRendererBase::setupAmbientLight(const QColor & a, bool first_pass) {
|
||||||
GLfloat ambient[] = {0.0f, 0.0f, 0.0f, 1.f};
|
GLfloat ambient[] = {0.0f, 0.0f, 0.0f, 1.f};
|
||||||
if (first_pass) {
|
if (first_pass) {
|
||||||
ambient[0] = view->ambientColor_.redF();
|
ambient[0] = view->ambientColor().redF();
|
||||||
ambient[1] = view->ambientColor_.greenF();
|
ambient[1] = view->ambientColor().greenF();
|
||||||
ambient[2] = view->ambientColor_.blueF();
|
ambient[2] = view->ambientColor().blueF();
|
||||||
}
|
}
|
||||||
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
|
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GLRendererBase::setupShadersLights(int lights_count) {
|
|
||||||
/*foreach (QOpenGLShaderProgram * i, view->shaders_ppl) {
|
|
||||||
i->bind();
|
|
||||||
i->setUniformValue("lightsCount", lights_count);
|
|
||||||
i->setUniformValue("acc_light", lights_count > 0);
|
|
||||||
//i->setUniformValue("mat", mvm);
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define BIND_TEXTURE(ch, map) if (rp.prev_tex[ch] != mat.map.bitmap_id) { \
|
#define BIND_TEXTURE(ch, map) if (rp.prev_tex[ch] != mat.map.bitmap_id) { \
|
||||||
rp.prev_tex[ch] = mat.map.bitmap_id; \
|
rp.prev_tex[ch] = mat.map.bitmap_id; \
|
||||||
@@ -97,177 +84,16 @@ void GLRendererBase::setupTextures(ObjectBase & o, GLRendererBase::RenderingPara
|
|||||||
#undef BIND_TEXTURE
|
#undef BIND_TEXTURE
|
||||||
|
|
||||||
|
|
||||||
void GLRendererBase::setupLights(int pass, int lights_per_pass) {
|
|
||||||
/*int light_start, light_end, lmax;
|
|
||||||
light_start = pass * lights_per_pass;
|
|
||||||
light_end = qMin<int>((pass + 1) * lights_per_pass, view->lights_.size());
|
|
||||||
setupAmbientLight(view->ambientColor_, pass == 0);
|
|
||||||
if (!view->lights_.isEmpty()) {
|
|
||||||
setupShadersLights(light_end - light_start);
|
|
||||||
for (int i = light_start; i < light_end; ++i)
|
|
||||||
setupLight(*view->lights_[i], i - light_start, GL_LIGHT0 + i - light_start);
|
|
||||||
lmax = light_start + 8;
|
|
||||||
for (int i = light_end; i < lmax; ++i)
|
|
||||||
glDisable(GL_LIGHT0 + i - light_start);
|
|
||||||
} else {
|
|
||||||
setupShadersLights(0);
|
|
||||||
for (int i = 0; i < 8; ++i)
|
|
||||||
glDisable(GL_LIGHT0 + i);
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GLRendererBase::applyFilteringParameters() {
|
void GLRendererBase::applyFilteringParameters() {
|
||||||
/*if (view->isFeatureEnabled(QGLView::qglLinearFiltering)) {
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
|
||||||
} else {
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
|
|
||||||
}*/
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, view->feature(QGLView::qglAnisotropicLevel).toInt());
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, view->feature(QGLView::qglAnisotropicLevel).toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GLRendererBase::renderObjects(int pass, int light_pass, void * shaders, bool textures, bool light, bool fog) {
|
|
||||||
/*RenderingParameters rpl;
|
|
||||||
rpl.pass = pass;
|
|
||||||
rpl.light_pass = light_pass;
|
|
||||||
rpl.shaders = shaders;
|
|
||||||
rpl.textures = textures;
|
|
||||||
rpl.light = rpl.prev_light = light;
|
|
||||||
rpl.fog = rpl.prev_fog = fog;
|
|
||||||
rpl.view_matrix = rp.view_matrix;
|
|
||||||
rpl.prev_view_matrix = rp.prev_view_matrix;
|
|
||||||
rpl.proj_matrix = rp.proj_matrix;
|
|
||||||
rpl.prev_proj_matrix = rp.prev_proj_matrix;
|
|
||||||
rpl.cam_offset_matrix = view->camera()->offsetMatrix();
|
|
||||||
//qDebug() << "view:" << rp.view_matrix;
|
|
||||||
for (int i = 0; i < 32; ++i) rpl.prev_tex[i] = 0;
|
|
||||||
setupTextures(view->objects_, rpl, true);
|
|
||||||
glSetCapEnabled(GL_TEXTURE_2D, rpl.textures);
|
|
||||||
glSetCapEnabled(GL_BLEND, pass == ObjectBase::Transparent);
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
glDisable(GL_TEXTURE_CUBE_MAP);
|
|
||||||
glPushMatrix();
|
|
||||||
renderSingleObject(view->objects_, rpl);
|
|
||||||
glPopMatrix();*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GLRendererBase::renderSingleObject(ObjectBase & o, RenderingParameters & rpl) {
|
|
||||||
// if (!o.isInit())
|
|
||||||
// o.init();
|
|
||||||
// if (!o.isTexturesLoaded())
|
|
||||||
// o.loadTextures();
|
|
||||||
// if (!o.visible_) return;
|
|
||||||
// if (rpl.pass == o.pass_) {
|
|
||||||
// //Material & mat(o.material_);
|
|
||||||
// QMatrix4x4 curview = rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_, prevview = rpl.prev_view_matrix * rpl.cam_offset_matrix * o.itransform_;
|
|
||||||
// //setupTextures(o, rpl, false);
|
|
||||||
// //mat.apply((QOpenGLShaderProgram*)rpl.shaders);
|
|
||||||
// glSetPolygonMode(o.render_mode != ObjectBase::View ? o.render_mode : (view->rmode != ObjectBase::View ? view->rmode : GL_FILL));
|
|
||||||
// glLineWidth(o.line_width > 0.f ? o.line_width : view->lineWidth_);
|
|
||||||
// glPointSize(o.line_width > 0.f ? o.line_width : view->lineWidth_);
|
|
||||||
// o.update();
|
|
||||||
// /*if (o.pass_ == GLObjectBase::Transparent) {
|
|
||||||
// glActiveTexture(GL_TEXTURE0 + 3);
|
|
||||||
// if (mat.reflectivity > 0.f) {
|
|
||||||
// glEnable(GL_TEXTURE_CUBE_MAP);
|
|
||||||
// //if (!mat.map_reflection.isEmpty()) mat.map_reflection.bind();
|
|
||||||
// //else glDisable(GL_TEXTURE_CUBE_MAP);
|
|
||||||
// } else glDisable(GL_TEXTURE_CUBE_MAP);
|
|
||||||
// if (rpl.light_pass > 0) glDisable(GL_TEXTURE_CUBE_MAP);
|
|
||||||
// GLfloat gm[16], bc[4] = {mat.reflectivity, mat.reflectivity, mat.reflectivity, mat.reflectivity};
|
|
||||||
// glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
|
||||||
// glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
|
|
||||||
// glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT);
|
|
||||||
// glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
|
|
||||||
// glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, bc);
|
|
||||||
// glGetFloatv(GL_MODELVIEW_MATRIX, gm);
|
|
||||||
// glMatrixMode(GL_TEXTURE);
|
|
||||||
// ///glLoadTransposeMatrixf(gm);
|
|
||||||
// glScalef(-1., -1., -1.);
|
|
||||||
// glMatrixMode(GL_MODELVIEW);
|
|
||||||
// glActiveTexture(GL_TEXTURE0);
|
|
||||||
// }*/
|
|
||||||
// if (rpl.shaders) {
|
|
||||||
// //qDebug() << o.name() << curview << curview->determinant();
|
|
||||||
// //setUniformMatrices((QOpenGLShaderProgram*)rpl.shaders, rpl.proj_matrix, curview, rpl.prev_proj_matrix, prevview);
|
|
||||||
// } else {
|
|
||||||
// glMatrixMode(GL_MODELVIEW);
|
|
||||||
// //setGLMatrix(curview);
|
|
||||||
// }
|
|
||||||
// o.draw((QOpenGLShaderProgram*)rpl.shaders);
|
|
||||||
// }
|
|
||||||
// foreach (ObjectBase * i, o.children_)
|
|
||||||
// renderSingleObject(*i, rpl);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GLRendererBase::renderShadow(Light * l, QOpenGLShaderProgram * prog, QMatrix4x4 mat) {
|
|
||||||
Camera cam;
|
|
||||||
QVector3D wp = l->worldPos();
|
|
||||||
cam.setPos(wp);
|
|
||||||
cam.setAim(wp + (l->worldTransform() * QVector4D(l->direction())).toVector3D());
|
|
||||||
cam.setDepthStart(view->camera()->depthStart());
|
|
||||||
cam.setFOV(l->angle_end);
|
|
||||||
//cam.apply(1.);
|
|
||||||
/*cam.rotateXY(l->angle_end);
|
|
||||||
QVector3D rdir = l->direction * cos(l->angle_end / 2. * deg2rad);
|
|
||||||
l->dir0 = cam.direction() - rdir;
|
|
||||||
cam.rotateXY(-l->angle_end);
|
|
||||||
cam.rotateZ(l->angle_end);
|
|
||||||
l->dir1 = cam.direction() - rdir;*/
|
|
||||||
//qDebug() << rdir << l->dir0 << l->dir1;
|
|
||||||
RenderingParameters rpl;
|
|
||||||
rpl.shaders = prog;
|
|
||||||
rpl.textures = rpl.light = rpl.fog = false;
|
|
||||||
//rpl.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);
|
|
||||||
//rpl.proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX);
|
|
||||||
rpl.cam_offset_matrix = cam.offsetMatrix();
|
|
||||||
QMatrix4x4 mbias;
|
|
||||||
mbias.scale(0.5, 0.5, 0.5);
|
|
||||||
mbias.translate(1., 1., 1.);
|
|
||||||
l->shadow_matrix = mbias*rpl.proj_matrix*rpl.view_matrix*rpl.cam_offset_matrix*mat;//;// * mbias;
|
|
||||||
//qDebug() << mbias;
|
|
||||||
//glPushMatrix();
|
|
||||||
//renderSingleShadow(view->objects_, rpl);
|
|
||||||
//glPopMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GLRendererBase::renderSingleShadow(ObjectBase & o, RenderingParameters & rpl) {
|
|
||||||
// if (!o.isInit())
|
|
||||||
// o.init();
|
|
||||||
// if (!o.visible_) return;
|
|
||||||
// if (rpl.shaders) {
|
|
||||||
// //qDebug() << o.name() << curview << curview->determinant();
|
|
||||||
// //setUniformMatrices((QOpenGLShaderProgram*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_);
|
|
||||||
// } else {
|
|
||||||
// glMatrixMode(GL_MODELVIEW);
|
|
||||||
// //setGLMatrix(rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_);
|
|
||||||
// }
|
|
||||||
// glPolygonMode(GL_FRONT_AND_BACK, o.render_mode != ObjectBase::View ? o.render_mode : (view->rmode != ObjectBase::View ? view->rmode : GL_FILL));
|
|
||||||
// glLineWidth(o.line_width > 0.f ? o.line_width : view->lineWidth_);
|
|
||||||
// glPointSize(o.line_width > 0.f ? o.line_width : view->lineWidth_);
|
|
||||||
// o.draw((QOpenGLShaderProgram*)rpl.shaders, true);
|
|
||||||
// foreach (ObjectBase * i, o.children_)
|
|
||||||
// renderSingleShadow(*i, rpl);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GLRendererBase::RenderingParameters::RenderingParameters() {
|
GLRendererBase::RenderingParameters::RenderingParameters() {
|
||||||
shaders = nullptr;
|
|
||||||
cur_shader = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GLRendererBase::RenderingParameters::prepare() {
|
void GLRendererBase::RenderingParameters::prepare() {
|
||||||
//proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX);
|
|
||||||
//view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);
|
|
||||||
viewproj_matrix = proj_matrix * view_matrix;
|
viewproj_matrix = proj_matrix * view_matrix;
|
||||||
normal_matrix = view_matrix.normalMatrix();
|
normal_matrix = view_matrix.normalMatrix();
|
||||||
proj_matrix_i = proj_matrix.inverted();
|
proj_matrix_i = proj_matrix.inverted();
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "glcamera.h"
|
#include "glcamera.h"
|
||||||
#include "glshaders.h"
|
#include "glshaders.h"
|
||||||
|
|
||||||
|
|
||||||
class GLRendererBase: public QObject , protected QOpenGLExtraFunctions
|
class GLRendererBase: public QObject , protected QOpenGLExtraFunctions
|
||||||
{
|
{
|
||||||
friend class QGLView;
|
friend class QGLView;
|
||||||
@@ -35,21 +36,10 @@ public:
|
|||||||
RenderingParameters();
|
RenderingParameters();
|
||||||
void prepare();
|
void prepare();
|
||||||
void setUniform(QOpenGLShaderProgram * prog);
|
void setUniform(QOpenGLShaderProgram * prog);
|
||||||
int pass;
|
QMatrix4x4 view_matrix, view_matrix_i;
|
||||||
int light_pass;
|
QMatrix4x4 proj_matrix, proj_matrix_i;
|
||||||
bool light;
|
|
||||||
bool fog;
|
|
||||||
bool textures;
|
|
||||||
bool prev_light;
|
|
||||||
bool prev_fog;
|
|
||||||
GLuint prev_tex[32];
|
|
||||||
void * shaders;
|
|
||||||
QMatrix4x4 view_matrix, view_matrix_i, prev_view_matrix;
|
|
||||||
QMatrix4x4 proj_matrix, proj_matrix_i, prev_proj_matrix;
|
|
||||||
QMatrix4x4 viewproj_matrix, viewproj_matrix_i;
|
QMatrix4x4 viewproj_matrix, viewproj_matrix_i;
|
||||||
QMatrix3x3 normal_matrix;
|
QMatrix3x3 normal_matrix;
|
||||||
QMatrix4x4 cam_offset_matrix;
|
|
||||||
QOpenGLShaderProgram * cur_shader;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
RenderingParameters rp;
|
RenderingParameters rp;
|
||||||
@@ -57,24 +47,18 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
virtual void setupLight(const Light & l, int inpass_index, int gl_index);
|
virtual void setupLight(const Light & l, int inpass_index, int gl_index);
|
||||||
virtual void setupAmbientLight(const QColor & a, bool first_pass);
|
virtual void setupAmbientLight(const QColor & a, bool first_pass);
|
||||||
virtual void setupShadersLights(int lights_count);
|
virtual void setupShadersLights(int lights_count) {}
|
||||||
virtual void setupTextures(ObjectBase & object, GLRendererBase::RenderingParameters & rp, bool first_object = false);
|
virtual void setupTextures(ObjectBase & object, GLRendererBase::RenderingParameters & rp, bool first_object = false);
|
||||||
virtual void setupShadersTextures(ObjectBase & object, GLRendererBase::RenderingParameters & rp) {}
|
virtual void setupShadersTextures(ObjectBase & object, GLRendererBase::RenderingParameters & rp) {}
|
||||||
virtual void reloadShaders() {}
|
virtual void reloadShaders() {}
|
||||||
virtual void init(int width, int height) {}
|
virtual void init(int width, int height) {}
|
||||||
virtual void resize(int width, int height) {}
|
virtual void resize(int width, int height) {}
|
||||||
|
|
||||||
void setupLights(int pass, int lights_per_pass);
|
|
||||||
inline void applyFilteringParameters();
|
inline void applyFilteringParameters();
|
||||||
void renderObjects(int pass, int light_pass, void * shaders = 0, bool textures = true, bool light = true, bool fog = true);
|
|
||||||
void renderSingleObject(ObjectBase & o, RenderingParameters & rpl);
|
|
||||||
void renderShadow(Light * l, QOpenGLShaderProgram * prog = 0, QMatrix4x4 mat = QMatrix4x4());
|
|
||||||
void renderSingleShadow(ObjectBase & o, RenderingParameters & rpl);
|
|
||||||
|
|
||||||
QGLView * view;
|
QGLView * view;
|
||||||
QImage white_image, violent_image;
|
QImage white_image, violent_image;
|
||||||
GLuint white_image_id, violent_image_id;
|
GLuint white_image_id, violent_image_id;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GLRENDERERBASE_H
|
#endif // GLRENDERERBASE_H
|
||||||
|
|||||||
19
glscene.cpp
19
glscene.cpp
@@ -106,7 +106,7 @@ void Scene::clear() {
|
|||||||
|
|
||||||
void Scene::objectsCountInternal(int * cnt, ObjectBase * where) {
|
void Scene::objectsCountInternal(int * cnt, ObjectBase * where) {
|
||||||
++(*cnt);
|
++(*cnt);
|
||||||
foreach (ObjectBase * i, where->children_)
|
foreach (ObjectBase * i, where->children())
|
||||||
objectsCountInternal(cnt, i);
|
objectsCountInternal(cnt, i);
|
||||||
}
|
}
|
||||||
int Scene::objectsCount(bool all) {
|
int Scene::objectsCount(bool all) {
|
||||||
@@ -119,7 +119,7 @@ int Scene::objectsCount(bool all) {
|
|||||||
|
|
||||||
void Scene::removeObjectInternal(ObjectBase * o, ObjectBase * where) {
|
void Scene::removeObjectInternal(ObjectBase * o, ObjectBase * where) {
|
||||||
if (destroying) return;
|
if (destroying) return;
|
||||||
foreach (ObjectBase * i, where->children_) {
|
foreach (ObjectBase * i, where->children()) {
|
||||||
if (o == i) {
|
if (o == i) {
|
||||||
where->removeChild(i);
|
where->removeChild(i);
|
||||||
setObjectMeshChanged(i);
|
setObjectMeshChanged(i);
|
||||||
@@ -250,7 +250,8 @@ void Scene::clearSelection() {
|
|||||||
selected_top.clear();
|
selected_top.clear();
|
||||||
ObjectBaseList ol = root_->children(true);
|
ObjectBaseList ol = root_->children(true);
|
||||||
foreach (ObjectBase * o, ol) {
|
foreach (ObjectBase * o, ol) {
|
||||||
o->selected_ = o->selected_aim = false;
|
o->setSelected(false);
|
||||||
|
o->setAimSelected(false);
|
||||||
}
|
}
|
||||||
emitSelectionChanged();
|
emitSelectionChanged();
|
||||||
}
|
}
|
||||||
@@ -275,9 +276,6 @@ void gatherMeshes(ObjectBase * o, QSet<Mesh*> & ums) {
|
|||||||
void Scene::cleanUnused() {
|
void Scene::cleanUnused() {
|
||||||
QSet<Mesh*> ums;
|
QSet<Mesh*> ums;
|
||||||
gatherMeshes(root_, ums);
|
gatherMeshes(root_, ums);
|
||||||
/*QMapIterator<int, QMap<Mesh*, ObjectBaseList>> it(geometries_used);
|
|
||||||
while (it.hasNext())
|
|
||||||
ums |= it.next().value().keys().toSet();*/
|
|
||||||
for (int i = 0; i < geometries.size(); ++i) {
|
for (int i = 0; i < geometries.size(); ++i) {
|
||||||
if (ums.contains(geometries[i])) continue;
|
if (ums.contains(geometries[i])) continue;
|
||||||
td_geometries << geometries[i];
|
td_geometries << geometries[i];
|
||||||
@@ -344,7 +342,7 @@ void Scene::gatherSelection() {
|
|||||||
selected_.clear();
|
selected_.clear();
|
||||||
ObjectBaseList ol = root_->children(true);
|
ObjectBaseList ol = root_->children(true);
|
||||||
foreach (ObjectBase * o, ol)
|
foreach (ObjectBase * o, ol)
|
||||||
if (o->selected_)
|
if (o->isSelected())
|
||||||
selected_ << o;
|
selected_ << o;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,7 +351,7 @@ void Scene::attachObject(ObjectBase * o) {
|
|||||||
if (!o) return;
|
if (!o) return;
|
||||||
o->setScene(this);
|
o->setScene(this);
|
||||||
if (o->mesh()) { // search suitable mesh in this scene
|
if (o->mesh()) { // search suitable mesh in this scene
|
||||||
o->mesh_ = attachMesh(o->mesh());
|
o->setMesh(attachMesh(o->mesh()));
|
||||||
setObjectMeshChanged(o);
|
setObjectMeshChanged(o);
|
||||||
}
|
}
|
||||||
if (o->material()) { // search suitable material in this scene
|
if (o->material()) { // search suitable material in this scene
|
||||||
@@ -483,7 +481,6 @@ void Scene::destroy(QOpenGLExtraFunctions * f) {
|
|||||||
|
|
||||||
|
|
||||||
void Scene::destroyUnused(QOpenGLExtraFunctions * f) {
|
void Scene::destroyUnused(QOpenGLExtraFunctions * f) {
|
||||||
//if (!td_geometries.isEmpty()) qDebug() << "destroyUnused" << td_geometries.size();
|
|
||||||
foreach (Mesh * i, td_geometries)
|
foreach (Mesh * i, td_geometries)
|
||||||
i->destroy(f);
|
i->destroy(f);
|
||||||
qDeleteAll(td_geometries);
|
qDeleteAll(td_geometries);
|
||||||
@@ -505,18 +502,14 @@ QDataStream & operator <<(QDataStream & s, const Scene * p) {
|
|||||||
cs.add(1, p->name_).add(10, p->geometries).add(11, p->materials)
|
cs.add(1, p->name_).add(10, p->geometries).add(11, p->materials)
|
||||||
.add(20, p->root_).add(21, geom_ind).add(22, mat_ind);
|
.add(20, p->root_).add(21, geom_ind).add(22, mat_ind);
|
||||||
s << qCompress(cs.data());
|
s << qCompress(cs.data());
|
||||||
//s << cs.data();
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
QDataStream & operator >>(QDataStream & s, Scene *& p) {
|
QDataStream & operator >>(QDataStream & s, Scene *& p) {
|
||||||
p = new Scene();
|
p = new Scene();
|
||||||
//ChunkStream cs(s);
|
|
||||||
|
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
s >> ba;
|
s >> ba;
|
||||||
ba = qUncompress(ba);
|
ba = qUncompress(ba);
|
||||||
ChunkStream cs(ba);
|
ChunkStream cs(ba);
|
||||||
|
|
||||||
QVector<short> geom_ind, mat_ind;
|
QVector<short> geom_ind, mat_ind;
|
||||||
while (!cs.atEnd()) {
|
while (!cs.atEnd()) {
|
||||||
switch (cs.read()) {
|
switch (cs.read()) {
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
class Scene: public QObject {
|
class Scene: public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
friend class QGLView;
|
|
||||||
friend class RendererBase;
|
friend class RendererBase;
|
||||||
friend class Renderer;
|
friend class Renderer;
|
||||||
friend class RendererMaterial;
|
friend class RendererMaterial;
|
||||||
@@ -119,8 +118,8 @@ protected:
|
|||||||
QVector<Mesh*> geometries, td_geometries;
|
QVector<Mesh*> geometries, td_geometries;
|
||||||
QVector<Material*> materials;
|
QVector<Material*> materials;
|
||||||
|
|
||||||
QMap<int, QMap<Mesh*, ObjectBaseList>> geometries_used; // [pass][mesh] = ObjectBaseList
|
QMap<int, QMap<Mesh*, ObjectBaseList>> geometries_used;
|
||||||
QMap<int, QList<Light*>> lights_used; // by Light::Type
|
QMap<int, QList<Light*>> lights_used;
|
||||||
QList<Camera*> cameras_used;
|
QList<Camera*> cameras_used;
|
||||||
QVector<Material*> changed_materials;
|
QVector<Material*> changed_materials;
|
||||||
|
|
||||||
@@ -129,14 +128,11 @@ protected:
|
|||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void __objectDeleted(ObjectBase * o);
|
void __objectDeleted(ObjectBase * o);
|
||||||
void __destroyed();
|
void __destroyed();
|
||||||
void treeChanged();
|
void treeChanged();
|
||||||
//void treeStructChanged();
|
|
||||||
void selectionChanged();
|
void selectionChanged();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ GLuint TextureManager::loadTexture(const QString & path, bool ownership, bool bu
|
|||||||
if (bump) convertToNormal(image);
|
if (bump) convertToNormal(image);
|
||||||
//qDebug() << p << image.width() << image.height() << image.format() << bump;
|
//qDebug() << p << image.width() << image.height() << image.format() << bump;
|
||||||
GLuint tid_ = tid;
|
GLuint tid_ = tid;
|
||||||
createGLTexture(f, tid_, image);///currentQGLView->bindTexture(image, GL_TEXTURE_2D);
|
createGLTexture(f, tid_, image);
|
||||||
tid = tid_;
|
tid = tid_;
|
||||||
if (tid == 0) {
|
if (tid == 0) {
|
||||||
qDebug() << "[TextureManager] Can`t load" << p;
|
qDebug() << "[TextureManager] Can`t load" << p;
|
||||||
@@ -64,7 +64,7 @@ GLuint TextureManager::loadTexture(const QImage & im, bool ownership, bool bump)
|
|||||||
QImage image(im);
|
QImage image(im);
|
||||||
if (bump) convertToNormal(image);
|
if (bump) convertToNormal(image);
|
||||||
GLuint tid = 0;
|
GLuint tid = 0;
|
||||||
createGLTexture(f, tid, im);///currentQGLView->bindTexture(image, GL_TEXTURE_2D);
|
createGLTexture(f, tid, im);
|
||||||
if (tid == 0) {
|
if (tid == 0) {
|
||||||
qDebug() << "[TextureManager] Can`t load image";
|
qDebug() << "[TextureManager] Can`t load image";
|
||||||
return tid;
|
return tid;
|
||||||
|
|||||||
@@ -56,9 +56,7 @@ protected:
|
|||||||
QMap<QString, GLuint> tex_ids[2];
|
QMap<QString, GLuint> tex_ids[2];
|
||||||
QMap<QString, QImage> tex_im [2];
|
QMap<QString, QImage> tex_im [2];
|
||||||
QStringList tex_pathes;
|
QStringList tex_pathes;
|
||||||
|
|
||||||
QOpenGLExtraFunctions * f;
|
QOpenGLExtraFunctions * f;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -97,8 +97,6 @@ private:
|
|||||||
QWidget * container;
|
QWidget * container;
|
||||||
QGLView * view_;
|
QGLView * view_;
|
||||||
QLayout * lay;
|
QLayout * lay;
|
||||||
|
|
||||||
signals:
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GLWIDGET_H
|
#endif // GLWIDGET_H
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ void MouseController::mouseReleaseEvent(QMouseEvent * e) {
|
|||||||
selecting_ = false;
|
selecting_ = false;
|
||||||
canSelect_ = true;
|
canSelect_ = true;
|
||||||
view->renderer_.mouse_rect = QRect();
|
view->renderer_.mouse_rect = QRect();
|
||||||
view->scene_->selectObjects(hov_objects.toList(), add_ts);
|
view->scene()->selectObjects(hov_objects.toList(), add_ts);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (canSelect_ && mouseSelect_) {
|
if (canSelect_ && mouseSelect_) {
|
||||||
@@ -68,16 +68,16 @@ void MouseController::mouseReleaseEvent(QMouseEvent * e) {
|
|||||||
view->scene()->clearSelection();
|
view->scene()->clearSelection();
|
||||||
} else {
|
} else {
|
||||||
if (!hov_objects.isEmpty())
|
if (!hov_objects.isEmpty())
|
||||||
view->scene_->selectObject(hov_objects[0], add_ts);
|
view->scene()->selectObject(hov_objects[0], add_ts);
|
||||||
if (!hov_aims.isEmpty()) {
|
if (!hov_aims.isEmpty()) {
|
||||||
view->scene_->selectObject(hov_aims[0], add_ts);
|
view->scene()->selectObject(hov_aims[0], add_ts);
|
||||||
hov_aims[0]->selected_aim = true;
|
hov_aims[0]->setAimSelected(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (e->button() == Qt::RightButton) {
|
if (e->button() == Qt::RightButton) {
|
||||||
if (view->renderer_.edit_mode && !view->scene()->selectedObjects().isEmpty())
|
if (view->renderer_.edit_mode && !view->scene()->selectedObjects().isEmpty())
|
||||||
view->context_menu.popup(e->globalPos());
|
view->popupMenu(e->globalPos());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -107,7 +107,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
|||||||
QPoint cpos = e->pos();
|
QPoint cpos = e->pos();
|
||||||
if (cur_action != RendererService::haNoAction && (e->buttons() == Qt::LeftButton)) {
|
if (cur_action != RendererService::haNoAction && (e->buttons() == Qt::LeftButton)) {
|
||||||
RendererService & rs(view->renderer_.rend_service);
|
RendererService & rs(view->renderer_.rend_service);
|
||||||
ObjectBaseList objects = view->scene_->selectedObjects(true);
|
ObjectBaseList objects = view->scene()->selectedObjects(true);
|
||||||
QVector<int> axis;
|
QVector<int> axis;
|
||||||
switch (cur_action) {
|
switch (cur_action) {
|
||||||
case RendererService::haMove:
|
case RendererService::haMove:
|
||||||
@@ -146,7 +146,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
|||||||
if (o->parent())
|
if (o->parent())
|
||||||
pmat = o->parent()->worldTransform().inverted();
|
pmat = o->parent()->worldTransform().inverted();
|
||||||
QVector3D dv = pmat.mapVector(axe_vector);
|
QVector3D dv = pmat.mapVector(axe_vector);
|
||||||
if (o->selected_aim) {
|
if (o->isAimSelected()) {
|
||||||
AimedObject * ao = (AimedObject*)o;
|
AimedObject * ao = (AimedObject*)o;
|
||||||
ao->setAim(ao->aim() + dv);
|
ao->setAim(ao->aim() + dv);
|
||||||
} else
|
} else
|
||||||
@@ -168,7 +168,6 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
|||||||
scales << axe_vector;
|
scales << axe_vector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//if (cur_handle >= RendererService::htScaleX && cur_handle <= RendererService::htScaleZ ) cs = Qt::SplitHCursor;
|
|
||||||
if (cur_action == RendererService::haScale) {
|
if (cur_action == RendererService::haScale) {
|
||||||
double sc = 0., max = 0.;
|
double sc = 0., max = 0.;
|
||||||
foreach (const QVector3D & s, scales) {
|
foreach (const QVector3D & s, scales) {
|
||||||
@@ -222,7 +221,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
|||||||
if (customMouseMove_) emit view->customMouseMoveEvent(e->pos(), lastPos, e->buttons());
|
if (customMouseMove_) emit view->customMouseMoveEvent(e->pos(), lastPos, e->buttons());
|
||||||
lastPos = e->pos();
|
lastPos = e->pos();
|
||||||
if (e->buttons() == 0) {
|
if (e->buttons() == 0) {
|
||||||
cur_handle = 0;
|
cur_handle = QFlags<RendererService::HandleMesh>();
|
||||||
cur_action = RendererService::haNoAction;
|
cur_action = RendererService::haNoAction;
|
||||||
Qt::CursorShape cs = Qt::CrossCursor;
|
Qt::CursorShape cs = Qt::CrossCursor;
|
||||||
if (view->renderer_.edit_mode) {
|
if (view->renderer_.edit_mode) {
|
||||||
@@ -242,7 +241,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cur_action == RendererService::haNoAction)
|
if (cur_action == RendererService::haNoAction)
|
||||||
cur_handle = 0;
|
cur_handle = QFlags<RendererService::HandleMesh>();
|
||||||
view->setCursor(cs);
|
view->setCursor(cs);
|
||||||
view->renderer_.rend_service.current_handle = cur_handle;
|
view->renderer_.rend_service.current_handle = cur_handle;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ OpenGLWindow::OpenGLWindow(QWindow *parent)
|
|||||||
#endif
|
#endif
|
||||||
format.setDepthBufferSize(24);
|
format.setDepthBufferSize(24);
|
||||||
format.setSamples(8);
|
format.setSamples(8);
|
||||||
// format.setStencilBufferSize(8);
|
|
||||||
setFormat(format);
|
setFormat(format);
|
||||||
QSurfaceFormat::setDefaultFormat(format);
|
QSurfaceFormat::setDefaultFormat(format);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class QOpenGLContext;
|
|||||||
class QOpenGLPaintDevice;
|
class QOpenGLPaintDevice;
|
||||||
|
|
||||||
|
|
||||||
class OpenGLWindow: public QWindow, protected QOpenGLExtraFunctions
|
class OpenGLWindow: public QWindow, public QOpenGLExtraFunctions
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
@@ -33,9 +33,7 @@ public:
|
|||||||
|
|
||||||
virtual void render(QPainter *painter);
|
virtual void render(QPainter *painter);
|
||||||
virtual void render();
|
virtual void render();
|
||||||
|
|
||||||
virtual void initialize();
|
virtual void initialize();
|
||||||
|
|
||||||
QOpenGLContext * context() {return m_context;}
|
QOpenGLContext * context() {return m_context;}
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
@@ -44,7 +42,6 @@ public slots:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool event(QEvent *event) override;
|
bool event(QEvent *event) override;
|
||||||
|
|
||||||
void exposeEvent(QExposeEvent *event) override;
|
void exposeEvent(QExposeEvent *event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
11
qglview.cpp
11
qglview.cpp
@@ -76,8 +76,6 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) {
|
|||||||
hoverHalo_ = selectionHalo_ = true;
|
hoverHalo_ = selectionHalo_ = true;
|
||||||
fogEnabled_ = is_init = shaders_bind = changed_ = false;
|
fogEnabled_ = is_init = shaders_bind = changed_ = false;
|
||||||
rmode = ObjectBase::Fill;
|
rmode = ObjectBase::Fill;
|
||||||
// sel_pen = QPen(Qt::black, 1, Qt::DashLine);
|
|
||||||
// sel_brush = QBrush(QColor(170, 100, 255, 120));
|
|
||||||
scene_ = new Scene();
|
scene_ = new Scene();
|
||||||
connect(scene_, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
|
connect(scene_, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
|
||||||
connect(scene_, SIGNAL(__destroyed()), this, SLOT(__destroyed()));
|
connect(scene_, SIGNAL(__destroyed()), this, SLOT(__destroyed()));
|
||||||
@@ -89,22 +87,14 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) {
|
|||||||
// qDebug() << camera_->aim();
|
// qDebug() << camera_->aim();
|
||||||
default_camera->setName("Camera");
|
default_camera->setName("Camera");
|
||||||
emit cameraPosChanged(default_camera->pos());
|
emit cameraPosChanged(default_camera->pos());
|
||||||
//camera().aim_ = camera().pos_;
|
|
||||||
ktm_.restart();
|
ktm_.restart();
|
||||||
|
|
||||||
//Mesh * m = Primitive::torus(100, 40, 1., 0.4, 360);
|
|
||||||
Mesh * m = Primitive::cube(10, 10, 10);
|
Mesh * m = Primitive::cube(10, 10, 10);
|
||||||
m->flipNormals();
|
m->flipNormals();
|
||||||
//QMatrix4x4 mat;
|
|
||||||
//mat.rotate(90, 0,1,0);
|
|
||||||
//mat.translate(0, 0, 2);
|
|
||||||
//mat.rotate(180, 1,0,0);
|
|
||||||
//m->transformPoints(mat);
|
|
||||||
ObjectBase * o = new ObjectBase(m);
|
ObjectBase * o = new ObjectBase(m);
|
||||||
o->setColor(Qt::cyan);
|
o->setColor(Qt::cyan);
|
||||||
scene()->addObject(o);
|
scene()->addObject(o);
|
||||||
delete m;
|
delete m;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -156,7 +146,6 @@ void QGLView::resizeEvent(QResizeEvent * e) {
|
|||||||
|
|
||||||
void QGLView::timerEvent(QTimerEvent *) {
|
void QGLView::timerEvent(QTimerEvent *) {
|
||||||
renderNow();
|
renderNow();
|
||||||
//if (ktm_.elapsed() < QApplication::keyboardInputInterval()) return;
|
|
||||||
Qt::KeyboardModifiers km = QApplication::keyboardModifiers();
|
Qt::KeyboardModifiers km = QApplication::keyboardModifiers();
|
||||||
foreach (int i, keys_)
|
foreach (int i, keys_)
|
||||||
emit keyEvent((Qt::Key)i, km);
|
emit keyEvent((Qt::Key)i, km);
|
||||||
|
|||||||
20
qglview.h
20
qglview.h
@@ -33,17 +33,7 @@
|
|||||||
|
|
||||||
class QGLView: public OpenGLWindow
|
class QGLView: public OpenGLWindow
|
||||||
{
|
{
|
||||||
friend class MouseController;
|
|
||||||
friend class GLRendererBase;
|
|
||||||
friend class TextureManager;
|
|
||||||
friend class ObjectBase;
|
|
||||||
friend class Scene;
|
|
||||||
friend class RendererBase;
|
|
||||||
friend class Renderer;
|
|
||||||
friend class RendererMaterial;
|
|
||||||
friend class RendererService;
|
|
||||||
friend class RendererSelection;
|
friend class RendererSelection;
|
||||||
friend class TonemappingProc;
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY (QColor backColor READ backColor WRITE setBackColor)
|
Q_PROPERTY (QColor backColor READ backColor WRITE setBackColor)
|
||||||
Q_PROPERTY (float lineWidth READ lineWidth WRITE setLineWidth)
|
Q_PROPERTY (float lineWidth READ lineWidth WRITE setLineWidth)
|
||||||
@@ -115,8 +105,8 @@ public:
|
|||||||
|
|
||||||
QColor backColor() const {return backColor_;}
|
QColor backColor() const {return backColor_;}
|
||||||
float lineWidth() const {return lineWidth_;}
|
float lineWidth() const {return lineWidth_;}
|
||||||
float FOV() const {return camera()->fov_;}
|
float FOV() const {return camera()->FOV();}
|
||||||
float depthStart() const {return camera()->depth_start;}
|
float depthStart() const {return camera()->depthStart();}
|
||||||
float currentFPS() const {return fps_;}
|
float currentFPS() const {return fps_;}
|
||||||
float gamma() const {return renderer_.gamma_;}
|
float gamma() const {return renderer_.gamma_;}
|
||||||
bool autoExposure() const {return renderer_.tone_proc.enabled;}
|
bool autoExposure() const {return renderer_.tone_proc.enabled;}
|
||||||
@@ -186,6 +176,7 @@ public:
|
|||||||
QImage materialThumbnail(Material * m) {return renderer_.materialThumbnail(m);}
|
QImage materialThumbnail(Material * m) {return renderer_.materialThumbnail(m);}
|
||||||
void setCurrentAction(RendererService::HandleAction ha) {renderer_.rend_service.setCurrentAction(ha);}
|
void setCurrentAction(RendererService::HandleAction ha) {renderer_.rend_service.setCurrentAction(ha);}
|
||||||
void setContextActions(QList<QAction*> al) {context_menu.clear(); context_menu.addActions(al);}
|
void setContextActions(QList<QAction*> al) {context_menu.clear(); context_menu.addActions(al);}
|
||||||
|
void popupMenu(const QPoint &pos, QAction *at = nullptr) {context_menu.popup(pos, at);}
|
||||||
|
|
||||||
GLfloat aspect, iaspect;
|
GLfloat aspect, iaspect;
|
||||||
Renderer renderer_;
|
Renderer renderer_;
|
||||||
@@ -241,8 +232,8 @@ private slots:
|
|||||||
public slots:
|
public slots:
|
||||||
void setBackColor(const QColor & arg) {backColor_ = arg;}
|
void setBackColor(const QColor & arg) {backColor_ = arg;}
|
||||||
void setLineWidth(const float & arg) {lineWidth_ = arg;}
|
void setLineWidth(const float & arg) {lineWidth_ = arg;}
|
||||||
void setFOV(const float & arg) {camera()->fov_ = arg;}
|
void setFOV(const float & arg) {camera()->setFOV(arg);}
|
||||||
void setDepthStart(const float & arg) {camera()->depth_start = arg;}
|
void setDepthStart(const float & arg) {camera()->setDepthStart(arg);}
|
||||||
void setGamma(const float & arg) {renderer_.gamma_ = arg;}
|
void setGamma(const float & arg) {renderer_.gamma_ = arg;}
|
||||||
void setAutoExposure(bool arg) {renderer_.tone_proc.enabled = arg;}
|
void setAutoExposure(bool arg) {renderer_.tone_proc.enabled = arg;}
|
||||||
void setAmbientColor(const QColor & arg) {ambientColor_ = arg;}
|
void setAmbientColor(const QColor & arg) {ambientColor_ = arg;}
|
||||||
@@ -287,7 +278,6 @@ signals:
|
|||||||
void materialsChanged();
|
void materialsChanged();
|
||||||
void materialThumbnailCreated(Material*);
|
void materialThumbnailCreated(Material*);
|
||||||
void doubleClick();
|
void doubleClick();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QGLVIEW_H
|
#endif // QGLVIEW_H
|
||||||
|
|||||||
37
renderer.cpp
37
renderer.cpp
@@ -51,22 +51,6 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_),
|
|||||||
shader_files[srFinalPass ] = "ds_final.glsl";
|
shader_files[srFinalPass ] = "ds_final.glsl";
|
||||||
shader_files[srTonemapPass ] = "ds_tonemap.glsl";
|
shader_files[srTonemapPass ] = "ds_tonemap.glsl";
|
||||||
|
|
||||||
/*shaders << ShaderPair("FXAA", &shader_fxaa)
|
|
||||||
<< ShaderPair("dsl_pass_0", &shader_ds_0)
|
|
||||||
<< ShaderPair("dsl_pass_1", &shader_ds_1)
|
|
||||||
<< ShaderPair("hdr", &shader_hdr)
|
|
||||||
<< ShaderPair("downscale", &shader_small)
|
|
||||||
<< ShaderPair("bloom_pass_0", &shader_bloom_0)
|
|
||||||
<< ShaderPair("bloom_pass_1", &shader_bloom_1)
|
|
||||||
<< ShaderPair("fbo_add", &shader_fbo_add)
|
|
||||||
<< ShaderPair("motion_blur", &shader_motion_blur)
|
|
||||||
<< ShaderPair("shadow", &shader_shadow)
|
|
||||||
<< ShaderPair("ssr", &shader_ssr)
|
|
||||||
<< ShaderPair("ssr_blur", &shader_ssr_blur)
|
|
||||||
<< ShaderPair("ssr_merge", &shader_ssr_merge)
|
|
||||||
<< ShaderPair("ssao_blur", &shader_ssao_blur)
|
|
||||||
<< ShaderPair("ssao_merge", &shader_ssao_merge)
|
|
||||||
<< ShaderPair("dof", &shader_dof);*/
|
|
||||||
shader_fxaa = 0;
|
shader_fxaa = 0;
|
||||||
gamma_ = 1.;
|
gamma_ = 1.;
|
||||||
edit_mode = need_init_shaders = true;
|
edit_mode = need_init_shaders = true;
|
||||||
@@ -159,7 +143,6 @@ void Renderer::initShaders() {
|
|||||||
for (int i = 0; i < 5; ++i)
|
for (int i = 0; i < 5; ++i)
|
||||||
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
|
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
|
||||||
prog->setUniformValue("tex_coeffs[0]", (int)Renderer::dbrBuffersCount);
|
prog->setUniformValue("tex_coeffs[0]", (int)Renderer::dbrBuffersCount);
|
||||||
//prog->setUniformValue("tex_coeffs[1]", (int)Renderer::dbrBuffersCount+1);
|
|
||||||
prog->setUniformValue("tex_env", (int)Renderer::dbrBuffersCount+1);
|
prog->setUniformValue("tex_env", (int)Renderer::dbrBuffersCount+1);
|
||||||
}
|
}
|
||||||
if (bindShader(srFinalPass, &prog)) {
|
if (bindShader(srFinalPass, &prog)) {
|
||||||
@@ -194,9 +177,9 @@ void Renderer::fillObjectsBuffer(const ObjectBaseList & ol, RenderPass pass) {
|
|||||||
so.color = QVector4D(1,1,1,1);
|
so.color = QVector4D(1,1,1,1);
|
||||||
} else {
|
} else {
|
||||||
so.material = 0;
|
so.material = 0;
|
||||||
so.color = QColor2QVector(o->color_);
|
so.color = QColor2QVector(o->color());
|
||||||
}
|
}
|
||||||
so.object_id = o->id_;
|
so.object_id = o->id();
|
||||||
o->worldTransform().transposed().copyDataTo(so.modelmatrix);
|
o->worldTransform().transposed().copyDataTo(so.modelmatrix);
|
||||||
//qDebug() << "load obj" << o->name() << o->worldTransform();
|
//qDebug() << "load obj" << o->name() << o->worldTransform();
|
||||||
}
|
}
|
||||||
@@ -242,11 +225,10 @@ void Renderer::renderLight(int first_wr_buff, bool clear_only) {
|
|||||||
fbo_ds.bindColorTextures();
|
fbo_ds.bindColorTextures();
|
||||||
fbo_out.bind();
|
fbo_out.bind();
|
||||||
tex_env.bind((int)Renderer::dbrBuffersCount+1);
|
tex_env.bind((int)Renderer::dbrBuffersCount+1);
|
||||||
//int ri = 1, wi = 0;
|
|
||||||
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
|
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
|
||||||
QVector<PassPair> passes;
|
QVector<PassPair> passes;
|
||||||
passes << PassPair(srLightOmniPass, Light::Omni) << PassPair(srLightSpotPass, Light::Cone);
|
passes << PassPair(srLightOmniPass, Light::Omni) << PassPair(srLightSpotPass, Light::Cone);
|
||||||
QColor back = view->fogColor_;
|
QColor back = view->fogColor();
|
||||||
back.setAlpha(0);
|
back.setAlpha(0);
|
||||||
foreach (PassPair pass, passes) {
|
foreach (PassPair pass, passes) {
|
||||||
if (bindShader(pass.first, &prog)) {
|
if (bindShader(pass.first, &prog)) {
|
||||||
@@ -257,9 +239,9 @@ void Renderer::renderLight(int first_wr_buff, bool clear_only) {
|
|||||||
setUniformViewCorners(prog, cam);
|
setUniformViewCorners(prog, cam);
|
||||||
prog->setUniformValue("lights_start", lights_start[pass.second]);
|
prog->setUniformValue("lights_start", lights_start[pass.second]);
|
||||||
prog->setUniformValue("lights_count", cur_lights[pass.second].size());
|
prog->setUniformValue("lights_count", cur_lights[pass.second].size());
|
||||||
prog->setUniformValue("fog_color", view->fogColor_);
|
prog->setUniformValue("fog_color", view->fogColor());
|
||||||
prog->setUniformValue("fog_decay", qMax(view->fogDecay_, 0.001f));
|
prog->setUniformValue("fog_decay", qMax(view->fogDecay(), 0.001f));
|
||||||
prog->setUniformValue("fog_density", view->fogDensity_);
|
prog->setUniformValue("fog_density", view->fogDensity());
|
||||||
prog->setUniformValue("view_mat", cam->viewMatrix().inverted().toGenericMatrix<3,3>());
|
prog->setUniformValue("view_mat", cam->viewMatrix().inverted().toGenericMatrix<3,3>());
|
||||||
renderQuad(prog, quad, cam);
|
renderQuad(prog, quad, cam);
|
||||||
}
|
}
|
||||||
@@ -271,7 +253,7 @@ void Renderer::renderScene() {
|
|||||||
initShaders();
|
initShaders();
|
||||||
tex_env.load();
|
tex_env.load();
|
||||||
QOpenGLExtraFunctions * f = view;
|
QOpenGLExtraFunctions * f = view;
|
||||||
Scene & scene(*(view->scene_));
|
Scene & scene(*(view->scene()));
|
||||||
Camera * cam = view->camera();
|
Camera * cam = view->camera();
|
||||||
QOpenGLShaderProgram * prog = 0;
|
QOpenGLShaderProgram * prog = 0;
|
||||||
bool scene_changed = scene.prepare();
|
bool scene_changed = scene.prepare();
|
||||||
@@ -279,8 +261,6 @@ void Renderer::renderScene() {
|
|||||||
|
|
||||||
/// reload materials on change
|
/// reload materials on change
|
||||||
if (scene_changed || scene.need_reload_materials) {
|
if (scene_changed || scene.need_reload_materials) {
|
||||||
//if (scene.need_reload_materials)
|
|
||||||
// maps_hash = 0;
|
|
||||||
rend_selection.generateObjectsID(scene);
|
rend_selection.generateObjectsID(scene);
|
||||||
reloadMaterials(scene);
|
reloadMaterials(scene);
|
||||||
if (edit_mode)
|
if (edit_mode)
|
||||||
@@ -342,7 +322,6 @@ void Renderer::renderScene() {
|
|||||||
|
|
||||||
/// blending layers
|
/// blending layers
|
||||||
if (bindShader(srFinalPass, &prog)) {
|
if (bindShader(srFinalPass, &prog)) {
|
||||||
//fbo_ds .bindColorTexture(dbrNormalZ , 0);
|
|
||||||
fbo_out.bindColorTexture(obrSolidOmni , 1);
|
fbo_out.bindColorTexture(obrSolidOmni , 1);
|
||||||
fbo_out.bindColorTexture(obrSolidSpot , 2);
|
fbo_out.bindColorTexture(obrSolidSpot , 2);
|
||||||
fbo_out.bindColorTexture(obrTransparentOmni, 3);
|
fbo_out.bindColorTexture(obrTransparentOmni, 3);
|
||||||
@@ -371,8 +350,6 @@ void Renderer::renderScene() {
|
|||||||
} else {
|
} else {
|
||||||
fbo_out.blit(obrTonemap, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size()));
|
fbo_out.blit(obrTonemap, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size()));
|
||||||
}
|
}
|
||||||
//fbo_small_16.blit(0, 0, 0, fbo_small_16.rect(), fbo_small_16.rect(), GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
class Renderer: public RendererBase {
|
class Renderer: public RendererBase {
|
||||||
friend class QGLView;
|
friend class QGLView;
|
||||||
friend class MouseController;
|
friend class MouseController;
|
||||||
friend class RendererBase;
|
|
||||||
friend class RendererMaterial;
|
friend class RendererMaterial;
|
||||||
friend class RendererService;
|
friend class RendererService;
|
||||||
friend class RendererSelection;
|
friend class RendererSelection;
|
||||||
@@ -105,10 +104,6 @@ private:
|
|||||||
int camera_light_mode;
|
int camera_light_mode;
|
||||||
bool edit_mode, need_init_shaders, need_render_sum;
|
bool edit_mode, need_init_shaders, need_render_sum;
|
||||||
Framebuffer fbo_ds, fbo_out;
|
Framebuffer fbo_ds, fbo_out;
|
||||||
/*QOpenGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;
|
|
||||||
QOpenGLShaderProgram * shader_bloom_0, * shader_bloom_1, * shader_motion_blur, * shader_fbo_add;
|
|
||||||
QOpenGLShaderProgram * shader_shadow, * shader_ssr, * shader_ssr_blur, * shader_ssr_merge;
|
|
||||||
QOpenGLShaderProgram * shader_ssao_blur, * shader_ssao_merge, * shader_dof;*/
|
|
||||||
QMap<ShaderRole, QString> shader_files;
|
QMap<ShaderRole, QString> shader_files;
|
||||||
QMap<ShaderRole, QStringList> shader_defines;
|
QMap<ShaderRole, QStringList> shader_defines;
|
||||||
QMap<ShaderRole, QOpenGLShaderProgram*> shaders;
|
QMap<ShaderRole, QOpenGLShaderProgram*> shaders;
|
||||||
@@ -130,7 +125,6 @@ private:
|
|||||||
QVector4D corner_dirs[4];
|
QVector4D corner_dirs[4];
|
||||||
QVector<QVector3D> hcontent;
|
QVector<QVector3D> hcontent;
|
||||||
QMap<int, QList<Light*>> cur_lights;
|
QMap<int, QList<Light*>> cur_lights;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RENDERER_H
|
#endif // RENDERER_H
|
||||||
|
|||||||
@@ -191,7 +191,6 @@ void RendererBase::reloadMaterials(Scene & scene) {
|
|||||||
qDebug() << "[QGLEngine] Warning: Too many materials! Maximum" << max_materials;
|
qDebug() << "[QGLEngine] Warning: Too many materials! Maximum" << max_materials;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//m->load(textures_manager);
|
|
||||||
m->_index = cur_materials_.size();
|
m->_index = cur_materials_.size();
|
||||||
m->_changed = false;
|
m->_changed = false;
|
||||||
glm.color_diffuse = QColor2QVector(m->color_diffuse );
|
glm.color_diffuse = QColor2QVector(m->color_diffuse );
|
||||||
@@ -209,8 +208,6 @@ void RendererBase::reloadMaterials(Scene & scene) {
|
|||||||
cur_materials_ << glm;
|
cur_materials_ << glm;
|
||||||
}
|
}
|
||||||
//qDebug() << "load" << cur_materials_.size() << "materials";
|
//qDebug() << "load" << cur_materials_.size() << "materials";
|
||||||
//textures_maps.resize(maps_size, );
|
|
||||||
//cur_materials_[0].color_diffuse = QColor2QVector(Qt::red);
|
|
||||||
buffer_materials.bind(view);
|
buffer_materials.bind(view);
|
||||||
buffer_materials.resize(view, cur_materials_.size() * sizeof(QGLMaterial));
|
buffer_materials.resize(view, cur_materials_.size() * sizeof(QGLMaterial));
|
||||||
buffer_materials.load(view, cur_materials_.constData(), cur_materials_.size() * sizeof(QGLMaterial));
|
buffer_materials.load(view, cur_materials_.constData(), cur_materials_.size() * sizeof(QGLMaterial));
|
||||||
@@ -247,8 +244,6 @@ void RendererBase::reloadLightsParameters(const QMap<int, QList<Light*>> & light
|
|||||||
so.decay_intensity[1] = l->decay_linear;
|
so.decay_intensity[1] = l->decay_linear;
|
||||||
so.decay_intensity[2] = l->decay_quadratic;
|
so.decay_intensity[2] = l->decay_quadratic;
|
||||||
so.decay_intensity[3] = l->intensity;
|
so.decay_intensity[3] = l->intensity;
|
||||||
//so.shadow = shadow;
|
|
||||||
//so.shadowColor = shadow;
|
|
||||||
}
|
}
|
||||||
buffer_lights.bind(view);
|
buffer_lights.bind(view);
|
||||||
buffer_lights.resize(view, cur_lights_params_.size() * sizeof(QGLLightParameter));
|
buffer_lights.resize(view, cur_lights_params_.size() * sizeof(QGLLightParameter));
|
||||||
@@ -263,12 +258,11 @@ void RendererBase::reloadLightsPositions(Camera * cam) {
|
|||||||
QGLLightPosition & so(cur_lights_pos_[i]);
|
QGLLightPosition & so(cur_lights_pos_[i]);
|
||||||
Light * l = current_lights[i];
|
Light * l = current_lights[i];
|
||||||
QMatrix4x4 m = mat * l->worldTransform();
|
QMatrix4x4 m = mat * l->worldTransform();
|
||||||
QVector4D pos(0, 0, 0, 1.), dir(QVector3D(0,0,-1), 1);//, dir0(light->dir0), dir1(light->dir1);
|
QVector4D pos(0, 0, 0, 1.), dir(QVector3D(0,0,-1), 1);
|
||||||
pos = m * pos;
|
pos = m * pos;
|
||||||
dir = (m * QVector4D(QVector3D(0,0,-1),0)).normalized();//((m * dir) - pos).normalized();
|
dir = (m * QVector4D(QVector3D(0,0,-1),0)).normalized();
|
||||||
so.position = pos;
|
so.position = pos;
|
||||||
so.direction = dir;
|
so.direction = dir;
|
||||||
//so.shadowMatrix = l->shadow_matrix;
|
|
||||||
}
|
}
|
||||||
buffer_lights_pos.bind(view);
|
buffer_lights_pos.bind(view);
|
||||||
buffer_lights_pos.resize(view, cur_lights_pos_.size() * sizeof(QGLLightPosition));
|
buffer_lights_pos.resize(view, cur_lights_pos_.size() * sizeof(QGLLightPosition));
|
||||||
@@ -279,7 +273,7 @@ void RendererBase::reloadLightsPositions(Camera * cam) {
|
|||||||
void RendererBase::markReloadTextures() {
|
void RendererBase::markReloadTextures() {
|
||||||
maps_hash = 0;
|
maps_hash = 0;
|
||||||
textures_manager->clearImageCache();
|
textures_manager->clearImageCache();
|
||||||
view->scene_->need_reload_materials = true;
|
view->scene()->need_reload_materials = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -305,7 +299,7 @@ void RendererBase::renderQuad(QOpenGLShaderProgram * prog, Mesh * mesh, Camera *
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
float RadicalInverse_VdC(uint bits) {
|
float RadicalInverse_VdC(uint bits) {
|
||||||
bits = (bits << 16u) | (bits >> 16u);
|
bits = (bits << 16u) | (bits >> 16u);
|
||||||
@@ -315,10 +309,13 @@ float RadicalInverse_VdC(uint bits) {
|
|||||||
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
|
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
|
||||||
return float(bits) * 2.3283064365386963e-10; // / 0x100000000
|
return float(bits) * 2.3283064365386963e-10; // / 0x100000000
|
||||||
}
|
}
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
QVector2D Hammersley(uint i, uint N) {
|
QVector2D Hammersley(uint i, uint N) {
|
||||||
return QVector2D(float(i)/float(N), RadicalInverse_VdC(i));
|
return QVector2D(float(i)/float(N), RadicalInverse_VdC(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QVector3D ImportanceSampleGGX(QVector2D Xi, QVector3D N, float roughness) {
|
QVector3D ImportanceSampleGGX(QVector2D Xi, QVector3D N, float roughness) {
|
||||||
float a = roughness*roughness;
|
float a = roughness*roughness;
|
||||||
float phi = 2.0 * M_PI * Xi[0];
|
float phi = 2.0 * M_PI * Xi[0];
|
||||||
@@ -336,12 +333,16 @@ QVector3D ImportanceSampleGGX(QVector2D Xi, QVector3D N, float roughness) {
|
|||||||
QVector3D sampleVec = tangent * H[0] + bitangent * H[1] + N * H[2];
|
QVector3D sampleVec = tangent * H[0] + bitangent * H[1] + N * H[2];
|
||||||
return sampleVec.normalized();
|
return sampleVec.normalized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float GeometrySchlickGGX(float NdotV, float roughness) {
|
float GeometrySchlickGGX(float NdotV, float roughness) {
|
||||||
float k = (roughness * roughness) / 2.0;
|
float k = (roughness * roughness) / 2.0;
|
||||||
float nom = NdotV;
|
float nom = NdotV;
|
||||||
float denom = NdotV * (1.0 - k) + k;
|
float denom = NdotV * (1.0 - k) + k;
|
||||||
return nom / denom;
|
return nom / denom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float GeometrySmith(QVector3D N, QVector3D V, QVector3D L, float roughness) {
|
float GeometrySmith(QVector3D N, QVector3D V, QVector3D L, float roughness) {
|
||||||
float NdotV = piMax(QVector3D::dotProduct(N, V), 0.f);
|
float NdotV = piMax(QVector3D::dotProduct(N, V), 0.f);
|
||||||
float NdotL = piMax(QVector3D::dotProduct(N, L), 0.f);
|
float NdotL = piMax(QVector3D::dotProduct(N, L), 0.f);
|
||||||
@@ -349,6 +350,8 @@ float GeometrySmith(QVector3D N, QVector3D V, QVector3D L, float roughness) {
|
|||||||
float ggx1 = GeometrySchlickGGX(NdotL, roughness);
|
float ggx1 = GeometrySchlickGGX(NdotL, roughness);
|
||||||
return ggx1 * ggx2;
|
return ggx1 * ggx2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QVector2D IntegrateBRDF(float NdotV, float roughness) {
|
QVector2D IntegrateBRDF(float NdotV, float roughness) {
|
||||||
QVector3D V;
|
QVector3D V;
|
||||||
V[0] = sqrt(1.f - NdotV*NdotV);
|
V[0] = sqrt(1.f - NdotV*NdotV);
|
||||||
@@ -378,49 +381,19 @@ QVector2D IntegrateBRDF(float NdotV, float roughness) {
|
|||||||
return QVector2D(A, B);
|
return QVector2D(A, B);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void RendererBase::initCoeffTextures() {
|
void RendererBase::initCoeffTextures() {
|
||||||
QImage im = QImage(":/coeffs_brdf.png").mirrored();
|
QImage im = QImage(":/coeffs_brdf.png").mirrored();
|
||||||
int size = im.width();
|
int size = im.width();
|
||||||
QVector<QVector2D> data(size*size);
|
QVector<QVector2D> data(size*size);
|
||||||
int ind = -1;
|
int ind = -1;
|
||||||
for (int x = 0; x < size; ++x) {
|
for (int x = 0; x < size; ++x) {
|
||||||
//float c = x / double(size - 1) + 1.E-3;
|
|
||||||
for (int y = 0; y < size; ++y) {
|
for (int y = 0; y < size; ++y) {
|
||||||
//float r = y / double(size - 1);
|
|
||||||
QColor p = im.pixelColor(x, y);
|
QColor p = im.pixelColor(x, y);
|
||||||
data[++ind] = QVector2D(p.redF(), p.greenF());//IntegrateBRDF(c, 1.f - r + 1.E-3);
|
data[++ind] = QVector2D(p.redF(), p.greenF());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
createCoeffTexture(tex_coeff[0], data.constData(), size, 2);
|
createCoeffTexture(tex_coeff[0], data.constData(), size, 2);
|
||||||
/*const int size = 512;
|
|
||||||
QVector<float> data_diff(size*size), data_spec(size*size);
|
|
||||||
double r, c, c2;
|
|
||||||
int ind = -1;
|
|
||||||
for (int x = 0; x < size; ++x) {
|
|
||||||
c = x / double(size - 1);
|
|
||||||
c = sqrt(c);
|
|
||||||
c = piMax(1.E-16, c);
|
|
||||||
c2 = c*c;
|
|
||||||
for (int y = 0; y < size; ++y) {
|
|
||||||
r = y / double(size - 1);
|
|
||||||
double r_d = r;
|
|
||||||
double r_s = r*r*r;
|
|
||||||
r_d = piMax(1.E-16, r_d);
|
|
||||||
r_s = piMax(1.E-16, r_s);
|
|
||||||
|
|
||||||
double ndlc = (1. - c2) / c2;
|
|
||||||
double diff = 2. / (1. + sqrt(1. + (1. - r_d) * ndlc));
|
|
||||||
|
|
||||||
double spec = c2 * (r_s + ndlc);
|
|
||||||
spec = r_s / (spec * spec) / M_PI;
|
|
||||||
|
|
||||||
++ind;
|
|
||||||
data_diff[ind] = piClamp(diff, 1.E-12, 1.E+36);
|
|
||||||
data_spec[ind] = piClamp(spec, 1.E-12, 1.E+36);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
createCoeffTexture(tex_coeff[0], data_diff, size);
|
|
||||||
createCoeffTexture(tex_coeff[1], data_spec, size);*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ protected:
|
|||||||
GLuint tex_coeff[2];
|
GLuint tex_coeff[2];
|
||||||
QMap<int, int> lights_start;
|
QMap<int, int> lights_start;
|
||||||
QList<Light*> current_lights;
|
QList<Light*> current_lights;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RENDERER_BASE_H
|
#endif // RENDERER_BASE_H
|
||||||
|
|||||||
@@ -28,8 +28,8 @@
|
|||||||
using namespace QGLEngineShaders;
|
using namespace QGLEngineShaders;
|
||||||
|
|
||||||
|
|
||||||
RendererMaterial::RendererMaterial(Renderer * r_): r(r_),
|
RendererMaterial::RendererMaterial(Renderer * r_)
|
||||||
fbo_mat_thumb(r->view, 6, true , GL_RGBA16F) {
|
: r(r_), fbo_mat_thumb(r->view, 6, true , GL_RGBA16F) {
|
||||||
mat_sphere = Primitive::ellipsoid(16, 16);
|
mat_sphere = Primitive::ellipsoid(16, 16);
|
||||||
mat_camera = new Camera();
|
mat_camera = new Camera();
|
||||||
mat_camera->setPos(QVector3D(2, 2, 2));
|
mat_camera->setPos(QVector3D(2, 2, 2));
|
||||||
@@ -122,10 +122,10 @@ void RendererMaterial::recreateMaterialThumbnails(bool force_all) {
|
|||||||
if (force_all) {
|
if (force_all) {
|
||||||
mat_thumb_queue.clear();
|
mat_thumb_queue.clear();
|
||||||
//qDebug() << "recreateMaterialThumbnails" << view->scene_->materials;
|
//qDebug() << "recreateMaterialThumbnails" << view->scene_->materials;
|
||||||
foreach (Material * m, r->view->scene_->materials)
|
foreach (Material * m, r->view->scene()->materials)
|
||||||
mat_thumb_queue.enqueue(m);
|
mat_thumb_queue.enqueue(m);
|
||||||
} else {
|
} else {
|
||||||
foreach (Material * m, r->view->scene_->changed_materials)
|
foreach (Material * m, r->view->scene()->changed_materials)
|
||||||
if (!mat_thumb_queue.contains(m))
|
if (!mat_thumb_queue.contains(m))
|
||||||
mat_thumb_queue.enqueue(m);
|
mat_thumb_queue.enqueue(m);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
class RendererMaterial {
|
class RendererMaterial {
|
||||||
friend class QGLView;
|
friend class QGLView;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RendererMaterial(Renderer * r_);
|
RendererMaterial(Renderer * r_);
|
||||||
virtual ~RendererMaterial();
|
virtual ~RendererMaterial();
|
||||||
@@ -40,7 +39,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Renderer * r;
|
Renderer * r;
|
||||||
|
|
||||||
Framebuffer fbo_mat_thumb;
|
Framebuffer fbo_mat_thumb;
|
||||||
Mesh * mat_sphere;
|
Mesh * mat_sphere;
|
||||||
Camera * mat_camera;
|
Camera * mat_camera;
|
||||||
@@ -48,7 +46,6 @@ private:
|
|||||||
QMap<Material*, QImage> mat_thumbnails;
|
QMap<Material*, QImage> mat_thumbnails;
|
||||||
Material * last_thumb_material;
|
Material * last_thumb_material;
|
||||||
QQueue<Material*> mat_thumb_queue;
|
QQueue<Material*> mat_thumb_queue;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RENDERER_MATERIAL_H
|
#endif // RENDERER_MATERIAL_H
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
using namespace QGLEngineShaders;
|
using namespace QGLEngineShaders;
|
||||||
|
|
||||||
|
|
||||||
RendererSelection::RendererSelection(Renderer * r_): r(r_),
|
RendererSelection::RendererSelection(Renderer * r_)
|
||||||
fbo_selection(r->view, 6) {
|
: r(r_), fbo_selection(r->view, 6) {
|
||||||
sel_frame = Primitive::plane(2., 2.);
|
sel_frame = Primitive::plane(2., 2.);
|
||||||
id_hover = 0;
|
id_hover = 0;
|
||||||
line_thick_ = 2.;
|
line_thick_ = 2.;
|
||||||
@@ -50,8 +50,6 @@ void RendererSelection::resize(int width, int height) {
|
|||||||
scale_ = 0.5 / appScale();
|
scale_ = 0.5 / appScale();
|
||||||
fbo_selection.enablePixelBuffer();
|
fbo_selection.enablePixelBuffer();
|
||||||
fbo_selection.resize(width * scale_, height * scale_);
|
fbo_selection.resize(width * scale_, height * scale_);
|
||||||
//fbo_selection.setColorTextureFiltering(sbrSrcHover , GL_LINEAR);
|
|
||||||
//fbo_selection.setColorTextureFiltering(sbrSrcSelect, GL_LINEAR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -138,8 +136,6 @@ void RendererSelection::renderSelection(Scene & scene) {
|
|||||||
rs.drawLights();
|
rs.drawLights();
|
||||||
rs.drawCameras();
|
rs.drawCameras();
|
||||||
rs.drawCurrentHandleObjects();
|
rs.drawCurrentHandleObjects();
|
||||||
|
|
||||||
//mouse_rect = fbo_selection.rect();
|
|
||||||
if (r->mouse_rect.isNull())
|
if (r->mouse_rect.isNull())
|
||||||
fbo_selection.queryPoint(0, r->mouse_pos * scale_);
|
fbo_selection.queryPoint(0, r->mouse_pos * scale_);
|
||||||
else
|
else
|
||||||
@@ -150,14 +146,14 @@ void RendererSelection::renderSelection(Scene & scene) {
|
|||||||
fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover );
|
fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover );
|
||||||
fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect);
|
fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect);
|
||||||
fbo_selection.setWriteBuffers(QVector<int>() << sbrHovered << sbrSelected);
|
fbo_selection.setWriteBuffers(QVector<int>() << sbrHovered << sbrSelected);
|
||||||
if (!view->hoverHalo_ && !view->selectionHalo_)
|
if (!view->isHoverHaloEnabled() && !view->isSelectionHaloEnabled())
|
||||||
glClearFramebuffer(QColor(0,0,0,0), false);
|
glClearFramebuffer(QColor(0,0,0,0), false);
|
||||||
else {
|
else {
|
||||||
r->bindShader(Renderer::srSelectionHalo, &prog);
|
r->bindShader(Renderer::srSelectionHalo, &prog);
|
||||||
r->setUniformHalo(prog, "hover" , view->hoverHaloColor() , view->hoverHaloFillAlpha());
|
r->setUniformHalo(prog, "hover" , view->hoverHaloColor() , view->hoverHaloFillAlpha());
|
||||||
r->setUniformHalo(prog, "selection", view->selectionHaloColor(), view->selectionHaloFillAlpha());
|
r->setUniformHalo(prog, "selection", view->selectionHaloColor(), view->selectionHaloFillAlpha());
|
||||||
prog->setUniformValue("has_hover" , view->hoverHalo_ && (id_hover > 0) ? 1.f : 0.f);
|
prog->setUniformValue("has_hover" , view->isHoverHaloEnabled() && (id_hover > 0) ? 1.f : 0.f);
|
||||||
prog->setUniformValue("has_selection", view->selectionHalo_ ? 1.f : 0.f);
|
prog->setUniformValue("has_selection", view->isSelectionHaloEnabled() ? 1.f : 0.f);
|
||||||
prog->setUniformValue("fb_hover" , (int)sbrSrcHover);
|
prog->setUniformValue("fb_hover" , (int)sbrSrcHover);
|
||||||
prog->setUniformValue("fb_selection", (int)sbrSrcSelect);
|
prog->setUniformValue("fb_selection", (int)sbrSrcSelect);
|
||||||
prog->setUniformValue("hover_id", QVector4D(float( id_hover & 0xFF) / 255.f,
|
prog->setUniformValue("hover_id", QVector4D(float( id_hover & 0xFF) / 255.f,
|
||||||
@@ -177,7 +173,6 @@ void RendererSelection::renderSelection(Scene & scene) {
|
|||||||
fbo_selection.setWriteBuffer(sbrSelectedFXAA);
|
fbo_selection.setWriteBuffer(sbrSelectedFXAA);
|
||||||
r->renderQuad(prog, r->quad, 0, false);
|
r->renderQuad(prog, r->quad, 0, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
fbo_selection.release();
|
fbo_selection.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,16 +53,13 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Renderer * r;
|
Renderer * r;
|
||||||
|
|
||||||
Framebuffer fbo_selection;
|
Framebuffer fbo_selection;
|
||||||
Mesh * sel_frame;
|
Mesh * sel_frame;
|
||||||
float line_thick_, scale_;
|
float line_thick_, scale_;
|
||||||
|
|
||||||
QVector<uchar> cur_selections_;
|
QVector<uchar> cur_selections_;
|
||||||
QHash<uint, ObjectBase * > ids;
|
QHash<uint, ObjectBase * > ids;
|
||||||
QHash<uint, ObjectBase * > aim_ids;
|
QHash<uint, ObjectBase * > aim_ids;
|
||||||
uint id_hover;
|
uint id_hover;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RENDERER_selection_H
|
#endif // RENDERER_selection_H
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ void RendererService::fillOmniObjects() {
|
|||||||
foreach (Light * l, ll) {
|
foreach (Light * l, ll) {
|
||||||
QMatrix4x4 m = invariantSizeMatrix(l->worldPos());
|
QMatrix4x4 m = invariantSizeMatrix(l->worldPos());
|
||||||
m.transposed().copyDataTo(o.modelmatrix);
|
m.transposed().copyDataTo(o.modelmatrix);
|
||||||
o.object_id = l->id_;
|
o.object_id = l->id();
|
||||||
cur_objects << o;
|
cur_objects << o;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -218,14 +218,14 @@ void RendererService::fillAimedObjects(const ObjectBaseList & objects, Mesh * li
|
|||||||
QMatrix4x4 m;
|
QMatrix4x4 m;
|
||||||
m = invariantSizeMatrix(ao->worldPos()) * parentRotationMatrix(ao);
|
m = invariantSizeMatrix(ao->worldPos()) * parentRotationMatrix(ao);
|
||||||
m.transposed().copyDataTo(o.modelmatrix);
|
m.transposed().copyDataTo(o.modelmatrix);
|
||||||
o.object_id = ao->id_;
|
o.object_id = ao->id();
|
||||||
cur_objects << o;
|
cur_objects << o;
|
||||||
|
|
||||||
lv << ao->worldPos() << ao->worldAim();
|
lv << ao->worldPos() << ao->worldAim();
|
||||||
|
|
||||||
m = invariantSizeMatrix(ao->worldAim());
|
m = invariantSizeMatrix(ao->worldAim());
|
||||||
m.transposed().copyDataTo(o.modelmatrix);
|
m.transposed().copyDataTo(o.modelmatrix);
|
||||||
o.object_id = ao->id_ + 1;
|
o.object_id = ao->id() + 1;
|
||||||
cur_aims << o;
|
cur_aims << o;
|
||||||
}
|
}
|
||||||
ln.resize(lv.size());
|
ln.resize(lv.size());
|
||||||
@@ -269,7 +269,7 @@ bool RendererService::calculateCenter() {
|
|||||||
axis_mat = QMatrix4x4();
|
axis_mat = QMatrix4x4();
|
||||||
if ((sol.size() == 1)) {
|
if ((sol.size() == 1)) {
|
||||||
if (current_action == haMove) {
|
if (current_action == haMove) {
|
||||||
if (sol[0]->selected_aim)
|
if (sol[0]->isAimSelected())
|
||||||
selection_center = ((AimedObject*)sol[0])->worldAim();
|
selection_center = ((AimedObject*)sol[0])->worldAim();
|
||||||
} else {
|
} else {
|
||||||
axis_mat = parentRotationMatrix(sol[0]);
|
axis_mat = parentRotationMatrix(sol[0]);
|
||||||
@@ -330,7 +330,7 @@ void RendererService::drawLights() {
|
|||||||
|
|
||||||
fillOmniObjects();
|
fillOmniObjects();
|
||||||
omni_mesh->loadObjects(v, cur_objects);
|
omni_mesh->loadObjects(v, cur_objects);
|
||||||
r->fillSelectionsBuffer(rs.cur_selections_, lights2objectList(v->scene_->lights_used.value(Light::Omni)));
|
r->fillSelectionsBuffer(rs.cur_selections_, lights2objectList(v->scene()->lights_used.value(Light::Omni)));
|
||||||
omni_mesh->loadSelections(v, rs.cur_selections_);
|
omni_mesh->loadSelections(v, rs.cur_selections_);
|
||||||
omni_mesh->draw(v, cur_objects.size());
|
omni_mesh->draw(v, cur_objects.size());
|
||||||
|
|
||||||
@@ -354,7 +354,7 @@ void RendererService::drawLightsFrame(QColor color) {
|
|||||||
fillOmniObjects();
|
fillOmniObjects();
|
||||||
setObjectsColor(cur_objects, color);
|
setObjectsColor(cur_objects, color);
|
||||||
omni_mesh_f->loadObjects(v, cur_objects);
|
omni_mesh_f->loadObjects(v, cur_objects);
|
||||||
r->fillSelectionsBuffer(rs.cur_selections_, lights2objectList(v->scene_->lights_used.value(Light::Omni)));
|
r->fillSelectionsBuffer(rs.cur_selections_, lights2objectList(v->scene()->lights_used.value(Light::Omni)));
|
||||||
omni_mesh_f->loadSelections(v, rs.cur_selections_);
|
omni_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||||
omni_mesh_f->draw(v, cur_objects.size());
|
omni_mesh_f->draw(v, cur_objects.size());
|
||||||
|
|
||||||
@@ -446,14 +446,12 @@ void RendererService::renderService() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
if (r->bindShader(Renderer::srServiceLine, &prog)) {
|
if (r->bindShader(Renderer::srServiceLine, &prog)) {
|
||||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
|
||||||
r->setUniformCamera(prog, r->view->camera());
|
r->setUniformCamera(prog, r->view->camera());
|
||||||
line_object.color = QColor2QVector(Qt::white);
|
line_object.color = QColor2QVector(Qt::white);
|
||||||
line_spot_f ->loadObject(f, line_object);
|
line_spot_f ->loadObject(f, line_object);
|
||||||
line_camera_f->loadObject(f, line_object);
|
line_camera_f->loadObject(f, line_object);
|
||||||
line_spot_f ->draw(f, 1);
|
line_spot_f ->draw(f, 1);
|
||||||
line_camera_f->draw(f, 1);
|
line_camera_f->draw(f, 1);
|
||||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
||||||
}
|
}
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
if (r->bindShader(Renderer::srServiceFill, &prog)) {
|
if (r->bindShader(Renderer::srServiceFill, &prog)) {
|
||||||
|
|||||||
@@ -84,7 +84,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Renderer * r;
|
Renderer * r;
|
||||||
|
|
||||||
Mesh * axis_mesh, * handle_move_mesh, * handle_rotate_mesh, * handle_scale_mesh;
|
Mesh * axis_mesh, * handle_move_mesh, * handle_rotate_mesh, * handle_scale_mesh;
|
||||||
Mesh * handle_ms_2_mesh, * handle_scale_3_mesh;
|
Mesh * handle_ms_2_mesh, * handle_scale_3_mesh;
|
||||||
Mesh * box_mesh_f, * omni_mesh_f, * cone_mesh_f, * camera_mesh_f;
|
Mesh * box_mesh_f, * omni_mesh_f, * cone_mesh_f, * camera_mesh_f;
|
||||||
@@ -102,7 +101,6 @@ private:
|
|||||||
QFlags<HandleMesh> current_handle;
|
QFlags<HandleMesh> current_handle;
|
||||||
int line_width;
|
int line_width;
|
||||||
double size_vp_scale, size_full_scale;
|
double size_vp_scale, size_full_scale;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RENDERER_SERVICE_H
|
#endif // RENDERER_SERVICE_H
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ void TonemappingProc::renderSum(Framebuffer & fbo_src, int index) {
|
|||||||
int pcnt = fbo_src.width() * fbo_src.height();
|
int pcnt = fbo_src.width() * fbo_src.height();
|
||||||
fbo_src.bindColorTexture(index);
|
fbo_src.bindColorTexture(index);
|
||||||
fbo_1x1.bind();
|
fbo_1x1.bind();
|
||||||
//glClearFramebuffer(Qt::white, false);
|
|
||||||
glClearFramebuffer();
|
glClearFramebuffer();
|
||||||
if (shader_sum) {
|
if (shader_sum) {
|
||||||
if (shader_sum->isLinked()) {
|
if (shader_sum->isLinked()) {
|
||||||
@@ -117,7 +116,6 @@ void TonemappingProc::renderSum(Framebuffer & fbo_src, int index) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fbo_1x1.release();
|
fbo_1x1.release();
|
||||||
//fbo_src.bind();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -175,7 +173,6 @@ bool TonemappingProc::process() {
|
|||||||
}
|
}
|
||||||
fbomm.create();
|
fbomm.create();
|
||||||
fbo.queryPoints(0, fbo.rect(), GL_FLOAT);
|
fbo.queryPoints(0, fbo.rect(), GL_FLOAT);
|
||||||
//renderSum(fbomm.plane(fbomm.lastLevel()), 0);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,18 +49,15 @@ private:
|
|||||||
QMutex mutex;
|
QMutex mutex;
|
||||||
QVector<QVector4D> last_data;
|
QVector<QVector4D> last_data;
|
||||||
QVector<float> last_max;
|
QVector<float> last_max;
|
||||||
|
|
||||||
float frame_max, cur_max;
|
float frame_max, cur_max;
|
||||||
bool need_render_sum, enabled;
|
bool need_render_sum, enabled;
|
||||||
std::atomic_bool exit_;
|
std::atomic_bool exit_;
|
||||||
int timer_tone, timer_delim;
|
int timer_tone, timer_delim;
|
||||||
Framebuffer fbo_1x1;
|
Framebuffer fbo_1x1;
|
||||||
FramebufferMipmap fbomm;
|
FramebufferMipmap fbomm;
|
||||||
|
|
||||||
QOpenGLShaderProgram * shader_sum;
|
QOpenGLShaderProgram * shader_sum;
|
||||||
Buffer buffer_vbo;
|
Buffer buffer_vbo;
|
||||||
GLenum vbo_vao;
|
GLenum vbo_vao;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RENDERER_H
|
#endif // RENDERER_H
|
||||||
|
|||||||
Reference in New Issue
Block a user