version 1.2.0

fixed framebuffer size feature
This commit is contained in:
2023-05-17 15:58:39 +03:00
parent 484a7f972f
commit 292f68a574
15 changed files with 73 additions and 23 deletions

View File

@@ -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();

View File

@@ -59,6 +59,7 @@ class QGLENGINE_CORE_EXPORT Renderer: public RendererBase {
srTonemapPass,
srShadowConePass,
srShadowOmniPass,
srRescale
};
enum OutBufferRole {
obrSolidOmni,

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -57,6 +57,7 @@ private:
Framebuffer fbo_selection;
Mesh * sel_frame;
float line_thick_, scale_;
QPointF size_coeff = {1., 1.};
QVector<uchar> cur_selections_;
QHash<uint, ObjectBase *> ids;
QHash<uint, ObjectBase *> aim_ids;

View File

@@ -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);
}