From a36ef5eb1d893698567524a44c253a22fd6ae3bf 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: Fri, 11 Oct 2019 13:34:03 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@613 a8b55f48-bf90-11e4-a774-851b48703e85 --- qglview/glmaterial.h | 48 ++++----- qglview/glshaders.cpp | 2 + qglview/material_map_editor.cpp | 4 + qglview/material_map_editor.ui | 167 +++++++++++++++++++++++++++++--- qglview/shaders/dsl_pass_0.frag | 12 +-- 5 files changed, 189 insertions(+), 44 deletions(-) diff --git a/qglview/glmaterial.h b/qglview/glmaterial.h index 4f79a23..8288346 100644 --- a/qglview/glmaterial.h +++ b/qglview/glmaterial.h @@ -99,10 +99,11 @@ protected: class Map { public: - Map() {bitmap_id = 0; color_amount = 1.f; color_offset = 0.f; animation_frame_rate = -1.f;} + Map() {bitmap_id = 0; color_amount = 1.f; color_offset = 0.f; animation_frame_rate = -1.f; bitmap_scale = QPointF(1., 1.);} QString bitmap_path; GLuint bitmap_id; QPointF bitmap_offset; + QPointF bitmap_scale; float color_amount; float color_offset; QString animation; @@ -138,18 +139,19 @@ public: inline QDataStream & operator <<(QDataStream & s, const Map & m) { ChunkStream cs; - cs << cs.chunk(1, m.bitmap_path) << cs.chunk(2, m.color_amount) << cs.chunk(3, m.color_offset) << cs.chunk(4, m.animation) << cs.chunk(5, m.animation_frame_rate); + cs.add(1, m.bitmap_path).add(2, m.color_amount).add(3, m.color_offset).add(4, m.animation).add(5, m.animation_frame_rate).add(6, m.bitmap_scale); s << cs.data(); return s; } inline QDataStream & operator >>(QDataStream & s, Map & m) { ChunkStream cs(s); while (!cs.atEnd()) { switch (cs.read()) { - case 1: m.bitmap_path = cs.getData(); break; - case 2: m.color_amount = cs.getData(); break; - case 3: m.color_offset = cs.getData(); break; - case 4: m.animation = cs.getData(); break; - case 5: m.animation_frame_rate = cs.getData(); break; + case 1: m.bitmap_path = cs.getData(); break; + case 2: m.color_amount = cs.getData(); break; + case 3: m.color_offset = cs.getData(); break; + case 4: m.animation = cs.getData(); break; + case 5: m.animation_frame_rate = cs.getData(); break; + case 6: m.bitmap_scale = cs.getData(); break; } } return s; @@ -157,9 +159,9 @@ inline QDataStream & operator >>(QDataStream & s, Map & m) { inline QDataStream & operator <<(QDataStream & s, const Material & m) { ChunkStream cs; - cs << cs.chunk(1, m.name) << cs.chunk(2, m.color_diffuse) << cs.chunk(3, m.color_specular) << cs.chunk(4, m.color_self_illumination) - << cs.chunk(5, m.transparency) << cs.chunk(6, m.reflectivity) << cs.chunk(7, m.glass) << cs.chunk(8, m.map_diffuse) << cs.chunk(9, m.map_normal) - << cs.chunk(10, m.map_relief) << cs.chunk(11, m.map_specular) << cs.chunk(12, m.map_specularity) << cs.chunk(13, m.map_self_illumination); + cs.add(1, m.name).add(2, m.color_diffuse).add(3, m.color_specular).add(4, m.color_self_illumination) + .add(5, m.transparency).add(6, m.reflectivity).add(7, m.glass).add(8, m.map_diffuse).add(9, m.map_normal) + .add(10, m.map_relief).add(11, m.map_specular).add(12, m.map_specularity).add(13, m.map_self_illumination); s << qCompress(cs.data()); return s; } inline QDataStream & operator >>(QDataStream & s, Material & m) { @@ -169,19 +171,19 @@ inline QDataStream & operator >>(QDataStream & s, Material & m) { ChunkStream cs(ba); while (!cs.atEnd()) { switch (cs.read()) { - case 1: m.name = cs.getData(); break; - case 2: m.color_diffuse = cs.getData(); break; - case 3: m.color_specular = cs.getData(); break; - case 4: m.color_self_illumination = cs.getData(); break; - case 5: m.transparency = cs.getData(); break; - case 6: m.reflectivity = cs.getData(); break; - case 7: m.glass = cs.getData(); break; - case 8: m.map_diffuse = cs.getData(); break; - case 9: m.map_normal = cs.getData(); break; - case 10: m.map_relief = cs.getData(); break; - case 11: m.map_specular = cs.getData(); break; - case 12: m.map_specularity = cs.getData(); break; - case 13: m.map_self_illumination = cs.getData(); break; + case 1: m.name = cs.getData(); break; + case 2: m.color_diffuse = cs.getData(); break; + case 3: m.color_specular = cs.getData(); break; + case 4: m.color_self_illumination = cs.getData(); break; + case 5: m.transparency = cs.getData(); break; + case 6: m.reflectivity = cs.getData(); break; + case 7: m.glass = cs.getData(); break; + case 8: m.map_diffuse = cs.getData(); break; + case 9: m.map_normal = cs.getData(); break; + case 10: m.map_relief = cs.getData(); break; + case 11: m.map_specular = cs.getData(); break; + case 12: m.map_specularity = cs.getData(); break; + case 13: m.map_self_illumination = cs.getData(); break; } } return s; diff --git a/qglview/glshaders.cpp b/qglview/glshaders.cpp index 61c7bcd..7e4b4b0 100644 --- a/qglview/glshaders.cpp +++ b/qglview/glshaders.cpp @@ -75,6 +75,7 @@ const char qgl_structs[] = "struct QGLMap {\n" " float offset;\n" " float amount;\n" + " vec2 scale;\n" " sampler2D map;\n" "};\n" "struct QGLMaterial {\n" @@ -174,6 +175,7 @@ void setUniformMap(QOpenGLShaderProgram * prog, QString map_name, const Map & ma if (!prog->isLinked()) return; prog->setUniformValue(("qgl_Material." + map_name + ".offset").toLatin1().constData(), map.color_offset); prog->setUniformValue(("qgl_Material." + map_name + ".amount").toLatin1().constData(), map.color_amount); + prog->setUniformValue(("qgl_Material." + map_name + ".scale").toLatin1().constData(), map.bitmap_scale); prog->setUniformValue(("qgl_Material." + map_name + ".map").toLatin1().constData(), map.bitmap_id > 0 ? channel : def_channel); } diff --git a/qglview/material_map_editor.cpp b/qglview/material_map_editor.cpp index ceaddfe..78dc3a0 100644 --- a/qglview/material_map_editor.cpp +++ b/qglview/material_map_editor.cpp @@ -55,6 +55,8 @@ void MaterialMapEditor::setMap(const Map & m) { active = false; ui->sliderAmount->setValue(m.color_amount); ui->sliderOffset->setValue(m.color_offset); + ui->spinScaleX->setValue(m.bitmap_scale.x()); + ui->spinScaleY->setValue(m.bitmap_scale.y()); ui->linePath->setProperty("GLpath", m.bitmap_path); ui->linePath->setText(QFileInfo(m.bitmap_path).fileName()); updateIcon(); active = true; @@ -65,6 +67,8 @@ Map MaterialMapEditor::map() { Map m; m.color_amount = ui->sliderAmount->value(); m.color_offset = ui->sliderOffset->value(); + m.bitmap_scale.setX(ui->spinScaleX->value()); + m.bitmap_scale.setY(ui->spinScaleY->value()); m.bitmap_path = ui->linePath->property("GLpath").toString(); return m; } diff --git a/qglview/material_map_editor.ui b/qglview/material_map_editor.ui index f97cf3d..47227a2 100644 --- a/qglview/material_map_editor.ui +++ b/qglview/material_map_editor.ui @@ -6,15 +6,21 @@ 0 0 - 509 - 74 + 587 + 138 - + 0 - + + 0 + + + 0 + + 0 @@ -36,15 +42,17 @@ - - X + + + :/icons/edit-delete.png:/icons/edit-delete.png - - ^ + + + :/icons/document-open.png:/icons/document-open.png @@ -60,10 +68,10 @@ - -10.000000000000000 + -1.000000000000000 - 10.000000000000000 + 1.000000000000000 1.000000000000000 @@ -77,6 +85,12 @@ 0.200000000000000 + + -99.000000000000000 + + + 99.000000000000000 + @@ -89,10 +103,10 @@ - -10.000000000000000 + -1.000000000000000 - 10.000000000000000 + 1.000000000000000 2 @@ -103,8 +117,96 @@ 0.200000000000000 + + -99.000000000000000 + + + 99.000000000000000 + + + + + + + + 0 + 0 + + + + Scale X: + + + + + + + 0.100000000000000 + + + 1.000000000000000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + + 0 + 0 + + + + Scale Y: + + + + + + + 0.100000000000000 + + + 1.000000000000000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 1 + 20 + + + + + + @@ -121,7 +223,10 @@
iconedlabel.h
- + + + + linePath @@ -130,8 +235,8 @@ mapChanged() - 175 - 19 + 471 + 22 99 @@ -171,6 +276,38 @@ + + spinScaleX + valueChanged(double) + MaterialMapEditor + mapChanged() + + + 377 + 104 + + + 332 + 164 + + + + + spinScaleY + valueChanged(double) + MaterialMapEditor + mapChanged() + + + 519 + 110 + + + 493 + 164 + + + mapChanged() diff --git a/qglview/shaders/dsl_pass_0.frag b/qglview/shaders/dsl_pass_0.frag index e1e6782..aba3db9 100644 --- a/qglview/shaders/dsl_pass_0.frag +++ b/qglview/shaders/dsl_pass_0.frag @@ -19,10 +19,10 @@ void main(void) { //float logz = log(pos.w * C + 1.) * FC; vec4 dc = qgl_FragColor; vec2 tc = qgl_FragTexture.xy; - float hei = dot(texture(qgl_Material.map_relief.map, tc).rgb, luma) * qgl_Material.map_relief.amount + qgl_Material.map_relief.offset; + float hei = dot(texture(qgl_Material.map_relief.map, tc * qgl_Material.map_relief.scale).rgb, luma) * qgl_Material.map_relief.amount + qgl_Material.map_relief.offset; vec3 n, dn, bn; - dn = texture(qgl_Material.map_normal.map, tc).rgb - vec3(0.5, 0.5, 1.); + dn = texture(qgl_Material.map_normal.map, tc * qgl_Material.map_normal.scale).rgb - vec3(0.5, 0.5, 1.); dn = dn * qgl_Material.map_normal.amount + qgl_Material.map_normal.offset; dn.y = -dn.y; dn = TBN * dn; @@ -31,15 +31,15 @@ void main(void) { bn = normalize(qgl_NormalMatrix * binormal); //n = dn; - dc *= texture(qgl_Material.map_diffuse.map, tc) * qgl_Material.map_diffuse.amount + qgl_Material.map_diffuse.offset; + dc *= texture(qgl_Material.map_diffuse.map, tc * qgl_Material.map_diffuse.scale) * qgl_Material.map_diffuse.amount + qgl_Material.map_diffuse.offset; - vec4 spec = texture(qgl_Material.map_specular.map, tc) * qgl_Material.map_specular.amount + qgl_Material.map_specular.offset; + vec4 spec = texture(qgl_Material.map_specular.map, tc * qgl_Material.map_specular.scale) * qgl_Material.map_specular.amount + qgl_Material.map_specular.offset; spec *= qgl_Material.color_specular; - float specularity = dot(texture(qgl_Material.map_specularity.map, tc).rgb, luma) * qgl_Material.map_specularity.amount + qgl_Material.map_specularity.offset; + float specularity = dot(texture(qgl_Material.map_specularity.map, tc * qgl_Material.map_specularity.scale).rgb, luma) * qgl_Material.map_specularity.amount + qgl_Material.map_specularity.offset; specularity = clamp(specularity, 0.05, 0.99); float reflectivity = qgl_Material.reflectivity;//dot(texture(qgl_Material.map_specularity.map, tc).rgb, luma) * qgl_Material.map_specularity.amount + qgl_Material.map_specularity.offset; reflectivity = clamp(reflectivity, 0., 1.); - vec4 self = texture(qgl_Material.map_self_illumination.map, tc) * qgl_Material.map_self_illumination.amount + qgl_Material.map_self_illumination.offset; + vec4 self = texture(qgl_Material.map_self_illumination.map, tc * qgl_Material.map_self_illumination.scale) * qgl_Material.map_self_illumination.amount + qgl_Material.map_self_illumination.offset; self *= qgl_Material.color_self_illumination; vec3 speed = pos.xyz/pos.w - ppos.xyz/ppos.w;