Merge pull request #7737 from ange-clement/Polyhedron-demo-Clipping-box-more-support-aclement

Polyhedron demo : Add clip box plugin support for more items
This commit is contained in:
Laurent Rineau 2023-10-16 11:13:26 +02:00
commit 3ec0c7e186
15 changed files with 360 additions and 27 deletions

View File

@ -231,7 +231,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND)
endmacro(add_item)
add_item(scene_triangulation_3_item Scene_triangulation_3_item.cpp)
target_link_libraries(scene_triangulation_3_item PUBLIC scene_basic_objects)
target_link_libraries(scene_triangulation_3_item PUBLIC scene_basic_objects scene_edit_box_item)
add_item(scene_c3t3_item Scene_c3t3_item.cpp)
target_link_libraries(

View File

@ -64,10 +64,14 @@ public Q_SLOTS:
void tab_change();
private:
bool eventFilter(QObject *, QEvent *);
bool process_event_clip_box(QEvent *);
bool process_event_clip_orthographic(QEvent *);
void do_clip(bool);
QAction* actionClipbox;
ClipWidget* dock_widget;
Scene_edit_box_item* item;
bool shift_pressing;
bool clipping;
Selection_visualizer* visualizer;
}; // end Clipping_box_plugin
@ -96,6 +100,7 @@ void Clipping_box_plugin::init(QMainWindow* mainWindow, CGAL::Three::Scene_inter
this, SLOT(connectNewViewer(QObject*)));
visualizer = nullptr;
shift_pressing = false;
clipping = false;
}
void Clipping_box_plugin::clipbox()
@ -130,6 +135,12 @@ void Clipping_box_plugin::clipbox()
});
connect(dock_widget->tabWidget, &QTabWidget::currentChanged,
this, &Clipping_box_plugin::tab_change);
connect(dock_widget->resetButton, &QPushButton::clicked,
this, [this]()
{
item->reset();
do_clip(true);
});
item->setName("Clipping box");
item->setRenderingMode(FlatPlusEdges);
@ -148,6 +159,25 @@ void Clipping_box_plugin::enableAction() {
}
void Clipping_box_plugin::clip(bool b)
{
clipping = b;
if (b)
{
for(CGAL::QGLViewer* v : CGAL::QGLViewer::QGLViewerPool())
{
v->installEventFilter(this);
}
}
else {
for(CGAL::QGLViewer* v : CGAL::QGLViewer::QGLViewerPool())
{
v->removeEventFilter(this);
}
}
do_clip(b);
}
void Clipping_box_plugin::do_clip(bool b)
{
typedef CGAL::Epick Kernel;
typedef CGAL::Polyhedron_3<Kernel> Mesh;
@ -231,12 +261,20 @@ void Clipping_box_plugin::tab_change()
}
bool Clipping_box_plugin::eventFilter(QObject *, QEvent *event) {
static QImage background;
if (dock_widget->isHidden() || !(dock_widget->isActiveWindow()) || dock_widget->tabWidget->currentIndex() != 1
|| (dock_widget->tabWidget->currentIndex() == 1 && !dock_widget->clipButton->isChecked()))
bool Clipping_box_plugin::process_event_clip_box(QEvent *event)
{
if (event->type() == QEvent::MouseButtonRelease)
{
// item->itemChanged();
do_clip(clipping);
return false;
}
return false;
}
bool Clipping_box_plugin::process_event_clip_orthographic(QEvent *event)
{
static QImage background;
if(event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
@ -359,4 +397,16 @@ bool Clipping_box_plugin::eventFilter(QObject *, QEvent *event) {
}
return false;
}
bool Clipping_box_plugin::eventFilter(QObject *, QEvent *event) {
if (dock_widget->isHidden() || !dock_widget->isActiveWindow())
return false;
if (dock_widget->tabWidget->currentIndex() == 0 && dock_widget->pushButton->isChecked())
return process_event_clip_box(event);
else if (dock_widget->tabWidget->currentIndex() == 1 && dock_widget->clipButton->isChecked())
return process_event_clip_orthographic(event);
else
return false;
}
#include "Clipping_box_plugin.moc"

View File

@ -65,6 +65,43 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="resetButton">
<property name="text">
<string>Reset</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">

View File

@ -99,9 +99,10 @@ struct Scene_edit_box_item_priv{
constraint.setRotationConstraintDirection(CGAL::qglviewer::Vec(.0,.0,.1));
frame->setConstraint(&constraint);
//create the sphere model
pool[0] = bb.xmin(); pool[3] = bb.xmax();
pool[1] = bb.ymin(); pool[4] = bb.ymax();
pool[2] = bb.zmin(); pool[5] = bb.zmax();
double eps = 1.e-3;
pool[0] = bb.xmin()-eps; pool[3] = bb.xmax()+eps;
pool[1] = bb.ymin()-eps; pool[4] = bb.ymax()+eps;
pool[2] = bb.zmin()-eps; pool[5] = bb.zmax()+eps;
vertex_spheres.resize(0);
normal_spheres.resize(0);
@ -251,6 +252,22 @@ struct Scene_edit_box_item_priv{
double applyX(int id, double x, double dirx);
double applyY(int id, double y, double diry);
double applyZ(int id, double z, double dirz);
void reset_vertices()
{
Scene_item::Bbox bb = scene->bbox();
double eps = 1.e-3;
pool[0] = bb.xmin()-eps; pool[3] = bb.xmax()+eps;
pool[1] = bb.ymin()-eps; pool[4] = bb.ymax()+eps;
pool[2] = bb.zmin()-eps; pool[5] = bb.zmax()+eps;
double x=(bb.xmin()+bb.xmax())/2;
double y=(bb.ymin()+bb.ymax())/2;
double z=(bb.zmin()+bb.zmax())/2;
center_ = CGAL::qglviewer::Vec(x,y,z);
relative_center_ = CGAL::qglviewer::Vec(0,0,0);
const CGAL::qglviewer::Vec offset = static_cast<CGAL::Three::Viewer_interface*>(CGAL::QGLViewer::QGLViewerPool().first())->offset();
frame->setPosition(center_+offset);
item->invalidateOpenGLBuffers();
}
const Scene_interface* scene;
Scene_edit_box_item* item;
QPoint picked_pixel;
@ -264,6 +281,7 @@ struct Scene_edit_box_item_priv{
Scene_edit_box_item::Scene_edit_box_item()
{
d = nullptr;
contextMenu();
}
Scene_edit_box_item::Scene_edit_box_item(const Scene_interface *scene_interface)
{
@ -294,12 +312,26 @@ Scene_edit_box_item::Scene_edit_box_item(const Scene_interface *scene_interface)
: Vi::PROGRAM_NO_SELECTION,
false));
}
contextMenu();
}
QString Scene_edit_box_item::toolTip() const {
return QString();
}
QMenu* Scene_edit_box_item::contextMenu()
{
// diasable "Alpha slider" in menu
QMenu* resMenu = Scene_item::contextMenu();
bool prop = property("menu_changed").toBool();
if(!prop)
{
setProperty("menu_changed", true);
}
return resMenu;
}
void Scene_edit_box_item::drawSpheres(Viewer_interface *viewer, const QMatrix4x4 f_matrix ) const
{
GLdouble d_mat[16];
@ -1307,3 +1339,8 @@ void Scene_edit_box_item::connectNewViewer(QObject *o)
return;
viewer->setMouseTracking(true);
}
void Scene_edit_box_item::reset()
{
d->reset_vertices();
}

View File

@ -33,6 +33,7 @@ class SCENE_EDIT_BOX_ITEM_EXPORT Scene_edit_box_item:
}
QString toolTip() const;
QMenu* contextMenu();
bool eventFilter(QObject *, QEvent *);
// Indicate if rendering mode is supported
@ -59,6 +60,7 @@ public Q_SLOTS:
void highlight(CGAL::Three::Viewer_interface* viewer);
void clearHL();
void connectNewViewer(QObject* o);
void reset();
protected:
friend struct Scene_edit_box_item_priv;
Scene_edit_box_item_priv* d;

View File

@ -114,15 +114,7 @@ is_vertex_active(std::size_t i, std::size_t j, std::size_t k) const
Word_type v7 = image_data(i , j , k-dz_);
Word_type v8 = image_data(i , j , k );
// don't draw interior vertices
if ( v1 != 0 && v2 != 0 && v3 != 0 && v4 != 0 &&
v5 != 0 && v6 != 0 && v7 != 0 && v8 != 0 )
{
return false;
}
return ( v1 != 0 || v2 != 0 || v3 != 0 || v4 != 0 ||
v5 != 0 || v6 != 0 || v7 != 0 || v8 != 0 );
return v1 != v2 || v1 != v3 || v1 != v4 || v1 != v5 || v1 != v6 || v1 != v7 || v1 != v8;
}
template <typename Word_type>
const QColor&
@ -756,6 +748,7 @@ void Scene_image_item::drawEdges(Viewer_interface *viewer) const
getEdgeContainer(0)->setWidth(3.0f);
}
getEdgeContainer(0)->setColor(QColor(Qt::black));
getEdgeContainer(0)->setClipping(false);
viewer->glDepthRangef(0.00001f, 0.99999f);
getEdgeContainer(0)->draw(viewer, true);
viewer->glDepthRangef(0.0f, 1.0f);

