diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e3c6fa..7612c35 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ else() include(SHSTKQtMacros) set(QGLEngine_MAJOR 1) - set(QGLEngine_MINOR 1) + set(QGLEngine_MINOR 2) set(QGLEngine_REVISION 0) set(QGLEngine_SUFFIX "rc") set(QGLEngine_COMPANY SHS) diff --git a/shaders/rescale.glsl b/shaders/rescale.glsl new file mode 100644 index 0000000..af4d32d --- /dev/null +++ b/shaders/rescale.glsl @@ -0,0 +1,15 @@ +// vert // + +void main(void) { + qgl_FragTexture = qgl_Texture; + gl_Position = qgl_ftransform(); +} + + +// frag // + +uniform sampler2D tex_0; + +void main(void) { + qgl_FragColor = texture(tex_0, qgl_FragTexture.xy); +} diff --git a/shaders/selection_apply.glsl b/shaders/selection_apply.glsl index 5029eba..4446f73 100644 --- a/shaders/selection_apply.glsl +++ b/shaders/selection_apply.glsl @@ -11,9 +11,10 @@ void main(void) { uniform sampler2D fb_out, fb_hover, fb_select; void main(void) { - ivec2 tc = ivec2(gl_FragCoord.xy); + //ivec2 tc = ivec2(gl_FragCoord.xy); + //vec4 src = texelFetch(fb_out , tc, 0); vec2 stc = qgl_FragTexture.xy; - vec4 src = texelFetch(fb_out , tc, 0); + vec4 src = texture(fb_out , stc); vec4 hov = texture(fb_hover , stc); vec4 sel = texture(fb_select, stc); src.rgb = clamp(src.rgb, vec3(0), vec3(1)); diff --git a/src/core/render/renderer.cpp b/src/core/render/renderer.cpp index 1fed053..7ffa97e 100644 --- a/src/core/render/renderer.cpp +++ b/src/core/render/renderer.cpp @@ -98,6 +98,8 @@ Renderer::Renderer(QGLView * view_) shader_files[srShadowConePass] = "shadow.glsl"; shader_files[srShadowOmniPass] = "shadow.glsl"; + shader_files[srRescale] = "rescale.glsl"; + shader_defines[srGeometrySolidPass] << "SOLID"; shader_defines[srLightSpotPass] << "SPOT"; shader_defines[srShadowOmniPass] << "OMNI"; @@ -136,7 +138,7 @@ void Renderer::init(int width, int height) { depth_maps_cone.reinit(); depth_maps_omni.reinit(); resize(width, height); - rend_mat.init(width, height); + rend_mat.init(256, 256); rend_service.init(width, height); rend_selection.init(width, height); tone_proc.init(); @@ -151,7 +153,7 @@ void Renderer::init(int width, int height) { void Renderer::resize(int width, int height) { - rend_mat.resize(width, height); + rend_mat.resize(256, 256); rend_service.resize(width, height); rend_selection.resize(width, height); fbo_ds.resize(width, height); @@ -244,6 +246,9 @@ void Renderer::initShaders() { prog->setUniformValue("tex_0", 0); prog->setUniformValue("tex_sum", 1); } + if (bindShader(srRescale, &prog)) { + prog->setUniformValue("tex_0", 0); + } } @@ -351,8 +356,8 @@ void Renderer::renderLight(int first_wr_buff, bool clear_only) { glClearFramebuffer(back, false); back = QColor(0, 0, 0, 0); if (clear_only) continue; - setUniformCamera(prog, cam); - setUniformViewCorners(prog, cam); + setUniformCamera(prog, cam, true, fbo_ds.size()); + setUniformViewCorners(prog, cam, fbo_ds.size()); prog->setUniformValue("lights_start", lights_start[pass.second]); prog->setUniformValue("lights_count", (int)cur_lights[pass.second].size()); prog->setUniformValue("fog_color", color2vector(view->fogColor()) / 2.); @@ -571,7 +576,7 @@ void Renderer::renderScene() { glEnableDepth(); glClearFramebuffer(); if (bindShader(srGeometrySolidPass, &prog)) { - setUniformCamera(prog, cam); + setUniformCamera(prog, cam, true, fbo_ds.size()); textures_empty.bind(f, tarEmpty); textures_maps.bind(f, tarMaps); prog->setUniformValue("out_index_normal", dbrNormalZSolid); @@ -600,7 +605,7 @@ void Renderer::renderScene() { glClearFramebuffer(Qt::black, false); fbo_ds.setWriteBuffers(); if (bindShader(srGeometryTransparentPass, &prog)) { - setUniformCamera(prog, cam); + setUniformCamera(prog, cam, true, fbo_ds.size()); textures_empty.bind(f, tarEmpty); textures_maps.bind(f, tarMaps); prog->setUniformValue("out_index_normal", dbrNormalZ); @@ -672,6 +677,7 @@ void Renderer::renderScene() { } fbo_out.release(); + glViewport(0, 0, view->pixelWidth(), view->pixelHeight()); /// apply hovers and selection frame if (edit_mode) { @@ -680,7 +686,14 @@ void Renderer::renderScene() { rend_service.renderService(); } else { phase.begin("blit to screen"); - fbo_out.blit(cur_write_plane, 0, 0, fbo_out.rect(), QRect(QPoint(), view->pixelSize())); + if (fbo_out.rect() == view->pixelRect()) { + fbo_out.blit(cur_write_plane, 0, 0, fbo_out.rect(), view->pixelRect()); + } else { + if (bindShader(srRescale, &prog)) { + fbo_out.bindColorTexture(cur_write_plane, 0); + renderQuad(prog, quad); + } + } } phase.end(); diff --git a/src/core/render/renderer.h b/src/core/render/renderer.h index 9986dbc..cf1dbc8 100644 --- a/src/core/render/renderer.h +++ b/src/core/render/renderer.h @@ -59,6 +59,7 @@ class QGLENGINE_CORE_EXPORT Renderer: public RendererBase { srTonemapPass, srShadowConePass, srShadowOmniPass, + srRescale }; enum OutBufferRole { obrSolidOmni, diff --git a/src/core/render/renderer_material.cpp b/src/core/render/renderer_material.cpp index 70a1a97..e66f263 100644 --- a/src/core/render/renderer_material.cpp +++ b/src/core/render/renderer_material.cpp @@ -59,7 +59,7 @@ void RendererMaterial::init(int width, int height) { void RendererMaterial::resize(int width, int height) { fbo_mat_thumb.enablePixelBuffer(); - fbo_mat_thumb.resize(256, 256); + fbo_mat_thumb.resize(width, height); } diff --git a/src/core/render/renderer_selection.cpp b/src/core/render/renderer_selection.cpp index 0243234..b4243a7 100644 --- a/src/core/render/renderer_selection.cpp +++ b/src/core/render/renderer_selection.cpp @@ -129,7 +129,7 @@ void RendererSelection::renderSelection(Scene & scene) { fbo_selection.setWriteBuffers(); glEnableDepth(); glClearFramebuffer(QColor(0, 0, 0, 0)); - r->setUniformCamera(prog, view->camera()); + r->setUniformCamera(prog, view->camera(), true, r->fbo_ds.size()); r->renderObjects(scene, rpSolid); r->renderObjects(scene, rpTransparent); view->glClear(GL_DEPTH_BUFFER_BIT); @@ -138,10 +138,12 @@ void RendererSelection::renderSelection(Scene & scene) { rs.drawLights(); rs.drawCameras(); rs.drawCurrentHandleObjects(); + auto mapPoint = [this](QPoint p) { return (QPointF(p.x() * size_coeff.x(), p.y() * size_coeff.y()) * scale_).toPoint(); }; + auto mapSize = [this](QSize s) { return (QSizeF(s.width() * size_coeff.x(), s.height() * size_coeff.y()) * scale_).toSize(); }; if (r->mouse_rect.isNull()) - fbo_selection.queryPoint(0, r->mouse_pos * scale_); + fbo_selection.queryPoint(0, mapPoint(r->mouse_pos)); else - fbo_selection.queryPoints(0, QRect(r->mouse_rect.topLeft() * scale_, r->mouse_rect.size() * scale_)); + fbo_selection.queryPoints(0, QRect(mapPoint(r->mouse_rect.topLeft()), mapSize(r->mouse_rect.size()))); // qDebug() << id_hover; fbo_selection.bindColorTexture(sbrSrcHover, sbrSrcHover); diff --git a/src/core/render/renderer_selection.h b/src/core/render/renderer_selection.h index e839edf..c20208b 100644 --- a/src/core/render/renderer_selection.h +++ b/src/core/render/renderer_selection.h @@ -57,6 +57,7 @@ private: Framebuffer fbo_selection; Mesh * sel_frame; float line_thick_, scale_; + QPointF size_coeff = {1., 1.}; QVector cur_selections_; QHash ids; QHash aim_ids; diff --git a/src/core/render/renderer_service.cpp b/src/core/render/renderer_service.cpp index 7698e11..01bc183 100644 --- a/src/core/render/renderer_service.cpp +++ b/src/core/render/renderer_service.cpp @@ -474,7 +474,7 @@ void RendererService::renderService() { prog->setUniformValue("qgl_ProjMatrix", r->view->camera()->projectionMatrix(r->view->aspect)); /// lights - r->setUniformCamera(prog, r->view->camera()); + r->setUniformCamera(prog, r->view->camera(), true, r->fbo_ds.size()); prog->setUniformValue("line_width", 2.f); prog->setUniformValue("z_offset", 0.f); @@ -486,7 +486,7 @@ void RendererService::renderService() { drawCamerasFrame(Qt::black); } if (r->bindShader(Renderer::srServiceLine, &prog)) { - r->setUniformCamera(prog, r->view->camera()); + r->setUniformCamera(prog, r->view->camera(), true, r->fbo_ds.size()); line_object.color = QColor2QVector(Qt::white); line_spot_f->loadObject(f, line_object); line_camera_f->loadObject(f, line_object); @@ -495,7 +495,7 @@ void RendererService::renderService() { } glEnable(GL_CULL_FACE); if (r->bindShader(Renderer::srServiceFill, &prog)) { - r->setUniformCamera(prog, r->view->camera()); + r->setUniformCamera(prog, r->view->camera(), true, r->fbo_ds.size()); /// handles f->glEnable(GL_BLEND); @@ -504,13 +504,15 @@ void RendererService::renderService() { f->glDisable(GL_BLEND); /// axis + GLint prev_view[4]; + f->glGetIntegerv(GL_VIEWPORT, prev_view); f->glViewport(0, 0, axis_viewport.width(), axis_viewport.height()); axis_camera->setPos(-r->view->camera()->direction() * 3.); axis_camera->setAim(QVector3D()); axis_camera->setRotation(r->view->camera()->rotation()); r->setUniformCamera(prog, axis_camera, true, axis_viewport); axis_mesh->draw(f, 3); - f->glViewport(0, 0, r->view->pixelWidth(), r->view->pixelHeight()); + f->glViewport(prev_view[0], prev_view[1], prev_view[2], prev_view[3]); } f->glDisable(GL_MULTISAMPLE); } diff --git a/src/core/shaders.qrc b/src/core/shaders.qrc index 2554217..3a81077 100644 --- a/src/core/shaders.qrc +++ b/src/core/shaders.qrc @@ -16,5 +16,6 @@ ../../shaders/service_line.glsl ../../shaders/sum.glsl ../../shaders/shadow.glsl + ../../shaders/rescale.glsl diff --git a/src/core/view/mouse_controller.cpp b/src/core/view/mouse_controller.cpp index 3f1aac3..3a0b8ca 100644 --- a/src/core/view/mouse_controller.cpp +++ b/src/core/view/mouse_controller.cpp @@ -103,7 +103,7 @@ void MouseController::mousePressEvent(QMouseEvent * e) { view->renderer_.mouse_rect = QRect(); return; } - if (!QRect(QPoint(), view->pixelSize()).contains(cpos)) return; + if (!view->pixelRect().contains(cpos)) return; lastPos = cpos; downPos = cpos; emit view->glMousePressEvent(e); @@ -206,7 +206,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) { } return; } - QRect g_rect(QPoint(), view->pixelSize()); + QRect g_rect = view->pixelRect(); if (mouseRotate_) { float dx = cpos.x() - lastPos.x(); float dy = cpos.y() - lastPos.y(); diff --git a/src/core/view/openglwindow.cpp b/src/core/view/openglwindow.cpp index 13708dc..54b4720 100644 --- a/src/core/view/openglwindow.cpp +++ b/src/core/view/openglwindow.cpp @@ -81,6 +81,11 @@ QSize OpenGLWindow::pixelSize() const { } +QRect OpenGLWindow::pixelRect() const { + return QRect(0, 0, pixelWidth(), pixelHeight()); +} + + // void OpenGLWindow::setSamples(int samples) { // QSurfaceFormat f = requestedFormat(); // if (f.samples() != samples) { diff --git a/src/core/view/openglwindow.h b/src/core/view/openglwindow.h index fe409d6..ad5fce8 100644 --- a/src/core/view/openglwindow.h +++ b/src/core/view/openglwindow.h @@ -30,6 +30,7 @@ public: int pixelWidth() const; int pixelHeight() const; QSize pixelSize() const; + QRect pixelRect() const; public slots: void renderLater(); diff --git a/src/core/view/qglview.cpp b/src/core/view/qglview.cpp index c7fb625..afa4a64 100644 --- a/src/core/view/qglview.cpp +++ b/src/core/view/qglview.cpp @@ -159,9 +159,13 @@ void QGLView::timerEvent(QTimerEvent *) { void QGLView::render() { - resizeGL(pixelWidth(), pixelHeight()); + QSize render_size = pixelSize(); + if (framebuffer_size.isValid()) render_size = framebuffer_size; + resizeGL(render_size.width(), render_size.height()); emit glBeginPaint(); - renderer_.mouse_pos = mapFromGlobal(QCursor::pos()) * devicePixelRatio(); + QSizeF fbo_sz = renderer_.fbo_ds.size(); + renderer_.rend_selection.size_coeff = {double(fbo_sz.width()) / pixelWidth(), double(fbo_sz.height()) / pixelHeight()}; + renderer_.mouse_pos = mapFromGlobal(QCursor::pos()) * devicePixelRatio(); renderer_.renderScene(); emit glEndPaint(); fps_tm = time.elapsed(); diff --git a/src/core/view/qglview.h b/src/core/view/qglview.h index ae64020..f566851 100644 --- a/src/core/view/qglview.h +++ b/src/core/view/qglview.h @@ -170,6 +170,10 @@ public: QSize shadowMapSize() const; QSize textureMapSize() const; + void setFramebufferSize(QSize sz) { framebuffer_size = sz; } + void resetFramebufferSize() { framebuffer_size = QSize(); } + QSize framebufferSize() const { return framebuffer_size; } + int softShadowsSamples() const { return soft_shadows_samples; } void setSoftShadowsSamples(int s) { soft_shadows_samples = s; } float softShadowsQuality() const { return soft_shadows_quality; } @@ -216,7 +220,7 @@ private: GLint max_anisotropic, max_texture_chanels; RenderMode render_mode; QFlags grab_formats; - QSize prev_size, shadow_map_size; + QSize prev_size, shadow_map_size, framebuffer_size; float lineWidth_, soft_shadows_quality; float fps_, fps_tm, fogDensity_, fogDecay_; float hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor;