devicePixelRatio() support

This commit is contained in:
2023-02-06 19:50:27 +03:00
parent 7c6ca07323
commit 4e02e154c6
17 changed files with 98 additions and 47 deletions

View File

@@ -32,6 +32,7 @@ void TextureManager::addSearchPath(const QString & path) {
if (!search_pathes.contains(path)) search_pathes << path;
}
QString TextureManager::findFile(const QString & path) {
return ::findFile(path, search_pathes);
}

View File

@@ -33,8 +33,8 @@ public:
TextureManager(QOpenGLExtraFunctions * f_): f(f_) {}
virtual ~TextureManager() {}
static void addSearchPath(const QString & path) {
if (!search_pathes; { search_pathes.clear(); }
static void addSearchPath(const QString & path);
static void clearSearchPathes() { search_pathes.clear(); }
static QStringList searchPathes() { return search_pathes; }
static QString findFile(const QString & path);
GLuint loadTexture(const QString & path, bool ownership = true, bool bump = false);

View File

@@ -45,21 +45,24 @@ Renderer::Renderer(QGLView * view_)
cam_light->intensity = 0.75;
cam_light->setName("Camera_Light");
shader_files[srSelectionFill] = "selection.glsl";
shader_files[srSelectionHalo] = "selection_halo.glsl";
shader_files[srSelectionApply] = "selection_apply.glsl";
shader_files[srSelectionFrame] = "selection_frame.glsl";
shader_files[srSelectionFill] = "selection.glsl";
shader_files[srSelectionHalo] = "selection_halo.glsl";
shader_files[srSelectionApply] = "selection_apply.glsl";
shader_files[srSelectionFrame] = "selection_frame.glsl";
shader_files[srServiceFill] = "service_fill.glsl";
shader_files[srServiceFrame] = "service_frame.glsl";
shader_files[srServiceLine] = "service_line.glsl";
shader_files[srServiceFill] = "service_fill.glsl";
shader_files[srServiceFrame] = "service_frame.glsl";
shader_files[srServiceLine] = "service_line.glsl";
shader_files[srGeometryPass] = "ds_geom.glsl";
shader_files[srLightOmniPass] = "ds_light.glsl";
shader_files[srLightSpotPass] = "ds_light.glsl";
shader_files[srGeometrySolidPass] = "ds_geom.glsl";
shader_files[srGeometryTransparentPass] = "ds_geom.glsl";
shader_files[srLightOmniPass] = "ds_light.glsl";
shader_files[srLightSpotPass] = "ds_light.glsl";
shader_files[srFinalPass] = "ds_final.glsl";
shader_files[srTonemapPass] = "ds_tonemap.glsl";
shader_defines[srGeometrySolidPass] << "SOLID";
shader_defines[srLightSpotPass] << "SPOT";
shader_files[srFinalPass] = "ds_final.glsl";
shader_files[srTonemapPass] = "ds_tonemap.glsl";
edit_mode = need_init_shaders = true;
camera_light_mode = QGLView::clmAuto;
@@ -116,7 +119,7 @@ void Renderer::reloadShaders() {
shader_fxaa = nullptr;
if (tone_proc.shader_sum) delete tone_proc.shader_sum;
tone_proc.shader_sum = nullptr;
QString dir = ":shaders/";
QString dir = ":/shaders/";
while (it.hasNext()) {
it.next();
loadShadersMulti(shaders[it.key()], dir + it.value(), true, shader_defines.value(it.key()));
@@ -159,7 +162,8 @@ bool Renderer::bindShader(QOpenGLShaderProgram * sp) {
void Renderer::initShaders() {
if (!need_init_shaders) return;
need_init_shaders = false;
initUniformBuffer(shaders.value(srGeometryPass), &buffer_materials, bpMaterials, "QGLMaterialData");
initUniformBuffer(shaders.value(srGeometrySolidPass), &buffer_materials, bpMaterials, "QGLMaterialData");
initUniformBuffer(shaders.value(srGeometryTransparentPass), &buffer_materials, bpMaterials, "QGLMaterialData");
QOpenGLShaderProgram * prog = 0;
for (ShaderRole role: {srLightOmniPass, srLightSpotPass}) {
initUniformBuffer(shaders.value(role), &buffer_materials, bpMaterials, "QGLMaterialData");
@@ -178,7 +182,10 @@ void Renderer::initShaders() {
prog->setUniformValue("tex_t_0", 3);
prog->setUniformValue("tex_t_1", 4);
}
if (bindShader(srGeometryPass, &prog)) {
if (bindShader(srGeometrySolidPass, &prog)) {
setUniformMaps(prog);
}
if (bindShader(srGeometryTransparentPass, &prog)) {
setUniformMaps(prog);
}
if (bindShader(srTonemapPass, &prog)) {
@@ -358,7 +365,7 @@ void Renderer::renderScene() {
fbo_ds.bind();
glEnableDepth();
glClearFramebuffer();
if (bindShader(srGeometryPass, &prog)) {
if (bindShader(srGeometrySolidPass, &prog)) {
setUniformCamera(prog, cam);
textures_empty.bind(f, tarEmpty);
textures_maps.bind(f, tarMaps);
@@ -381,7 +388,10 @@ void Renderer::renderScene() {
fbo_ds.setWriteBuffers({0, 1, 2, 3, 4});
glClearFramebuffer(Qt::black, false);
fbo_ds.setWriteBuffers();
if (bindShader(srGeometryPass, &prog)) {
if (bindShader(srGeometryTransparentPass, &prog)) {
setUniformCamera(prog, cam);
textures_empty.bind(f, tarEmpty);
textures_maps.bind(f, tarMaps);
renderObjects(scene, rpTransparent);
}
fbo_ds.release();

View File

@@ -51,7 +51,8 @@ class QGLENGINE_CORE_EXPORT Renderer: public RendererBase {
srServiceLine,
// Deferred shading
srGeometryPass,
srGeometrySolidPass,
srGeometryTransparentPass,
srLightOmniPass,
srLightSpotPass,
srFinalPass,

View File

@@ -89,7 +89,7 @@ void RendererBase::setUniformMaps(QOpenGLShaderProgram * prog) {
void RendererBase::setUniformCamera(QOpenGLShaderProgram * prog, Camera * cam, bool matrices, QSize viewport) {
double w = view->width(), h = view->height();
double w = view->pixelWidth(), h = view->pixelHeight();
if (viewport.isValid()) {
w = viewport.width();
h = viewport.height();

View File

@@ -70,7 +70,8 @@ void RendererMaterial::renderMaterial(Material * m) {
fbo_mat_thumb.bind();
glEnableDepth();
glClearFramebuffer(QColor(0, 0, 0, 0));
if (r->bindShader(Renderer::srGeometryPass, &prog)) {
auto role = m->hasTransparency() ? Renderer::srGeometryTransparentPass : Renderer::srGeometrySolidPass;
if (r->bindShader(role, &prog)) {
r->setUniformMaps(prog);
r->setUniformCamera(prog, mat_camera, true, fbo_mat_thumb.size());
// qDebug() << mat_camera->viewMatrix();

View File

@@ -184,8 +184,8 @@ void RendererSelection::renderSelectionFrame() {
QOpenGLShaderProgram * prog = 0;
if (r->bindShader(Renderer::srSelectionFrame, &prog)) {
QMatrix4x4 mat;
double mrx = r->mouse_rect.x(), mrw = r->mouse_rect.width(), vw = r->view->width();
double mry = r->mouse_rect.y(), mrh = r->mouse_rect.height(), vh = r->view->height();
double mrx = r->mouse_rect.x(), mrw = r->mouse_rect.width(), vw = r->view->pixelWidth();
double mry = r->mouse_rect.y(), mrh = r->mouse_rect.height(), vh = r->view->pixelHeight();
mat.translate(-1. + (mrw + mrx * 2) / vw, 1. - (mrh + mry * 2) / vh, 0.);
mat.scale(mrw / vw, mrh / vh, 0.);
r->initQuad(sel_frame, mat);

View File

@@ -511,7 +511,7 @@ void RendererService::renderService() {
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->width(), r->view->height());
f->glViewport(0, 0, r->view->pixelWidth(), r->view->pixelHeight());
}
f->glDisable(GL_MULTISAMPLE);
}