View File

@ -1,7 +1,9 @@
#include "Scene.h"
#include "config.h"
#include "Scene_triangulation_3_item.h"
#include "Scene_surface_mesh_item.h"
#include "Scene_spheres_item.h"
#include "Plugins/PCA/Scene_edit_box_item.h"
#include <QVector>
#include <QColor>
@ -20,6 +22,7 @@
#include <unordered_map>
#include <bitset>
#include <CGAL/Three/Scene_item.h>
#include <CGAL/Three/Scene_interface.h>
#include <CGAL/Three/Triangle_container.h>
#include <CGAL/Three/Edge_container.h>
@ -179,7 +182,15 @@ public :
QVector4D cp = cgal_plane_to_vector4d(plane);
getEdgeContainer(0)->setPlane(cp);
getEdgeContainer(0)->setColor(QColor(Qt::black));
getEdgeContainer(0)->draw(viewer, true);
if (!cut_edges) {
bool clipping = getEdgeContainer(0)->getClipping();
getEdgeContainer(0)->setClipping(false);
getEdgeContainer(0)->draw(viewer, true);
getEdgeContainer(0)->setClipping(clipping);
}
else {
getEdgeContainer(0)->draw(viewer, true);
}
}
@ -278,6 +289,10 @@ public :
m_alpha = a / 255.0f;
redraw();
}
void setCutEdges(bool b)
{
cut_edges = b;
}
private:
//contains the data
@ -290,6 +305,8 @@ private:
mutable bool is_fast;
mutable QSlider* alphaSlider;
mutable float m_alpha ;
bool cut_edges;
}; //end of class Scene_triangle_item
@ -436,6 +453,23 @@ struct Scene_triangulation_3_item_priv {
Scene_spheres_item *spheres;
std::vector<Tr::Vertex> tr_vertices;
Scene_intersection_item *intersection;
void set_intersection_enabled(bool b)
{
if (intersection)
intersection->setVisible(b);
cut_plane_enabled = b;
}
bool is_intersection_enabled()
{
return cut_plane_enabled;
}
bool is_item_clip_box(int id)
{
if(dynamic_cast<Scene_edit_box_item*>(CGAL::Three::Three::scene()->item(id)))
return true;
else
return false;
}
bool spheres_are_shown;
const Scene_item* data_item_;
QPixmap histogram_;
@ -495,8 +529,10 @@ struct Scene_triangulation_3_item_priv {
boost::dynamic_bitset<> visible_subdomain;
std::bitset<24> bs[4] = {16777215, 16777215, 16777215, 16777215};
bool show_tetrahedra;
bool cut_plane_enabled;
bool is_aabb_tree_built;
bool last_intersection;
bool cut_edges;
void push_normal(std::vector<float>& normals, const EPICK::Vector_3& n) const
{
@ -540,6 +576,7 @@ void Scene_triangulation_3_item::common_constructor(bool display_elements)
d->is_grid_shown = display_elements;
d->show_tetrahedra = display_elements;
d->cut_plane_enabled = display_elements;
d->last_intersection = !d->show_tetrahedra;
setTriangleContainer(T3_faces, new Tc(Vi::PROGRAM_C3T3, false));
@ -550,6 +587,14 @@ void Scene_triangulation_3_item::common_constructor(bool display_elements)
{
v->installEventFilter(this);
}
for(int i = 0, end = scene->numberOfEntries();
i < end; ++i)
{
if (d->is_item_clip_box(i))
d->set_intersection_enabled(false);
}
connect(static_cast<Scene*>(CGAL::Three::Three::scene()), SIGNAL(newItem(int)), this, SLOT(check_new_item(int)));
connect(static_cast<Scene*>(CGAL::Three::Three::scene()), SIGNAL(indexErased(Scene_interface::Item_id)), this, SLOT(check_deleted_item(Scene_interface::Item_id)));
}
Scene_triangulation_3_item::Scene_triangulation_3_item(bool display_elements)
: Scene_group_item("unnamed")
@ -602,6 +647,20 @@ Scene_triangulation_3_item::data_item_destroyed()
set_data_item(NULL);
}
void
Scene_triangulation_3_item::check_new_item(int id)
{
if (d->is_item_clip_box(id))
d->set_intersection_enabled(false);
}
void
Scene_triangulation_3_item::check_deleted_item(Scene_interface::Item_id id)
{
if (d->is_item_clip_box(id))
d->set_intersection_enabled(true);
}
const T3&
Scene_triangulation_3_item::triangulation() const {
return d->triangulation;
@ -913,6 +972,8 @@ Scene_triangulation_3_item_priv::compute_color_map(const QColor& c)
Geom_traits::Plane_3 Scene_triangulation_3_item::plane(CGAL::qglviewer::Vec offset) const
{
if (!d->is_intersection_enabled())
return Geom_traits::Plane_3(1.0, 0.0, 0.0, std::numeric_limits<float>::max());
const CGAL::qglviewer::Vec& pos = d->frame->position() - offset;
const CGAL::qglviewer::Vec& n =
d->frame->inverseTransformOf(CGAL::qglviewer::Vec(0.f, 0.f, 1.f));
@ -1018,7 +1079,7 @@ void Scene_triangulation_3_item::draw(CGAL::Three::Viewer_interface* viewer) con
d->spheres->setPlane(this->plane());
}
}
if(d->is_grid_shown)
if(d->is_grid_shown && d->is_intersection_enabled())
{
getEdgeContainer(Grid_edges)->setColor(QColor(Qt::black));
@ -1026,7 +1087,11 @@ void Scene_triangulation_3_item::draw(CGAL::Three::Viewer_interface* viewer) con
for (int i = 0; i<16; i++)
f_mat.data()[i] = static_cast<float>(d->frame->matrix()[i]);
getEdgeContainer(Grid_edges)->setFrameMatrix(f_mat);
// always draw plane (disable clipping)
bool clipping = getEdgeContainer(Grid_edges)->getClipping();
getEdgeContainer(Grid_edges)->setClipping(false);
getEdgeContainer(Grid_edges)->draw(viewer, true);
getEdgeContainer(Grid_edges)->setClipping(clipping);
}
}
@ -1056,14 +1121,18 @@ void Scene_triangulation_3_item::drawEdges(CGAL::Three::Viewer_interface* viewer
computeElements();
initializeBuffers(viewer);
}
if(renderingMode() == Wireframe && d->is_grid_shown)
if(renderingMode() == Wireframe && d->is_grid_shown && d->is_intersection_enabled())
{
getEdgeContainer(Grid_edges)->setColor(QColor(Qt::black));
QMatrix4x4 f_mat;
for (int i = 0; i<16; i++)
f_mat.data()[i] = static_cast<float>(d->frame->matrix()[i]);
getEdgeContainer(Grid_edges)->setFrameMatrix(f_mat);
// always draw plane (disable clipping)
bool clipping = getEdgeContainer(Grid_edges)->getClipping();
getEdgeContainer(Grid_edges)->setClipping(false);
getEdgeContainer(Grid_edges)->draw(viewer, true);
getEdgeContainer(Grid_edges)->setClipping(clipping);
}
QVector4D cp = cgal_plane_to_vector4d(this->plane());
@ -1079,7 +1148,15 @@ void Scene_triangulation_3_item::drawEdges(CGAL::Three::Viewer_interface* viewer
getEdgeContainer(T3_edges)->setPlane(cp);
getEdgeContainer(T3_edges)->setIsSurface(is_surface());
getEdgeContainer(T3_edges)->setColor(QColor(Qt::black));
getEdgeContainer(T3_edges)->draw(viewer, true);
if (!d->cut_edges) {
bool clipping = getEdgeContainer(T3_edges)->getClipping();
getEdgeContainer(T3_edges)->setClipping(false);
getEdgeContainer(T3_edges)->draw(viewer, true);
getEdgeContainer(T3_edges)->setClipping(clipping);
}
else {
getEdgeContainer(T3_edges)->draw(viewer, true);
}
if(d->show_tetrahedra){
if(!d->frame->isManipulated())
@ -1217,6 +1294,14 @@ QMenu* Scene_triangulation_3_item::contextMenu()
this, SLOT(show_spheres(bool)));
}
QAction* actionToggleCutEdges =
menu->addAction(tr("Cut &edges"));
actionToggleCutEdges->setCheckable(true);
actionToggleCutEdges->setChecked(true);
actionToggleCutEdges->setObjectName("actionToggleCutEdges");
connect(actionToggleCutEdges, SIGNAL(toggled(bool)),
this, SLOT(set_cut_edge(bool)));
menu->setProperty(prop_name, true);
}
return menu;
@ -2081,5 +2166,12 @@ void Scene_triangulation_3_item::computeIntersection()
}
}
void Scene_triangulation_3_item::set_cut_edge(bool b)
{
d->cut_edges = b;
d->intersection->setCutEdges(b);
Q_EMIT redraw();
}
#include "Scene_triangulation_3_item.moc"

