mirror of https://github.com/CGAL/cgal
Changed limit from 24 to 128
This limit can be changed by updating number_of_bitset in * Scene_triangulation_3_item.h * shader_c3t3.frag * shader_c3t3_edges.frag
This commit is contained in:
parent
7674684146
commit
c44d66f84f
|
|
@ -11,6 +11,7 @@
|
||||||
#include <CGAL/double.h>
|
#include <CGAL/double.h>
|
||||||
|
|
||||||
#include "Scene_c3t3_item.h"
|
#include "Scene_c3t3_item.h"
|
||||||
|
#include "Scene_triangulation_3_item.h"
|
||||||
#include "Scene_tetrahedra_item.h"
|
#include "Scene_tetrahedra_item.h"
|
||||||
#include "Messages_interface.h"
|
#include "Messages_interface.h"
|
||||||
#include "CGAL_double_edit.h"
|
#include "CGAL_double_edit.h"
|
||||||
|
|
@ -150,9 +151,13 @@ public Q_SLOTS:
|
||||||
if(!tet_item)
|
if(!tet_item)
|
||||||
return;
|
return;
|
||||||
Scene_c3t3_item* c3t3_item = tet_item->c3t3_item();
|
Scene_c3t3_item* c3t3_item = tet_item->c3t3_item();
|
||||||
if(c3t3_item->subdomain_indices().size() > 25)
|
unsigned int max_number_of_item = 32*Scene_triangulation_3_item::number_of_bitset-1;
|
||||||
|
if(c3t3_item->subdomain_indices().size() >= max_number_of_item)
|
||||||
{
|
{
|
||||||
QMessageBox::warning(nullptr, "Warning", tr("The filtering is only available for items with less than 24 subdomains, and this one has %1").arg(c3t3_item->subdomain_indices().size()));
|
QString message = tr("The filtering is only available for items with less than %1 subdomains, and this one has %2")
|
||||||
|
.arg(max_number_of_item)
|
||||||
|
.arg(c3t3_item->subdomain_indices().size());
|
||||||
|
QMessageBox::warning(nullptr, "Warning", message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
|
|
|
||||||
|
|
@ -353,6 +353,7 @@ struct Scene_triangulation_3_item_priv {
|
||||||
is_aabb_tree_built = false;
|
is_aabb_tree_built = false;
|
||||||
alphaSlider = NULL;
|
alphaSlider = NULL;
|
||||||
is_filterable = true;
|
is_filterable = true;
|
||||||
|
memset(visible_biteset, 0xFFFF, Scene_triangulation_3_item::number_of_bitset * sizeof(uint)); // all bits set to 1
|
||||||
}
|
}
|
||||||
void computeIntersection(const Primitive& facet);
|
void computeIntersection(const Primitive& facet);
|
||||||
void fill_aabb_tree() {
|
void fill_aabb_tree() {
|
||||||
|
|
@ -492,7 +493,7 @@ struct Scene_triangulation_3_item_priv {
|
||||||
QVector<QColor> colors;
|
QVector<QColor> colors;
|
||||||
QVector<QColor> colors_subdomains;
|
QVector<QColor> colors_subdomains;
|
||||||
boost::dynamic_bitset<> visible_subdomain;
|
boost::dynamic_bitset<> visible_subdomain;
|
||||||
std::bitset<24> bs[4] = {16777215, 16777215, 16777215, 16777215};
|
std::bitset<32> visible_biteset[Scene_triangulation_3_item::number_of_bitset];
|
||||||
bool show_tetrahedra;
|
bool show_tetrahedra;
|
||||||
bool is_aabb_tree_built;
|
bool is_aabb_tree_built;
|
||||||
bool last_intersection;
|
bool last_intersection;
|
||||||
|
|
@ -659,7 +660,7 @@ Scene_triangulation_3_item::triangulation_changed()
|
||||||
}
|
}
|
||||||
const int max_subdomain_index = max;
|
const int max_subdomain_index = max;
|
||||||
d->visible_subdomain.resize(max_subdomain_index+1, true);
|
d->visible_subdomain.resize(max_subdomain_index+1, true);
|
||||||
d->is_filterable &=( d->subdomain_ids.size() <= 24);
|
d->is_filterable &=( d->subdomain_indices_.size() < 32*number_of_bitset-1);
|
||||||
for (Tr::Finite_facets_iterator fit = triangulation().finite_facets_begin(),
|
for (Tr::Finite_facets_iterator fit = triangulation().finite_facets_begin(),
|
||||||
end = triangulation().finite_facets_end(); fit != end; ++fit)
|
end = triangulation().finite_facets_end(); fit != end; ++fit)
|
||||||
{
|
{
|
||||||
|
|
@ -972,8 +973,9 @@ void Scene_triangulation_3_item::draw(CGAL::Three::Viewer_interface* viewer) con
|
||||||
program->bind();
|
program->bind();
|
||||||
if(d->is_filterable)
|
if(d->is_filterable)
|
||||||
{
|
{
|
||||||
QVector4D visible_bitset(d->bs[0].to_ulong(),d->bs[1].to_ulong(),d->bs[2].to_ulong(),d->bs[3].to_ulong());
|
GLuint visible_bitset_ulong[number_of_bitset];
|
||||||
program->setUniformValue("is_visible_bitset", visible_bitset);
|
memcpy(visible_bitset_ulong, d->visible_biteset, number_of_bitset * sizeof(uint));
|
||||||
|
program->setUniformValueArray("is_visible_bitset", visible_bitset_ulong, number_of_bitset);
|
||||||
}
|
}
|
||||||
program->setUniformValue("is_filterable", d->is_filterable);
|
program->setUniformValue("is_filterable", d->is_filterable);
|
||||||
program->release();
|
program->release();
|
||||||
|
|
@ -1051,8 +1053,9 @@ void Scene_triangulation_3_item::drawEdges(CGAL::Three::Viewer_interface* viewer
|
||||||
program->bind();
|
program->bind();
|
||||||
if(d->is_filterable)
|
if(d->is_filterable)
|
||||||
{
|
{
|
||||||
QVector4D visible_bitset(d->bs[0].to_ulong(),d->bs[1].to_ulong(),d->bs[2].to_ulong(),d->bs[3].to_ulong());
|
GLuint visible_bitset_ulong[number_of_bitset];
|
||||||
program->setUniformValue("is_visible_bitset", visible_bitset);
|
memcpy(visible_bitset_ulong, d->visible_biteset, number_of_bitset * sizeof(uint));
|
||||||
|
program->setUniformValueArray("is_visible_bitset", visible_bitset_ulong, number_of_bitset);
|
||||||
}
|
}
|
||||||
program->setUniformValue("is_filterable", d->is_filterable);
|
program->setUniformValue("is_filterable", d->is_filterable);
|
||||||
program->release();
|
program->release();
|
||||||
|
|
@ -2050,7 +2053,7 @@ void Scene_triangulation_3_item::switchVisibleSubdomain(int id)
|
||||||
int i = compact_id/32;
|
int i = compact_id/32;
|
||||||
int j = compact_id%32;
|
int j = compact_id%32;
|
||||||
|
|
||||||
d->bs[i][j] = d->visible_subdomain[id];
|
d->visible_biteset[i][j] = d->visible_subdomain[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene_triangulation_3_item::computeIntersection()
|
void Scene_triangulation_3_item::computeIntersection()
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ using namespace CGAL::Three;
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
typedef CGAL::qglviewer::ManipulatedFrame ManipulatedFrame;
|
typedef CGAL::qglviewer::ManipulatedFrame ManipulatedFrame;
|
||||||
|
static const int number_of_bitset = 4; // also defined in "shader_c3t3.frag" and "shader_c3t3_edges.frag"
|
||||||
|
|
||||||
Scene_triangulation_3_item(bool display_elements = true);
|
Scene_triangulation_3_item(bool display_elements = true);
|
||||||
Scene_triangulation_3_item(const T3 t3, bool display_elements = true);
|
Scene_triangulation_3_item(const T3 t3, bool display_elements = true);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
#version 150
|
#version 150
|
||||||
|
|
||||||
|
const int number_of_bitset = 4;
|
||||||
|
|
||||||
in vec4 color;
|
in vec4 color;
|
||||||
in vec4 fP;
|
in vec4 fP;
|
||||||
in vec3 fN;
|
in vec3 fN;
|
||||||
|
|
@ -19,8 +22,8 @@ uniform bool writing;
|
||||||
uniform sampler2D sampler;
|
uniform sampler2D sampler;
|
||||||
uniform float alpha;
|
uniform float alpha;
|
||||||
uniform bool is_surface;
|
uniform bool is_surface;
|
||||||
uniform vec4 is_visible_bitset;
|
|
||||||
uniform bool is_filterable;
|
uniform bool is_filterable;
|
||||||
|
uniform int is_visible_bitset[number_of_bitset];
|
||||||
out vec4 out_color;
|
out vec4 out_color;
|
||||||
|
|
||||||
float depth(float z)
|
float depth(float z)
|
||||||
|
|
@ -33,11 +36,13 @@ void main(void) {
|
||||||
{
|
{
|
||||||
uint domain1 = uint(subdomain_out.x);
|
uint domain1 = uint(subdomain_out.x);
|
||||||
uint domain2 = uint(subdomain_out.y);
|
uint domain2 = uint(subdomain_out.y);
|
||||||
uint i1 = domain1/25u;
|
uint i1 = domain1/32u;
|
||||||
uint i2 = domain2/25u;
|
uint j1 = domain1%32u;
|
||||||
|
uint i2 = domain2/32u;
|
||||||
|
uint j2 = domain2%32u;
|
||||||
uint visible1 = uint(is_visible_bitset[i1]);
|
uint visible1 = uint(is_visible_bitset[i1]);
|
||||||
uint visible2 = uint(is_visible_bitset[i2]);
|
uint visible2 = uint(is_visible_bitset[i2]);
|
||||||
if((visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u)
|
if(((visible1>>j1)&1u) == 0u && ((visible2>>j2)&1u) == 0u)
|
||||||
{
|
{
|
||||||
discard;
|
discard;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,12 @@
|
||||||
#version 150
|
#version 150
|
||||||
|
|
||||||
|
const int number_of_bitset = 4;
|
||||||
|
|
||||||
in vec4 color;
|
in vec4 color;
|
||||||
flat in vec2 subdomain_out;
|
flat in vec2 subdomain_out;
|
||||||
uniform bool is_surface;
|
uniform bool is_surface;
|
||||||
uniform vec4 is_visible_bitset;
|
|
||||||
uniform bool is_filterable;
|
uniform bool is_filterable;
|
||||||
|
uniform int is_visible_bitset[number_of_bitset];
|
||||||
out vec4 out_color;
|
out vec4 out_color;
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
|
|
@ -12,10 +15,12 @@ void main(void)
|
||||||
uint domain1 = uint(subdomain_out.x);
|
uint domain1 = uint(subdomain_out.x);
|
||||||
uint domain2 = uint(subdomain_out.y);
|
uint domain2 = uint(subdomain_out.y);
|
||||||
uint i1 = domain1/32u;
|
uint i1 = domain1/32u;
|
||||||
|
uint j1 = domain1%32u;
|
||||||
uint i2 = domain2/32u;
|
uint i2 = domain2/32u;
|
||||||
|
uint j2 = domain2%32u;
|
||||||
uint visible1 = uint(is_visible_bitset[i1]);
|
uint visible1 = uint(is_visible_bitset[i1]);
|
||||||
uint visible2 = uint(is_visible_bitset[i2]);
|
uint visible2 = uint(is_visible_bitset[i2]);
|
||||||
if((visible1>>(domain1%32u))%2u == 0u && (visible2>>(domain2%32u))%2u == 0u)
|
if(((visible1>>j1)&1u) == 0u && ((visible2>>j2)&1u) == 0u)
|
||||||
{
|
{
|
||||||
discard;
|
discard;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue