From cb6fe2b7efda3b734586b947d21c115fd7ee735d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Tue, 3 Dec 2019 18:29:26 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@643 a8b55f48-bf90-11e4-a774-851b48703e85 --- qglengine/core/glframebuffer.cpp | 9 ++++++++- qglengine/core/glframebuffer.h | 1 + qglengine/core/glprimitives.cpp | 14 ++++++++++++++ qglengine/core/glprimitives.h | 2 ++ qglengine/core/glshaders.cpp | 5 ++++- qglengine/renderer_selection.cpp | 6 ++++-- qglengine/renderer_service.cpp | 24 +++++++++++++++++++++--- qglengine/renderer_service.h | 5 +++-- qglengine/shaders/selection_halo.glsl | 6 ++---- qglengine/shaders/service_frame.glsl | 2 ++ 10 files changed, 61 insertions(+), 13 deletions(-) diff --git a/qglengine/core/glframebuffer.cpp b/qglengine/core/glframebuffer.cpp index 30e3817..2f7a822 100644 --- a/qglengine/core/glframebuffer.cpp +++ b/qglengine/core/glframebuffer.cpp @@ -245,13 +245,14 @@ void Framebuffer::release() { void Framebuffer::setWriteBuffer(int index) { - //QVector buffers; buffers << GL_COLOR_ATTACHMENT0 + index; + unsetWriteBuffers(); GLenum e = GL_COLOR_ATTACHMENT0 + index; f->glDrawBuffers(1, &e); } void Framebuffer::setWriteBuffers(int * indeces, int count) { + unsetWriteBuffers(); QVector buffers; for (int i = 0; i < count; ++i) buffers << GL_COLOR_ATTACHMENT0 + indeces[i]; @@ -267,6 +268,12 @@ void Framebuffer::setWriteBuffers() { } +void Framebuffer::unsetWriteBuffers() { + QVector buffers(colors.size(), GL_NONE); + f->glDrawBuffers(buffers.size(), buffers.constData()); +} + + void Framebuffer::enablePixelBuffer() { pbo.init(f); } diff --git a/qglengine/core/glframebuffer.h b/qglengine/core/glframebuffer.h index f1e315d..f0a5f35 100644 --- a/qglengine/core/glframebuffer.h +++ b/qglengine/core/glframebuffer.h @@ -56,6 +56,7 @@ public: void setWriteBuffer(int index); void setWriteBuffers(int * indeces, int count); void setWriteBuffers(); + void unsetWriteBuffers(); //void setColorFormat(GLenum format) {color_format = format; is_changed = true;} void enablePixelBuffer(); diff --git a/qglengine/core/glprimitives.cpp b/qglengine/core/glprimitives.cpp index 5724e7c..106c02f 100644 --- a/qglengine/core/glprimitives.cpp +++ b/qglengine/core/glprimitives.cpp @@ -405,3 +405,17 @@ Mesh * Primitive::coneFrame(int segments, float width, float length, float heigh return ret; } + + +Mesh * Primitive::lineFrame(QVector3D p0, QVector3D p1) { + Mesh * ret = new Mesh(GL_LINES); + QVector & v(ret->vertices ()); + QVector & n(ret->normals ()); + QVector & t(ret->texcoords()); + QVector< Vector2i> & ind(ret->indicesLines()); + v << p0 << p1; + n << QVector3D(0,0,1) << QVector3D(0,0,1); + t << QVector2D(0,0) << QVector2D(1,0); + ind << Vector2i(0, 1); + return ret; +} diff --git a/qglengine/core/glprimitives.h b/qglengine/core/glprimitives.h index 2b076a4..11e1297 100644 --- a/qglengine/core/glprimitives.h +++ b/qglengine/core/glprimitives.h @@ -42,6 +42,8 @@ Mesh * arrow(int segments = 16, float thick = 0.04, float angle = 30.); // lengt Mesh * torus(int segments_main = 30, int segments_second = 16, float radius_main = 2.5, float radius_second = 0.5, float end_angle = 360.); +Mesh * lineFrame(QVector3D p0, QVector3D p1); + Mesh * cubeFrame(float width = 1., float length = 1., float height = 1.); Mesh * ellipsoidFrame(int segments_wl, int segments_h, float width = 1., float length = 1., float height = 1.); diff --git a/qglengine/core/glshaders.cpp b/qglengine/core/glshaders.cpp index cd093ff..ef50a3d 100644 --- a/qglengine/core/glshaders.cpp +++ b/qglengine/core/glshaders.cpp @@ -66,7 +66,10 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr prog = new QOpenGLShaderProgram(); prog->removeAllShaders(); QFile f(file); - if (!f.open(QIODevice::ReadOnly)) return false; + if (!f.open(QIODevice::ReadOnly)) { + qDebug() << "[QGLView] Shader" << file << "Error: can`t open file!"; + return false; + } QTextStream ts(&f); QString cur_shader, line, pl, defs = prepareDefines(defines); QOpenGLShader::ShaderType type = 0; diff --git a/qglengine/renderer_selection.cpp b/qglengine/renderer_selection.cpp index ebf42ae..0ccb3b5 100644 --- a/qglengine/renderer_selection.cpp +++ b/qglengine/renderer_selection.cpp @@ -131,8 +131,10 @@ void RendererSelection::renderSelection(Scene & scene) { fbo_selection.queryPoints(0, r->mouse_rect); //qDebug() << id_hover; - fbo_selection.bindColorTextures(); - fbo_selection.setWriteBuffers(); + fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover ); + fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect); + int wind[2] = {2, 3}; + fbo_selection.setWriteBuffers(wind, 2); if (!view->hoverHalo_ && !view->selectionHalo_) glClearFramebuffer(QColor(0,0,0,0), false); else { diff --git a/qglengine/renderer_service.cpp b/qglengine/renderer_service.cpp index 67de02e..b306ef4 100644 --- a/qglengine/renderer_service.cpp +++ b/qglengine/renderer_service.cpp @@ -75,6 +75,8 @@ RendererService::RendererService(Renderer * r_): r(r_) { cone_mesh ->translatePoints(0,0,-0.5); cone_mesh ->scalePoints(1.5); + line_mesh_f = Primitive::lineFrame(QVector3D(), QVector3D(0, 0, -1)); + handle_move_mesh = Primitive::arrow(12, 0.06); handle_ms_2_mesh = Primitive::torus(8, 12, 0.5, 0.02, 90); Mesh * m = Primitive::disc(8, 1., 1., true, 90); @@ -112,6 +114,7 @@ RendererService::~RendererService() { delete omni_mesh_f; delete cone_mesh; delete cone_mesh_f; + delete line_mesh_f; delete axis_camera; delete axis_mesh; delete handle_move_mesh; @@ -137,12 +140,13 @@ void RendererService::resize(int width, int height) { } -QMatrix4x4 RendererService::invariantSizeMatrix(QVector3D p) { +QMatrix4x4 RendererService::invariantSizeMatrix(QVector3D p, double * ret_scale) { QVector4D pos = QVector4D(p, 1.); double dist = -(v_mat * pos).z(); QMatrix4x4 m; m.translate(pos.toVector3D()); m.scale(dist * size_full_scale); + if (ret_scale) *ret_scale = dist * size_full_scale; return m; } @@ -189,13 +193,21 @@ void RendererService::fillSpotObjects() { Object o; cur_objects.clear(); cur_aims.clear(); + cur_lines.clear(); + double scl = 1.; foreach (Light * l, ll) { QMatrix4x4 m; - m = invariantSizeMatrix(l->worldPos()) * parentRotationMatrix(l); + m = invariantSizeMatrix(l->worldPos(), &scl) * parentRotationMatrix(l); m.transposed().copyDataTo(o.modelmatrix); o.object_id = l->id_; cur_objects << o; + QMatrix4x4 sm; + sm.scale(1, 1, l->distance() / scl); + m = m * sm; + m.transposed().copyDataTo(o.modelmatrix); + //cur_lines << o; + m = invariantSizeMatrix(l->worldAim()); m.transposed().copyDataTo(o.modelmatrix); o.object_id = l->id_ + 1; @@ -330,12 +342,18 @@ void RendererService::drawLightsFrame(QColor color) { r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone))); cone_mesh_f->loadSelections(v, rs.cur_selections_); cone_mesh_f->draw(v, cur_objects.size()); + setObjectsColor(cur_aims, color); box_mesh_f->loadObjects(v, cur_aims); box_mesh_f->loadSelections(v, rs.cur_selections_); box_mesh_f->draw(v, cur_aims.size()); - setObjectsColor(cur_aims, color); + setObjectsColor(cur_lines, color); + line_mesh_f->loadObjects(v, cur_lines); + r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone))); + line_mesh_f->loadSelections(v, rs.cur_selections_); + line_mesh_f->draw(v, cur_lines.size()); + } diff --git a/qglengine/renderer_service.h b/qglengine/renderer_service.h index 9cb3d4e..5da273a 100644 --- a/qglengine/renderer_service.h +++ b/qglengine/renderer_service.h @@ -65,7 +65,7 @@ public: void init(int width, int height); void resize(int width, int height); - QMatrix4x4 invariantSizeMatrix(QVector3D p); + QMatrix4x4 invariantSizeMatrix(QVector3D p, double * ret_scale = 0); QMatrix4x4 parentRotationMatrix(ObjectBase * o, bool self_rotation = true); void fillXYZObjects(); void fillOmniObjects(); @@ -86,11 +86,12 @@ private: Mesh * axis_mesh, * handle_move_mesh, * handle_rotate_mesh, * handle_scale_mesh; Mesh * handle_ms_2_mesh, * handle_scale_3_mesh; Mesh * box_mesh_f, * omni_mesh_f, * cone_mesh_f, * box_mesh, * omni_mesh, * cone_mesh; + Mesh * line_mesh_f; QMatrix4x4 v_mat, axis_mat; QVector3D selection_center; QVector mat_xyz, mat_ms2; QVector color_xyz, color_ms2; - QVector cur_objects, cur_aims; + QVector cur_objects, cur_aims, cur_lines; Camera * axis_camera; QSize axis_viewport; HandleAction current_action; diff --git a/qglengine/shaders/selection_halo.glsl b/qglengine/shaders/selection_halo.glsl index 6d367c6..8fd2f9c 100644 --- a/qglengine/shaders/selection_halo.glsl +++ b/qglengine/shaders/selection_halo.glsl @@ -34,11 +34,9 @@ void main(void) { vec2 dp = diffPair(diffVector(fb_hover, hover_id)); float v = diffAlpha(dp, hover_fill); - qgl_FragData[2] = has_hover*hh*v*vec4(hover_color.bgr, hover_color.a); + qgl_FragData[0] = has_hover*hh*v*vec4(hover_color.bgr, hover_color.a); dp = diffPair(diffVector(fb_selection, vec4(1))); v = diffAlpha(dp, selection_fill); - qgl_FragData[3] = has_selection*v*vec4(selection_color.bgr, selection_color.a); - - //qgl_FragData[3] = vec4(has_selection); + qgl_FragData[1] = has_selection*v*vec4(selection_color.bgr, selection_color.a); } diff --git a/qglengine/shaders/service_frame.glsl b/qglengine/shaders/service_frame.glsl index a96d2f0..65189c1 100644 --- a/qglengine/shaders/service_frame.glsl +++ b/qglengine/shaders/service_frame.glsl @@ -8,6 +8,8 @@ void main(void) { object_color_g = qgl_ObjectColor; //mat_scale = pow(qgl_ModelMatrix[0][0] * qgl_ModelMatrix[1][1] * qgl_ModelMatrix[2][2], 0.3333); mat_scale = pow(determinant(mat3(qgl_ModelMatrix)), 0.333); + //mat3 mm = transpose(mat3(qgl_ModelMatrix)); + //mat_scale = min(min(dot(vec3(1), mm[0]), dot(vec3(1), mm[1])), dot(vec3(1), mm[2])); }