View File

@ -121,6 +121,9 @@ public:
void data_item_destroyed();
void check_new_item(int id);
void check_deleted_item(Scene_interface::Item_id id);
void reset_spheres();
void reset_intersection_item();
@ -128,6 +131,7 @@ public:
void show_grid(bool b);
void show_spheres(bool b);
void computeIntersection();
void set_cut_edge(bool b);
virtual QPixmap graphicalToolTip() const Q_DECL_OVERRIDE;

View File

@ -7,6 +7,7 @@ in GS_OUT
flat vec4 color[4];
vec2 uv;
flat vec4 prob[4];
float dist[6];
} fs_in;
uniform bool is_two_side;
@ -15,11 +16,20 @@ uniform vec4 light_diff;
uniform vec4 light_spec;
uniform vec4 light_amb;
uniform float spec_power ;
uniform bool is_clipbox_on;
out vec4 out_color;
void main(void)
{
if(is_clipbox_on)
if(fs_in.dist[0]>0.0 ||
fs_in.dist[1]>0.0 ||
fs_in.dist[2]>0.0 ||
fs_in.dist[3]>0.0 ||
fs_in.dist[4]>0.0 ||
fs_in.dist[5]>0.0)
discard;
vec4 color;
//find base color of pixel
vec4 m1 = mix(fs_in.prob[0], fs_in.prob[1], fs_in.uv.y);

View File

@ -8,6 +8,7 @@ in VS_OUT
vec4 fP;
vec3 fN;
vec4 out_color;
float dist[6];
} gs_in[4];
out GS_OUT
@ -17,6 +18,7 @@ out GS_OUT
flat vec4 color[4];
vec2 uv;
flat vec4 prob[4];
float dist[6];
} gs_out;
void main(void)
@ -25,19 +27,21 @@ void main(void)
gs_out.fN = gs_in[0].fN;
gs_out.fP = gs_in[0].fP;
gs_out.uv = vec2(0.0, 0.0);
gs_out.dist = gs_in[0].dist;
EmitVertex();
gl_Position = gl_in[1].gl_Position;
gs_out.fN = gs_in[1].fN;
gs_out.fP = gs_in[1].fP;
gs_out.uv = vec2(0.0, 1.0);
gs_out.dist = gs_in[1].dist;
EmitVertex();
gl_Position = gl_in[3].gl_Position;
gs_out.fN = gs_in[3].fN;
gs_out.fP = gs_in[3].fP;
gs_out.uv = vec2(1.0, 0.0);
gs_out.dist = gs_in[3].dist;
// We're only writing the output color for the last
// vertex here because they're flat attributes,
@ -67,18 +71,21 @@ void main(void)
gs_out.fN = gs_in[1].fN;
gs_out.fP = gs_in[1].fP;
gs_out.uv = vec2(0.0, 1.0);
gs_out.dist = gs_in[1].dist;
EmitVertex();
gl_Position = gl_in[2].gl_Position;
gs_out.fN = gs_in[2].fN;
gs_out.fP = gs_in[2].fP;
gs_out.uv = vec2(1.0, 1.0);
gs_out.dist = gs_in[2].dist;
EmitVertex();
gl_Position = gl_in[3].gl_Position;
gs_out.fN = gs_in[3].fN;
gs_out.fP = gs_in[3].fP;
gs_out.uv = vec2(1.0, 0.0);
gs_out.dist = gs_in[3].dist;
// Again, only write the output color for the last vertex
gs_out.color[0] = gs_in[0].out_color;
gs_out.color[1] = gs_in[1].out_color;

