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

This commit is contained in:
2019-10-07 15:51:43 +00:00
parent 8556e28984
commit c0c11def52
21 changed files with 748 additions and 612 deletions

View File

@@ -116,8 +116,9 @@ void GLFramebuffer::release() {
void GLFramebuffer::setWriteBuffer(int index) {
//QVector<GLenum> buffers; buffers << GL_COLOR_ATTACHMENT0 + index;
glDrawBuffer(GL_COLOR_ATTACHMENT0 + index);
//glDrawBuffers(buffers.size(), buffers.constData());
GLenum e = GL_COLOR_ATTACHMENT0 + index;
glDrawBuffer(e);
//glDrawBuffers(1, &e);
}

View File

@@ -53,42 +53,52 @@ QString findFile(const QString & file, const QStringList & pathes) {
}
void quadProgPoint(QOpenGLFunctions * glFuncs, QOpenGLShaderProgram * prog, QVector4D * corner_dirs,
GLfloat x, GLfloat y, GLfloat tx, GLfloat ty, int locv, int loct, int locc, int index) {
if (prog) {
if (corner_dirs)
prog->setAttributeValue(locc, corner_dirs[index]);
glFuncs->glVertexAttrib2f(loct, tx, ty);
glFuncs->glVertexAttrib2f(locv, x, y);
} else {
glTexCoord2f(tx, ty);
glVertex2f(x, y);
}
}
void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
glResetAllTransforms();
glSetPolygonMode(GL_FILL);
glDisable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
int loc = prog ? prog->attributeLocation("qgl_Color") : -1,
locv = prog ? prog->attributeLocation("qgl_Vertex") : -1,
loct = prog ? prog->attributeLocation("qgl_Texture") : -1,
locc = prog ? prog->attributeLocation("view_corner") : -1;
if (prog) {
}
//if (prog)
//qDebug() << loc << locv << loct << locc;
glBegin(GL_QUADS);
//if (prog) {qDebug() << locv << loct << locc;}
QOpenGLFunctions * glFuncs = QOpenGLContext::currentContext()->functions();
if (prog) {
glFuncs->glVertexAttrib3f(loc, 1.f, 1.f, 1.f);
static const GLfloat cols [] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
static const GLfloat verts[] = {x, y, x+w, y, x, y+h, x+w, y+h};
static const GLfloat texs [] = {0.f, 0.f, 1.f, 0.f, 0.f, 1.f, 1.f, 1.f};
GLfloat vcs[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
if (corner_dirs) {
vcs[0] = corner_dirs[0].x(); vcs[1] = corner_dirs[0].y(); vcs[2] = corner_dirs[0].z();
vcs[3] = corner_dirs[1].x(); vcs[4] = corner_dirs[1].y(); vcs[5] = corner_dirs[1].z();
vcs[6] = corner_dirs[2].x(); vcs[7] = corner_dirs[2].y(); vcs[8] = corner_dirs[2].z();
vcs[9] = corner_dirs[3].x(); vcs[10] = corner_dirs[3].y(); vcs[11] = corner_dirs[3].z();
}
glColor3f(1.f, 1.f, 1.f);
quadProgPoint(glFuncs, prog, corner_dirs, x , y , 0.f, 0.f, locv, loct, locc, 0);
quadProgPoint(glFuncs, prog, corner_dirs, x+w, y , 1.f, 0.f, locv, loct, locc, 1);
quadProgPoint(glFuncs, prog, corner_dirs, x+w, y+h, 1.f, 1.f, locv, loct, locc, 2);
quadProgPoint(glFuncs, prog, corner_dirs, x , y+h, 0.f, 1.f, locv, loct, locc, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glFuncs->glBindBuffer(GL_ARRAY_BUFFER, 0);
glFuncs->glEnableVertexAttribArray(loc);
glFuncs->glVertexAttribPointer(loc, 3, GL_FLOAT, 0, 0, cols);
glFuncs->glEnableVertexAttribArray(locv);
glFuncs->glVertexAttribPointer(locv, 2, GL_FLOAT, 0, 0, verts);
glFuncs->glEnableVertexAttribArray(loct);
glFuncs->glVertexAttribPointer(loct, 2, GL_FLOAT, 0, 0, texs);
glFuncs->glEnableVertexAttribArray(locc);
glFuncs->glVertexAttribPointer(locc, 3, GL_FLOAT, 0, 0, vcs);
glFuncs->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
} else {
glBegin(GL_TRIANGLE_STRIP);
glColor4f(1.f, 1.f, 1.f, 1.f);
glTexCoord2f(0.f, 0.f); glVertex2f(x, y);
glTexCoord2f(1.f, 0.f); glVertex2f(x+w, y);
glTexCoord2f(0.f, 1.f); glVertex2f(x, y+h);
glTexCoord2f(1.f, 1.f); glVertex2f(x+w, y+h);
glEnd();
}
}
QMatrix4x4 getGLMatrix(GLenum matrix) {

View File

@@ -31,6 +31,7 @@ QGLView::QGLView(): OpenGLWindow(), fbo_selection(3) {
// setScene(new QGraphicsScene());
// setInteractive(true);
setIcon(QIcon("://icons/qglview.png"));
deleting_ = false;
timer = 0;
need_init_ = is_first_draw = true;
objects_.is_root = true;
@@ -106,6 +107,7 @@ QGLView::~QGLView() {
stop();
if (shader_select) delete shader_select;
if (shader_halo) delete shader_halo;
deleting_ = true;
}
@@ -344,12 +346,14 @@ void QGLView::render() {
renderer_->renderScene();
}
emit glPainting();
glUseProgram(0);
if (selectionHalo_ || hoverHalo_) {
glReleaseTextures();
glUseProgram(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//glClearFramebuffer(Qt::black, false);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glDisable(GL_TEXTURE_CUBE_MAP);
glDisable(GL_LIGHTING);
@@ -363,13 +367,20 @@ void QGLView::render() {
if (hoverHalo_ && hov_obj) {
glBindTexture(GL_TEXTURE_2D, fbo_selection.colorTexture(1));
//qDebug() << "draw hover";
//glBindTexture(GL_TEXTURE_2D, textures_manager->loadTexture("batt_pn.jpg"));
glDrawQuad();
}
}
glUseProgram(0);
glResetAllTransforms();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glUseProgram(0);
//glDisable(GL_BLEND);
//glDisable(GL_LIGHTING);
//glActiveTexture(GL_TEXTURE0);
//glBindTexture(GL_TEXTURE_2D, textures_manager->loadTexture("batt_pn.jpg"));
//glDrawQuad();
emit glEndPaint();
@@ -457,10 +468,10 @@ void QGLView::renderHalo(const GLObjectBase * obj, const uint iid, const QColor
if (!shader_halo) return;
if (!shader_halo->isLinked()) return;
if (obj) {
shader_halo->bind();
shader_halo->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, fbo_selection.colorTexture());
shader_halo->bind();
shader_halo->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
shader_halo->setUniformValue("t0", 0);
shader_halo->setUniformValue("dt", QVector2D(1.f / width(), 1.f / height()));
shader_halo->setUniformValue("selected", QVector4D(float((iid >> 24) & 0xFF) / 255.f,
@@ -471,6 +482,7 @@ void QGLView::renderHalo(const GLObjectBase * obj, const uint iid, const QColor
shader_halo->setUniformValue("fill", GLfloat(fill));
//qDebug() << "render halo" << iid << shader_halo->log() << shader_halo->programId();
glDisableDepth();
//glClearFramebuffer(color);
glDrawQuad(shader_halo);
glDepthMask(GL_TRUE);
//glFlush();
@@ -545,9 +557,11 @@ void QGLView::collectLights() {
void QGLView::objectDeleted(GLObjectBase * o) {
if (deleting_) return;
//qDebug() << "del" << o;
if (sel_obj == o) selectObject(nullptr);
if (hov_obj == o) hov_obj = nullptr;
collectLights();
}
@@ -590,8 +604,8 @@ void QGLView::checkCaps() {
void QGLView::reloadThisShaders() {
if (!shaders_supported) return;
loadShaders(shader_select, "selection", "://shaders");
loadShaders(shader_halo, "selection_halo", "://shaders");
loadShaders(shader_select, "selection", "shaders");
loadShaders(shader_halo, "selection_halo", "shaders");
//loadShaders(shader_rope, "rope", "://shaders");
}
@@ -789,6 +803,7 @@ QByteArray QGLView::saveCamera() {
void QGLView::restoreCamera(const QByteArray &ba) {
if (ba.isEmpty()) return;
qDebug() << "restoreCamera" << ba.size();
ChunkStream cs(ba);
QVector3D pos, aim, ang;
while (!cs.atEnd()) {

View File

@@ -238,7 +238,7 @@ private:
QSize prev_size;
float lineWidth_;
float fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor;
int timer, fps_cnt, sh_id_loc;
int timer, fps_cnt, sh_id_loc, deleting_;
bool is_first_draw, is_init, fogEnabled_, lightEnabled_, grabMouse_, mouse_first, mouseRotate_, mouseSelect_, customMouseMove_;
bool shaders_supported, changed_, cameraOrbit_, need_init_;
bool hoverHalo_, selectionHalo_, shaders_bind, selecting_;

View File

@@ -34,6 +34,10 @@ QGLViewWindow::QGLViewWindow(QWidget * parent): QMainWindow(parent), Ui::QGLView
icon_geo = QIcon(":/icons/type-geo.png");
icon_camera = QIcon(":/icons/type-camera.png");
icon_light = QIcon(":/icons/type-light.png");
QAction * a = new QAction(QIcon(":/icons/edit-delete.png"), "Remove");
connect(a, SIGNAL(triggered()), this, SLOT(removeObjects()));
treeObjects->addAction(a);
spinViewLineWidth->setValue(lineThickness()*2);
sel_obj = nullptr;
view->view()->camera()->setAim(QVector3D());
@@ -311,6 +315,16 @@ void QGLViewWindow::on_treeObjects_itemClicked(QTreeWidgetItem * ti, int) {
}
void QGLViewWindow::removeObjects() {
QList<QTreeWidgetItem*> sil = treeObjects->selectedItems();
foreach (QTreeWidgetItem * i, sil) {
GLObjectBase * o = (GLObjectBase*)(i->data(0, Qt::UserRole).toULongLong());
delete o;
}
qDeleteAll(sil);
}
void QGLViewWindow::objectsTreeChanged() {
treeObjects->clear();
makeObjetTree(&(view->view()->rootObject()), treeObjects->invisibleRootItem());

View File

@@ -124,6 +124,7 @@ private slots:
void on_treeObjects_itemClicked(QTreeWidgetItem * ti, int);
void removeObjects();
void objectsTreeChanged();
void materialChanged();
void selectionChanged(GLObjectBase * cur, GLObjectBase *);

View File

@@ -7,14 +7,14 @@
<x>0</x>
<y>0</y>
<width>1125</width>
<height>1056</height>
<height>1032</height>
</rect>
</property>
<property name="windowTitle">
<string>QGLView converter</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
@@ -420,6 +420,36 @@
<string>Features</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QScrollArea" name="scrollArea_2">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>294</width>
<height>737</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupShadows">
<property name="title">
@@ -930,6 +960,23 @@
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>1</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
@@ -998,6 +1045,36 @@
<string>Material</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>333</width>
<height>853</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="MaterialEditor" name="matEditor" native="true"/>
</item>
@@ -1009,13 +1086,17 @@
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>1</height>
<height>834</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
<string>Страница</string>
@@ -1038,7 +1119,11 @@
</widget>
</item>
<item>
<widget class="GLWidget" name="view" native="true">
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="GLWidget" name="view">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -1046,8 +1131,6 @@
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Objects</string>
@@ -1055,9 +1138,15 @@
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeWidget" name="treeObjects">
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
@@ -1073,6 +1162,7 @@
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
@@ -1098,7 +1188,7 @@
<x>0</x>
<y>0</y>
<width>1125</width>
<height>21</height>
<height>24</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -1204,7 +1294,7 @@
<customwidget>
<class>GLWidget</class>
<extends>QWidget</extends>
<header location="global">glwidget.h</header>
<header>glwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>

View File

@@ -80,10 +80,10 @@ void RendererDeferredShading::renderScene() {
QMatrix4x4 vc_proji;
vc_proji.perspective(90., 1., view.camera()->depthStart(), view.camera()->depthEnd());
vc_proji = vc_proji.inverted();
corner_dirs[0] = (mproji * QVector4D( 1, 1, 0, 1));
corner_dirs[1] = (mproji * QVector4D(-1, 1, 0, 1));
corner_dirs[2] = (mproji * QVector4D(-1, -1, 0, 1));
corner_dirs[3] = (mproji * QVector4D( 1, -1, 0, 1));
corner_dirs[0] = (mproji * QVector4D(-1, -1, 0, 1));
corner_dirs[1] = (mproji * QVector4D( 1, -1, 0, 1));
corner_dirs[2] = (mproji * QVector4D(-1, 1, 0, 1));
corner_dirs[3] = (mproji * QVector4D( 1, 1, 0, 1));
//qDebug() << corner_dirs[0] << corner_dirs[1] << corner_dirs[2] << corner_dirs[3];
fbo_g.bind();
int buffs[] = {0, 1, 2, 3, 4};
@@ -545,7 +545,7 @@ void RendererDeferredShading::reloadShaders() {
for (int i = 0; i < shaders.size(); ++i) {
QOpenGLShaderProgram * p(*(shaders[i].second));
if (!p) p = new QOpenGLShaderProgram(view.context());
loadShaders(p, shaders[i].first, "://shaders");
loadShaders(p, shaders[i].first, "shaders");
*(shaders[i].second) = p;
}
}

View File

@@ -49,16 +49,17 @@ void RendererSimple::resizeFBO(int w, int h) {
void RendererSimple::renderScene() {
int passes = (view.lightsCount() - 1) / 8 + 1;
//QMatrix4x4 pm = getGLMatrix(GL_PROJECTION_MATRIX), mvm = getGLMatrix(GL_MODELVIEW_MATRIX), pmvm = pm * mvm, lpm, lmvm, lpmvm;
glSetCapEnabled(GL_MULTISAMPLE, view.isFeatureEnabled(QGLView::qglMSAA));
//glSetCapEnabled(GL_MULTISAMPLE, view.isFeatureEnabled(QGLView::qglMSAA));
if (passes < 1) passes = 1;
//glEnable(GL_FOG);
if (view.isFeatureEnabled(QGLView::qglFXAA)) fbo.bind();
//if (view.isFeatureEnabled(QGLView::qglFXAA)) fbo.bind();
//glEnable(GL_TEXTURE_2D);
if (passes > 1) {
if (passes > 1 || view.isFeatureEnabled(QGLView::qglFXAA)) {
fbo.bind();
fbo.setWriteBuffer(0);
glClearFramebuffer();
}
} else
glSetCapEnabled(GL_MULTISAMPLE, view.isFeatureEnabled(QGLView::qglMSAA));
glEnable(GL_RESCALE_NORMAL);
for (int l = 0; l < passes; ++l) {
if (passes > 1) fbo.setWriteBuffer(1);

View File

@@ -2,5 +2,5 @@
void main(void) {
qgl_FragTexture = qgl_Texture;
gl_Position = qgl_ftransform();
gl_Position = vec4(qgl_Vertex,1);
}

View File

@@ -2,5 +2,5 @@
void main(void) {
qgl_FragTexture = qgl_Texture;
gl_Position = qgl_ftransform();
gl_Position = vec4(qgl_Vertex,1);
}

View File

@@ -2,5 +2,5 @@
void main(void) {
qgl_FragTexture = qgl_Texture;
gl_Position = qgl_ftransform();
gl_Position = vec4(qgl_Vertex,1);
}

View File

@@ -120,7 +120,7 @@ void main(void) {
pos.w = 1;
pos.xyz = view_dir * z;
pos.z = -pos.z;
//pos.z = -pos.z;
//pos.z = posz;
//pos.xyz += n * height;
@@ -142,8 +142,8 @@ void main(void) {
// calcLight(0, n, v, v2);
qgl_FragData[0] = vec4(max(vec3(0), li * dc + si * v2.rgb + v3.rgb + texelFetch(t_pp, tc, 0).rgb), v0.w);
//qgl_FragData[0].rgb = vec3(-z);
//qgl_FragData[0].rgb = li + vec3(texelFetch(t_pp, tc, 0).xyz);
//qgl_FragData[0].rgb = vec3(length(view_pos.xyz - qgl_Light[1].position.xyz)/3);
//qgl_FragData[0].rgb = vec3(view_pos.xyz);
//shd = shd - shp.w;
/*vec3 fp = pos.xyz;// * lpos.w;

View File

@@ -5,10 +5,12 @@ out vec3 view_dir;
out vec4 view_pos;
void main(void) {
view_dir = view_corner / view_corner.z;
//view_dir = vec3(0.8);
view_pos = vec4(qgl_ModelViewMatrix * vec4(qgl_Vertex.xy, 1, 1));
view_pos /= view_pos.w;
view_dir = vec3(view_corner.xyz);// / view_corner.z;
qgl_FragTexture = qgl_Texture;
qgl_FragColor = qgl_Color;
gl_Position = qgl_ftransform();
//gl_Position = vec4(qgl_Vertex,1);
}

View File

@@ -2,5 +2,5 @@
void main(void) {
qgl_FragTexture = qgl_Texture;
gl_Position = qgl_ftransform();
gl_Position = vec4(qgl_Vertex,1);
}

View File

@@ -16,5 +16,6 @@ void main(void) {
float vm = step(1e-3, (d0 * 25.) * (d1 * 25.) * (d2 * 255.) * (d3 * 255.));
float v = mix(vs - vm, vs - vm - vm + 1, fill);
//qgl_FragData[0] = vec4(1,0,0,0.5);//vec4(color.rgb, v * color.a);
qgl_FragData[0] = vec4(color.bgr, v * color.a);
gl_FragColor = v*vec4(color.bgr, v * color.a);
//qgl_FragData[0] = vec4(1);
}

View File

@@ -2,5 +2,6 @@
void main(void) {
qgl_FragTexture = qgl_Texture;
qgl_FragColor = qgl_Color;
gl_Position = qgl_ftransform();
}

View File

@@ -6,5 +6,5 @@ out vec3 view_dir;
void main(void) {
view_dir = view_corner / view_corner.z;
qgl_FragTexture = qgl_Texture;
gl_Position = qgl_ftransform();
gl_Position = vec4(qgl_Vertex,1);
}

View File

@@ -2,5 +2,5 @@
void main(void) {
qgl_FragTexture = qgl_Texture;
gl_Position = qgl_ftransform();
gl_Position = vec4(qgl_Vertex,1);
}

View File

@@ -2,5 +2,5 @@
void main(void) {
qgl_FragTexture = qgl_Texture;
gl_Position = qgl_ftransform();
gl_Position = vec4(qgl_Vertex,1);
}