From 5953ed5767fa29dd8d3389a4e922f721d0936621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Candice=20Bent=C3=A9jac?= Date: Fri, 11 Oct 2024 15:57:23 +0200 Subject: [PATCH] [qt6] Add QT6 support for wireframe on nvidia --- meshroom/submitters/simpleFarmSubmitter.py | 2 +- meshroom/ui/qml/Viewer3D/MaterialSwitcher.qml | 12 +- .../Viewer3D/Materials/WireframeEffect.qml | 9 -- .../Viewer3D/Materials/WireframeMaterial.qml | 17 --- .../Materials/shaders/robustwireframe.frag | 117 ++-------------- .../Materials/shaders/robustwireframe.geom | 131 ------------------ .../Materials/shaders/robustwireframe.vert | 46 ++++-- meshroom/ui/qml/Viewer3D/Viewer3DSettings.qml | 2 +- 8 files changed, 49 insertions(+), 287 deletions(-) delete mode 100644 meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.geom diff --git a/meshroom/submitters/simpleFarmSubmitter.py b/meshroom/submitters/simpleFarmSubmitter.py index d869a332..2628c291 100644 --- a/meshroom/submitters/simpleFarmSubmitter.py +++ b/meshroom/submitters/simpleFarmSubmitter.py @@ -39,7 +39,7 @@ class SimpleFarmSubmitter(BaseSubmitter): # logging.info('REZ: {}'.format(str(r))) v = r.split('-') # logging.info(' v: {}'.format(str(v))) - if len(v) == 2: + if len(v) >= 2: resolvedVersions[v[0]] = v[1] for p in packages: if p.startswith('~'): diff --git a/meshroom/ui/qml/Viewer3D/MaterialSwitcher.qml b/meshroom/ui/qml/Viewer3D/MaterialSwitcher.qml index eb6ef08e..9a9614be 100644 --- a/meshroom/ui/qml/Viewer3D/MaterialSwitcher.qml +++ b/meshroom/ui/qml/Viewer3D/MaterialSwitcher.qml @@ -55,10 +55,10 @@ Entity { name: "Solid" PropertyChanges { target: m; material: solid } }, - /* State { + State { name: "Wireframe" PropertyChanges { target: m; material: wireframe } - }, */ + }, State { name: "Textured" PropertyChanges { @@ -105,15 +105,11 @@ Entity { } } - /* WireframeMaterial { + WireframeMaterial { id: wireframe objectName: "WireframeMaterial" effect: WireframeEffect {} - ambient: root.ambient - diffuse: root.diffuseColor - shininess: 0 - specular: root.specular - } */ + } SphericalHarmonicsMaterial { id: shMaterial diff --git a/meshroom/ui/qml/Viewer3D/Materials/WireframeEffect.qml b/meshroom/ui/qml/Viewer3D/Materials/WireframeEffect.qml index f3a888c4..0ae376e6 100644 --- a/meshroom/ui/qml/Viewer3D/Materials/WireframeEffect.qml +++ b/meshroom/ui/qml/Viewer3D/Materials/WireframeEffect.qml @@ -5,10 +5,6 @@ Effect { id: root parameters: [ - Parameter { name: "ka"; value: Qt.vector3d(0.1, 0.1, 0.1) }, - Parameter { name: "kd"; value: Qt.vector3d(0.7, 0.7, 0.7) }, - Parameter { name: "ks"; value: Qt.vector3d(0.95, 0.95, 0.95) }, - Parameter { name: "shininess"; value: 150.0 } ] techniques: [ @@ -23,17 +19,12 @@ Effect { filterKeys: [ FilterKey { name: "renderingStyle"; value: "forward" } ] parameters: [ - Parameter { name: "light.position"; value: Qt.vector4d(0.0, 0.0, 0.0, 1.0) }, - Parameter { name: "light.intensity"; value: Qt.vector3d(1.0, 1.0, 1.0) }, - Parameter { name: "line.width"; value: 1.0 }, - Parameter { name: "line.color"; value: Qt.vector4d(1.0, 1.0, 1.0, 1.0) } ] renderPasses: [ RenderPass { shaderProgram: ShaderProgram { vertexShaderCode: loadSource(Qt.resolvedUrl("shaders/robustwireframe.vert")) - geometryShaderCode: loadSource(Qt.resolvedUrl("shaders/robustwireframe.geom")) fragmentShaderCode: loadSource(Qt.resolvedUrl("shaders/robustwireframe.frag")) } } diff --git a/meshroom/ui/qml/Viewer3D/Materials/WireframeMaterial.qml b/meshroom/ui/qml/Viewer3D/Materials/WireframeMaterial.qml index 37dc534c..c9b54131 100644 --- a/meshroom/ui/qml/Viewer3D/Materials/WireframeMaterial.qml +++ b/meshroom/ui/qml/Viewer3D/Materials/WireframeMaterial.qml @@ -4,25 +4,8 @@ import Qt3D.Render 2.6 Material { id: root - property color ambient: Qt.rgba(0.05, 0.05, 0.05, 1.0) - property color diffuse: Qt.rgba(0.7, 0.7, 0.7, 1.0) - property color specular: Qt.rgba(0.95, 0.95, 0.95, 1.0) - property real shininess: 1.0 - property real lineWidth: 0.8 - property color lineColor: Qt.rgba(0.2, 0.2, 0.2, 1.0) - property vector3d lightIntensity: Qt.vector3d(0.7, 0.7, 0.7) - property vector4d lightPosition: Qt.vector4d(0.0, 0.0, 0.0, 1.0) - effect: WireframeEffect {} parameters: [ - Parameter { name: "ka"; value: Qt.vector3d(root.ambient.r, root.ambient.g, root.ambient.b) }, - Parameter { name: "kd"; value: Qt.vector3d(root.diffuse.r, root.diffuse.g, root.diffuse.b) }, - Parameter { name: "ksp"; value: Qt.vector3d(root.specular.r, root.specular.g, root.specular.b) }, - Parameter { name: "shininess"; value: root.shininess }, - Parameter { name: "line.width"; value: root.lineWidth }, - Parameter { name: "line.color"; value: root.lineColor }, - Parameter { name: "light.intensity"; value: root.lightIntensity }, - Parameter { name: "light.position"; value: root.lightPosition } ] } diff --git a/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.frag b/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.frag index 89d21e98..a84351c0 100644 --- a/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.frag +++ b/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.frag @@ -1,112 +1,17 @@ -#version 330 core +#version 450 -uniform struct LightInfo { - vec4 position; - vec3 intensity; -} light; +#extension GL_NV_fragment_shader_barycentric : require -uniform struct LineInfo { - float width; - vec4 color; -} line; - -uniform vec3 ka; // Ambient reflectivity -uniform vec3 kd; // Diffuse reflectivity -uniform vec3 ks; // Specular reflectivity -uniform float shininess; // Specular shininess factor - -in WireframeVertex { - vec3 position; - vec3 normal; - noperspective vec4 edgeA; - noperspective vec4 edgeB; - flat int configuration; -} fs_in; - -out vec4 fragColor; - -vec3 adsModel( const in vec3 pos, const in vec3 n ) -{ - // Calculate the vector from the light to the fragment - vec3 s = normalize( vec3( light.position ) - pos ); - - // Calculate the vector from the fragment to the eye position (the - // origin since this is in "eye" or "camera" space - vec3 v = normalize( -pos ); - - // Calculate the diffus component - vec3 diffuse = vec3( max( dot( s, n ), 0.0 ) ); - - // Calculate the specular component - vec3 specular = vec3(0.0, 0.0, 0.0); - if(shininess > 0) - { - // Refleft the light beam using the normal at this fragment - vec3 r = reflect( -s, n ); - vec3( pow( max( dot( r, v ), 0.0 ), shininess ) ); - } - - // Combine the ambient, diffuse and specular contributions - return light.intensity * ( ka + kd * diffuse + ks * specular ); -} - - -vec4 shadeLine( const in vec4 color ) -{ - // Find the smallest distance between the fragment and a triangle edge - float d; - if ( fs_in.configuration == 0 ) - { - // Common configuration - d = min( fs_in.edgeA.x, fs_in.edgeA.y ); - d = min( d, fs_in.edgeA.z ); - } - else - { - // Handle configuration where screen space projection breaks down - // Compute and compare the squared distances - vec2 AF = gl_FragCoord.xy - fs_in.edgeA.xy; - float sqAF = dot( AF, AF ); - float AFcosA = dot( AF, fs_in.edgeA.zw ); - d = abs( sqAF - AFcosA * AFcosA ); - - vec2 BF = gl_FragCoord.xy - fs_in.edgeB.xy; - float sqBF = dot( BF, BF ); - float BFcosB = dot( BF, fs_in.edgeB.zw ); - d = min( d, abs( sqBF - BFcosB * BFcosB ) ); - - // Only need to care about the 3rd edge for some configurations. - if ( fs_in.configuration == 1 || fs_in.configuration == 2 || fs_in.configuration == 4 ) - { - float AFcosA0 = dot( AF, normalize( fs_in.edgeB.xy - fs_in.edgeA.xy ) ); - d = min( d, abs( sqAF - AFcosA0 * AFcosA0 ) ); - } - - d = sqrt( d ); - } - - // Blend between line color and phong color - float mixVal; - if ( d < line.width - 1.0 ) - { - mixVal = 1.0; - } - else if ( d > line.width + 1.0 ) - { - mixVal = 0.0; - } - else - { - float x = d - ( line.width - 1.0 ); - mixVal = exp2( -2.0 * ( x * x ) ); - } - - return mix( color, line.color, mixVal ); -} +layout(location = 0) out vec4 fragColor; void main() { - // Calculate the color from the phong model - vec4 color = vec4( adsModel( fs_in.position, normalize( fs_in.normal ) ), 1.0 ); - fragColor = shadeLine( color ); + vec3 barycentric = gl_BaryCoordNV; + + float mindist = min(min(barycentric.x, barycentric.y), barycentric.z); + + if (mindist < 0.05) + { + fragColor = vec4(1.0, 1.0, 1.0, 1.0); + } } diff --git a/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.geom b/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.geom deleted file mode 100644 index 86d0423c..00000000 --- a/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.geom +++ /dev/null @@ -1,131 +0,0 @@ -#version 330 core - -layout( triangles ) in; -layout( triangle_strip, max_vertices = 3 ) out; - -in EyeSpaceVertex { - vec3 position; - vec3 normal; -} gs_in[]; - -out WireframeVertex { - vec3 position; - vec3 normal; - noperspective vec4 edgeA; - noperspective vec4 edgeB; - flat int configuration; -} gs_out; - -uniform mat4 viewportMatrix; - -const int infoA[] = int[]( 0, 0, 0, 0, 1, 1, 2 ); -const int infoB[] = int[]( 1, 1, 2, 0, 2, 1, 2 ); -const int infoAd[] = int[]( 2, 2, 1, 1, 0, 0, 0 ); -const int infoBd[] = int[]( 2, 2, 1, 2, 0, 2, 1 ); - -vec2 transformToViewport( const in vec4 p ) -{ - return vec2( viewportMatrix * ( p / p.w ) ); -} - -void main() -{ - gs_out.configuration = int(gl_in[0].gl_Position.z < 0) * int(4) - + int(gl_in[1].gl_Position.z < 0) * int(2) - + int(gl_in[2].gl_Position.z < 0); - - // If all vertices are behind us, cull the primitive - if (gs_out.configuration == 7) - return; - - // Transform each vertex into viewport space - vec2 p[3]; - p[0] = transformToViewport( gl_in[0].gl_Position ); - p[1] = transformToViewport( gl_in[1].gl_Position ); - p[2] = transformToViewport( gl_in[2].gl_Position ); - - if (gs_out.configuration == 0) - { - // Common configuration where all vertices are within the viewport - gs_out.edgeA = vec4(0.0); - gs_out.edgeB = vec4(0.0); - - // Calculate lengths of 3 edges of triangle - float a = length( p[1] - p[2] ); - float b = length( p[2] - p[0] ); - float c = length( p[1] - p[0] ); - - // Calculate internal angles using the cosine rule - float alpha = acos( ( b * b + c * c - a * a ) / ( 2.0 * b * c ) ); - float beta = acos( ( a * a + c * c - b * b ) / ( 2.0 * a * c ) ); - - // Calculate the perpendicular distance of each vertex from the opposing edge - float ha = abs( c * sin( beta ) ); - float hb = abs( c * sin( alpha ) ); - float hc = abs( b * sin( alpha ) ); - - // Now add this perpendicular distance as a per-vertex property in addition to - // the position and normal calculated in the vertex shader. - - // Vertex 0 (a) - gs_out.edgeA = vec4( ha, 0.0, 0.0, 0.0 ); - gs_out.normal = gs_in[0].normal; - gs_out.position = gs_in[0].position; - gl_Position = gl_in[0].gl_Position; - EmitVertex(); - - // Vertex 1 (b) - gs_out.edgeA = vec4( 0.0, hb, 0.0, 0.0 ); - gs_out.normal = gs_in[1].normal; - gs_out.position = gs_in[1].position; - gl_Position = gl_in[1].gl_Position; - EmitVertex(); - - // Vertex 2 (c) - gs_out.edgeA = vec4( 0.0, 0.0, hc, 0.0 ); - gs_out.normal = gs_in[2].normal; - gs_out.position = gs_in[2].position; - gl_Position = gl_in[2].gl_Position; - EmitVertex(); - - // Finish the primitive off - EndPrimitive(); - } - else - { - // Viewport projection breaks down for one or two vertices. - // Calculate what we can here and defer rest to fragment shader. - // Since this is coherent for the entire primitive the conditional - // in the fragment shader is still cheap as all concurrent - // fragment shader invocations will take the same code path. - - // Copy across the viewport-space points for the (up to) two vertices - // in the viewport - gs_out.edgeA.xy = p[infoA[gs_out.configuration]]; - gs_out.edgeB.xy = p[infoB[gs_out.configuration]]; - - // Copy across the viewport-space edge vectors for the (up to) two vertices - // in the viewport - gs_out.edgeA.zw = normalize( gs_out.edgeA.xy - p[ infoAd[gs_out.configuration] ] ); - gs_out.edgeB.zw = normalize( gs_out.edgeB.xy - p[ infoBd[gs_out.configuration] ] ); - - // Pass through the other vertex attributes - gs_out.normal = gs_in[0].normal; - gs_out.position = gs_in[0].position; - gl_Position = gl_in[0].gl_Position; - EmitVertex(); - - gs_out.normal = gs_in[1].normal; - gs_out.position = gs_in[1].position; - gl_Position = gl_in[1].gl_Position; - EmitVertex(); - - gs_out.normal = gs_in[2].normal; - gs_out.position = gs_in[2].position; - gl_Position = gl_in[2].gl_Position; - EmitVertex(); - - // Finish the primitive off - EndPrimitive(); - } -} diff --git a/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.vert b/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.vert index e53a2b59..770df4e6 100644 --- a/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.vert +++ b/meshroom/ui/qml/Viewer3D/Materials/shaders/robustwireframe.vert @@ -1,21 +1,39 @@ -#version 330 core +#version 450 core -in vec3 vertexPosition; -in vec3 vertexNormal; +layout(location = 0) in vec3 vertexPosition; -out EyeSpaceVertex { - vec3 position; - vec3 normal; -} vs_out; +layout(std140, binding = 0) uniform qt3d_render_view_uniforms { + mat4 viewMatrix; + mat4 projectionMatrix; + mat4 uncorrectedProjectionMatrix; + mat4 clipCorrectionMatrix; + mat4 viewProjectionMatrix; + mat4 inverseViewMatrix; + mat4 inverseProjectionMatrix; + mat4 inverseViewProjectionMatrix; + mat4 viewportMatrix; + mat4 inverseViewportMatrix; + vec4 textureTransformMatrix; + vec3 eyePosition; + float aspectRatio; + float gamma; + float exposure; + float time; + float yUpInNDC; + float yUpInFBO; +}; -uniform mat4 modelView; -uniform mat3 modelViewNormal; -uniform mat4 mvp; +layout(std140, binding = 1) uniform qt3d_command_uniforms { + mat4 modelMatrix; + mat4 inverseModelMatrix; + mat4 modelViewMatrix; + mat3 modelNormalMatrix; + mat4 inverseModelViewMatrix; + mat4 modelViewProjection; + mat4 inverseModelViewProjectionMatrix; +}; void main() { - vs_out.normal = normalize( modelViewNormal * vertexNormal ); - vs_out.position = vec3( modelView * vec4( vertexPosition, 1.0 ) ); - - gl_Position = mvp * vec4( vertexPosition, 1.0 ); + gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4( vertexPosition, 1.0 ); } diff --git a/meshroom/ui/qml/Viewer3D/Viewer3DSettings.qml b/meshroom/ui/qml/Viewer3D/Viewer3DSettings.qml index d4c02780..e8ffc939 100644 --- a/meshroom/ui/qml/Viewer3D/Viewer3DSettings.qml +++ b/meshroom/ui/qml/Viewer3D/Viewer3DSettings.qml @@ -30,7 +30,7 @@ Item { // Available render modes readonly property var renderModes: [ // Can't use ListModel because of MaterialIcons expressions {"name": "Solid", "icon": MaterialIcons.crop_din }, - /* {"name": "Wireframe", "icon": MaterialIcons.details }, */ + {"name": "Wireframe", "icon": MaterialIcons.details }, {"name": "Textured", "icon": MaterialIcons.texture }, {"name": "Spherical Harmonics", "icon": MaterialIcons.brightness_7} ]