commit 358b00c1371eda630adef5897c6a8e4fad42a183
parent 4bb8948d0893a77fe836788c36e48740791f86c3
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Fri, 16 Feb 2018 15:30:35 +0100
Bugfix: mutiple bugs in analyze.
When selecting the starting point for inter-component raytracing.
Diffstat:
1 file changed, 29 insertions(+), 10 deletions(-)
diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c
@@ -151,7 +151,7 @@ find_component_Zmax
* This is mandatory to select the correct side when both sides of a triangle
* are candidate. */
if(cc->max_vrtx[2] > trg_tmp->max_z)
- return;
+ continue;
d3_sub(edge0, vertices[trg_in->vertice_id[1]].vec,
vertices[trg_in->vertice_id[0]].vec);
@@ -189,6 +189,7 @@ find_component_Zmax
ASSERT(trg_tmp->max_z_vrtx_id < 3);
ASSERT(trg_in->vertice_id[trg_tmp->max_z_vrtx_id] < scn->nverts);
cc->max_z_vrtx_id = trg_in->vertice_id[trg_tmp->max_z_vrtx_id];
+ ASSERT(trg_tmp->max_z == vertices[cc->max_z_vrtx_id].pos.z);
d3_set(cc->max_vrtx, vertices[cc->max_z_vrtx_id].vec);
}
}
@@ -812,13 +813,13 @@ link_neighbours
edge_count = (edge_id_t)tmp;
FOR_EACH(e, 0, edge_count) {
- double edge[3], common_edge[3], basis[9], norm, mz;
+ double edge[3], common_edge[3], basis[9], norm, mz, mz_edge;
vrtx_id_t v0, v1, v2;
struct edge_neighbourhood* neighbourhood
= darray_neighbourhood_data_get(neighbourhood_by_edge) + e;
struct darray_neighbour* neighbour_list = &neighbourhood->neighbours;
side_id_t i, neighbour_count;
- char mz_vid;
+ char mz_vid, mz_vid_edge;
tmp = darray_neighbour_size_get(neighbour_list);
ASSERT(tmp <= SIDE_MAX__);
neighbour_count = (side_id_t)tmp;
@@ -827,11 +828,11 @@ link_neighbours
v1 = neighbourhood->edge.vrtx1;
d3_sub(common_edge, vertices[v1].vec, vertices[v0].vec);
if(vertices[v0].pos.z > vertices[v1].pos.z) {
- mz = vertices[v0].pos.z;
- mz_vid = 0;
+ mz_edge = vertices[v0].pos.z;
+ mz_vid_edge = 0;
} else {
- mz = vertices[v1].pos.z;
- mz_vid = 1;
+ mz_edge = vertices[v1].pos.z;
+ mz_vid_edge = 1;
}
norm = d3_normalize(common_edge, common_edge);
ASSERT(norm);
@@ -842,20 +843,38 @@ link_neighbours
= darray_neighbour_data_get(neighbour_list) + i;
struct triangle_in *trg_in = triangles_in + neighbour_info->trg_id;
struct triangle_tmp *neighbour = triangles_tmp + neighbour_info->trg_id;
+ char actual_vid;
v2 = trg_in->vertice_id[(neighbour_info->edge_rank + 2) % 3];
- if(vertices[v2].pos.z > mz) {
+ if(vertices[v2].pos.z > mz_edge) {
mz = vertices[v2].pos.z;
mz_vid = 2;
+ } else {
+ mz = mz_edge;
+ mz_vid = mz_vid_edge;
+ }
+ /* Compute the actual vertex id
+ * as vertices are not in the v0 v1 v2 order in the actual triangle */
+ if (mz_vid == 2) {
+ actual_vid = (2 + neighbour_info->edge_rank) % 3;
+ }
+ else {
+ int is_r = neighbour->reversed_edge[neighbour_info->edge_rank];
+ ASSERT(mz_vid == 0 || mz_vid == 1);
+ actual_vid = ((is_r ? 1 - mz_vid : mz_vid) + neighbour_info->edge_rank) % 3;
}
+
+ ASSERT(neighbour->max_z <= mz);
neighbour->max_z = mz;
- neighbour->max_z_vrtx_id = mz_vid;
+ ASSERT(0 <= actual_vid && actual_vid <= 2);
+ neighbour->max_z_vrtx_id = actual_vid;
/* Compute rotation angle around common edge */
d3_sub(edge, vertices[v2].vec, vertices[v0].vec);
d33_muld3(edge, basis, edge);
ASSERT(d3_len(edge) && (edge[0] || edge[1]));
neighbour_info->angle = atan2(edge[1], edge[0]);
if(neighbour_info->angle < 0) neighbour_info->angle += 2 * PI;
- ASSERT(0 <= neighbour_info->angle && neighbour_info->angle < 2 * PI);
+ /* Due to catastrophic cancelation, -eps+2pi translates to 2pi */
+ ASSERT(0 <= neighbour_info->angle && neighbour_info->angle <= 2 * PI);
}
/* Sort triangles by rotation angle */
qsort(darray_neighbour_data_get(neighbour_list), neighbour_count,