git-svn-id: svn://db.shs.com.ru/libs@536 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-05-24 19:06:35 +00:00
parent 1082db07c6
commit 58fce3cd81
29 changed files with 394 additions and 599 deletions

View File

@@ -23,8 +23,8 @@
class Camera; class Camera;
extern QMatrix4x4 globCameraMatrix; //extern QMatrix4x4 globCameraMatrix;
extern Camera * currentCamera; //extern Camera * currentCamera;
class Camera: public GLObjectBase class Camera: public GLObjectBase
{ {

View File

@@ -42,9 +42,7 @@ GLFramebuffer::~GLFramebuffer() {
void GLFramebuffer::resize(int width, int height, bool force) { void GLFramebuffer::resize(int width, int height, bool force) {
if ((wid == width) && (hei == height) && !force) return; if ((wid == width) && (hei == height) && !force) return;
#if QT_VERSION >= 0x050600
initializeOpenGLFunctions(); initializeOpenGLFunctions();
#endif
wid = width; wid = width;
hei = height; hei = height;
deleteGLFramebuffer(fbo); deleteGLFramebuffer(fbo);
@@ -91,9 +89,7 @@ QImage GLFramebuffer::grab() const {
void GLFramebuffer::bind() { void GLFramebuffer::bind() {
if (is_changed) resize(wid, hei); if (is_changed) resize(wid, hei);
if (fbo == 0) return; if (fbo == 0) return;
#if QT_VERSION >= 0x050600
initializeOpenGLFunctions(); initializeOpenGLFunctions();
#endif
glFlush(); glFlush();
glGetIntegerv(GL_VIEWPORT, prev_view); glGetIntegerv(GL_VIEWPORT, prev_view);
//glClearError(); //glClearError();

View File

@@ -21,10 +21,7 @@
#include "gltypes.h" #include "gltypes.h"
class GLFramebuffer class GLFramebuffer : protected QOpenGLExtraFunctions
#if QT_VERSION >= 0x050600
: protected QOpenGLExtraFunctions
#endif
{ {
public: public:
GLFramebuffer(int colorAttachments = 1, bool withDepth = true, GLenum colorFormat = GL_RGBA8, GLenum target = GL_TEXTURE_2D); GLFramebuffer(int colorAttachments = 1, bool withDepth = true, GLenum colorFormat = GL_RGBA8, GLenum target = GL_TEXTURE_2D);

View File

@@ -226,7 +226,7 @@ Material::Material(): map_reflection(512) {
} }
void Material::apply(__GLShaderProgram__ * prog) { void Material::apply(QOpenGLShaderProgram * prog) {
if (prog) { if (prog) {
setUniformMaterial(prog, *this); setUniformMaterial(prog, *this);
} else { } else {

View File

@@ -92,7 +92,7 @@ protected:
}; };
extern GLTextureManager * currentGLTextureManager; //extern GLTextureManager * currentGLTextureManager;
struct Map { struct Map {
Map() {bitmap_id = 0; color_amount = 1.f; color_offset = 0.f; animation_frame_rate = -1.f;} Map() {bitmap_id = 0; color_amount = 1.f; color_offset = 0.f; animation_frame_rate = -1.f;}
@@ -107,7 +107,7 @@ struct Map {
struct Material { struct Material {
Material(); Material();
void apply(__GLShaderProgram__ * prog); void apply(QOpenGLShaderProgram * prog);
void loadTextures(GLTextureManagerBase * tm = 0); void loadTextures(GLTextureManagerBase * tm = 0);
QString name; QString name;
QColor color_diffuse; QColor color_diffuse;

View File

@@ -90,7 +90,7 @@ GLObjectBase * GLObjectBase::clone(bool withChildren) {
return o; return o;
} }
void GLObjectBase::draw(__GLShaderProgram__ * prog, bool simplest) { void GLObjectBase::draw(QOpenGLShaderProgram * prog, bool simplest) {
vbo.draw(geom_prim, prog, simplest); vbo.draw(geom_prim, prog, simplest);
/*if (!d_vertices.isEmpty()) { /*if (!d_vertices.isEmpty()) {
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
@@ -332,7 +332,7 @@ GLObjectBase * Light::clone(bool withChildren) {
} }
void Light::draw(__GLShaderProgram__ * prog, bool simplest) { void Light::draw(QOpenGLShaderProgram * prog, bool simplest) {
bool l = glIsEnabled(GL_LIGHTING); bool l = glIsEnabled(GL_LIGHTING);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glPointSize(8.); glPointSize(8.);

View File

@@ -48,7 +48,7 @@ public:
void setName(const QString & name) {name_ = name;} void setName(const QString & name) {name_ = name;}
//virtual GLuint hList() {return list;} //virtual GLuint hList() {return list;}
virtual void init() {calculateBoundingBox(); vbo.init(); vbo.rebuffer(); /*material_.reflection.create();*/ /*qDebug() << "init" << vbo.buffer_;*/ is_init = true;} virtual void init() {calculateBoundingBox(); vbo.init(); vbo.rebuffer(); /*material_.reflection.create();*/ /*qDebug() << "init" << vbo.buffer_;*/ is_init = true;}
virtual void draw(__GLShaderProgram__ * prog, bool simplest = false); virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);
virtual void update() {} virtual void update() {}
bool isInit() const {return is_init;} bool isInit() const {return is_init;}
bool isTexturesLoaded() const {return is_tex_loaded;} bool isTexturesLoaded() const {return is_tex_loaded;}
@@ -192,7 +192,7 @@ public:
protected: protected:
void addChildren(QList<GLObjectBase * > & list, GLObjectBase * where); void addChildren(QList<GLObjectBase * > & list, GLObjectBase * where);
void loadTextures(bool with_children = false) {material_.loadTextures((GLTextureManagerBase * )currentGLTextureManager); if (with_children) foreach (GLObjectBase * i, children_) i->loadTextures(); is_tex_loaded = true; checkPass();} void loadTextures(bool with_children = false) {material_.loadTextures(view_->textureManager()); if (with_children) foreach (GLObjectBase * i, children_) i->loadTextures(); is_tex_loaded = true; checkPass();}
//void deleteTextures() {foreach (GLuint i, textures) currentQGLView->deleteTexture(i); textures.clear();} //void deleteTextures() {foreach (GLuint i, textures) currentQGLView->deleteTexture(i); textures.clear();}
void buildTransform(); void buildTransform();
void initInternal() {init(); loadTextures(); foreach (GLObjectBase * i, children_) i->initInternal();} void initInternal() {init(); loadTextures(); foreach (GLObjectBase * i, children_) i->initInternal();}
@@ -236,7 +236,7 @@ public:
Light(const QVector3D & p, const QColor & c = Qt::white, GLdouble i = 1.); Light(const QVector3D & p, const QColor & c = Qt::white, GLdouble i = 1.);
virtual GLObjectBase * clone(bool withChildren = true); virtual GLObjectBase * clone(bool withChildren = true);
virtual void init() {shadow_map.resize(512, 512); is_init = true;} virtual void init() {shadow_map.resize(512, 512); is_init = true;}
virtual void draw(__GLShaderProgram__ * prog, bool simplest = false); virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);
QVector3D direction, dir0, dir1; QVector3D direction, dir0, dir1;
GLdouble angle_start; GLdouble angle_start;

View File

@@ -108,7 +108,7 @@ void GLParticlesSystem::update() {
} }
void GLParticlesSystem::draw(__GLShaderProgram__ * prog, bool) { void GLParticlesSystem::draw(QOpenGLShaderProgram * prog, bool) {
if (particles.isEmpty()) return; if (particles.isEmpty()) return;
if (view_ == 0) return; if (view_ == 0) return;
QGLCI QGLCI

View File

@@ -69,7 +69,7 @@ public:
}; };
void update(); void update();
void draw(__GLShaderProgram__ * prog, bool); void draw(QOpenGLShaderProgram * prog, bool);
float birthRate() const {return birthRate_;} float birthRate() const {return birthRate_;}
float lifeDuration() const {return lifeDuration_;} float lifeDuration() const {return lifeDuration_;}

View File

@@ -19,7 +19,7 @@
#include "glprimitives.h" #include "glprimitives.h"
void GLPrimitivePoint::draw(__GLShaderProgram__ * prog, bool simplest) { void GLPrimitivePoint::draw(QOpenGLShaderProgram * prog, bool simplest) {
glPointSize(sz); glPointSize(sz);
glColor3f(material_.color_diffuse.redF(), material_.color_diffuse.greenF(), material_.color_diffuse.blueF()); glColor3f(material_.color_diffuse.redF(), material_.color_diffuse.greenF(), material_.color_diffuse.blueF());
glBegin(GL_POINTS); glBegin(GL_POINTS);
@@ -29,7 +29,7 @@ void GLPrimitivePoint::draw(__GLShaderProgram__ * prog, bool simplest) {
void GLPrimitiveLine::draw(__GLShaderProgram__ * prog, bool simplest) { void GLPrimitiveLine::draw(QOpenGLShaderProgram * prog, bool simplest) {
glColor3f(material_.color_diffuse.redF(), material_.color_diffuse.greenF(), material_.color_diffuse.blueF()); glColor3f(material_.color_diffuse.redF(), material_.color_diffuse.greenF(), material_.color_diffuse.blueF());
glBegin(GL_LINES); glBegin(GL_LINES);
glVertex3d(p0.x(), p0.y(), p0.z()); glVertex3d(p0.x(), p0.y(), p0.z());

View File

@@ -26,7 +26,7 @@ class GLPrimitivePoint: public GLObjectBase
{ {
public: public:
GLPrimitivePoint(double size = 1., QVector3D pos = QVector3D()) {sz = 8.;} GLPrimitivePoint(double size = 1., QVector3D pos = QVector3D()) {sz = 8.;}
virtual void draw(__GLShaderProgram__ * prog, bool simplest = false); virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);
private: private:
double sz; double sz;
}; };
@@ -38,7 +38,7 @@ class GLPrimitiveLine: public GLObjectBase
{ {
public: public:
GLPrimitiveLine(QVector3D p0_ = QVector3D(), QVector3D p1_ = QVector3D()) {p0 = p0_; p1 = p1_;} GLPrimitiveLine(QVector3D p0_ = QVector3D(), QVector3D p1_ = QVector3D()) {p0 = p0_; p1 = p1_;}
virtual void draw(__GLShaderProgram__ * prog, bool simplest = false); virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);
QVector3D point0() const {return p0;} QVector3D point0() const {return p0;}
QVector3D point1() const {return p1;} QVector3D point1() const {return p1;}
void setPoint0(const QVector3D & p) {p0 = p;} void setPoint0(const QVector3D & p) {p0 = p;}

View File

@@ -77,7 +77,7 @@ void GLRendererBase::setupAmbientLight(const QColor & a, bool first_pass) {
void GLRendererBase::setupShadersLights(int lights_count) { void GLRendererBase::setupShadersLights(int lights_count) {
/*foreach (__GLShaderProgram__ * i, view.shaders_ppl) { /*foreach (QOpenGLShaderProgram * i, view.shaders_ppl) {
i->bind(); i->bind();
i->setUniformValue("lightsCount", lights_count); i->setUniformValue("lightsCount", lights_count);
i->setUniformValue("acc_light", lights_count > 0); i->setUniformValue("acc_light", lights_count > 0);
@@ -190,7 +190,7 @@ void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters &
Material & mat(o.material_); 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_; 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); setupTextures(o, rpl, false);
mat.apply((__GLShaderProgram__*)rpl.shaders); mat.apply((QOpenGLShaderProgram*)rpl.shaders);
glSetPolygonMode(o.render_mode != GLObjectBase::View ? o.render_mode : (view.rmode != GLObjectBase::View ? view.rmode : GL_FILL)); glSetPolygonMode(o.render_mode != GLObjectBase::View ? o.render_mode : (view.rmode != GLObjectBase::View ? view.rmode : GL_FILL));
glLineWidth(o.line_width > 0. ? o.line_width : view.lineWidth_); glLineWidth(o.line_width > 0. ? o.line_width : view.lineWidth_);
glPointSize(o.line_width > 0. ? o.line_width : view.lineWidth_); glPointSize(o.line_width > 0. ? o.line_width : view.lineWidth_);
@@ -218,19 +218,19 @@ void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters &
} }
if (rpl.shaders) { if (rpl.shaders) {
//qDebug() << o.name() << curview << curview.determinant(); //qDebug() << o.name() << curview << curview.determinant();
setUniformMatrices((__GLShaderProgram__*)rpl.shaders, rpl.proj_matrix, curview, rpl.prev_proj_matrix, prevview); setUniformMatrices((QOpenGLShaderProgram*)rpl.shaders, rpl.proj_matrix, curview, rpl.prev_proj_matrix, prevview);
} else { } else {
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
setGLMatrix(curview); setGLMatrix(curview);
} }
o.draw((__GLShaderProgram__*)rpl.shaders); o.draw((QOpenGLShaderProgram*)rpl.shaders);
} }
foreach (GLObjectBase * i, o.children_) foreach (GLObjectBase * i, o.children_)
renderSingleObject(*i, rpl); renderSingleObject(*i, rpl);
} }
void GLRendererBase::renderShadow(Light * l, __GLShaderProgram__ * prog, QMatrix4x4 mat) { void GLRendererBase::renderShadow(Light * l, QOpenGLShaderProgram * prog, QMatrix4x4 mat) {
Camera cam; Camera cam;
QVector3D wp = l->worldPos(); QVector3D wp = l->worldPos();
cam.setPos(wp); cam.setPos(wp);
@@ -270,7 +270,7 @@ void GLRendererBase::renderSingleShadow(GLObjectBase & o, RenderingParameters &
if (!o.visible_) return; if (!o.visible_) return;
if (rpl.shaders) { if (rpl.shaders) {
//qDebug() << o.name() << curview << curview.determinant(); //qDebug() << o.name() << curview << curview.determinant();
setUniformMatrices((__GLShaderProgram__*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_); setUniformMatrices((QOpenGLShaderProgram*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_);
} else { } else {
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
setGLMatrix(rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_); setGLMatrix(rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_);
@@ -278,7 +278,7 @@ void GLRendererBase::renderSingleShadow(GLObjectBase & o, RenderingParameters &
glPolygonMode(GL_FRONT_AND_BACK, o.render_mode != GLObjectBase::View ? o.render_mode : (view.rmode != GLObjectBase::View ? view.rmode : GL_FILL)); glPolygonMode(GL_FRONT_AND_BACK, o.render_mode != GLObjectBase::View ? o.render_mode : (view.rmode != GLObjectBase::View ? view.rmode : GL_FILL));
glLineWidth(o.line_width > 0. ? o.line_width : view.lineWidth_); glLineWidth(o.line_width > 0. ? o.line_width : view.lineWidth_);
glPointSize(o.line_width > 0. ? o.line_width : view.lineWidth_); glPointSize(o.line_width > 0. ? o.line_width : view.lineWidth_);
o.draw((__GLShaderProgram__*)rpl.shaders, true); o.draw((QOpenGLShaderProgram*)rpl.shaders, true);
foreach (GLObjectBase * i, o.children_) foreach (GLObjectBase * i, o.children_)
renderSingleShadow(*i, rpl); renderSingleShadow(*i, rpl);
} }
@@ -303,7 +303,7 @@ void GLRendererBase::RenderingParameters::prepare() {
} }
void GLRendererBase::RenderingParameters::setUniform(__GLShaderProgram__ * prog) { void GLRendererBase::RenderingParameters::setUniform(QOpenGLShaderProgram * prog) {
if (!prog) return; if (!prog) return;
prog->setUniformValue("qgl_ModelViewMatrix", view_matrix); prog->setUniformValue("qgl_ModelViewMatrix", view_matrix);
prog->setUniformValue("qgl_ProjectionMatrix", proj_matrix); prog->setUniformValue("qgl_ProjectionMatrix", proj_matrix);

View File

@@ -22,10 +22,7 @@
#include "glcamera.h" #include "glcamera.h"
#include "glshaders.h" #include "glshaders.h"
class GLRendererBase: public QObject class GLRendererBase: public QObject , protected QOpenGLExtraFunctions
#if QT_VERSION >= 0x050600
, protected QOpenGLExtraFunctions
#endif
{ {
friend class QGLView; friend class QGLView;
Q_OBJECT Q_OBJECT
@@ -37,7 +34,7 @@ public:
struct RenderingParameters { struct RenderingParameters {
RenderingParameters(); RenderingParameters();
void prepare(); void prepare();
void setUniform(__GLShaderProgram__ * prog); void setUniform(QOpenGLShaderProgram * prog);
int pass; int pass;
int light_pass; int light_pass;
bool light; bool light;
@@ -52,7 +49,7 @@ public:
QMatrix4x4 viewproj_matrix, viewproj_matrix_i; QMatrix4x4 viewproj_matrix, viewproj_matrix_i;
QMatrix3x3 normal_matrix; QMatrix3x3 normal_matrix;
QMatrix4x4 cam_offset_matrix; QMatrix4x4 cam_offset_matrix;
__GLShaderProgram__ * cur_shader; QOpenGLShaderProgram * cur_shader;
}; };
RenderingParameters rp; RenderingParameters rp;
@@ -71,7 +68,7 @@ protected:
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 renderObjects(int pass, int light_pass, void * shaders = 0, bool textures = true, bool light = true, bool fog = true);
void renderSingleObject(GLObjectBase & o, RenderingParameters & rpl); void renderSingleObject(GLObjectBase & o, RenderingParameters & rpl);
void renderShadow(Light * l, __GLShaderProgram__ * prog = 0, QMatrix4x4 mat = QMatrix4x4()); void renderShadow(Light * l, QOpenGLShaderProgram * prog = 0, QMatrix4x4 mat = QMatrix4x4());
void renderSingleShadow(GLObjectBase & o, RenderingParameters & rpl); void renderSingleShadow(GLObjectBase & o, RenderingParameters & rpl);
QGLView & view; QGLView & view;

View File

@@ -96,7 +96,7 @@ const char qgl_structs[] =
"uniform QGLMaterial qgl_Material;\n"; "uniform QGLMaterial qgl_Material;\n";
QString loadShaderFile(__GLShaderProgram__ * prog, __GLShader__::ShaderType type, const QString & file) { QString loadShaderFile(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, const QString & file) {
QFile f(file); QFile f(file);
if (!f.open(QIODevice::ReadOnly)) return ""; if (!f.open(QIODevice::ReadOnly)) return "";
QString all = QString::fromUtf8(f.readAll()); QString all = QString::fromUtf8(f.readAll());
@@ -105,10 +105,10 @@ QString loadShaderFile(__GLShaderProgram__ * prog, __GLShader__::ShaderType type
if (version.toInt() >= 150) { if (version.toInt() >= 150) {
int ip = all.indexOf("\n", i); int ip = all.indexOf("\n", i);
if (ip < 0) return all; if (ip < 0) return all;
if (type == __GLShader__::Vertex) { if (type == QOpenGLShader::Vertex) {
all.insert(ip + 1, qgl_vertex_head); all.insert(ip + 1, qgl_vertex_head);
} }
if (type == __GLShader__::Fragment) { if (type == QOpenGLShader::Fragment) {
all.insert(ip + 1, qgl_fragment_head); all.insert(ip + 1, qgl_fragment_head);
} }
all.insert(ip + 1, qgl_structs); all.insert(ip + 1, qgl_structs);
@@ -120,27 +120,25 @@ QString loadShaderFile(__GLShaderProgram__ * prog, __GLShader__::ShaderType type
} }
bool loadShaders(__GLShaderProgram__ * prog, const QString & name, const QString & dir) { bool loadShaders(QOpenGLShaderProgram * prog, const QString & name, const QString & dir) {
prog->removeAllShaders(); prog->removeAllShaders();
QDir d(dir); QDir d(dir);
QFileInfoList sl; QFileInfoList sl;
//qDebug() << "[QGLView] Shader \"" + name + "\" load shaders from" << d.absolutePath(); //qDebug() << "[QGLView] Shader \"" + name + "\" load shaders from" << d.absolutePath();
#if QT_VERSION >= 0x040700
sl = d.entryInfoList(QStringList(name + ".geom"), QDir::Files | QDir::NoDotAndDotDot); sl = d.entryInfoList(QStringList(name + ".geom"), QDir::Files | QDir::NoDotAndDotDot);
foreach (const QFileInfo & i, sl) { foreach (const QFileInfo & i, sl) {
qDebug() << "[QGLView] Shader \"" + name + "\" add geometry shader:" << i.fileName(); qDebug() << "[QGLView] Shader \"" + name + "\" add geometry shader:" << i.fileName();
loadShaderFile(prog, __GLShader__::Geometry, i.absoluteFilePath()); loadShaderFile(prog, QOpenGLShader::Geometry, i.absoluteFilePath());
} }
#endif
sl = d.entryInfoList(QStringList(name + ".vert"), QDir::Files | QDir::NoDotAndDotDot); sl = d.entryInfoList(QStringList(name + ".vert"), QDir::Files | QDir::NoDotAndDotDot);
foreach (const QFileInfo & i, sl) { foreach (const QFileInfo & i, sl) {
//qDebug() << "[QGLView] Shader \"" + name + "\" add vertex shader:" << i.fileName(); //qDebug() << "[QGLView] Shader \"" + name + "\" add vertex shader:" << i.fileName();
loadShaderFile(prog, __GLShader__::Vertex, i.absoluteFilePath()); loadShaderFile(prog, QOpenGLShader::Vertex, i.absoluteFilePath());
} }
sl = d.entryInfoList(QStringList(name + ".frag"), QDir::Files | QDir::NoDotAndDotDot); sl = d.entryInfoList(QStringList(name + ".frag"), QDir::Files | QDir::NoDotAndDotDot);
foreach (const QFileInfo & i, sl) { foreach (const QFileInfo & i, sl) {
//qDebug() << "[QGLView] Shader \"" + name + "\" add fragment shader:" << i.fileName(); //qDebug() << "[QGLView] Shader \"" + name + "\" add fragment shader:" << i.fileName();
loadShaderFile(prog, __GLShader__::Fragment, i.absoluteFilePath()); loadShaderFile(prog, QOpenGLShader::Fragment, i.absoluteFilePath());
} }
if (!prog->link()) { if (!prog->link()) {
qDebug() << "[QGLView] Shader \"" + name + "\" link error: " + prog->log(); qDebug() << "[QGLView] Shader \"" + name + "\" link error: " + prog->log();
@@ -150,7 +148,7 @@ bool loadShaders(__GLShaderProgram__ * prog, const QString & name, const QString
} }
void setUniformMatrices(__GLShaderProgram__ * prog, QMatrix4x4 proj, QMatrix4x4 view, QMatrix4x4 prevproj, QMatrix4x4 prevview) { void setUniformMatrices(QOpenGLShaderProgram * prog, QMatrix4x4 proj, QMatrix4x4 view, QMatrix4x4 prevproj, QMatrix4x4 prevview) {
if (!prog) return; if (!prog) return;
if (!prog->isLinked()) return; if (!prog->isLinked()) return;
QMatrix4x4 mvpm = proj * view; QMatrix4x4 mvpm = proj * view;
@@ -170,7 +168,7 @@ void setUniformMatrices(__GLShaderProgram__ * prog, QMatrix4x4 proj, QMatrix4x4
} }
void setUniformMap(__GLShaderProgram__ * prog, QString map_name, const Map & map, int channel, int def_channel) { void setUniformMap(QOpenGLShaderProgram * prog, QString map_name, const Map & map, int channel, int def_channel) {
if (!prog) return; if (!prog) return;
if (!prog->isLinked()) return; if (!prog->isLinked()) return;
prog->setUniformValue(("qgl_Material." + map_name + ".offset").toLatin1().constData(), map.color_offset); prog->setUniformValue(("qgl_Material." + map_name + ".offset").toLatin1().constData(), map.color_offset);
@@ -179,7 +177,7 @@ void setUniformMap(__GLShaderProgram__ * prog, QString map_name, const Map & map
} }
void setUniformMaterial(__GLShaderProgram__ * prog, const Material & mat) { void setUniformMaterial(QOpenGLShaderProgram * prog, const Material & mat) {
if (!prog) return; if (!prog) return;
if (!prog->isLinked()) return; if (!prog->isLinked()) return;
QGLCI QGLCI
@@ -206,7 +204,7 @@ void setUniformMaterial(__GLShaderProgram__ * prog, const Material & mat) {
} }
void setUniformLights(__GLShaderProgram__ * prog, const QVector<Light*> & lights, const QMatrix4x4 & mat, int shadow_start) { void setUniformLights(QOpenGLShaderProgram * prog, const QVector<Light*> & lights, const QMatrix4x4 & mat, int shadow_start) {
for (int i = 0; i < lights.size(); ++i) for (int i = 0; i < lights.size(); ++i)
setUniformLight(prog, lights[i], QString("qgl_Light[%1]").arg(i), mat, shadow_start + i); setUniformLight(prog, lights[i], QString("qgl_Light[%1]").arg(i), mat, shadow_start + i);
} }
@@ -223,7 +221,7 @@ void setUniformLights(__GLShaderProgram__ * prog, const QVector<Light*> & lights
" sampler2DShadow shadow;\n" " sampler2DShadow shadow;\n"
" mat4 shadowMatrix;\n" " mat4 shadowMatrix;\n"
*/ */
void setUniformLight(__GLShaderProgram__ * prog, Light * light, QString ulightn, const QMatrix4x4 & mat, int shadow) { void setUniformLight(QOpenGLShaderProgram * prog, Light * light, QString ulightn, const QMatrix4x4 & mat, int shadow) {
if (!prog) return; if (!prog) return;
if (!prog->isLinked()) return; if (!prog->isLinked()) return;
QMatrix4x4 m = mat * light->worldTransform(); QMatrix4x4 m = mat * light->worldTransform();

View File

@@ -25,12 +25,12 @@ class Map;
class Material; class Material;
class Light; class Light;
QString loadShaderFile(__GLShaderProgram__ * prog, __GLShader__::ShaderType type, const QString & file); QString loadShaderFile(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, const QString & file);
bool loadShaders(__GLShaderProgram__ * prog, const QString & name, const QString & dir = QString()); bool loadShaders(QOpenGLShaderProgram * prog, const QString & name, const QString & dir = QString());
void setUniformMatrices(__GLShaderProgram__ * prog, QMatrix4x4 proj, QMatrix4x4 view, QMatrix4x4 prevproj = QMatrix4x4(), QMatrix4x4 prevview = QMatrix4x4()); void setUniformMatrices(QOpenGLShaderProgram * prog, QMatrix4x4 proj, QMatrix4x4 view, QMatrix4x4 prevproj = QMatrix4x4(), QMatrix4x4 prevview = QMatrix4x4());
void setUniformMap(__GLShaderProgram__ * prog, const Map & map, int channel, int def_channel); void setUniformMap(QOpenGLShaderProgram * prog, const Map & map, int channel, int def_channel);
void setUniformMaterial(__GLShaderProgram__ * prog, const Material & mat); void setUniformMaterial(QOpenGLShaderProgram * prog, const Material & mat);
void setUniformLights(__GLShaderProgram__ * prog, const QVector<Light*> & lights, const QMatrix4x4 & mat, int shadow_start); void setUniformLights(QOpenGLShaderProgram * prog, const QVector<Light*> & lights, const QMatrix4x4 & mat, int shadow_start);
void setUniformLight(__GLShaderProgram__ * prog, Light * light, QString ulightn, const QMatrix4x4 & mat = QMatrix4x4(), int shadow = 0); void setUniformLight(QOpenGLShaderProgram * prog, Light * light, QString ulightn, const QMatrix4x4 & mat = QMatrix4x4(), int shadow = 0);
#endif // GLSHADERS_H #endif // GLSHADERS_H

View File

@@ -19,7 +19,9 @@
#include "glcamera.h" #include "glcamera.h"
#include "qglview.h" #include "qglview.h"
__GLWidget__ * currentQGLView; #include <QPainter>
//__GLWidget__ * currentQGLView;
QMutex globMutex; QMutex globMutex;
@@ -51,7 +53,7 @@ QString findFile(const QString & file, const QStringList & pathes) {
} }
void glDrawQuad(__GLShaderProgram__ * 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) {
QGLCI QGLCI
glResetAllTransforms(); glResetAllTransforms();
glSetPolygonMode(GL_FILL); glSetPolygonMode(GL_FILL);
@@ -72,12 +74,7 @@ void glDrawQuad(__GLShaderProgram__ * prog, QVector4D * corner_dirs, GLfloat x,
QMatrix4x4 getGLMatrix(GLenum matrix) { QMatrix4x4 getGLMatrix(GLenum matrix) {
GLdouble gm[16]; GLdouble gm[16];
glGetDoublev(matrix, gm); glGetDoublev(matrix, gm);
#if QT_VERSION < 0x050600 float qm[16];
qreal
#else
float
#endif
qm[16];
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
qm[i] = gm[i]; qm[i] = gm[i];
return QMatrix4x4(qm).transposed(); return QMatrix4x4(qm).transposed();
@@ -86,12 +83,7 @@ QMatrix4x4 getGLMatrix(GLenum matrix) {
void setGLMatrix(QMatrix4x4 matrix) { void setGLMatrix(QMatrix4x4 matrix) {
GLdouble gm[16]; GLdouble gm[16];
#if QT_VERSION < 0x050600 float qm[16];
qreal
#else
float
#endif
qm[16];
matrix.transposed().copyDataTo(qm); matrix.transposed().copyDataTo(qm);
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
gm[i] = qm[i]; gm[i] = qm[i];
@@ -101,12 +93,7 @@ void setGLMatrix(QMatrix4x4 matrix) {
void qglMultMatrix(const QMatrix4x4 & m) { void qglMultMatrix(const QMatrix4x4 & m) {
GLdouble gm[16]; GLdouble gm[16];
#if QT_VERSION < 0x050600 float qm[16];
qreal
#else
float
#endif
qm[16];
m.transposed().copyDataTo(qm); m.transposed().copyDataTo(qm);
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
gm[i] = qm[i]; gm[i] = qm[i];
@@ -307,6 +294,11 @@ void QGLViewBase::setCamera(const Camera & camera) {
} }
GLTextureManagerBase * QGLViewBase::textureManager() {
return m_texture_manager;
}
Box3D::Box3D(const QVector<QVector3D> & points) { Box3D::Box3D(const QVector<QVector3D> & points) {
x = y = z = width = length = height = angle_z = angle_xy = angle_roll = 0.f; x = y = z = width = length = height = angle_z = angle_xy = angle_roll = 0.f;
if (points.isEmpty()) return; if (points.isEmpty()) return;

View File

@@ -41,15 +41,9 @@
# define CC_VC # define CC_VC
#endif #endif
#if QT_VERSION < 0x050600
# define GL_GLEXT_PROTOTYPES
#endif
#include <QObject> #include <QObject>
#ifdef WINDOWS #ifndef WINDOWS
# if QT_VERSION < 0x050600
# include "GLee.h"
# endif
#else
# ifdef MAC # ifdef MAC
# include <OpenGL/gl.h> # include <OpenGL/gl.h>
# include <OpenGL/glu.h> # include <OpenGL/glu.h>
@@ -60,15 +54,12 @@
# include <GL/glu.h> # include <GL/glu.h>
# endif # endif
#endif #endif
#if QT_VERSION < 0x050600 #include <QOpenGLExtraFunctions>
# include <qgl.h> #include <QOpenGLWidget>
#else #include <QOpenGLShader>
//# include "GLee.h" #include <QOpenGLShaderProgram>
# include <QOpenGLExtraFunctions>
#endif
#include <cmath> #include <cmath>
#include <float.h> #include <float.h>
//#include <limits>
#include <QMatrix4x4> #include <QMatrix4x4>
#include <QDebug> #include <QDebug>
#include <QDataStream> #include <QDataStream>
@@ -87,23 +78,7 @@
# include <complex.h> # include <complex.h>
#endif #endif
#include <iostream> #include <iostream>
#if QT_VERSION >= 0x050400
# include <QOpenGLWidget>
# include <QOpenGLShader>
# include <QOpenGLShaderProgram>
typedef QOpenGLWidget __GLWidget__;
typedef QOpenGLContext __GLContext__;
typedef QOpenGLShader __GLShader__;
typedef QOpenGLShaderProgram __GLShaderProgram__;
#else
# include <QGLWidget>
# include <QGLShader>
# include <QGLShaderProgram>
typedef QGLWidget __GLWidget__;
typedef QGLContext __GLContext__;
typedef QGLShader __GLShader__;
typedef QGLShaderProgram __GLShaderProgram__;
#endif
#ifdef WINDOWS #ifdef WINDOWS
# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF # define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
@@ -169,8 +144,7 @@ QString findFile(const QString & file, const QStringList & pathes);
inline QColor operator *(const QColor & c, double v) {return QColor(c.red() * v, c.green() * v, c.blue() * v, c.alpha() * v);} inline QColor operator *(const QColor & c, double v) {return QColor(c.red() * v, c.green() * v, c.blue() * v, c.alpha() * v);}
inline QColor operator /(const QColor & c, double v) {return QColor(c.red() / v, c.green() / v, c.blue() / v, c.alpha() / v);} inline QColor operator /(const QColor & c, double v) {return QColor(c.red() / v, c.green() / v, c.blue() / v, c.alpha() / v);}
extern __GLWidget__ * currentQGLView; //extern __GLWidget__ * currentQGLView;
extern QMutex globMutex;
inline void qglColor(const QColor & c) {glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF());} inline void qglColor(const QColor & c) {glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF());}
void qglMultMatrix(const QMatrix4x4 & m); void qglMultMatrix(const QMatrix4x4 & m);
@@ -184,11 +158,10 @@ inline void glSetCapEnabled(GLenum cap, bool on = true) {if (on) glEnable(cap);
inline void glSetLightEnabled(bool on) {if (on) glEnable(GL_LIGHTING); else glDisable(GL_LIGHTING);} inline void glSetLightEnabled(bool on) {if (on) glEnable(GL_LIGHTING); else glDisable(GL_LIGHTING);}
inline void glSetFogEnabled(bool on) {if (on) glEnable(GL_FOG); else glDisable(GL_FOG);} inline void glSetFogEnabled(bool on) {if (on) glEnable(GL_FOG); else glDisable(GL_FOG);}
inline void glSetPolygonMode(GLenum mode) {glPolygonMode(GL_FRONT_AND_BACK, mode);} inline void glSetPolygonMode(GLenum mode) {glPolygonMode(GL_FRONT_AND_BACK, mode);}
void glDrawQuad(__GLShaderProgram__ * prog = 0, QVector4D * corner_dirs = 0, GLfloat x = -1.f, GLfloat y = -1.f, GLfloat w = 2.f, GLfloat h = 2.f); void glDrawQuad(QOpenGLShaderProgram * prog = 0, QVector4D * corner_dirs = 0, GLfloat x = -1.f, GLfloat y = -1.f, GLfloat w = 2.f, GLfloat h = 2.f);
QMatrix4x4 getGLMatrix(GLenum matrix); QMatrix4x4 getGLMatrix(GLenum matrix);
void setGLMatrix(QMatrix4x4 matrix); void setGLMatrix(QMatrix4x4 matrix);
inline void deleteGLTexture(GLuint & tex) {if (tex != 0) glDeleteTextures(1, &tex); tex = 0;} inline void deleteGLTexture(GLuint & tex) {if (tex != 0) glDeleteTextures(1, &tex); tex = 0;}
#if QT_VERSION >= 0x050600
# define QGLCI if (!QOpenGLContext::currentContext()) return; QOpenGLExtraFunctions gf(QOpenGLContext::currentContext()); # define QGLCI if (!QOpenGLContext::currentContext()) return; QOpenGLExtraFunctions gf(QOpenGLContext::currentContext());
# define QGLC gf. # define QGLC gf.
inline void glActiveTextureChannel(int channel) {QGLCI gf.glActiveTexture(GL_TEXTURE0 + channel);} inline void glActiveTextureChannel(int channel) {QGLCI gf.glActiveTexture(GL_TEXTURE0 + channel);}
@@ -200,19 +173,6 @@ inline void deleteGLFramebuffer(GLuint & fbo) {QGLCI if (fbo != 0) gf.glDeleteFr
inline void deleteGLRenderbuffer(GLuint & drbo) {QGLCI if (drbo != 0) gf.glDeleteRenderbuffers(1, &drbo); drbo = 0;} inline void deleteGLRenderbuffer(GLuint & drbo) {QGLCI if (drbo != 0) gf.glDeleteRenderbuffers(1, &drbo); drbo = 0;}
inline void deleteGLBuffer(GLuint & bo) {QGLCI if (bo != 0) gf.glDeleteBuffers(1, &bo); bo = 0;} inline void deleteGLBuffer(GLuint & bo) {QGLCI if (bo != 0) gf.glDeleteBuffers(1, &bo); bo = 0;}
inline void deleteGLVertexArray(GLuint & va) {QGLCI if (va != 0) gf.glDeleteVertexArrays(1, &va); va = 0;} inline void deleteGLVertexArray(GLuint & va) {QGLCI if (va != 0) gf.glDeleteVertexArrays(1, &va); va = 0;}
#else
# define QGLCI
# define QGLC
inline void glActiveTextureChannel(int channel) {glActiveTexture(GL_TEXTURE0 + channel); glClientActiveTexture(GL_TEXTURE0 + channel);}
inline void glDisableTextures(int channels = 8) {for (int i = channels - 1; i >= 0; --i) {glActiveTextureChannel(i); glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_CUBE_MAP);}}
inline void glReleaseTextures(int channels = 8) {for (int i = channels - 1; i >= 0; --i) {glActiveTextureChannel(i); glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_CUBE_MAP, 0);}}
inline void glReleaseFramebuffer() {glBindFramebuffer(GL_FRAMEBUFFER, 0);}
inline void glReleaseShaders() {glUseProgram(0);}
inline void deleteGLFramebuffer(GLuint & fbo) {if (fbo != 0) glDeleteFramebuffers(1, &fbo); fbo = 0;}
inline void deleteGLRenderbuffer(GLuint & drbo) {if (drbo != 0) glDeleteRenderbuffers(1, &drbo); drbo = 0;}
inline void deleteGLBuffer(GLuint & bo) {if (bo != 0) glDeleteBuffers(1, &bo); bo = 0;}
inline void deleteGLVertexArray(GLuint & va) {if (va != 0) glDeleteVertexArrays(1, &va); va = 0;}
#endif
void createGLTexture(GLuint & tex, int width, int height, const GLenum & format = GL_RGBA8, const GLenum & target = GL_TEXTURE_2D); void createGLTexture(GLuint & tex, int width, int height, const GLenum & format = GL_RGBA8, const GLenum & target = GL_TEXTURE_2D);
void createGLTexture(GLuint & tex, const QImage & image, const GLenum & format = GL_RGBA8, const GLenum & target = GL_TEXTURE_2D); void createGLTexture(GLuint & tex, const QImage & image, const GLenum & format = GL_RGBA8, const GLenum & target = GL_TEXTURE_2D);
inline void qglTranslate(const QVector3D & v) {glTranslated(v.x(), v.y(), v.z());} inline void qglTranslate(const QVector3D & v) {glTranslated(v.x(), v.y(), v.z());}
@@ -367,6 +327,7 @@ class GLObjectBase;
class QGLView; class QGLView;
class Light; class Light;
class Camera; class Camera;
class GLTextureManagerBase;
class QGLViewBase class QGLViewBase
{ {
@@ -376,9 +337,11 @@ public:
Camera & camera(); Camera & camera();
const Camera & camera() const; const Camera & camera() const;
void setCamera(const Camera & camera); void setCamera(const Camera & camera);
GLTextureManagerBase * textureManager();
protected: protected:
virtual void collectLights() = 0; virtual void collectLights() = 0;
Camera * camera_; Camera * camera_;
GLTextureManagerBase * m_texture_manager;
}; };
#endif // GLTYPES_H #endif // GLTYPES_H

View File

@@ -33,9 +33,7 @@ GLVBO::~GLVBO() {
void GLVBO::init() { void GLVBO::init() {
#if QT_VERSION >= 0x050600
initializeOpenGLFunctions(); initializeOpenGLFunctions();
#endif
if (!isInit()) { if (!isInit()) {
//glGenVertexArrays(1, &va_); //glGenVertexArrays(1, &va_);
glGenBuffers(1, &buffer_); glGenBuffers(1, &buffer_);
@@ -83,9 +81,7 @@ void GLVBO::calculateBinormals() {
bool GLVBO::rebuffer(bool clear_) { bool GLVBO::rebuffer(bool clear_) {
#if QT_VERSION >= 0x050600
initializeOpenGLFunctions(); initializeOpenGLFunctions();
#endif
QVector<GLfloat> data; QVector<GLfloat> data;
//data.clear(); //data.clear();
calculateBinormals(); calculateBinormals();
@@ -120,7 +116,7 @@ bool GLVBO::rebuffer(bool clear_) {
} }
void GLVBO::draw(GLenum type, __GLShaderProgram__ * prog, bool simplest) { void GLVBO::draw(GLenum type, QOpenGLShaderProgram * prog, bool simplest) {
if (buffer_ == 0 || vert_count == 0) return; if (buffer_ == 0 || vert_count == 0) return;
if (changed) rebuffer(); if (changed) rebuffer();
//qDebug() << "draw" << vert_count; //qDebug() << "draw" << vert_count;
@@ -289,9 +285,8 @@ bool GLVBO::loadFromFile(const QString & filename) {
} }
Box3D GLVBO::boundingBox(const QMatrix4x4 & mat) const { Box3D GLVBO::boundingBox() const {
if (vertices_.size() < 3) return Box3D(); if (vertices_.size() < 3) return Box3D();
bool mi = mat.isIdentity();
int vcnt = vertices_.size() / 3; int vcnt = vertices_.size() / 3;
//qDebug() << "calculateBinormals" << vcnt << tcnt << vertices_.size() << texcoords_.size() << "..."; //qDebug() << "calculateBinormals" << vcnt << tcnt << vertices_.size() << texcoords_.size() << "...";
GLfloat mix, miy, miz, max, may, maz; GLfloat mix, miy, miz, max, may, maz;

View File

@@ -22,10 +22,7 @@
#include "gltypes.h" #include "gltypes.h"
#include "chunkstream.h" #include "chunkstream.h"
class GLVBO class GLVBO : protected QOpenGLExtraFunctions
#if QT_VERSION >= 0x050600
: protected QOpenGLExtraFunctions
#endif
{ {
friend class GLObjectBase; friend class GLObjectBase;
friend QDataStream & operator <<(QDataStream & s, const GLVBO & m); friend QDataStream & operator <<(QDataStream & s, const GLVBO & m);
@@ -39,7 +36,7 @@ public:
void init(); void init();
void destroy(); void destroy();
bool rebuffer(bool clear_ = false); bool rebuffer(bool clear_ = false);
void draw(GLenum type, __GLShaderProgram__ * prog, bool simplest = false); void draw(GLenum type, QOpenGLShaderProgram * prog, bool simplest = false);
void clear(); void clear();
GLuint buffer() const {return buffer_;} GLuint buffer() const {return buffer_;}
@@ -58,7 +55,7 @@ public:
bool saveToFile(const QString & filename); bool saveToFile(const QString & filename);
bool loadFromFile(const QString & filename); bool loadFromFile(const QString & filename);
Box3D boundingBox(const QMatrix4x4 & mat = QMatrix4x4()) const; Box3D boundingBox() const;
private: private:
void calculateBinormals(); void calculateBinormals();

View File

@@ -18,21 +18,22 @@
#include "qglview.h" #include "qglview.h"
#include <QApplication>
#include <QKeyEvent>
QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
setFrameShape(QFrame::NoFrame); QGLView::QGLView(): OpenGLWindow(), fbo_selection(3) {
setViewportUpdateMode(FullViewportUpdate); // setFrameShape(QFrame::NoFrame);
setCacheMode(CacheNone); // setViewportUpdateMode(FullViewportUpdate);
setMouseTracking(true); // setCacheMode(CacheNone);
setFocusPolicy(Qt::WheelFocus); // setMouseTracking(true);
setScene(new QGraphicsScene()); // setFocusPolicy(Qt::WheelFocus);
setInteractive(true); // setScene(new QGraphicsScene());
_w = 0; // setInteractive(true);
timer = 0; timer = 0;
need_init_ = is_first_draw = true; need_init_ = is_first_draw = true;
objects_.is_root = true; objects_.is_root = true;
objects_.view_ = this; objects_.view_ = this;
painter_ = 0;
backColor_ = Qt::black; backColor_ = Qt::black;
hoverHaloColor_ = QColor(195, 140, 255, 96); hoverHaloColor_ = QColor(195, 140, 255, 96);
selectionHaloColor_ = QColor(175, 255, 140); selectionHaloColor_ = QColor(175, 255, 140);
@@ -45,17 +46,18 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
shaders_supported = selecting_ = customMouseMove_ = false; shaders_supported = selecting_ = customMouseMove_ = false;
sel_button = Qt::LeftButton; sel_button = Qt::LeftButton;
sel_mod = Qt::NoModifier; sel_mod = Qt::NoModifier;
renderer_ = 0; renderer_ = nullptr;
fps_cnt = 0; fps_cnt = 0;
fps_tm = fps_ = 0.; fps_tm = fps_ = 0.;
sel_obj = hov_obj = 0; sel_obj = hov_obj = nullptr;
fogDensity_ = fogEnd_ = 1.; fogDensity_ = fogEnd_ = 1.;
fogStart_ = 0.; fogStart_ = 0.;
fogMode_ = Exp; fogMode_ = Exp;
hoverHaloFill_ = 0.333; hoverHaloFill_ = 0.333;
selectionHaloFill_ = 0.5; selectionHaloFill_ = 0.5;
//lmode = Simple; //lmode = Simple;
shader_select = shader_halo = 0; shader_select = shader_halo = nullptr;
m_texture_manager = new GLTextureManager();
setFeature(qglMSAA, false); setFeature(qglMSAA, false);
setFeature(qglFXAA, false); setFeature(qglFXAA, false);
setFeature(qglLinearFiltering, true); setFeature(qglLinearFiltering, true);
@@ -84,11 +86,11 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
setFeature(qglDepthOfFieldFocus, 1.); setFeature(qglDepthOfFieldFocus, 1.);
setFeature(qglDepthOfFieldDiaphragm, 8.); setFeature(qglDepthOfFieldDiaphragm, 8.);
mouse_first = mouseSelect_ = hoverHalo_ = selectionHalo_ = true; mouse_first = mouseSelect_ = hoverHalo_ = selectionHalo_ = true;
fogEnabled_ = is_init = grabMouse_ = mouseRotate_ = mouseThis_ = shaders_bind = changed_ = false; fogEnabled_ = is_init = grabMouse_ = mouseRotate_ = shaders_bind = changed_ = false;
rmode = GLObjectBase::Fill; rmode = GLObjectBase::Fill;
sel_mode = QGLView::SingleSelection; sel_mode = QGLView::SingleSelection;
sel_pen = QPen(Qt::black, 1, Qt::DashLine); // sel_pen = QPen(Qt::black, 1, Qt::DashLine);
sel_brush = QBrush(QColor(170, 100, 255, 120)); // sel_brush = QBrush(QColor(170, 100, 255, 120));
camera().setAim(QVector3D(0,0,5.5)); camera().setAim(QVector3D(0,0,5.5));
camera().setPos(QVector3D(10, 5, 5.5)); camera().setPos(QVector3D(10, 5, 5.5));
camera().setName("Camera"); camera().setName("Camera");
@@ -103,20 +105,27 @@ QGLView::~QGLView() {
stop(); stop();
if (shader_select) delete shader_select; if (shader_select) delete shader_select;
if (shader_halo) delete shader_halo; if (shader_halo) delete shader_halo;
currentQGLView = 0; delete m_texture_manager;
currentGLTextureManager = 0;
//if (shader_rope != 0) delete shader_rope;
} }
void QGLView::addObject(QWidget * o, Qt::WindowFlags f) { void QGLView::stop() {
scene()->addWidget(o, f)->setCacheMode(QGraphicsItem::ItemCoordinateCache); if (timer) killTimer(timer);
/*QList<QGraphicsItem * > il = collectGraphicItems(); }
foreach (QGraphicsItem * i, il) {
QGraphicsProxyWidget * p = qgraphicsitem_cast<QGraphicsProxyWidget * >(i);
if (p == 0) continue; void QGLView::start(double freq) {
p->setCacheMode(QGraphicsItem::ItemCoordinateCache); timer = startTimer(freq <= 0. ? 0 : 1000. / freq);
}*/ }
GLRendererBase * QGLView::renderer() {
return renderer_;
}
void QGLView::setRenderer(GLRendererBase * r, GLRendererBase ** prev) {
if (prev != nullptr) *prev = renderer_;
renderer_ = r;
} }
@@ -130,15 +139,13 @@ void QGLView::addObject(GLObjectBase * o) {
emit objectAdded(i); emit objectAdded(i);
} }
if (is_init) { if (is_init) {
globMutex.lock();
o->init(); o->init();
globMutex.unlock();
} }
} }
void QGLView::removeObject(GLObjectBase * o, bool inChildren) { void QGLView::removeObject(GLObjectBase * o, bool inChildren) {
o->setView(0); o->setView(nullptr);
if (inChildren) if (inChildren)
removeObjectInternal(o, &objects_); removeObjectInternal(o, &objects_);
else else
@@ -151,8 +158,8 @@ void QGLView::clearObjects(bool deleteAll) {
removeObject(camera_); removeObject(camera_);
objects_.clearChildren(deleteAll); objects_.clearChildren(deleteAll);
addObject(camera()); addObject(camera());
selectObject(0); selectObject(nullptr);
hov_obj = 0; hov_obj = nullptr;
} }
@@ -164,95 +171,22 @@ void QGLView::selectObject(GLObjectBase * o) {
} }
void QGLView::drawBackground(QPainter * painter, const QRectF & rect) { void QGLView::resizeEvent(QResizeEvent * e) {
if (setupViewport()) { resizeGL(width(), height());
QGraphicsView::drawBackground(painter_, rect); /* QWindow::resizeEvent(e);*/
return; }
}
painter_ = painter; void QGLView::timerEvent(QTimerEvent *) {
if (is_first_draw) { renderNow();
//connect(context(), SIGNAL(aboutToBeDestroyed()), this, SLOT(glCleanup())); if (ktm_.elapsed() < QApplication::keyboardInputInterval()) return;
//resizeGL(viewport()->width(), viewport()->height()); Qt::KeyboardModifiers km = QApplication::keyboardModifiers();
initializeGL(); foreach (int i, keys_)
} emit keyEvent((Qt::Key)i, km);
is_first_draw = false;
painter_->beginNativePainting();
paintGL();
painter_->endNativePainting();
glDisableDepth();
glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);
glReleaseTextures();
painter_ = 0;
QGraphicsView::drawBackground(painter, rect);
} }
void QGLView::initializeGL() { void QGLView::render() {
//qDebug() << "init glview"; QRect g_rect(QPoint(), size());
//makeCurrent();
#if QT_VERSION >= 0x050600
initializeOpenGLFunctions();
#endif
currentQGLView = (__GLWidget__ * )viewport();
currentGLTextureManager = &textures_manager;
currentCamera = &camera();
glEnable(GL_TEXTURE_MAX_ANISOTROPY_EXT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glEnableDepth();
glEnable(GL_CULL_FACE);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
glActiveTextureChannel(3);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glActiveTextureChannel(0);
glShadeModel(GL_SMOOTH);
glCullFace(GL_BACK);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
textures_manager.loadTextures();
objects_.initInternal();
checkCaps();
shader_select = new __GLShaderProgram__(context());
shader_halo = new __GLShaderProgram__(context());
//shader_rope = new __GLShaderProgram__(context());
reloadThisShaders();
is_init = true;
resizeGL(viewport()->width(), viewport()->height());
//dynamic_cubemap.loadPathesFromDirectory("e");
//dynamic_cubemap.load();
/*dynamic_cubemap.loadFront("e/front.jpg");
dynamic_cubemap.loadBack("e/back.jpg");
dynamic_cubemap.loadLeft("e/left.jpg");
dynamic_cubemap.loadRight("e/right.jpg");
dynamic_cubemap.loadTop("e/top.jpg");
dynamic_cubemap.loadBottom("e/bottom.jpg");*/
//glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
//GLuint t = 0;
//createGLTexture(t, QImage("e/bottom.jpg"));
//qDebug() << bindTexture(QImage("e/bottom.jpg"));
need_init_ = false;
emit glInitializeDone();
}
void QGLView::paintGL() {
#if QT_VERSION >= 0x050600
//initializeOpenGLFunctions();
if (need_init_)
initializeGL();
#endif
emit glBeforePaint(); emit glBeforePaint();
//qDebug() << "paintGL"; //qDebug() << "paintGL";
//QMutexLocker ml_v(&v_mutex); //QMutexLocker ml_v(&v_mutex);
@@ -290,16 +224,16 @@ void QGLView::paintGL() {
if (shaders_supported && shader_select->isLinked()) shader_select->release(); if (shaders_supported && shader_select->isLinked()) shader_select->release();
uchar cgid[4] = {0, 0, 0, 0}; uchar cgid[4] = {0, 0, 0, 0};
uint iid = 0; uint iid = 0;
GLObjectBase * so = 0; GLObjectBase * so = nullptr;
if (!rect().contains(lastPos)) { if (!g_rect.contains(lastPos)) {
if (hov_obj != 0) { if (hov_obj != nullptr) {
hov_obj = 0; hov_obj = nullptr;
emit hoverChanged(0, hov_obj); emit hoverChanged(nullptr, hov_obj);
} }
} else { } else {
glReadPixels(lastPos.x(), viewport()->height() - lastPos.y(), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, cgid); glReadPixels(lastPos.x(), height() - lastPos.y(), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, cgid);
iid = (cgid[0] << 24) | (cgid[1] << 16) | (cgid[2] << 8) | cgid[3]; iid = (cgid[0] << 24) | (cgid[1] << 16) | (cgid[2] << 8) | cgid[3];
so = ids[iid]; so = ids.value(iid, nullptr);
//qDebug() <<cgid[0]<<cgid[1]<<cgid[2]<<cgid[3]<< iid; //qDebug() <<cgid[0]<<cgid[1]<<cgid[2]<<cgid[3]<< iid;
if (so != hov_obj) { if (so != hov_obj) {
emit hoverChanged(so, hov_obj); emit hoverChanged(so, hov_obj);
@@ -309,7 +243,7 @@ void QGLView::paintGL() {
} }
if (selectionHalo_ && sel_obj) { if (selectionHalo_ && sel_obj) {
fbo_selection.setWriteBuffer(2); fbo_selection.setWriteBuffer(2);
renderHalo(sel_obj, ids.key(sel_obj), selectionHaloColor_, selectionHaloFill_); renderHalo(sel_obj, qHash((quint64)sel_obj), selectionHaloColor_, selectionHaloFill_);
} }
if (hoverHalo_ && hov_obj) { if (hoverHalo_ && hov_obj) {
fbo_selection.setWriteBuffer(1); fbo_selection.setWriteBuffer(1);
@@ -327,18 +261,18 @@ void QGLView::paintGL() {
cur_mvpm = start_rp.proj_matrix * start_rp.view_matrix * start_rp.cam_offset_matrix; cur_mvpm = start_rp.proj_matrix * start_rp.view_matrix * start_rp.cam_offset_matrix;
//objects_.preparePos(camera()); //objects_.preparePos(camera());
static GLRendererBase * prev_rend = 0; static GLRendererBase * prev_rend = nullptr;
glShadeModel(GL_SMOOTH); glShadeModel(GL_SMOOTH);
if (prev_rend != renderer_) { if (prev_rend != renderer_) {
prev_rend = renderer_; prev_rend = renderer_;
if (renderer_ != 0) { if (renderer_ != nullptr) {
renderer_->init(viewport()->width(), viewport()->height()); renderer_->init(width(), height());
renderer_->resize(viewport()->width(), viewport()->height()); renderer_->resize(width(), height());
renderer_->reloadShaders(); renderer_->reloadShaders();
} }
} }
emit glBeginPaint(); emit glBeginPaint();
if (renderer_ != 0) { if (renderer_ != nullptr) {
renderer_->rp.prepare(); renderer_->rp.prepare();
renderer_->prepareScene(); renderer_->prepareScene();
renderer_->renderScene(); renderer_->renderScene();
@@ -367,13 +301,6 @@ void QGLView::paintGL() {
} }
} }
if (selecting_ && painter_) {
painter_->setPen(sel_pen);
painter_->setBrush(sel_brush);
painter_->drawRect(QRect(downPos, lastPos).normalized());
qDebug() << QRect(downPos, lastPos).normalized();
}
glReleaseShaders(); glReleaseShaders();
glResetAllTransforms(); glResetAllTransforms();
glReleaseFramebuffer(); glReleaseFramebuffer();
@@ -419,12 +346,47 @@ void QGLView::paintGL() {
fps_ = fps_cnt / fps_tm * 1000.; fps_ = fps_cnt / fps_tm * 1000.;
fps_tm = 0.; fps_tm = 0.;
fps_cnt = 0; fps_cnt = 0;
//glResetAllTransforms();
} }
void QGLView::renderHalo(const GLObjectBase * obj, const int iid, const QColor & color, const double & fill) { void QGLView::initialize() {
initializeOpenGLFunctions();
glEnable(GL_TEXTURE_MAX_ANISOTROPY_EXT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glEnableDepth();
glEnable(GL_CULL_FACE);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
glActiveTextureChannel(3);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glActiveTextureChannel(0);
glShadeModel(GL_SMOOTH);
glCullFace(GL_BACK);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
textures_manager.loadTextures();
objects_.initInternal();
checkCaps();
shader_select = new QOpenGLShaderProgram(context());
shader_halo = new QOpenGLShaderProgram(context());
reloadThisShaders();
is_init = true;
resizeGL(width(), height());
need_init_ = false;
emit glInitializeDone();
}
void QGLView::renderHalo(const GLObjectBase * obj, const uint iid, const QColor & color, const double & fill) {
if (!shaders_supported) return; if (!shaders_supported) return;
if (!shader_halo) return; if (!shader_halo) return;
if (!shader_halo->isLinked()) return; if (!shader_halo->isLinked()) return;
@@ -434,7 +396,7 @@ void QGLView::renderHalo(const GLObjectBase * obj, const int iid, const QColor &
glActiveTextureChannel(0); glActiveTextureChannel(0);
glBindTexture(GL_TEXTURE_2D, fbo_selection.colorTexture()); glBindTexture(GL_TEXTURE_2D, fbo_selection.colorTexture());
shader_halo->setUniformValue("t0", 0); shader_halo->setUniformValue("t0", 0);
shader_halo->setUniformValue("dt", QVector2D(1. / viewport()->width(), 1. / viewport()->height())); shader_halo->setUniformValue("dt", QVector2D(1. / width(), 1. / height()));
shader_halo->setUniformValue("selected", QVector4D(float((iid >> 24) & 0xFF) / 255.f, shader_halo->setUniformValue("selected", QVector4D(float((iid >> 24) & 0xFF) / 255.f,
float((iid >> 16) & 0xFF) / 255.f, float((iid >> 16) & 0xFF) / 255.f,
float((iid >> 8) & 0xFF) / 255.f, float((iid >> 8) & 0xFF) / 255.f,
@@ -454,7 +416,7 @@ void QGLView::renderHalo(const GLObjectBase * obj, const int iid, const QColor &
void QGLView::renderSelection() { void QGLView::renderSelection() {
cid = 1; // cid = 1;
ids.clear(); ids.clear();
if (shaders_supported) { if (shaders_supported) {
if (shader_select) { if (shader_select) {
@@ -480,28 +442,29 @@ void QGLView::renderSingleSelection(GLObjectBase & o) {
} }
if (!o.visible_ || !o.select_) return; if (!o.visible_ || !o.select_) return;
QMatrix4x4 curview = start_rp.view_matrix * start_rp.cam_offset_matrix * o.itransform_; QMatrix4x4 curview = start_rp.view_matrix * start_rp.cam_offset_matrix * o.itransform_;
ids.insert(cid, &o); uint id = qHash((quint64)&o);
ids.insert(id, &o);
if (shaders_supported){ if (shaders_supported){
if (shader_select) { if (shader_select) {
if (shader_select->isLinked()) { if (shader_select->isLinked()) {
setUniformMatrices(shader_select, start_rp.proj_matrix, curview); setUniformMatrices(shader_select, start_rp.proj_matrix, curview);
shader_select->setUniformValue(sh_id_loc, QVector4D(float((cid >> 24) & 0xFF) / 255.f, shader_select->setUniformValue(sh_id_loc, QVector4D(float((id >> 24) & 0xFF) / 255.f,
float((cid >> 16) & 0xFF) / 255.f, float((id >> 16) & 0xFF) / 255.f,
float((cid >> 8) & 0xFF) / 255.f, float((id >> 8) & 0xFF) / 255.f,
float(cid & 0xFF) / 255.f)); float(id & 0xFF) / 255.f));
} }
} }
} else { } else {
setGLMatrix(curview); setGLMatrix(curview);
glColor4f(float((cid >> 24) & 0xFF) / 255.f, glColor4f(float((id >> 24) & 0xFF) / 255.f,
float((cid >> 16) & 0xFF) / 255.f, float((id >> 16) & 0xFF) / 255.f,
float((cid >> 8) & 0xFF) / 255.f, float((id >> 8) & 0xFF) / 255.f,
float(cid & 0xFF) / 255.f); float(id & 0xFF) / 255.f);
} }
//qDebug() << o.name() << "assign to" << sh_id_loc << cid; //qDebug() << o.name() << "assign to" << sh_id_loc << cid;
//glColor4f(float((cid >> 24) & 0xFF) / 255.f, float((cid >> 16) & 0xFF) / 255.f, float((cid >> 8) & 0xFF) / 255.f, float(cid & 0xFF) / 255.f); //glColor4f(float((cid >> 24) & 0xFF) / 255.f, float((cid >> 16) & 0xFF) / 255.f, float((cid >> 8) & 0xFF) / 255.f, float(cid & 0xFF) / 255.f);
++cid; // ++cid;
o.draw(0, true); o.draw(nullptr, true);
foreach (GLObjectBase * i, o.children_) foreach (GLObjectBase * i, o.children_)
renderSingleSelection(*i); renderSingleSelection(*i);
} }
@@ -515,25 +478,8 @@ void QGLView::collectLights() {
void QGLView::objectDeleted(GLObjectBase * o) { void QGLView::objectDeleted(GLObjectBase * o) {
//qDebug() << "del" << o; //qDebug() << "del" << o;
if (sel_obj == o) selectObject(0); if (sel_obj == o) selectObject(nullptr);
if (hov_obj == o) hov_obj = 0; if (hov_obj == o) hov_obj = nullptr;
}
QList<QGraphicsItem * > QGLView::collectGraphicItems() {
QList<QGraphicsItem * > list = scene()->items();
foreach (QGraphicsItem * i, list)
collectGraphicItems(list, i);
return list;
}
void QGLView::collectGraphicItems(QList<QGraphicsItem * > & list, QGraphicsItem * o) {
QList<QGraphicsItem * > cl = o->childItems();
foreach (QGraphicsItem * i, cl) {
list << i;
collectGraphicItems(list, i);
}
} }
@@ -563,7 +509,7 @@ void QGLView::checkCaps() {
//glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_texture_chanels); //glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_texture_chanels);
//qDebug() << max_texture_chanels; //qDebug() << max_texture_chanels;
//qDebug() << max_texture_chanels; //qDebug() << max_texture_chanels;
shaders_supported = __GLShaderProgram__::hasOpenGLShaderPrograms(); shaders_supported = QOpenGLShaderProgram::hasOpenGLShaderPrograms();
} }
@@ -605,10 +551,10 @@ void QGLView::resizeGL(int width, int height) {
void QGLView::mouseReleaseEvent(QMouseEvent * e) { void QGLView::mouseReleaseEvent(QMouseEvent * e) {
QGraphicsView::mouseReleaseEvent(e); // QGraphicsView::mouseReleaseEvent(e);
//setCursor(QCursor(Qt::ArrowCursor)); //setCursor(QCursor(Qt::ArrowCursor));
selecting_ = false; selecting_ = false;
if (mouseThis_ && mouseSelect_ && e->button() == Qt::LeftButton) { if (mouseSelect_ && e->button() == Qt::LeftButton) {
if ((lastPos - downPos).manhattanLength() < 8) { if ((lastPos - downPos).manhattanLength() < 8) {
if (sel_obj != hov_obj) if (sel_obj != hov_obj)
selectObject(hov_obj); selectObject(hov_obj);
@@ -619,14 +565,10 @@ void QGLView::mouseReleaseEvent(QMouseEvent * e) {
void QGLView::mousePressEvent(QMouseEvent * e) { void QGLView::mousePressEvent(QMouseEvent * e) {
QGraphicsView::mousePressEvent(e); // QGraphicsView::mousePressEvent(e);
mouseThis_ = (scene()->itemAt(mapToScene(e->pos()) // mouseThis_ = (scene()->itemAt(mapToScene(e->pos()) , QTransform() ) == 0);
#if QT_VERSION >= 0x050000
, QTransform()
#endif
) == 0);
selecting_ = false; selecting_ = false;
if (!mouseThis_) return; if (!QRect(QPoint(), size()).contains(e->pos())) return;
/// TODO select by rect /// TODO select by rect
//if (e->button() == sel_button && e->modifiers() == sel_mod) //if (e->button() == sel_button && e->modifiers() == sel_mod)
// selecting_ = true; // selecting_ = true;
@@ -638,16 +580,16 @@ void QGLView::mousePressEvent(QMouseEvent * e) {
void QGLView::mouseMoveEvent(QMouseEvent * e) { void QGLView::mouseMoveEvent(QMouseEvent * e) {
//qDebug() << e->pos(); // qDebug() << e->pos();
QGraphicsView::mouseMoveEvent(e); // QGraphicsView::mouseMoveEvent(e);
//lastPos = e->pos(); //lastPos = e->pos();
if (selecting_) { if (selecting_) {
return; return;
} }
if (!mouseThis_) return;
//if (scene()->itemAt(mapToScene(e->pos())) != 0) return; //if (scene()->itemAt(mapToScene(e->pos())) != 0) return;
///qDebug() << e->x() << e->y(); ///qDebug() << e->x() << e->y();
QRect g_rect(QPoint(), size());
if (mouseRotate_) { if (mouseRotate_) {
double dx = e->x() - lastPos.x(); double dx = e->x() - lastPos.x();
double dy = e->y() - lastPos.y(); double dy = e->y() - lastPos.y();
@@ -676,7 +618,7 @@ void QGLView::mouseMoveEvent(QMouseEvent * e) {
lastPos = e->pos(); lastPos = e->pos();
if (grabMouse_) { if (grabMouse_) {
//if (!isrunning) return; //if (!isrunning) return;
QCursor::setPos(mapToGlobal(rect().center())); QCursor::setPos(mapToGlobal(QRect(QPoint(), size()).center()));
static bool mouse_sec = false; static bool mouse_sec = false;
if (mouse_sec) { if (mouse_sec) {
mouse_sec = false; mouse_sec = false;
@@ -688,7 +630,7 @@ void QGLView::mouseMoveEvent(QMouseEvent * e) {
//qDebug() << "first" << e->pos(); //qDebug() << "first" << e->pos();
return; return;
} }
lastPos = rect().center(); lastPos = g_rect.center();
int dx = e->x() - lastPos.x(); int dx = e->x() - lastPos.x();
int dy = e->y() - lastPos.y(); int dy = e->y() - lastPos.y();
emit glMouseMoveEvent(new QMouseEvent(QEvent::MouseMove, QPoint(dx, dy), e->button(), e->buttons(), e->modifiers())); emit glMouseMoveEvent(new QMouseEvent(QEvent::MouseMove, QPoint(dx, dy), e->button(), e->buttons(), e->modifiers()));
@@ -699,12 +641,6 @@ void QGLView::mouseMoveEvent(QMouseEvent * e) {
void QGLView::wheelEvent(QWheelEvent * e) { void QGLView::wheelEvent(QWheelEvent * e) {
QGraphicsView::wheelEvent(e);
if (scene()->itemAt(mapToScene(e->pos())
#if QT_VERSION >= 0x050000
, QTransform()
#endif
) != 0) return;
if (mouseRotate_) { if (mouseRotate_) {
if (e->delta() > 0) camera().flyCloser(0.1); //camera().pos.setZ(camera().pos.z() - 0.1 * camera().pos.z()); if (e->delta() > 0) camera().flyCloser(0.1); //camera().pos.setZ(camera().pos.z() - 0.1 * camera().pos.z());
if (e->delta() < 0) camera().flyFarer(0.1); //camera().pos.setZ(camera().pos.z() + 0.1 * camera().pos.z()); if (e->delta() < 0) camera().flyFarer(0.1); //camera().pos.setZ(camera().pos.z() + 0.1 * camera().pos.z());
@@ -720,37 +656,19 @@ void QGLView::leaveEvent(QEvent * ) {
} }
void QGLView::processKeys() { void QGLView::keyPressEvent(QKeyEvent * e) {
if (ktm_.elapsed() < QApplication::keyboardInputInterval()) return; emit glKeyPressEvent(e);
Qt::KeyboardModifiers km = QApplication::keyboardModifiers(); if (e->key() > 0) keys_.insert(e->key());
foreach (int i, keys_)
emit keyEvent((Qt::Key)i, km);
} }
bool QGLView::setupViewport() { void QGLView::keyReleaseEvent(QKeyEvent * e) {
if (_w) return false; emit glKeyReleaseEvent(e);
#if QT_VERSION >= 0x050600 keys_.remove(e->key());
_w = new __GLWidget__();
QSurfaceFormat f = _w->format();
f.setSamples(8);
_w->setFormat(f);
#else
QGLFormat f(QGL::DoubleBuffer | QGL::DepthBuffer | QGL::Rgba | QGL::AlphaChannel | QGL::DirectRendering | QGL::SampleBuffers);
f.setSwapInterval(1);
_w = new __GLWidget__(f);
#endif
setViewport(_w);
_w->setMouseTracking(true);
return true;
} }
void QGLView::glCleanup() { void QGLView::focusOutEvent(QFocusEvent *)
//qDebug() << "cleanup"; {keys_.clear();
/*disconnect(context(), SIGNAL(aboutToBeDestroyed()), this, SLOT(glCleanup()));
is_first_draw = true;
textures_manager = GLTextureManager();
currentQGLView = 0;
currentGLTextureManager = 0;*/
} }

View File

@@ -19,27 +19,15 @@
#ifndef QGLVIEW_H #ifndef QGLVIEW_H
#define QGLVIEW_H #define QGLVIEW_H
#include "openglwindow.h"
#include "glframebuffer.h" #include "glframebuffer.h"
#include <QGraphicsProxyWidget>
#include <QGraphicsView>
#include <QGLFramebufferObject>
#include <QVector3D>
#include <QTimer>
#include <QTime>
#include <QMouseEvent>
#include <QDebug>
#include <QMutex>
#include <QThread>
#include <QApplication>
#include "glprimitives.h" #include "glprimitives.h"
#include "glparticles_system.h" #include "glparticles_system.h"
#include "glrendererbase.h" #include "glrendererbase.h"
#include <QTime>
class QGLView: public QGraphicsView, public QGLViewBase class QGLView: public OpenGLWindow, public QGLViewBase
#if QT_VERSION >= 0x050600
, protected QOpenGLExtraFunctions
#endif
{ {
friend class GLRendererBase; friend class GLRendererBase;
friend class GLObjectBase; friend class GLObjectBase;
@@ -67,15 +55,12 @@ class QGLView: public QGraphicsView, public QGLViewBase
Q_PROPERTY (bool selectionHalo READ isSelectionHaloEnabled WRITE setSelectionHaloEnabled) Q_PROPERTY (bool selectionHalo READ isSelectionHaloEnabled WRITE setSelectionHaloEnabled)
Q_PROPERTY (QColor selectionHaloColor READ selectionHaloColor WRITE setSelectionHaloColor) Q_PROPERTY (QColor selectionHaloColor READ selectionHaloColor WRITE setSelectionHaloColor)
Q_PROPERTY (double selectionHaloFillAlpha READ selectionHaloFillAlpha WRITE setSelectionHaloFillAlpha) Q_PROPERTY (double selectionHaloFillAlpha READ selectionHaloFillAlpha WRITE setSelectionHaloFillAlpha)
//Q_PROPERTY (LightingMode lightingMode READ lightingMode WRITE setLightingMode)
Q_PROPERTY (Qt::MouseButton selectionButton READ selectionButton WRITE setSelectionButton) Q_PROPERTY (Qt::MouseButton selectionButton READ selectionButton WRITE setSelectionButton)
Q_PROPERTY (Qt::KeyboardModifier selectionModifier READ selectionModifier WRITE setSelectionModifier) Q_PROPERTY (Qt::KeyboardModifier selectionModifier READ selectionModifier WRITE setSelectionModifier)
Q_PROPERTY (SelectionMode selectionMode READ selectionMode WRITE setSelectionMode) Q_PROPERTY (SelectionMode selectionMode READ selectionMode WRITE setSelectionMode)
Q_PROPERTY (QPen selectionRectPen READ selectionRectPen WRITE setSelectionRectPen)
Q_PROPERTY (QBrush selectionRectBrush READ selectionRectBrush WRITE setSelectionRectBrush)
public: public:
QGLView(QWidget * parent = 0); QGLView();
virtual ~QGLView(); virtual ~QGLView();
enum FogMode {Linear = GL_LINEAR, Exp = GL_EXP, Exp2 = GL_EXP2}; enum FogMode {Linear = GL_LINEAR, Exp = GL_EXP, Exp2 = GL_EXP2};
@@ -112,21 +97,12 @@ public:
Q_ENUMS (FogMode) Q_ENUMS (FogMode)
Q_ENUMS (SelectionMode) Q_ENUMS (SelectionMode)
//enum LightingMode {Simple, PerPixel, DeferredShading};
//Q_ENUMS (LightingMode)
void stop() {if (timer) killTimer(timer);} void stop();
void start(double freq = 40.) {timer = startTimer(freq <= 0. ? 0 : 1000. / freq);} void start(double freq = 40.);
GLRendererBase * renderer() {return renderer_;} GLRendererBase * renderer();
void setRenderer(GLRendererBase * r, GLRendererBase ** prev = 0) {if (prev != 0) *prev = renderer_; renderer_ = r;} void setRenderer(GLRendererBase * r, GLRendererBase ** prev = nullptr);
#if QT_VERSION >= 0x050600
__GLContext__ * context() {return ((__GLWidget__ * )viewport())->context();}
#else
const __GLContext__ * context() const {return ((const __GLWidget__ * )viewport())->context();}
#endif
void makeCurrent() {((__GLWidget__ * )viewport())->makeCurrent();}
QColor backColor() const {return backColor_;} QColor backColor() const {return backColor_;}
double lineWidth() const {return lineWidth_;} double lineWidth() const {return lineWidth_;}
@@ -142,7 +118,6 @@ public:
double fogStart() const {return fogStart_;} double fogStart() const {return fogStart_;}
double fogEnd() const {return fogEnd_;} double fogEnd() const {return fogEnd_;}
FogMode fogMode() const {return fogMode_;} FogMode fogMode() const {return fogMode_;}
//LightingMode lightingMode() const {return lmode;}
bool isFogEnabled() const {return fogEnabled_;} bool isFogEnabled() const {return fogEnabled_;}
bool isLightEnabled() const {return lightEnabled_;} bool isLightEnabled() const {return lightEnabled_;}
bool isGrabMouseEnabled() const {return grabMouse_;} bool isGrabMouseEnabled() const {return grabMouse_;}
@@ -163,7 +138,6 @@ public:
int renderMode() const {return (int)rmode;} int renderMode() const {return (int)rmode;}
void setRenderMode(int mode) {rmode = (GLObjectBase::RenderMode)mode;} void setRenderMode(int mode) {rmode = (GLObjectBase::RenderMode)mode;}
void addObject(QGraphicsItem * o) {scene()->addItem(o);}
void addObject(QWidget * o, Qt::WindowFlags f = Qt::Widget); void addObject(QWidget * o, Qt::WindowFlags f = Qt::Widget);
void addObject(GLObjectBase * o); void addObject(GLObjectBase * o);
void addObject(GLObjectBase & o) {addObject(&o);} void addObject(GLObjectBase & o) {addObject(&o);}
@@ -189,8 +163,6 @@ public:
Light * light(int index) {return lights_[index];} Light * light(int index) {return lights_[index];}
Light * light(const QString & name) {foreach (Light * i, lights_) if (i->name_ == name) return i; return 0;} Light * light(const QString & name) {foreach (Light * i, lights_) if (i->name_ == name) return i; return 0;}
QPen selectionRectPen() const {return sel_pen;}
QBrush selectionRectBrush() const {return sel_brush;}
SelectionMode selectionMode() const {return sel_mode;} SelectionMode selectionMode() const {return sel_mode;}
Qt::MouseButton selectionButton() const {return sel_button;} Qt::MouseButton selectionButton() const {return sel_button;}
Qt::KeyboardModifier selectionModifier() const {return sel_mod;} Qt::KeyboardModifier selectionModifier() const {return sel_mod;}
@@ -198,31 +170,28 @@ public:
void setSelectionMode(SelectionMode v) {sel_mode = v;} void setSelectionMode(SelectionMode v) {sel_mode = v;}
void setSelectionButton(Qt::MouseButton v) {sel_button = v;} void setSelectionButton(Qt::MouseButton v) {sel_button = v;}
void setSelectionModifier(Qt::KeyboardModifier v) {sel_mod = v;} void setSelectionModifier(Qt::KeyboardModifier v) {sel_mod = v;}
void setSelectionRectPen(const QPen & v) {sel_pen = v;}
void setSelectionRectBrush(const QBrush & v) {sel_brush = v;}
void selectObject(GLObjectBase * o); void selectObject(GLObjectBase * o);
GLObjectBase * selectedObject() const {return sel_obj;} GLObjectBase * selectedObject() const {return sel_obj;}
GLdouble aspect, iaspect; GLdouble aspect, iaspect;
QMatrix4x4 cur_mvpm; QMatrix4x4 cur_mvpm;
//__GLShaderProgram__ * shader_rope;
protected: protected:
virtual void drawBackground(QPainter * painter, const QRectF & rect); void render();
virtual void resizeEvent(QResizeEvent * e) {resizeGL(viewport()->width(), viewport()->height()); QGraphicsView::resizeEvent(e);} void resizeEvent(QResizeEvent * e);
void timerEvent(QTimerEvent * ) {/*globMutex.lock();*/ processKeys(); viewport()->repaint(); /*globMutex.unlock();*/} void timerEvent(QTimerEvent * );
void initializeGL(); void initialize();
void paintGL();
void resizeGL(int width, int height); void resizeGL(int width, int height);
void mousePressEvent(QMouseEvent * e); void mousePressEvent(QMouseEvent * e);
void mouseMoveEvent(QMouseEvent * e); void mouseMoveEvent(QMouseEvent * e);
void mouseReleaseEvent(QMouseEvent * e); void mouseReleaseEvent(QMouseEvent * e);
void wheelEvent(QWheelEvent * e); void wheelEvent(QWheelEvent * e);
void leaveEvent(QEvent * ); void leaveEvent(QEvent * );
void keyPressEvent(QKeyEvent * e) {emit glKeyPressEvent(e); if (e->key() > 0) keys_.insert(e->key());}
void keyReleaseEvent(QKeyEvent * e) {emit glKeyReleaseEvent(e); keys_.remove(e->key());} void keyPressEvent(QKeyEvent * e);
void focusOutEvent(QFocusEvent *) {keys_.clear();} void keyReleaseEvent(QKeyEvent * e);
void focusOutEvent(QFocusEvent *);
void applyFog(); void applyFog();
void renderSelection(); void renderSelection();
@@ -237,46 +206,38 @@ private:
void removeObjectInternal(GLObjectBase * o, GLObjectBase * where); void removeObjectInternal(GLObjectBase * o, GLObjectBase * where);
void renderSingleSelection(GLObjectBase & o); void renderSingleSelection(GLObjectBase & o);
//void renderSingleShadow(GLObjectBase & o); //void renderSingleShadow(GLObjectBase & o);
void renderHalo(const GLObjectBase * obj, const int iid, const QColor & color, const double & fill); void renderHalo(const GLObjectBase * obj, const uint iid, const QColor & color, const double & fill);
QList<QGraphicsItem * > collectGraphicItems();
void collectGraphicItems(QList<QGraphicsItem * > & list, QGraphicsItem * o);
void reloadThisShaders(); void reloadThisShaders();
void processKeys(); void processKeys();
bool setupViewport(); bool setupViewport();
QPoint lastPos, downPos; QPoint lastPos, downPos;
QMutex v_mutex;
GLTextureManager textures_manager; GLTextureManager textures_manager;
GLObjectBase objects_; GLObjectBase objects_;
QList<Light * > lights_; QList<Light * > lights_;
uint cid; // uint cid;
QMap<uint, GLObjectBase * > ids; QHash<uint, GLObjectBase * > ids;
QSet<int> keys_; QSet<int> keys_;
FogMode fogMode_; FogMode fogMode_;
QColor backColor_, fogColor_, ambientColor_, hoverHaloColor_, selectionHaloColor_; QColor backColor_, fogColor_, ambientColor_, hoverHaloColor_, selectionHaloColor_;
QPainter * painter_;
QTime time, ktm_; QTime time, ktm_;
QPen sel_pen;
QBrush sel_brush;
GLint max_anisotropic, max_texture_chanels; GLint max_anisotropic, max_texture_chanels;
GLObjectBase::RenderMode rmode; GLObjectBase::RenderMode rmode;
//LightingMode lmode;
GLObjectBase * sel_obj, * hov_obj; GLObjectBase * sel_obj, * hov_obj;
GLFramebuffer fbo_selection; GLFramebuffer fbo_selection;
__GLShaderProgram__ * shader_select, * shader_halo; QOpenGLShaderProgram * shader_select, * shader_halo;
GLRendererBase * renderer_; GLRendererBase * renderer_;
SelectionMode sel_mode; SelectionMode sel_mode;
Qt::MouseButton sel_button; Qt::MouseButton sel_button;
Qt::KeyboardModifier sel_mod; Qt::KeyboardModifier sel_mod;
GLRendererBase::RenderingParameters start_rp; GLRendererBase::RenderingParameters start_rp;
QHash<int, QVariant> features_; QHash<int, QVariant> features_;
__GLWidget__ * _w;
double lineWidth_; double lineWidth_;
double fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor; double fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor;
int timer, fps_cnt, sh_id_loc; int timer, fps_cnt, sh_id_loc;
bool is_first_draw, is_init, fogEnabled_, lightEnabled_, grabMouse_, mouse_first, mouseRotate_, mouseSelect_, customMouseMove_; bool is_first_draw, is_init, fogEnabled_, lightEnabled_, grabMouse_, mouse_first, mouseRotate_, mouseSelect_, customMouseMove_;
bool shaders_supported, changed_, cameraOrbit_, need_init_; bool shaders_supported, changed_, cameraOrbit_, need_init_;
bool hoverHalo_, selectionHalo_, mouseThis_, shaders_bind, selecting_; bool hoverHalo_, selectionHalo_, shaders_bind, selecting_;
public slots: public slots:
void setBackColor(const QColor & arg) {backColor_ = arg;} void setBackColor(const QColor & arg) {backColor_ = arg;}
@@ -303,11 +264,9 @@ public slots:
void setSelectionHaloEnabled(const bool & arg) {selectionHalo_ = arg;} void setSelectionHaloEnabled(const bool & arg) {selectionHalo_ = arg;}
void setSelectionHaloColor(const QColor & arg) {selectionHaloColor_ = arg;} void setSelectionHaloColor(const QColor & arg) {selectionHaloColor_ = arg;}
void setSelectionHaloFillAlpha(const double & arg) {selectionHaloFill_ = arg;} void setSelectionHaloFillAlpha(const double & arg) {selectionHaloFill_ = arg;}
//void setLightingMode(const LightingMode & arg) {lmode = arg;}
void reloadShaders() {if (renderer_ != 0) renderer_->reloadShaders(); reloadThisShaders();} void reloadShaders() {if (renderer_ != 0) renderer_->reloadShaders(); reloadThisShaders();}
void deselect() {sel_obj = 0;} void deselect() {sel_obj = 0;}
void glCleanup();
signals: signals:
void glBeforePaint(); void glBeforePaint();

View File

@@ -23,9 +23,7 @@
int main(int argc, char ** argv) { int main(int argc, char ** argv) {
QApplication a(argc, argv); QApplication a(argc, argv);
#if QT_VERSION >= 0x050000
a.setAttribute(Qt::AA_UseHighDpiPixmaps, true); a.setAttribute(Qt::AA_UseHighDpiPixmaps, true);
#endif
QGLViewWindow w; QGLViewWindow w;
w.show(); w.show();
QStringList al(a.arguments()); QStringList al(a.arguments());

View File

@@ -36,61 +36,61 @@ QGLViewWindow::QGLViewWindow(QWidget * parent): QMainWindow(parent), Ui::QGLView
icon_light = QIcon(":/icons/type-light.png"); icon_light = QIcon(":/icons/type-light.png");
sel_obj = 0; sel_obj = 0;
view->camera().setAim(QVector3D()); view->view()->camera().setAim(QVector3D());
view->camera().setPos(QVector3D(2, 2, 2)); view->view()->camera().setPos(QVector3D(2, 2, 2));
view->setFrameShape(QFrame::NoFrame); // view->setFrameShape(QFrame::NoFrame);
view->setRenderer(new RendererSimple(view)); view->view()->setRenderer(new RendererSimple(view->view()));
view->setMouseRotateEnabled(true); view->view()->setMouseRotateEnabled(true);
view->setMouseSelectionEnabled(true); view->view()->setMouseSelectionEnabled(true);
view->setSelectionHaloEnabled(true); view->view()->setSelectionHaloEnabled(true);
view->setHoverHaloEnabled(true); view->view()->setHoverHaloEnabled(true);
view->setHoverHaloFillAlpha(0.); view->view()->setHoverHaloFillAlpha(0.);
view->setSelectionHaloFillAlpha(0.); view->view()->setSelectionHaloFillAlpha(0.);
view->setBackColor(Qt::lightGray); view->view()->setBackColor(Qt::lightGray);
view->setDepthStart(0.001); view->view()->setDepthStart(0.001);
view->setDepthEnd(100000.); view->view()->setDepthEnd(100000.);
spinFOV->setValue(view->FOV()); spinFOV->setValue(view->view()->FOV());
spinDepthStart->setValue(view->depthStart()); spinDepthStart->setValue(view->view()->depthStart());
spinDepthEnd->setValue(view->depthEnd()); spinDepthEnd->setValue(view->view()->depthEnd());
groupHoverHalo->setChecked(view->isHoverHaloEnabled()); groupHoverHalo->setChecked(view->view()->isHoverHaloEnabled());
groupSelectionHalo->setChecked(view->isSelectionHaloEnabled()); groupSelectionHalo->setChecked(view->view()->isSelectionHaloEnabled());
spinHoverHaloFill->setValue(view->hoverHaloFillAlpha()); spinHoverHaloFill->setValue(view->view()->hoverHaloFillAlpha());
spinSelectionHaloFill->setValue(view->selectionHaloFillAlpha()); spinSelectionHaloFill->setValue(view->view()->selectionHaloFillAlpha());
colorHoverHalo->setColor(view->hoverHaloColor()); colorHoverHalo->setColor(view->view()->hoverHaloColor());
colorSelectionHalo->setColor(view->selectionHaloColor()); colorSelectionHalo->setColor(view->view()->selectionHaloColor());
checkFXAA->setChecked(view->isFeatureEnabled(QGLView::qglFXAA)); checkFXAA->setChecked(view->view()->isFeatureEnabled(QGLView::qglFXAA));
checkMSAA->setChecked(view->isFeatureEnabled(QGLView::qglMSAA)); checkMSAA->setChecked(view->view()->isFeatureEnabled(QGLView::qglMSAA));
colorBack->setColor(view->backColor()); colorBack->setColor(view->view()->backColor());
colorAmbient->setColor(view->ambientColor()); colorAmbient->setColor(view->view()->ambientColor());
checkCameraOrbit->setChecked(view->isCameraOrbit()); checkCameraOrbit->setChecked(view->view()->isCameraOrbit());
groupShadows->setChecked(view->isFeatureEnabled(QGLView::qglShadowsEnabled)); groupShadows->setChecked(view->view()->isFeatureEnabled(QGLView::qglShadowsEnabled));
groupEyeAccomodation->setChecked(view->isFeatureEnabled(QGLView::qglEyeAccomodationEnabled)); groupEyeAccomodation->setChecked(view->view()->isFeatureEnabled(QGLView::qglEyeAccomodationEnabled));
groupBloom->setChecked(view->isFeatureEnabled(QGLView::qglBloomEnabled)); groupBloom->setChecked(view->view()->isFeatureEnabled(QGLView::qglBloomEnabled));
groupMotionBlur->setChecked(view->isFeatureEnabled(QGLView::qglMotionBlurEnabled)); groupMotionBlur->setChecked(view->view()->isFeatureEnabled(QGLView::qglMotionBlurEnabled));
groupReflections->setChecked(view->isFeatureEnabled(QGLView::qglReflectionsEnabled)); groupReflections->setChecked(view->view()->isFeatureEnabled(QGLView::qglReflectionsEnabled));
checkSoftShadows->setChecked(view->isFeatureEnabled(QGLView::qglShadowsSoftEnabled)); checkSoftShadows->setChecked(view->view()->isFeatureEnabled(QGLView::qglShadowsSoftEnabled));
groupSSAO->setChecked(view->isFeatureEnabled(QGLView::qglSSAOEnabled)); groupSSAO->setChecked(view->view()->isFeatureEnabled(QGLView::qglSSAOEnabled));
spinAccom->setValue(view->feature(QGLView::qglEyeAccomodationTime).toDouble()); spinAccom->setValue(view->view()->feature(QGLView::qglEyeAccomodationTime).toDouble());
spinAccomMS->setValue(view->feature(QGLView::qglEyeAccomodationMaxSpeed).toDouble()); spinAccomMS->setValue(view->view()->feature(QGLView::qglEyeAccomodationMaxSpeed).toDouble());
checkReflectionsBlur->setChecked(view->isFeatureEnabled(QGLView::qglReflectionsBlur)); checkReflectionsBlur->setChecked(view->view()->isFeatureEnabled(QGLView::qglReflectionsBlur));
spinShadowmapSize->setValue(view->feature(QGLView::qglShadowsMapSize).toInt()); spinShadowmapSize->setValue(view->view()->feature(QGLView::qglShadowsMapSize).toInt());
spinMotionBlurFactor->setValue(view->feature(QGLView::qglMotionBlurFactor).toDouble()); spinMotionBlurFactor->setValue(view->view()->feature(QGLView::qglMotionBlurFactor).toDouble());
spinMotionBlurSteps->setValue(view->feature(QGLView::qglMotionBlurSteps).toInt()); spinMotionBlurSteps->setValue(view->view()->feature(QGLView::qglMotionBlurSteps).toInt());
spinBloomFactor->setValue(view->feature(QGLView::qglBloomFactor).toDouble()); spinBloomFactor->setValue(view->view()->feature(QGLView::qglBloomFactor).toDouble());
spinBloomRadius->setValue(view->feature(QGLView::qglBloomRadius).toInt()); spinBloomRadius->setValue(view->view()->feature(QGLView::qglBloomRadius).toInt());
spinBloomThreshold->setValue(view->feature(QGLView::qglBloomThreshold).toDouble()); spinBloomThreshold->setValue(view->view()->feature(QGLView::qglBloomThreshold).toDouble());
spinSSAORadius->setValue(view->feature(QGLView::qglSSAORadius).toInt()); spinSSAORadius->setValue(view->view()->feature(QGLView::qglSSAORadius).toInt());
groupDOF->setChecked(view->isFeatureEnabled(QGLView::qglDepthOfFieldEnabled)); groupDOF->setChecked(view->view()->isFeatureEnabled(QGLView::qglDepthOfFieldEnabled));
checkDOFAutoFocus->setChecked(view->isFeatureEnabled(QGLView::qglDepthOfFieldAutoFocusEnabled)); checkDOFAutoFocus->setChecked(view->view()->isFeatureEnabled(QGLView::qglDepthOfFieldAutoFocusEnabled));
spinDOFFocus->setValue(view->feature(QGLView::qglDepthOfFieldFocus).toDouble()); spinDOFFocus->setValue(view->view()->feature(QGLView::qglDepthOfFieldFocus).toDouble());
spinDOFDiaphragm->setValue(view->feature(QGLView::qglDepthOfFieldDiaphragm).toDouble()); spinDOFDiaphragm->setValue(view->view()->feature(QGLView::qglDepthOfFieldDiaphragm).toDouble());
spinDOFSpeed->setValue(view->feature(QGLView::qglDepthOfFieldAutoFocusSpeed).toDouble()); spinDOFSpeed->setValue(view->view()->feature(QGLView::qglDepthOfFieldAutoFocusSpeed).toDouble());
axis = new GLObjectBase(); axis = new GLObjectBase();
GLObjectBase * obj; GLObjectBase * obj;
double al = 1.; float al = 1.;
obj = new GLPrimitiveLine(QVector3D(0, 0, -al), QVector3D(0, 0, al)); obj = new GLPrimitiveLine(QVector3D(0, 0, -al), QVector3D(0, 0, al));
obj->material().color_diffuse = Qt::darkBlue; obj->setAcceptLight(false); obj->material().color_diffuse = Qt::darkBlue; obj->setAcceptLight(false);
axis->addChild(obj); axis->addChild(obj);
@@ -100,19 +100,20 @@ QGLViewWindow::QGLViewWindow(QWidget * parent): QMainWindow(parent), Ui::QGLView
obj = new GLPrimitiveLine(QVector3D(0, -al, 0), QVector3D(0, al, 0)); obj = new GLPrimitiveLine(QVector3D(0, -al, 0), QVector3D(0, al, 0));
obj->material().color_diffuse = Qt::darkGreen; obj->setAcceptLight(false); obj->material().color_diffuse = Qt::darkGreen; obj->setAcceptLight(false);
axis->addChild(obj); axis->addChild(obj);
view->addObject(axis); view->view()->addObject(axis);
cam_light = new Light(); cam_light = new Light();
cam_light->intensity = 0.5; cam_light->intensity = 0.5;
cam_light->setName("Camera_Light"); cam_light->setName("Camera_Light");
view->camera().addChild(cam_light); view->view()->camera().addChild(cam_light);
view->start(-1); view->view()->start(-1);
startTimer(1000/60); startTimer(1000/60);
connect(view, SIGNAL(selectionChanged(GLObjectBase*,GLObjectBase*)), this, SLOT(selectionChanged(GLObjectBase*,GLObjectBase*))); connect(view->view(), SIGNAL(selectionChanged(GLObjectBase*,GLObjectBase*)), this, SLOT(selectionChanged(GLObjectBase*,GLObjectBase*)));
connect(view->view(), SIGNAL(keyEvent(Qt::Key, Qt::KeyboardModifiers)), this, SLOT(view_keyEvent(Qt::Key, Qt::KeyboardModifiers)));
connect(matEditor, SIGNAL(changed()), this, SLOT(materialChanged())); connect(matEditor, SIGNAL(changed()), this, SLOT(materialChanged()));
//view->addObject(&partsys); //view->view()->addObject(&partsys);
partsys.material().color_diffuse = Qt::red; partsys.material().color_diffuse = Qt::red;
treeProps->assignObject(&partsys); treeProps->assignObject(&partsys);
session.load(); session.load();
@@ -138,24 +139,8 @@ void QGLViewWindow::timerEvent(QTimerEvent * ) {
//static double t = 0.; //static double t = 0.;
//cam_light->intensity = checkCameraLight->isChecked() ? 0.5 : 0.; //cam_light->intensity = checkCameraLight->isChecked() ? 0.5 : 0.;
cam_light->setVisible(checkCameraLight->isChecked()); cam_light->setVisible(checkCameraLight->isChecked());
//((RendererSimple*)(view->renderer()))->mpos = view->mapFromGlobal(QCursor::pos()); //((RendererSimple*)(view->view()->renderer()))->mpos = view->view()->mapFromGlobal(QCursor::pos());
statusBar()->showMessage(QString("FPS: %1").arg(QString::number(view->currentFPS(), 'f', 2))); statusBar()->showMessage(QString("FPS: %1").arg(QString::number(view->view()->currentFPS(), 'f', 2)));
}
void QGLViewWindow::on_view_glKeyPressEvent(QKeyEvent * e) {
if (e->key() != Qt::Key_F11) return;
if (view->windowState().testFlag(Qt::WindowFullScreen)) {
centralwidget->layout()->addWidget(view);
} else {
view->setParent(0);
view->showFullScreen();
}
}
void QGLViewWindow::on_view_glInitializeDone() {
} }
@@ -180,7 +165,7 @@ void QGLViewWindow::importFile(const QString & path) {
return; return;
} }
o->setName(fi.baseName()); o->setName(fi.baseName());
view->addObject(o); view->view()->addObject(o);
objectsTreeChanged(); objectsTreeChanged();
} }
@@ -233,18 +218,18 @@ void QGLViewWindow::materialChanged() {
void QGLViewWindow::on_comboRenderer_currentIndexChanged(int val) { void QGLViewWindow::on_comboRenderer_currentIndexChanged(int val) {
GLRendererBase * pr = 0; GLRendererBase * pr = 0;
switch (val) { switch (val) {
case 0: view->setRenderer(new RendererSimple(view), &pr); break; case 0: view->view()->setRenderer(new RendererSimple(view->view()), &pr); break;
case 1: view->setRenderer(new RendererDeferredShading(view), &pr); break; case 1: view->view()->setRenderer(new RendererDeferredShading(view->view()), &pr); break;
//case 2: view->setRenderer(new RendererRT(view), &pr); break; //case 2: view->view()->setRenderer(new RendererRT(view), &pr); break;
} }
if (pr != 0) delete pr; if (pr != 0) delete pr;
} }
void QGLViewWindow::on_actionReset_triggered() { void QGLViewWindow::on_actionReset_triggered() {
view->removeObject(axis, false); view->view()->removeObject(axis, false);
view->clearObjects(true); view->view()->clearObjects(true);
view->addObject(axis); view->view()->addObject(axis);
objectsTreeChanged(); objectsTreeChanged();
} }
@@ -269,11 +254,11 @@ void QGLViewWindow::on_actionSave_triggered() {
if (f.right(4).toLower() != ".qgl") if (f.right(4).toLower() != ".qgl")
f += ".qgl"; f += ".qgl";
prev_path = f; prev_path = f;
view->removeObject(axis); view->view()->removeObject(axis);
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
saveToQGLFile(f, &(view->rootObject())); saveToQGLFile(f, &(view->view()->rootObject()));
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
view->addObject(axis); view->view()->addObject(axis);
} }
@@ -303,16 +288,16 @@ void QGLViewWindow::on_actionOpen_triggered() {
} }
void QGLViewWindow::on_view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m) { void QGLViewWindow::view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m) {
//qDebug() << k; //qDebug() << k;
double spd = 0.2; double spd = 0.2;
if (m.testFlag(Qt::ShiftModifier)) if (m.testFlag(Qt::ShiftModifier))
spd = 0.5; spd = 0.5;
switch (k) { switch (k) {
case Qt::Key_W: view->camera().moveForward(spd); break; case Qt::Key_W: view->view()->camera().moveForward(spd); break;
case Qt::Key_S: view->camera().moveBackward(spd); break; case Qt::Key_S: view->view()->camera().moveBackward(spd); break;
case Qt::Key_A: view->camera().moveLeft(spd); break; case Qt::Key_A: view->view()->camera().moveLeft(spd); break;
case Qt::Key_D: view->camera().moveRight(spd); break; case Qt::Key_D: view->view()->camera().moveRight(spd); break;
default: break; default: break;
} }
} }
@@ -322,28 +307,28 @@ void QGLViewWindow::on_treeObjects_itemClicked(QTreeWidgetItem * ti, int col) {
((GLObjectBase*)(ti->data(0, Qt::UserRole).toULongLong()))->select(); ((GLObjectBase*)(ti->data(0, Qt::UserRole).toULongLong()))->select();
//qDebug() << ((GLObjectBase*)(ti->data(0, Qt::UserRole).toULongLong()))->type(); //qDebug() << ((GLObjectBase*)(ti->data(0, Qt::UserRole).toULongLong()))->type();
if (sel_obj->type() == GLObjectBase::glCamera) if (sel_obj->type() == GLObjectBase::glCamera)
view->setCamera(*(Camera*)sel_obj); view->view()->setCamera(*(Camera*)sel_obj);
} }
void QGLViewWindow::objectsTreeChanged() { void QGLViewWindow::objectsTreeChanged() {
treeObjects->clear(); treeObjects->clear();
makeObjetTree(&(view->rootObject()), treeObjects->invisibleRootItem()); makeObjetTree(&(view->view()->rootObject()), treeObjects->invisibleRootItem());
treeObjects->expandAll(); treeObjects->expandAll();
} }
void QGLViewWindow::on_pushButton_clicked() { void QGLViewWindow::on_pushButton_clicked() {
//view->removeLight(view->lightsCount() - 1); //view->view()->removeLight(view->view()->lightsCount() - 1);
//setWindowTitle(QString::number(view->lightsCount())); //setWindowTitle(QString::number(view->view()->lightsCount()));
QVector3D wp = view->light(0)->worldPos(); QVector3D wp = view->view()->light(0)->worldPos();
view->camera().setPos(wp); view->view()->camera().setPos(wp);
view->camera().setAim(wp + (view->light(0)->worldTransform() * QVector4D(view->light(0)->direction)).toVector3D()*100); view->view()->camera().setAim(wp + (view->view()->light(0)->worldTransform() * QVector4D(view->view()->light(0)->direction)).toVector3D()*100);
} }
void QGLViewWindow::on_pushButton_3_clicked() { void QGLViewWindow::on_pushButton_3_clicked() {
QList<GLObjectBase * > ol = view->objects(true); QList<GLObjectBase * > ol = view->view()->objects(true);
qDebug() << ol.size(); qDebug() << ol.size();
foreach (GLObjectBase * i, ol) { foreach (GLObjectBase * i, ol) {
i->VBO().rebuffer(); i->VBO().rebuffer();

View File

@@ -38,6 +38,8 @@
#include "session_manager.h" #include "session_manager.h"
//#include "renderer_rt.h" //#include "renderer_rt.h"
#include "glparticles_system.h" #include "glparticles_system.h"
#include "qglview.h"
#include "ui_qglview_window.h"
class QGLViewWindow: public QMainWindow, public Ui::QGLViewWindow class QGLViewWindow: public QMainWindow, public Ui::QGLViewWindow
@@ -70,45 +72,45 @@ private:
GLParticlesSystem partsys; GLParticlesSystem partsys;
private slots: private slots:
void on_spinFOV_valueChanged(double val) {view->setFOV(val);} void on_spinFOV_valueChanged(double val) {view->view()->setFOV(val);}
void on_spinDepthStart_valueChanged(double val) {view->setDepthStart(val);} void on_spinDepthStart_valueChanged(double val) {view->view()->setDepthStart(val);}
void on_spinDepthEnd_valueChanged(double val) {view->setDepthEnd(val);} void on_spinDepthEnd_valueChanged(double val) {view->view()->setDepthEnd(val);}
void on_comboRenderer_currentIndexChanged(int val); void on_comboRenderer_currentIndexChanged(int val);
void on_comboViewRenderMode_currentIndexChanged(int val) {static int modes[] = {GL_POINT, GL_LINE, GL_FILL}; view->setRenderMode((GLObjectBase::RenderMode)modes[val]);} void on_comboViewRenderMode_currentIndexChanged(int val) {static int modes[] = {GL_POINT, GL_LINE, GL_FILL}; view->view()->setRenderMode((GLObjectBase::RenderMode)modes[val]);}
void on_groupHoverHalo_clicked(bool val) {view->setHoverHaloEnabled(val);} void on_groupHoverHalo_clicked(bool val) {view->view()->setHoverHaloEnabled(val);}
void on_groupSelectionHalo_clicked(bool val) {view->setSelectionHaloEnabled(val);} void on_groupSelectionHalo_clicked(bool val) {view->view()->setSelectionHaloEnabled(val);}
void on_spinHoverHaloFill_valueChanged(double val) {view->setHoverHaloFillAlpha(val);} void on_spinHoverHaloFill_valueChanged(double val) {view->view()->setHoverHaloFillAlpha(val);}
void on_spinSelectionHaloFill_valueChanged(double val) {view->setSelectionHaloFillAlpha(val);} void on_spinSelectionHaloFill_valueChanged(double val) {view->view()->setSelectionHaloFillAlpha(val);}
void on_colorHoverHalo_colorChanged(QColor color) {view->setHoverHaloColor(color);} void on_colorHoverHalo_colorChanged(QColor color) {view->view()->setHoverHaloColor(color);}
void on_colorSelectionHalo_colorChanged(QColor color) {view->setSelectionHaloColor(color);} void on_colorSelectionHalo_colorChanged(QColor color) {view->view()->setSelectionHaloColor(color);}
void on_checkFXAA_clicked(bool val) {view->setFeature(QGLView::qglFXAA, val);} void on_checkFXAA_clicked(bool val) {view->view()->setFeature(QGLView::qglFXAA, val);}
void on_checkMSAA_clicked(bool val) {view->setFeature(QGLView::qglMSAA, val);} void on_checkMSAA_clicked(bool val) {view->view()->setFeature(QGLView::qglMSAA, val);}
void on_colorBack_colorChanged(QColor color) {view->setBackColor(color);} void on_colorBack_colorChanged(QColor color) {view->view()->setBackColor(color);}
void on_colorAmbient_colorChanged(QColor color) {view->setAmbientColor(color);} void on_colorAmbient_colorChanged(QColor color) {view->view()->setAmbientColor(color);}
void on_checkCameraOrbit_clicked(bool val) {view->setCameraOrbit(val);} void on_checkCameraOrbit_clicked(bool val) {view->view()->setCameraOrbit(val);}
void on_groupShadows_clicked(bool val) {view->setFeature(QGLView::qglShadowsEnabled, val);} void on_groupShadows_clicked(bool val) {view->view()->setFeature(QGLView::qglShadowsEnabled, val);}
void on_groupEyeAccomodation_clicked(bool val) {view->setFeature(QGLView::qglEyeAccomodationEnabled, val);} void on_groupEyeAccomodation_clicked(bool val) {view->view()->setFeature(QGLView::qglEyeAccomodationEnabled, val);}
void on_groupBloom_clicked(bool val) {view->setFeature(QGLView::qglBloomEnabled, val);} void on_groupBloom_clicked(bool val) {view->view()->setFeature(QGLView::qglBloomEnabled, val);}
void on_groupMotionBlur_clicked(bool val) {view->setFeature(QGLView::qglMotionBlurEnabled, val);} void on_groupMotionBlur_clicked(bool val) {view->view()->setFeature(QGLView::qglMotionBlurEnabled, val);}
void on_groupReflections_clicked(bool val) {view->setFeature(QGLView::qglReflectionsEnabled, val);} void on_groupReflections_clicked(bool val) {view->view()->setFeature(QGLView::qglReflectionsEnabled, val);}
void on_checkSoftShadows_clicked(bool val) {view->setFeature(QGLView::qglShadowsSoftEnabled, val);} void on_checkSoftShadows_clicked(bool val) {view->view()->setFeature(QGLView::qglShadowsSoftEnabled, val);}
void on_groupSSAO_clicked(bool val) {view->setFeature(QGLView::qglSSAOEnabled, val);} void on_groupSSAO_clicked(bool val) {view->view()->setFeature(QGLView::qglSSAOEnabled, val);}
void on_groupDOF_clicked(bool val) {view->setFeature(QGLView::qglDepthOfFieldEnabled, val);} void on_groupDOF_clicked(bool val) {view->view()->setFeature(QGLView::qglDepthOfFieldEnabled, val);}
void on_checkDOFAutoFocus_clicked(bool val) {view->setFeature(QGLView::qglDepthOfFieldAutoFocusEnabled, val);} void on_checkDOFAutoFocus_clicked(bool val) {view->view()->setFeature(QGLView::qglDepthOfFieldAutoFocusEnabled, val);}
void on_spinDOFFocus_valueChanged(double val) {view->setFeature(QGLView::qglDepthOfFieldFocus, val);} void on_spinDOFFocus_valueChanged(double val) {view->view()->setFeature(QGLView::qglDepthOfFieldFocus, val);}
void on_spinDOFDiaphragm_valueChanged(double val) {view->setFeature(QGLView::qglDepthOfFieldDiaphragm, val);} void on_spinDOFDiaphragm_valueChanged(double val) {view->view()->setFeature(QGLView::qglDepthOfFieldDiaphragm, val);}
void on_spinDOFSpeed_valueChanged(double val) {view->setFeature(QGLView::qglDepthOfFieldAutoFocusSpeed, val);} void on_spinDOFSpeed_valueChanged(double val) {view->view()->setFeature(QGLView::qglDepthOfFieldAutoFocusSpeed, val);}
void on_spinAccom_valueChanged(double val) {view->setFeature(QGLView::qglEyeAccomodationTime, val);} void on_spinAccom_valueChanged(double val) {view->view()->setFeature(QGLView::qglEyeAccomodationTime, val);}
void on_spinAccomMS_valueChanged(double val) {view->setFeature(QGLView::qglEyeAccomodationMaxSpeed, val);} void on_spinAccomMS_valueChanged(double val) {view->view()->setFeature(QGLView::qglEyeAccomodationMaxSpeed, val);}
void on_checkReflectionsBlur_clicked(bool val) {view->setFeature(QGLView::qglReflectionsBlur, val);} void on_checkReflectionsBlur_clicked(bool val) {view->view()->setFeature(QGLView::qglReflectionsBlur, val);}
void on_spinShadowmapSize_valueChanged(double val) {view->setFeature(QGLView::qglShadowsMapSize, val);} void on_spinShadowmapSize_valueChanged(double val) {view->view()->setFeature(QGLView::qglShadowsMapSize, val);}
void on_spinMotionBlurFactor_valueChanged(double val) {view->setFeature(QGLView::qglMotionBlurFactor, val);} void on_spinMotionBlurFactor_valueChanged(double val) {view->view()->setFeature(QGLView::qglMotionBlurFactor, val);}
void on_spinMotionBlurSteps_valueChanged(int val) {view->setFeature(QGLView::qglMotionBlurSteps, val);} void on_spinMotionBlurSteps_valueChanged(int val) {view->view()->setFeature(QGLView::qglMotionBlurSteps, val);}
void on_spinBloomFactor_valueChanged(double val) {view->setFeature(QGLView::qglBloomFactor, val);} void on_spinBloomFactor_valueChanged(double val) {view->view()->setFeature(QGLView::qglBloomFactor, val);}
void on_spinBloomRadius_valueChanged(int val) {view->setFeature(QGLView::qglBloomRadius, val);} void on_spinBloomRadius_valueChanged(int val) {view->view()->setFeature(QGLView::qglBloomRadius, val);}
void on_spinBloomThreshold_valueChanged(double val) {view->setFeature(QGLView::qglBloomThreshold, val);} void on_spinBloomThreshold_valueChanged(double val) {view->view()->setFeature(QGLView::qglBloomThreshold, val);}
void on_spinSSAORadius_valueChanged(int val) {view->setFeature(QGLView::qglSSAORadius, val);} void on_spinSSAORadius_valueChanged(int val) {view->view()->setFeature(QGLView::qglSSAORadius, val);}
void on_actionExit_triggered() {close();} void on_actionExit_triggered() {close();}
void on_actionReset_triggered(); void on_actionReset_triggered();
@@ -117,9 +119,7 @@ private slots:
void on_actionSaveSelected_triggered(); void on_actionSaveSelected_triggered();
void on_actionOpen_triggered(); void on_actionOpen_triggered();
void on_view_glKeyPressEvent(QKeyEvent * e); void view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m);
void on_view_glInitializeDone();
void on_view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m);
void on_treeObjects_itemClicked(QTreeWidgetItem * ti, int col); void on_treeObjects_itemClicked(QTreeWidgetItem * ti, int col);
@@ -128,7 +128,7 @@ private slots:
void selectionChanged(GLObjectBase * cur, GLObjectBase * prev); void selectionChanged(GLObjectBase * cur, GLObjectBase * prev);
void on_pushButton_clicked(); void on_pushButton_clicked();
void on_pushButton_2_clicked() {view->reloadShaders();} void on_pushButton_2_clicked() {view->view()->reloadShaders();}
void on_pushButton_3_clicked(); void on_pushButton_3_clicked();
public slots: public slots:

View File

@@ -1015,7 +1015,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGLView" name="view" native="true"> <widget class="GLWidget" name="view" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@@ -1075,7 +1075,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1125</width> <width>1125</width>
<height>24</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">
@@ -1096,7 +1096,7 @@
<widget class="QStatusBar" name="statusBar_"/> <widget class="QStatusBar" name="statusBar_"/>
<action name="actionExit"> <action name="actionExit">
<property name="icon"> <property name="icon">
<iconset> <iconset resource="../../qad/application/qad_application.qrc">
<normaloff>:/icons/application-exit.png</normaloff>:/icons/application-exit.png</iconset> <normaloff>:/icons/application-exit.png</normaloff>:/icons/application-exit.png</iconset>
</property> </property>
<property name="text"> <property name="text">
@@ -1105,7 +1105,7 @@
</action> </action>
<action name="actionImport"> <action name="actionImport">
<property name="icon"> <property name="icon">
<iconset> <iconset resource="../qglview.qrc">
<normaloff>:/icons/document-import.png</normaloff>:/icons/document-import.png</iconset> <normaloff>:/icons/document-import.png</normaloff>:/icons/document-import.png</iconset>
</property> </property>
<property name="text"> <property name="text">
@@ -1117,7 +1117,7 @@
</action> </action>
<action name="actionOpen"> <action name="actionOpen">
<property name="icon"> <property name="icon">
<iconset resource="../../../SM/src/SignalModelling/signalmodelling.qrc"> <iconset resource="../../qad/application/qad_application.qrc">
<normaloff>:/icons/document-open.png</normaloff>:/icons/document-open.png</iconset> <normaloff>:/icons/document-open.png</normaloff>:/icons/document-open.png</iconset>
</property> </property>
<property name="text"> <property name="text">
@@ -1129,7 +1129,7 @@
</action> </action>
<action name="actionSave"> <action name="actionSave">
<property name="icon"> <property name="icon">
<iconset resource="../../../SM/src/SignalModelling/signalmodelling.qrc"> <iconset resource="../../qad/application/qad_application.qrc">
<normaloff>:/icons/document-save-all.png</normaloff>:/icons/document-save-all.png</iconset> <normaloff>:/icons/document-save-all.png</normaloff>:/icons/document-save-all.png</iconset>
</property> </property>
<property name="text"> <property name="text">
@@ -1141,7 +1141,7 @@
</action> </action>
<action name="actionReset"> <action name="actionReset">
<property name="icon"> <property name="icon">
<iconset resource="../../../SM/src/SMBricks/SM_plugins/signal_process/icons.qrc"> <iconset resource="../../qad/application/qad_application.qrc">
<normaloff>:/icons/document-new.png</normaloff>:/icons/document-new.png</iconset> <normaloff>:/icons/document-new.png</normaloff>:/icons/document-new.png</iconset>
</property> </property>
<property name="text"> <property name="text">
@@ -1153,7 +1153,7 @@
</action> </action>
<action name="actionSaveSelected"> <action name="actionSaveSelected">
<property name="icon"> <property name="icon">
<iconset resource="../../../SM/src/SMBricks/SM_plugins/signal_process/icons.qrc"> <iconset resource="../../piqt_utils/piconnedit/piconnedit.qrc">
<normaloff>:/icons/document-save-.png</normaloff>:/icons/document-save-.png</iconset> <normaloff>:/icons/document-save-.png</normaloff>:/icons/document-save-.png</iconset>
</property> </property>
<property name="text"> <property name="text">
@@ -1179,9 +1179,9 @@
<header>colorbutton.h</header> <header>colorbutton.h</header>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>QGLView</class> <class>GLWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header location="global">qglview.h</header> <header location="global">glwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget> <customwidget>
@@ -1202,6 +1202,10 @@
<header>propertyeditor.h</header> <header>propertyeditor.h</header>
</customwidget> </customwidget>
</customwidgets> </customwidgets>
<resources/> <resources>
<include location="../../qad/application/qad_application.qrc"/>
<include location="../../piqt_utils/piconnedit/piconnedit.qrc"/>
<include location="../qglview.qrc"/>
</resources>
<connections/> <connections/>
</ui> </ui>

View File

@@ -59,7 +59,7 @@ fbo_g(5, true, GL_RGBA16F), fbo_out(3, false, GL_RGBA16F), fbo_hsmall(1, false,
RendererDeferredShading::~RendererDeferredShading() { RendererDeferredShading::~RendererDeferredShading() {
for (int i = 0; i < shaders.size(); ++i) { for (int i = 0; i < shaders.size(); ++i) {
__GLShaderProgram__ * p(*(shaders[i].second)); QOpenGLShaderProgram * p(*(shaders[i].second));
if (p) delete p; if (p) delete p;
} }
delete df; delete df;
@@ -88,15 +88,15 @@ void RendererDeferredShading::renderScene() {
fbo_g.bind(); fbo_g.bind();
int buffs[] = {0, 1, 2, 3, 4}; int buffs[] = {0, 1, 2, 3, 4};
fbo_g.setWriteBuffers(buffs, 5); fbo_g.setWriteBuffers(buffs, 5);
if (white_image_id == 0 && currentGLTextureManager) { if (white_image_id == 0) {
glActiveTextureChannel(6); glActiveTextureChannel(6);
white_image_id = ((GLTextureManagerBase*)currentGLTextureManager)->loadTexture(white_image, false); white_image_id = view.textureManager()->loadTexture(white_image, false);
glBindTexture(GL_TEXTURE_2D, white_image_id); glBindTexture(GL_TEXTURE_2D, white_image_id);
glActiveTextureChannel(0); glActiveTextureChannel(0);
} }
if (violent_image_id == 0 && currentGLTextureManager) { if (violent_image_id == 0) {
glActiveTextureChannel(7); glActiveTextureChannel(7);
violent_image_id = ((GLTextureManagerBase*)currentGLTextureManager)->loadTexture(violent_image, false); violent_image_id = view.textureManager()->loadTexture(violent_image, false);
glBindTexture(GL_TEXTURE_2D, violent_image_id); glBindTexture(GL_TEXTURE_2D, violent_image_id);
glActiveTextureChannel(0); glActiveTextureChannel(0);
} }
@@ -112,7 +112,7 @@ void RendererDeferredShading::renderScene() {
shader_ds_0->setUniformValue("t2", 2); shader_ds_0->setUniformValue("t2", 2);
shader_ds_0->setUniformValue("t3", 3); shader_ds_0->setUniformValue("t3", 3);
shader_ds_0->setUniformValue("t4", 4); shader_ds_0->setUniformValue("t4", 4);
shader_ds_0->setUniformValue("dt", QVector2D(1. / view.viewport()->width(), 1. / view.viewport()->height())); shader_ds_0->setUniformValue("dt", QVector2D(1. / view.width(), 1. / view.height()));
//qDebug() << rp.view_matrix << prev_view; //qDebug() << rp.view_matrix << prev_view;
//shader_ds_0->setUniformValue("qgl_ModelViewMatrix", rp.view_matrix); //shader_ds_0->setUniformValue("qgl_ModelViewMatrix", rp.view_matrix);
renderObjects(GLObjectBase::Solid, 0, shader_ds_0, true, false, false); renderObjects(GLObjectBase::Solid, 0, shader_ds_0, true, false, false);
@@ -170,7 +170,7 @@ void RendererDeferredShading::renderScene() {
shader_ds_1->setUniformValue("mat_viewi", mviewi); shader_ds_1->setUniformValue("mat_viewi", mviewi);
shader_ds_1->setUniformValue("mat_viewproji", mviewproji); shader_ds_1->setUniformValue("mat_viewproji", mviewproji);
shader_ds_1->setUniformValue("shadow_on", view.isFeatureEnabled(QGLView::qglShadowsEnabled) ? 1 : 0); shader_ds_1->setUniformValue("shadow_on", view.isFeatureEnabled(QGLView::qglShadowsEnabled) ? 1 : 0);
shader_ds_1->setUniformValue("dt", QVector2D(1. / view.viewport()->width(), 1. / view.viewport()->height())); shader_ds_1->setUniformValue("dt", QVector2D(1. / view.width(), 1. / view.height()));
rp.setUniform(shader_ds_1); rp.setUniform(shader_ds_1);
fbo_g.bindColorTextures(); fbo_g.bindColorTextures();
fbo_g.bindDepthTexture(5); fbo_g.bindDepthTexture(5);
@@ -507,7 +507,7 @@ void RendererDeferredShading::renderScene() {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
shader_fxaa->bind(); shader_fxaa->bind();
shader_fxaa->setUniformValue("dt", QVector2D(1. / view.viewport()->width(), 1. / view.viewport()->height())); shader_fxaa->setUniformValue("dt", QVector2D(1. / view.width(), 1. / view.height()));
} else { } else {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
@@ -521,9 +521,7 @@ void RendererDeferredShading::renderScene() {
void RendererDeferredShading::init(int width, int height) { void RendererDeferredShading::init(int width, int height) {
#if QT_VERSION >= 0x050600
initializeOpenGLFunctions(); initializeOpenGLFunctions();
#endif
resize(width, height); resize(width, height);
} }
@@ -532,15 +530,15 @@ void RendererDeferredShading::resize(int width, int height) {
fbo_g.resize(width, height); fbo_g.resize(width, height);
fbo_out.resize(width, height); fbo_out.resize(width, height);
fbo_hsmall.resize(width / 16, height / 16); fbo_hsmall.resize(width / 16, height / 16);
view.setSceneRect(QRect(0, 0, width, height)); // view.setSceneRect(QRect(0, 0, width, height));
//df->move(-width / 2, -height / 2); //df->move(-width / 2, -height / 2);
} }
void RendererDeferredShading::reloadShaders() { void RendererDeferredShading::reloadShaders() {
for (int i = 0; i < shaders.size(); ++i) { for (int i = 0; i < shaders.size(); ++i) {
__GLShaderProgram__ * p(*(shaders[i].second)); QOpenGLShaderProgram * p(*(shaders[i].second));
if (!p) p = new __GLShaderProgram__(view.context()); if (!p) p = new QOpenGLShaderProgram(view.context());
loadShaders(p, shaders[i].first, "shaders"); loadShaders(p, shaders[i].first, "shaders");
*(shaders[i].second) = p; *(shaders[i].second) = p;
} }

View File

@@ -40,15 +40,15 @@ protected:
void setupAmbientLight(const QColor & a, bool first_pass); void setupAmbientLight(const QColor & a, bool first_pass);
private: private:
typedef QPair<QString, __GLShaderProgram__ **> ShaderPair; typedef QPair<QString, QOpenGLShaderProgram **> ShaderPair;
int cplc, lights_per_pass; int cplc, lights_per_pass;
double exposure_; double exposure_;
GLFramebuffer fbo_g, fbo_out, fbo_hsmall; GLFramebuffer fbo_g, fbo_out, fbo_hsmall;
__GLShaderProgram__ * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small; QOpenGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;
__GLShaderProgram__ * shader_bloom_0, * shader_bloom_1, * shader_motion_blur, * shader_fbo_add; QOpenGLShaderProgram * shader_bloom_0, * shader_bloom_1, * shader_motion_blur, * shader_fbo_add;
__GLShaderProgram__ * shader_shadow, * shader_ssr, * shader_ssr_blur, * shader_ssr_merge; QOpenGLShaderProgram * shader_shadow, * shader_ssr, * shader_ssr_blur, * shader_ssr_merge;
__GLShaderProgram__ * shader_ssao_blur, * shader_ssao_merge, * shader_dof; QOpenGLShaderProgram * shader_ssao_blur, * shader_ssao_merge, * shader_dof;
GLuint tnoise; GLuint tnoise;
QVector<ShaderPair> shaders; QVector<ShaderPair> shaders;

View File

@@ -29,20 +29,18 @@ RendererSimple::RendererSimple(QGLView * view_): GLRendererBase(view_), fbo(2)
void RendererSimple::reloadShaders() { void RendererSimple::reloadShaders() {
if (shader_fxaa == 0) { if (shader_fxaa == 0) {
shader_fxaa = new __GLShaderProgram__(view.context()); shader_fxaa = new QOpenGLShaderProgram(view.context());
loadShaders(shader_fxaa, "FXAA", "shaders"); loadShaders(shader_fxaa, "FXAA", "shaders");
} }
/*if (shader == 0) { /*if (shader == 0) {
shader = new __GLShaderProgram__(view.context()); /// WARNING shader = new QOpenGLShaderProgram(view.context()); /// WARNING
loadShaders(shader, "test", "shaders"); /// WARNING loadShaders(shader, "test", "shaders"); /// WARNING
}*/ }*/
} }
void RendererSimple::resizeFBO(int w, int h) { void RendererSimple::resizeFBO(int w, int h) {
#if QT_VERSION >= 0x050600
initializeOpenGLFunctions(); initializeOpenGLFunctions();
#endif
fbo.resize(w, h); fbo.resize(w, h);
fbo_c.resize(w, h); /// WARNING fbo_c.resize(w, h); /// WARNING
} }
@@ -120,7 +118,7 @@ void RendererSimple::renderScene() {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
shader_fxaa->bind(); shader_fxaa->bind();
shader_fxaa->setUniformValue("dt", QVector2D(1. / view.viewport()->width(), 1. / view.viewport()->height())); shader_fxaa->setUniformValue("dt", QVector2D(1. / view.width(), 1. / view.height()));
glDrawQuad(); glDrawQuad();
shader_fxaa->release(); shader_fxaa->release();
} else { } else {

View File

@@ -40,7 +40,7 @@ private:
void resizeFBO(int w, int h); void resizeFBO(int w, int h);
GLFramebuffer fbo, fbo_c; GLFramebuffer fbo, fbo_c;
__GLShaderProgram__ * shader_fxaa, * shader; QOpenGLShaderProgram * shader_fxaa, * shader;
}; };