Skip to content

Commit 852dde9

Browse files
fix surfel shader projection scaling
1 parent 5a703a8 commit 852dde9

12 files changed

Lines changed: 323 additions & 248 deletions

src/OpenCOVER/plugins/hlrs/LamurePointCloud/Lamure.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,7 @@ void Lamure::loadSettingsFromCovise() {
490490
// ---- Modelle: models (Semikolon), optional data_dir (rekursiv .bvh) ----
491491
// Check if the plugin itself is set to 'on' (via value attribute) and no command-line models exist.
492492
bool load_from_config = getOn((std::string(root)).c_str(), false);
493+
std::cout << load_from_config << std::endl;
493494
if (load_from_config && s.models.empty()) {
494495
const std::string models_list = getStr((std::string(root) + ".models").c_str(), "");
495496
const std::string data_dir = getStr((std::string(root) + ".data_dir").c_str(), "");
@@ -516,8 +517,8 @@ void Lamure::loadSettingsFromCovise() {
516517
#ifdef _WIN32
517518
std::replace(abs.begin(), abs.end(), '\\', '/');
518519
#endif
519-
if (seen.insert(abs).second) // nur erster Fund bleibt erhalten (Index-Stabilität)
520-
norm.push_back(std::move(abs));
520+
if (seen.insert(abs).second) // nur erster Fund bleibt erhalten (Index-Stabilität)
521+
norm.push_back(std::move(abs));
521522
}
522523
s.models = std::move(norm);
523524
}
@@ -667,8 +668,6 @@ void Lamure::dumpSettings(const char* tag){
667668
? static_cast<double>(opencover::cover->getScale())
668669
: static_cast<double>(covise::coCoviseConfig::getFloat("value","COVER.DefaultScaleFactor",1.0f));
669670

670-
std::cout << "--- Lamure::Settings " << (tag?tag:"") << " ---\n";
671-
672671
// Modelle
673672
std::cout << "models: " << s.models.size() << " (loaded=" << s.num_models << ")\n";
674673
for(size_t i=0;i<std::min<size_t>(s.models.size(),3);++i)
@@ -806,6 +805,17 @@ void Lamure::preFrame() {
806805

807806
{
808807
std::lock_guard<std::mutex> lock(g_settings_mutex);
808+
809+
// Ensure scene graph nodes exist for all models after a reload
810+
//for (const auto& model_path : models) {
811+
// if (m_model_nodes.find(model_path) == m_model_nodes.end()) {
812+
// osg::ref_ptr<osg::Group> modelNode = new osg::Group();
813+
// modelNode->setName(model_path);
814+
// m_lamure_grp->addChild(modelNode.get());
815+
// m_model_nodes[model_path] = modelNode;
816+
// }
817+
//}
818+
809819
if (m_settings.model_visible.size() < models.size()) {
810820
m_settings.model_visible.resize(models.size(), true);
811821
}

src/OpenCOVER/plugins/hlrs/LamurePointCloud/LamureRenderer.cpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ struct PointsDrawCallback : public virtual osg::Drawable::DrawCallback
943943
scm::math::mat4 mvp_matrix = projection_matrix * model_view_matrix;
944944
scm::gl::frustum frustum = _renderer->getScmCamera()->get_frustum_by_model(model_matrix);
945945

946-
_renderer->setModelUniforms(mvp_matrix);
946+
_renderer->setModelUniforms(mvp_matrix, model_view_matrix);
947947
for (auto const& node_slot_aggregate : renderable) {
948948

949949
if (_renderer->getScmCamera()->cull_against_frustum(frustum, bounding_box_vector[node_slot_aggregate.node_id_]) != 1) {
@@ -1349,6 +1349,7 @@ void LamureRenderer::initUniforms()
13491349

13501350
glUseProgram(m_surfel_shader.program);
13511351
m_surfel_shader.mvp_matrix_loc = glGetUniformLocation(m_surfel_shader.program, "mvp_matrix");
1352+
m_surfel_shader.model_view_matrix_loc = glGetUniformLocation(m_surfel_shader.program, "model_view_matrix");
13521353
m_surfel_shader.max_radius_loc = glGetUniformLocation(m_surfel_shader.program, "max_radius");
13531354
m_surfel_shader.min_radius_loc = glGetUniformLocation(m_surfel_shader.program, "min_radius");
13541355
m_surfel_shader.max_screen_size_loc = glGetUniformLocation(m_surfel_shader.program, "max_screen_size");
@@ -1361,6 +1362,7 @@ void LamureRenderer::initUniforms()
13611362

13621363
glUseProgram(m_surfel_color_shader.program);
13631364
m_surfel_color_shader.mvp_matrix_loc = glGetUniformLocation(m_surfel_color_shader.program, "mvp_matrix");
1365+
m_surfel_color_shader.model_view_matrix_loc = glGetUniformLocation(m_surfel_color_shader.program, "model_view_matrix");
13641366
m_surfel_color_shader.view_matrix_loc = glGetUniformLocation(m_surfel_color_shader.program, "view_matrix");
13651367
m_surfel_color_shader.normal_matrix_loc = glGetUniformLocation(m_surfel_color_shader.program, "normal_matrix");
13661368
m_surfel_color_shader.max_radius_loc = glGetUniformLocation(m_surfel_color_shader.program, "max_radius");
@@ -1382,6 +1384,7 @@ void LamureRenderer::initUniforms()
13821384

13831385
glUseProgram(m_surfel_color_lighting_shader.program);
13841386
m_surfel_color_lighting_shader.mvp_matrix_loc = glGetUniformLocation(m_surfel_color_lighting_shader.program, "mvp_matrix");
1387+
m_surfel_color_lighting_shader.model_view_matrix_loc = glGetUniformLocation(m_surfel_color_lighting_shader.program, "model_view_matrix");
13851388
m_surfel_color_lighting_shader.view_matrix_loc = glGetUniformLocation(m_surfel_color_lighting_shader.program, "view_matrix");
13861389
m_surfel_color_lighting_shader.normal_matrix_loc = glGetUniformLocation(m_surfel_color_lighting_shader.program, "normal_matrix");
13871390
m_surfel_color_lighting_shader.max_radius_loc = glGetUniformLocation(m_surfel_color_lighting_shader.program, "max_radius");
@@ -1803,15 +1806,30 @@ void LamureRenderer::setFrameUniforms(const scm::math::mat4& projection_matrix,
18031806
}
18041807
}
18051808

1806-
void LamureRenderer::setModelUniforms(const scm::math::mat4& mvp_matrix) {
1809+
void LamureRenderer::setModelUniforms(const scm::math::mat4& mvp_matrix, const scm::math::mat4& model_view_matrix) {
18071810
switch (m_plugin->getSettings().shader_type) {
18081811
case ShaderType::Point: glUniformMatrix4fv(m_point_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array); break;
18091812
case ShaderType::PointColor: glUniformMatrix4fv(m_point_color_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array); break;
18101813
case ShaderType::PointColorLighting: glUniformMatrix4fv(m_point_color_lighting_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array); break;
18111814
case ShaderType::PointProv: glUniformMatrix4fv(m_point_prov_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array); break;
1812-
case ShaderType::Surfel: glUniformMatrix4fv(m_surfel_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array); break;
1813-
case ShaderType::SurfelColor: glUniformMatrix4fv(m_surfel_color_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array); break;
1814-
case ShaderType::SurfelColorLighting: glUniformMatrix4fv(m_surfel_color_lighting_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array); break;
1815+
case ShaderType::Surfel:
1816+
glUniformMatrix4fv(m_surfel_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array);
1817+
if (m_surfel_shader.model_view_matrix_loc >= 0) {
1818+
glUniformMatrix4fv(m_surfel_shader.model_view_matrix_loc, 1, GL_FALSE, model_view_matrix.data_array);
1819+
}
1820+
break;
1821+
case ShaderType::SurfelColor:
1822+
glUniformMatrix4fv(m_surfel_color_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array);
1823+
if (m_surfel_color_shader.model_view_matrix_loc >= 0) {
1824+
glUniformMatrix4fv(m_surfel_color_shader.model_view_matrix_loc, 1, GL_FALSE, model_view_matrix.data_array);
1825+
}
1826+
break;
1827+
case ShaderType::SurfelColorLighting:
1828+
glUniformMatrix4fv(m_surfel_color_lighting_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array);
1829+
if (m_surfel_color_lighting_shader.model_view_matrix_loc >= 0) {
1830+
glUniformMatrix4fv(m_surfel_color_lighting_shader.model_view_matrix_loc, 1, GL_FALSE, model_view_matrix.data_array);
1831+
}
1832+
break;
18151833
case ShaderType::SurfelProv: glUniformMatrix4fv(m_surfel_prov_shader.mvp_matrix_loc, 1, GL_FALSE, mvp_matrix.data_array); break;
18161834
case ShaderType::SurfelMultipass: break;
18171835
}

src/OpenCOVER/plugins/hlrs/LamurePointCloud/LamureRenderer.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ class LamureRenderer {
146146
GLint normal_matrix_loc {-1}; // mat3 normal_matrix
147147
GLint max_radius_loc {-1};
148148
GLint min_radius_loc {-1};
149-
GLint max_screen_size_loc{-1};
150-
GLint min_screen_size_loc{-1};
149+
GLint max_screen_size_loc {-1};
150+
GLint min_screen_size_loc {-1};
151151
GLint scale_radius_gamma_loc {-1};
152152
GLint max_radius_cut_loc {-1};
153153
GLint scale_radius_loc {-1};
@@ -171,6 +171,7 @@ class LamureRenderer {
171171
struct SurfelShader {
172172
GLuint program{0};
173173
GLint mvp_matrix_loc{-1};
174+
GLint model_view_matrix_loc {-1};
174175
GLint max_radius_loc{-1};
175176
GLint min_radius_loc{-1};
176177
GLint max_screen_size_loc{-1};
@@ -183,14 +184,15 @@ class LamureRenderer {
183184
SurfelShader m_surfel_shader;
184185

185186
struct SurfelColorShader {
186-
GLuint program{0};
187+
GLuint program {0};
187188
GLint mvp_matrix_loc {-1}; // mat4 mvp_matrix
188189
GLint view_matrix_loc {-1}; // mat4 view_matrix
190+
GLint model_view_matrix_loc {-1};
189191
GLint normal_matrix_loc {-1}; // mat3 normal_matrix
190192
GLint min_radius_loc {-1}; // float min_radius
191193
GLint max_radius_loc {-1}; // float max_radius
192-
GLint max_screen_size_loc{-1};
193-
GLint min_screen_size_loc{-1};
194+
GLint max_screen_size_loc {-1};
195+
GLint min_screen_size_loc {-1};
194196
GLint scale_radius_gamma_loc {-1};
195197
GLint max_radius_cut_loc {-1};
196198
GLint scale_radius_loc {-1}; // float scale_radius
@@ -209,10 +211,11 @@ class LamureRenderer {
209211
GLuint program{0};
210212
GLint mvp_matrix_loc {-1}; // mat4 mvp_matrix
211213
GLint view_matrix_loc {-1}; // mat4 view_matrix
214+
GLint model_view_matrix_loc {-1};
212215
GLint normal_matrix_loc {-1}; // mat3 normal_matrix
213216
GLint max_radius_loc {-1}; // float max_radius
214-
GLint max_screen_size_loc{-1};
215-
GLint min_screen_size_loc{-1};
217+
GLint max_screen_size_loc {-1};
218+
GLint min_screen_size_loc {-1};
216219
GLint min_radius_loc {-1}; // float min_radius
217220
GLint scale_radius_loc {-1}; // float scale_radius
218221
GLint scale_radius_gamma_loc {-1};
@@ -244,8 +247,8 @@ class LamureRenderer {
244247
GLint normal_matrix_loc {-1}; // mat3 normal_matrix
245248
GLint min_radius_loc {-1}; // float min_radius
246249
GLint max_radius_loc {-1}; // float max_radius
247-
GLint min_screen_size_loc {-1};
248-
GLint max_screen_size_loc {-1};
250+
GLint min_screen_size_loc {-1};
251+
GLint max_screen_size_loc {-1};
249252
GLint scale_radius_gamma_loc {-1};
250253
GLint max_radius_cut_loc {-1};
251254
GLint scale_radius_loc {-1}; // float scale_radius
@@ -669,7 +672,7 @@ class LamureRenderer {
669672
const std::vector<ShaderInfo>& getPclShader() const { return pcl_shader; }
670673

671674
void setFrameUniforms(const scm::math::mat4& projection_matrix, const scm::math::vec2& viewport);
672-
void setModelUniforms(const scm::math::mat4& mvp_matrix);
675+
void setModelUniforms(const scm::math::mat4& mvp_matrix, const scm::math::mat4& model_view_matrix);
673676
void setNodeUniforms(const lamure::ren::bvh* bvh, uint32_t node_id);
674677
void resetLamureSystemAndWait();
675678

src/OpenCOVER/plugins/hlrs/LamurePointCloud/shaders/vis/vis_surfel.glslg

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,62 @@
11
#version 420 core
22

3+
INCLUDE vis_surfel_util.glsl
4+
35
layout(points) in;
46
layout(triangle_strip, max_vertices = 4) out;
57

68
in VertexData {
7-
vec3 pass_ms_u; // Halbachse U (WS, Radius)
8-
vec3 pass_ms_v; // Halbachse V (WS, Radius)
9+
vec3 pass_ms_u;
10+
vec3 pass_ms_v;
911
vec3 pass_point_color;
1012
vec3 pass_world_pos;
11-
float pass_radius_ws; // Durchmesser (WS) nach World-CLAMP (0 bei Cut)
13+
float pass_radius_ws;
1214
} VertexIn[];
1315

1416
uniform mat4 mvp_matrix;
17+
uniform mat4 model_view_matrix;
1518
uniform vec2 viewport;
16-
uniform float min_screen_size; // Pixel-CLAMP (Durchmesser)
17-
uniform float max_screen_size; // Pixel-CLAMP (Durchmesser)
19+
uniform float min_screen_size;
20+
uniform float max_screen_size;
1821
uniform float scale_projection;
1922

2023
out FS_IN {
2124
vec3 pass_point_color;
2225
vec2 pass_uv_coords;
2326
vec3 pass_world_pos;
24-
float pass_radius_ws; // effektiver WS-Durchmesser nach Pixel-CLAMP
25-
float pass_screen_size; // Pixel-Durchmesser nach Pixel-CLAMP
27+
float pass_radius_ws;
28+
float pass_screen_size;
2629
} gOut;
2730

2831
void main() {
29-
const float EPS = 1e-6;
30-
3132
gOut.pass_point_color = VertexIn[0].pass_point_color;
3233
gOut.pass_world_pos = VertexIn[0].pass_world_pos;
3334

3435
vec3 center = VertexIn[0].pass_world_pos;
35-
vec3 step_u = VertexIn[0].pass_ms_u; // Radius
36-
vec3 step_v = VertexIn[0].pass_ms_v; // Radius
36+
vec3 step_u = VertexIn[0].pass_ms_u;
37+
vec3 step_v = VertexIn[0].pass_ms_v;
3738

38-
// Optionaler Kurzschluss: falls bereits degeneriert, nichts emittieren
39-
if (all(lessThanEqual(abs(step_u) + abs(step_v), vec3(EPS)))) {
39+
// Call the new scaling function
40+
float pixel_diameter, world_radius;
41+
if (!scale_surfel_for_screen(
42+
center,
43+
model_view_matrix,
44+
scale_projection,
45+
min_screen_size,
46+
max_screen_size,
47+
step_u,
48+
step_v,
49+
pixel_diameter,
50+
world_radius
51+
)) {
4052
return;
4153
}
4254

43-
// Projektionsfaktor am Mittelpunkt
44-
vec4 Pc = mvp_matrix * vec4(center, 1.0);
45-
float w0 = max(EPS, abs(Pc.w));
46-
47-
// Ausgangs-WS-Durchmesser & Pixel-Durchmesser
48-
float r_ws = length(step_u);
49-
float d_ws = 2.0 * r_ws;
50-
float d_px = (d_ws * scale_projection) / w0;
51-
52-
// Pixel-CLAMP (Durchmesser) + isotrope Skalierung der Halbachsen
53-
float d_pxC = clamp(d_px, min_screen_size, max_screen_size);
54-
if (d_pxC <= EPS) return; // optional: unsichtbar -> skip
55-
56-
float s = (d_px > EPS) ? (d_pxC / d_px) : 1.0;
57-
step_u *= s;
58-
step_v *= s;
59-
60-
// Werte für FS
61-
gOut.pass_radius_ws = length(step_u); // effektiver WS-Radius nach Pixel-CLAMP
62-
gOut.pass_screen_size = d_pxC; // Pixel-Durchmesser nach Pixel-CLAMP
55+
// Pass results to fragment shader
56+
gOut.pass_radius_ws = world_radius;
57+
gOut.pass_screen_size = pixel_diameter;
6358

59+
// Generate quad vertices
6460
vec3 offs[4] = vec3[4](
6561
-step_u - step_v,
6662
step_u - step_v,

src/OpenCOVER/plugins/hlrs/LamurePointCloud/shaders/vis/vis_surfel.glslv

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,49 @@
11
#version 420 core
22

3+
INCLUDE vis_surfel_util.glsl
4+
35
layout(location = 0) in vec3 in_position;
46
layout(location = 1) in float in_r;
57
layout(location = 2) in float in_g;
68
layout(location = 3) in float in_b;
79
layout(location = 4) in float empty;
8-
layout(location = 5) in float in_radius; // Roh-DURCHMESSER (Attribute)
10+
layout(location = 5) in float in_radius; // Roh-RADIUS (Attribute)
911
layout(location = 6) in vec3 in_normal;
1012

1113
uniform mat4 mvp_matrix;
1214

13-
uniform float min_radius; // World-CLAMP (Durchmesser)
14-
uniform float max_radius; // World-CLAMP (Durchmesser)
15-
uniform float scale_radius; // Roh -> Welt (Durchmesser)
16-
uniform float scale_radius_gamma; // Gamma auf Roh-Durchmesser
15+
uniform float min_radius; // World-CLAMP (Radius)
16+
uniform float max_radius; // World-CLAMP (Radius)
17+
uniform float scale_radius; // Roh -> Welt (Radius)
18+
uniform float scale_radius_gamma; // Gamma auf Roh-Radius
1719
uniform float max_radius_cut; // CUT im Roh-RADIUS (vor Scaling!)
1820

1921
out VertexData {
2022
vec3 pass_ms_u; // Halbachse U (WS, Radius)
2123
vec3 pass_ms_v; // Halbachse V (WS, Radius)
2224
vec3 pass_point_color; // RGB
2325
vec3 pass_world_pos; // Mittelpunkt (WS)
24-
float pass_radius_ws; // Durchmesser (WS) nach World-CLAMP (Pixel-CLAMP folgt im GS)
26+
float pass_radius_ws; // Radius (WS) nach World-CLAMP (Pixel-CLAMP folgt im GS)
2527
} VertexOut;
2628

2729
void main() {
28-
const float EPS = 1e-6;
29-
30-
// --- RAW-Radius & Cut im RAW-Domain ---
31-
float r_raw = max(0.0, in_radius);
32-
bool cut = (max_radius_cut > 0.0) && (r_raw > max_radius_cut);
33-
34-
// --- WS-Radius mit Gamma/Scale, danach CLAMP im WS ---
35-
float r_ws = 0.0;
36-
if (!cut) {
37-
float gamma = (scale_radius_gamma > 0.0) ? scale_radius_gamma : 1.0;
38-
float r_ws_unclamped = scale_radius * pow(r_raw, gamma); // WS-Radius
39-
r_ws = clamp(r_ws_unclamped, min_radius, max_radius); // << CLAMP NACH Skalierung (WS)
40-
}
41-
42-
// Normale & TBN
43-
vec3 n = normalize(length(in_normal) > EPS ? in_normal : vec3(0,0,1));
44-
vec3 ref = (abs(n.x)>abs(n.y) && abs(n.x)>abs(n.z)) ? vec3(0,1,0)
45-
: (abs(n.y)>abs(n.z) ? vec3(0,0,1) : vec3(1,0,0));
46-
vec3 u = normalize(cross(ref, n));
47-
vec3 v = normalize(cross(n, u));
48-
49-
VertexOut.pass_ms_u = u * (r_ws);
50-
VertexOut.pass_ms_v = v * (r_ws);
30+
// Calculate world-space radius from raw radius attribute
31+
float r_ws = calculate_world_space_radius(
32+
in_radius,
33+
max_radius_cut,
34+
scale_radius_gamma,
35+
scale_radius,
36+
min_radius,
37+
max_radius
38+
);
39+
40+
// Calculate tangent frame from normal
41+
vec3 u, v;
42+
calculate_orthonormal_basis(in_normal, u, v);
43+
44+
// Pass data to geometry shader
45+
VertexOut.pass_ms_u = u * r_ws;
46+
VertexOut.pass_ms_v = v * r_ws;
5147
VertexOut.pass_point_color = vec3(in_r, in_g, in_b);
5248
VertexOut.pass_world_pos = in_position;
5349
VertexOut.pass_radius_ws = r_ws;

0 commit comments

Comments
 (0)