View File

@ -9,15 +9,39 @@ out VS_OUT
vec4 fP;
vec3 fN;
vec4 out_color;
float dist[6];
}vs_out;
uniform mat4 mvp_matrix;
uniform mat4 mv_matrix;
uniform mat4 norm_matrix;
uniform bool is_clipbox_on;
uniform mat4 clipbox1;
uniform mat4 clipbox2;
void compute_distances(void)
{
for(int i=0; i<3; ++i)
{
vs_out.dist[i]=
clipbox1[i][0]*vertex.x+
clipbox1[i][1]*vertex.y+
clipbox1[i][2]*vertex.z +
clipbox1[i][3];
vs_out.dist[i+3]=
clipbox2[i][0]*vertex.x+
clipbox2[i][1]*vertex.y+
clipbox2[i][2]*vertex.z +
clipbox2[i][3];
}
}
void main(void)
{
vs_out.out_color=colors;
if(is_clipbox_on)
compute_distances();
vs_out.fP = mv_matrix * vertex;
vs_out.fN = mat3(norm_matrix)* normals;
gl_Position = mvp_matrix * vertex;

View File

@ -2,6 +2,7 @@
in vec4 color;
in vec4 fP;
in vec3 fN;
in float dist[6];
flat in vec2 subdomain_out;
uniform vec4 light_pos;
uniform vec4 light_diff;
@ -10,6 +11,7 @@ uniform vec4 light_amb;
uniform float spec_power ;
uniform int is_two_side;
uniform bool is_selected;
uniform bool is_clipbox_on;
uniform float near;
uniform float far;
uniform float width;
@ -28,7 +30,19 @@ float depth(float z)
return (2 * near) / (far + near - z * (far - near));
}
void main(void) {
bool compute_clip_visibility() {
if(is_clipbox_on)
return dist[0]>0.0 ||
dist[1]>0.0 ||
dist[2]>0.0 ||
dist[3]>0.0 ||
dist[4]>0.0 ||
dist[5]>0.0;
else
return false;
}
bool compute_filtering_visibility() {
if(is_filterable)
{
uint domain1 = uint(subdomain_out.x);
@ -37,10 +51,15 @@ void main(void) {
uint i2 = domain2/25u;
uint visible1 = uint(is_visible_bitset[i1]);
uint visible2 = uint(is_visible_bitset[i2]);
if((visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u)
{
discard;
}
return (visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u;
}
else
return false;
}
void main(void) {
if (compute_clip_visibility() || compute_filtering_visibility()) {
discard;
}
float d = depth(gl_FragCoord.z);
float test = texture(sampler, vec2(gl_FragCoord.x/width, gl_FragCoord.y/height)).r;

View File

@ -12,13 +12,37 @@ uniform float shrink_factor;
out vec4 fP;
out vec3 fN;
out vec4 color;
out float dist[6];
flat out vec2 subdomain_out;
uniform bool is_clipbox_on;
uniform mat4 clipbox1;
uniform mat4 clipbox2;
uniform float point_size;
void compute_distances(void)
{
for(int i=0; i<3; ++i)
{
dist[i]=
clipbox1[i][0]*vertex.x+
clipbox1[i][1]*vertex.y+
clipbox1[i][2]*vertex.z +
clipbox1[i][3];
dist[i+3]=
clipbox2[i][0]*vertex.x+
clipbox2[i][1]*vertex.y+
clipbox2[i][2]*vertex.z +
clipbox2[i][3];
}
}
void main(void)
{
subdomain_out = subdomain_in;
gl_PointSize = point_size;
color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w);
if(is_clipbox_on)
compute_distances();
fP = mv_matrix * vertex;
mat3 norm_matrix_3;

View File

@ -1,12 +1,22 @@
#version 150
in vec4 color;
in float dist[6];
flat in vec2 subdomain_out;
uniform bool is_clipbox_on;
uniform bool is_surface;
uniform vec4 is_visible_bitset;
uniform bool is_filterable;
out vec4 out_color;
void main(void)
{
if(is_clipbox_on)
if(dist[0]>0.0 ||
dist[1]>0.0 ||
dist[2]>0.0 ||
dist[3]>0.0 ||
dist[4]>0.0 ||
dist[5]>0.0)
discard;
if(is_filterable)
{
uint domain1 = uint(subdomain_out.x);

View File

@ -5,12 +5,36 @@ in vec2 subdomain_in;
uniform mat4 mvp_matrix;
uniform vec4 cutplane;
out vec4 color;
out float dist[6];
uniform float point_size;
flat out vec2 subdomain_out;
uniform bool is_clipbox_on;
uniform mat4 clipbox1;
uniform mat4 clipbox2;
void compute_distances(void)
{
for(int i=0; i<3; ++i)
{
dist[i]=
clipbox1[i][0]*vertex.x+
clipbox1[i][1]*vertex.y+
clipbox1[i][2]*vertex.z +
clipbox1[i][3];
dist[i+3]=
clipbox2[i][0]*vertex.x+
clipbox2[i][1]*vertex.y+
clipbox2[i][2]*vertex.z +
clipbox2[i][3];
}
}
void main(void)
{
subdomain_out = subdomain_in;
gl_PointSize = point_size;
color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w);
if(is_clipbox_on)
compute_distances();
gl_Position = mvp_matrix * vertex;
}