43#define VOLUMEMESHNODET_CC
47#include "VolumeMeshNode.hh"
49#include <ACG/GL/gl.hh>
50#include <ACG/Utils/VSToolsT.hh>
54#include <ACG/GL/RenderObject.hh>
55#include <ACG/GL/VertexDeclaration.hh>
56#include <ACG/GL/IRenderer.hh>
57#include <ACG/ShaderUtils/GLSLShader.hh>
58#include <ACG/GL/ShaderCache.hh>
59#include <ACG/Geometry/Types/PlaneType.hh>
61#include <OpenVolumeMesh/Mesh/HexahedralMesh.hh>
74template<
class VolumeMeshT>
85 boundary_only_(false),
86 translucency_factor_(0.1f),
87 selection_color_(
ACG::
Vec4f(1.0f, 0.0f, 0.0f, 1.0f)),
88 statusAttrib_(_statusAttrib),
89 colorAttrib_(_colorAttrib),
90 normalAttrib_(_normalAttrib),
91 texcoordAttrib_(_texcoordAttrib),
92 materialNode_(_matNode),
94 cellsBufferManager_ (_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
95 facesBufferManager_ (_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
96 edgesBufferManager_ (_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
97 verticesBufferManager_(_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
99 cellSelectionBufferManager_ (_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
100 faceSelectionBufferManager_ (_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
101 edgeSelectionBufferManager_ (_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
102 vertexSelectionBufferManager_(_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
104 cellPickBufferManager_ (_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
105 facePickBufferManager_ (_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
106 edgePickBufferManager_ (_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
107 vertexPickBufferManager_(_mesh, _statusAttrib, _colorAttrib, _normalAttrib, _texcoordAttrib),
110 lastDrawMode_ (DrawModes::NONE),
111 lastCellDrawMode_ (DrawModes::NONE),
112 lastFaceDrawMode_ (DrawModes::NONE),
113 lastEdgeDrawMode_ (DrawModes::NONE),
114 lastVertexDrawMode_(DrawModes::NONE),
116 face_normals_calculated_(false),
117 vertex_normals_calculated_(false)
119 vertexSelectionBufferManager_.setSelectionOnly(
true);
120 edgeSelectionBufferManager_.setSelectionOnly(
true);
121 faceSelectionBufferManager_.setSelectionOnly(
true);
122 cellSelectionBufferManager_.setSelectionOnly(
true);
128template<
class VolumeMeshT>
135template<
class VolumeMeshT>
138 int n_vertices(mesh_.n_vertices());
139 for (
int i = 0; i < n_vertices; ++i) {
149template<
class VolumeMeshT>
153 if (mesh_.n_cells() > 0)
155 result |= drawModes_.cellsTransparent;
156 result |= drawModes_.cellsFlatShaded;
157 result |= drawModes_.cellsSmoothShaded;
158 result |= drawModes_.cellsPhongShaded;
159 if (colorAttrib_.vertex_colors_available())
160 result |= drawModes_.cellsColoredPerVertex;
161 if (colorAttrib_.halfface_colors_available())
162 result |= drawModes_.cellsColoredPerHalfface;
163 if (colorAttrib_.face_colors_available())
164 result |= drawModes_.cellsColoredPerFace;
165 if (colorAttrib_.cell_colors_available())
166 result |= drawModes_.cellsColoredPerCell;
169 if (mesh_.n_faces() > 0)
171 result |= drawModes_.facesFlatShaded;
172 result |= drawModes_.facesSmoothShaded;
173 result |= drawModes_.facesPhongShaded;
174 if (colorAttrib_.vertex_colors_available())
175 result |= drawModes_.facesColoredPerVertex;
176 if (colorAttrib_.face_colors_available())
177 result |= drawModes_.facesColoredPerFace;
178 if (colorAttrib_.face_colors_available())
179 result |= drawModes_.facesColoredPerFaceFlatShaded;
180 if (texcoordAttrib_.vertex_texcoords_available())
181 result |= drawModes_.facesTextured;
182 if (texcoordAttrib_.vertex_texcoords_available())
183 result |= drawModes_.facesTexturedShaded;
186 if (mesh_.n_halffaces() > 0)
188 result |= drawModes_.halffacesFlatShaded;
189 result |= drawModes_.halffacesSmoothShaded;
190 result |= drawModes_.halffacesPhongShaded;
191 if (colorAttrib_.vertex_colors_available())
192 result |= drawModes_.halffacesColoredPerVertex;
193 if (colorAttrib_.halfface_colors_available())
194 result |= drawModes_.halffacesColoredPerHalfface;
197 if (mesh_.n_edges() > 0)
199 result |= drawModes_.edgesWireframe;
201 if (mesh_.n_cells () > 0)
202 result |= drawModes_.edgesOnCells;
203 if (mesh_.n_faces() > 0)
204 result |= drawModes_.edgesHiddenLine;
205 if (colorAttrib_.edge_colors_available())
206 result |= drawModes_.edgesColoredPerEdge;
208 if (std::is_base_of<HexahedralMeshTopologyKernel, VolumeMeshT>::value)
210 result |= drawModes_.irregularInnerEdges;
211 result |= drawModes_.irregularOuterEdges;
215 if (mesh_.n_halfedges() > 0)
217 result |= drawModes_.halfedgesWireframe;
219 if (mesh_.n_faces() > 0)
220 result |= drawModes_.halfedgesHiddenLine;
221 if (colorAttrib_.halfedge_colors_available())
222 result |= drawModes_.halfedgesColoredPerHalfedge;
225 if (mesh_.n_vertices() > 0)
227 result |= drawModes_.verticesFlatShaded;
229 if (colorAttrib_.vertex_colors_available())
230 result |= drawModes_.verticesColored;
241template<
class VolumeMeshT>
247 cellsBufferManager_.setOptionsFromDrawMode(_drawMode);
253 GLState::normalPointer(GL_FLOAT, cellsBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(cellsBufferManager_.getNormalOffset()));
255 if (_drawMode & (drawModes_.cellsColoredPerCell | drawModes_.cellsColoredPerFace | drawModes_.cellsColoredPerHalfface | drawModes_.cellsColoredPerVertex))
259 GLState::colorPointer(4, GL_UNSIGNED_BYTE, cellsBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(cellsBufferManager_.getColorOffset()));
266 else if (_drawMode & drawModes_.cellsSmoothShaded)
272 else if (_drawMode & drawModes_.cellsFlatShaded)
278 else if (_drawMode & drawModes_.cellsTransparent)
290 glDrawArrays(GL_TRIANGLES, 0, cellsBufferManager_.getNumOfVertices());
292 if (_drawMode & drawModes_.cellsTransparent)
304template<
class VolumeMeshT>
313 if ((_drawMode & drawModes_.faceBasedDrawModes) || boundary_only_)
325 facesBufferManager_.setOptionsFromDrawMode(_drawMode);
330 if (_drawMode & (drawModes_.hiddenLineBackgroundFaces))
338 else if (_drawMode & (drawModes_.facesColoredPerFace | drawModes_.facesColoredPerVertex
339 | drawModes_.halffacesColoredPerHalfface | drawModes_.halffacesColoredPerVertex ))
342 GLState::colorPointer(4, GL_UNSIGNED_BYTE, facesBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(facesBufferManager_.getColorOffset()));
347 else if (_drawMode & (drawModes_.facesColoredPerFaceFlatShaded))
352 GLState::colorPointer(4, GL_UNSIGNED_BYTE, facesBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(facesBufferManager_.getColorOffset()));
358 GLState::normalPointer(GL_FLOAT, facesBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(facesBufferManager_.getNormalOffset()));
360 else if (_drawMode & (drawModes_.facesTexturedShaded) )
362 glClientActiveTexture(GL_TEXTURE0);
363 ACG::GLState::texcoordPointer(2, GL_FLOAT, facesBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(facesBufferManager_.getTexCoordOffset()));
370 GLState::normalPointer(GL_FLOAT, facesBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(facesBufferManager_.getNormalOffset()));
372 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
375 else if (_drawMode & (drawModes_.facesTextured) )
377 glClientActiveTexture(GL_TEXTURE0);
378 ACG::GLState::texcoordPointer(2, GL_FLOAT, facesBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(facesBufferManager_.getTexCoordOffset()));
387 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
395 GLState::normalPointer(GL_FLOAT, facesBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(facesBufferManager_.getNormalOffset()));
400 glDrawArrays(GL_TRIANGLES, 0, facesBufferManager_.getNumOfVertices());
406 if (_drawMode & (drawModes_.edgesHiddenLine | drawModes_.halfedgesHiddenLine))
412template<
class VolumeMeshT>
418 edgesBufferManager_.setOptionsFromDrawMode(_drawMode);
424 if (_drawMode & ( drawModes_.edgesColoredPerEdge | drawModes_.halfedgesColoredPerHalfedge |
425 drawModes_.irregularInnerEdges | drawModes_.irregularOuterEdges ))
428 GLState::colorPointer(4, GL_UNSIGNED_BYTE, edgesBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(edgesBufferManager_.getColorOffset()));
446 glDrawArrays(GL_LINES, 0, edgesBufferManager_.getNumOfVertices());
455template<
class VolumeMeshT>
458 verticesBufferManager_.setOptionsFromDrawMode(_drawMode);
465 if (_drawMode & ( drawModes_.verticesColored ))
468 GLState::colorPointer(4, GL_UNSIGNED_BYTE, verticesBufferManager_.getStride(),
reinterpret_cast<GLvoid*
>(verticesBufferManager_.getColorOffset()));
483 glDrawArrays(GL_POINTS, 0, verticesBufferManager_.getNumOfVertices());
491template<
class VolumeMeshT>
496 GLint currentProgramm;
497 glGetIntegerv(GL_CURRENT_PROGRAM, ¤tProgramm);
507 glDisable(GL_CULL_FACE);
515 if ((_drawMode & drawModes_.cellBasedDrawModes) && !(_drawMode & drawModes_.vertexBasedDrawModes))
516 vertexSelectionBufferManager_.enableVertexOnCellPrimitives();
518 vertexSelectionBufferManager_.enableVertexPrimitives();
520 if ((_drawMode & (drawModes_.cellBasedDrawModes | drawModes_.edgesOnCells)) && !(_drawMode & (drawModes_.edgeBasedDrawModes & ~drawModes_.edgesOnCells)))
521 edgeSelectionBufferManager_.enableEdgeOnCellPrimitives();
523 edgeSelectionBufferManager_.enableEdgePrimitives();
525 if ((_drawMode & drawModes_.cellBasedDrawModes) && !(_drawMode & (drawModes_.faceBasedDrawModes | drawModes_.halffaceBasedDrawModes)))
526 faceSelectionBufferManager_.enableFaceOnCellPrimitives();
528 faceSelectionBufferManager_.enableFacePrimitives();
530 cellSelectionBufferManager_.enableCellPrimitives();
538 glDrawArrays(GL_POINTS, 0, vertexSelectionBufferManager_.getNumOfVertices());
542 glDrawArrays(GL_LINES, 0, edgeSelectionBufferManager_.getNumOfVertices());
548 glDrawArrays(GL_TRIANGLES, 0, faceSelectionBufferManager_.getNumOfVertices());
552 glDrawArrays(GL_TRIANGLES, 0, cellSelectionBufferManager_.getNumOfVertices());
567template<
class VolumeMeshT>
570 invalidateAllDrawBuffers();
571 invalidateAllPickingBuffers();
572 invalidateAllSelectionBuffers();
575template<
class VolumeMeshT>
578 cellsBufferManager_.invalidate();
579 facesBufferManager_.invalidate();
580 edgesBufferManager_.invalidate();
581 verticesBufferManager_.invalidate();
584template<
class VolumeMeshT>
587 cellPickBufferManager_.invalidate();
588 facePickBufferManager_.invalidate();
589 edgePickBufferManager_.invalidate();
590 vertexPickBufferManager_.invalidate();
593template<
class VolumeMeshT>
596 cellSelectionBufferManager_.invalidate();
597 faceSelectionBufferManager_.invalidate();
598 edgeSelectionBufferManager_.invalidate();
599 vertexSelectionBufferManager_.invalidate();
602template<
class VolumeMeshT>
606 GLboolean lighting =
false;
607 glGetBooleanv(GL_LIGHTING, &lighting);
608 GLboolean color_material =
false;
609 glGetBooleanv(GL_COLOR_MATERIAL, &color_material);
610 GLboolean blend =
false;
611 glGetBooleanv(GL_BLEND, &blend);
612 GLboolean depth =
false;
613 glGetBooleanv(GL_DEPTH_TEST, &depth);
615 GLboolean cullFace =
false;
616 glGetBooleanv(GL_CULL_FACE, &cullFace);
618 glGetIntegerv(GL_CULL_FACE_MODE, &cullFaceMode);
620 glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &texmode);
622 glGetBooleanv(GL_TEXTURE_2D, &texturing);
639 if (!face_normals_calculated_)
641 if ( (cellDrawMode & drawModes_.cellsFlatShaded) ||
642 (faceDrawMode & (drawModes_.facesFlatShaded | drawModes_.halffacesFlatShaded | drawModes_.facesTexturedShaded)) )
643 update_face_normals();
645 if (!vertex_normals_calculated_)
647 if ( (cellDrawMode & (drawModes_.cellsSmoothShaded | drawModes_.cellsPhongShaded)) ||
648 (faceDrawMode & (drawModes_.facesSmoothShaded | drawModes_.halffacesSmoothShaded | drawModes_.facesPhongShaded | drawModes_.halffacesPhongShaded)) )
649 update_vertex_normals();
654 edgeDrawMode |= _drawMode & (drawModes_.irregularInnerEdges | drawModes_.irregularOuterEdges);
657 if(faceDrawMode & (drawModes_.facesColoredPerFaceFlatShaded))
661 drawCells(_state, cellDrawMode);
663 cellsBufferManager_.free();
665 drawFaces(_state, faceDrawMode);
667 facesBufferManager_.free();
669 drawEdges(_state, edgeDrawMode);
671 edgesBufferManager_.free();
673 drawVertices(_state, vertexDrawMode);
675 verticesBufferManager_.free();
677 drawSelection(_state, cellDrawMode | faceDrawMode | edgeDrawMode | vertexDrawMode);
680 lastDrawMode_ = cellDrawMode | faceDrawMode | edgeDrawMode | vertexDrawMode;
681 lastCellDrawMode_ = cellDrawMode;
682 lastFaceDrawMode_ = faceDrawMode;
683 lastEdgeDrawMode_ = edgeDrawMode;
684 lastVertexDrawMode_ = vertexDrawMode;
713 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, texmode);
718 if (clientStateEnabledVertexArray)
723 if (clientStateEnabledColorArray)
728 if (clientStateEnabledNormalArray)
733 if (clientStateEnabledTexCoordArray)
742template<
class VolumeMeshT>
748 ro.debugName =
"VolumeMeshNodeCells";
754 ro.depthWrite =
true;
756 ro.setMaterial(_mat);
764 if (_drawMode & (drawModes_.cellsColoredPerCell | drawModes_.cellsColoredPerFace | drawModes_.cellsColoredPerHalfface | drawModes_.cellsColoredPerVertex))
770 else if (_drawMode & drawModes_.cellsSmoothShaded)
775 else if (_drawMode & drawModes_.cellsFlatShaded)
780 else if (_drawMode & drawModes_.cellsTransparent)
784 ro.depthTest =
false;
791 ro.alpha = translucency_factor_;
794 ro.blendSrc = GL_SRC_ALPHA;
797 cellsBufferManager_.setOptionsFromDrawMode(_drawMode);
799 ro.
vertexDecl = cellsBufferManager_.getVertexDeclaration();
801 ro.glDrawArrays(GL_TRIANGLES, 0, cellsBufferManager_.getNumOfVertices());
802 if (cellsBufferManager_.getNumOfVertices() > 0) {
807template<
class VolumeMeshT>
813 ro.debugName =
"VolumeMeshNodeFaces";
819 ro.depthWrite =
true;
821 ro.setMaterial(_mat);
829 facesBufferManager_.setOptionsFromDrawMode(_drawMode);
832 if ((_drawMode & drawModes_.faceBasedDrawModes) || boundary_only_)
837 if (_drawMode & (drawModes_.hiddenLineBackgroundFaces))
849 else if (_drawMode & (drawModes_.facesColoredPerFace | drawModes_.facesColoredPerVertex
850 | drawModes_.halffacesColoredPerHalfface | drawModes_.halffacesColoredPerVertex ))
856 else if (_drawMode & drawModes_.facesColoredPerFaceFlatShaded)
869 ro.
vertexDecl = facesBufferManager_.getVertexDeclaration();
871 ro.glDrawArrays(GL_TRIANGLES, 0, facesBufferManager_.getNumOfVertices());
872 if (facesBufferManager_.getNumOfVertices() > 0) {
877template<
class VolumeMeshT>
883 ro.debugName =
"VolumeMeshNodeEdges";
890 ro.depthWrite =
true;
892 ro.setMaterial(_mat);
904 edgesBufferManager_.setOptionsFromDrawMode(_drawMode);
906 if (_drawMode & ( drawModes_.edgesColoredPerEdge | drawModes_.halfedgesColoredPerHalfedge |
907 drawModes_.irregularInnerEdges | drawModes_.irregularOuterEdges ))
917 ro.
vertexDecl = edgesBufferManager_.getVertexDeclaration();
919 ro.glDrawArrays(GL_LINES, 0, edgesBufferManager_.getNumOfVertices());
920 if (edgesBufferManager_.getNumOfVertices() > 0) {
925template<
class VolumeMeshT>
931 ro.debugName =
"VolumeMeshNodeVertices";
939 ro.depthWrite =
true;
941 ro.setMaterial(_mat);
953 verticesBufferManager_.setOptionsFromDrawMode(_drawMode);
956 if (_drawMode & ( drawModes_.verticesColored ))
962 ro.
vertexDecl = verticesBufferManager_.getVertexDeclaration();
964 ro.glDrawArrays(GL_POINTS, 0, verticesBufferManager_.getNumOfVertices());
965 if (verticesBufferManager_.getNumOfVertices() > 0) {
972template<
class VolumeMeshT>
978 ro.debugName =
"VolumeMeshNodeSelections";
980 ro.setMaterial(_mat);
990 ro.
diffuse =
ACG::Vec3f(selection_color_[0],selection_color_[1],selection_color_[2]);
991 ro.ambient =
ACG::Vec3f(selection_color_[0],selection_color_[1],selection_color_[2]);
992 ro.specular =
ACG::Vec3f(selection_color_[0],selection_color_[1],selection_color_[2]);
993 ro.emissive =
ACG::Vec3f(selection_color_[0],selection_color_[1],selection_color_[2]);
995 if ((_drawMode & drawModes_.cellBasedDrawModes) && !(_drawMode & drawModes_.vertexBasedDrawModes))
996 vertexSelectionBufferManager_.enableVertexOnCellPrimitives();
998 vertexSelectionBufferManager_.enableVertexPrimitives();
1000 if ((_drawMode & (drawModes_.cellBasedDrawModes | drawModes_.edgesOnCells)) && !(_drawMode & (drawModes_.edgeBasedDrawModes & ~drawModes_.edgesOnCells)))
1001 edgeSelectionBufferManager_.enableEdgeOnCellPrimitives();
1003 edgeSelectionBufferManager_.enableEdgePrimitives();
1005 if ((_drawMode & drawModes_.cellBasedDrawModes) && !(_drawMode & (drawModes_.faceBasedDrawModes | drawModes_.halffaceBasedDrawModes)))
1006 faceSelectionBufferManager_.enableFaceOnCellPrimitives();
1008 faceSelectionBufferManager_.enableFacePrimitives();
1010 cellSelectionBufferManager_.enableCellPrimitives();
1014 ro.
vertexBuffer = vertexSelectionBufferManager_.getBuffer();
1015 ro.
vertexDecl = vertexSelectionBufferManager_.getVertexDeclaration();
1016 ro.glDrawArrays(GL_POINTS, 0, vertexSelectionBufferManager_.getNumOfVertices());
1017 if (vertexSelectionBufferManager_.getNumOfVertices())
1019 ro.debugName =
"VolumeMeshNode.VertexSelections";
1029 ro.
vertexBuffer = edgeSelectionBufferManager_.getBuffer();
1030 ro.
vertexDecl = edgeSelectionBufferManager_.getVertexDeclaration();
1031 ro.glDrawArrays(GL_LINES, 0, edgeSelectionBufferManager_.getNumOfVertices());
1032 if (edgeSelectionBufferManager_.getNumOfVertices())
1034 ro.debugName =
"VolumeMeshNode.EdgeSelections";
1047 ro.
vertexBuffer = faceSelectionBufferManager_.getBuffer();
1048 ro.
vertexDecl = faceSelectionBufferManager_.getVertexDeclaration();
1049 ro.glDrawArrays(GL_TRIANGLES, 0, faceSelectionBufferManager_.getNumOfVertices());
1050 if (faceSelectionBufferManager_.getNumOfVertices())
1052 ro.debugName =
"VolumeMeshNode.FaceSelections";
1057 ro.
vertexBuffer = cellSelectionBufferManager_.getBuffer();
1058 ro.
vertexDecl = cellSelectionBufferManager_.getVertexDeclaration();
1059 ro.glDrawArrays(GL_TRIANGLES, 0, cellSelectionBufferManager_.getNumOfVertices());
1060 if (cellSelectionBufferManager_.getNumOfVertices())
1062 ro.debugName =
"VolumeMeshNode.CellSelections";
1069template<
class VolumeMeshT>
1078 if (!face_normals_calculated_)
1080 if ( (cellDrawMode & drawModes_.cellsFlatShaded) ||
1081 (faceDrawMode & (drawModes_.facesFlatShaded | drawModes_.halffacesFlatShaded | drawModes_.facesTexturedShaded)) )
1082 update_face_normals();
1084 if (!vertex_normals_calculated_)
1086 if ( (cellDrawMode & (drawModes_.cellsSmoothShaded | drawModes_.cellsPhongShaded)) ||
1087 (faceDrawMode & (drawModes_.facesSmoothShaded | drawModes_.halffacesSmoothShaded | drawModes_.facesPhongShaded | drawModes_.halffacesPhongShaded)) )
1088 update_vertex_normals();
1093 edgeDrawMode |= _drawMode & (drawModes_.irregularInnerEdges | drawModes_.irregularOuterEdges);
1096 getCellRenderObjects(_renderer, _state, cellDrawMode, _mat);
1098 cellsBufferManager_.free();
1100 getFaceRenderObjects(_renderer, _state, faceDrawMode, _mat);
1102 facesBufferManager_.free();
1104 getEdgeRenderObjects(_renderer, _state, edgeDrawMode, _mat);
1106 edgesBufferManager_.free();
1108 getVertexRenderObjects(_renderer, _state, vertexDrawMode, _mat);
1110 verticesBufferManager_.free();
1112 getSelectionRenderObjects(_renderer, _state, cellDrawMode | faceDrawMode | edgeDrawMode | vertexDrawMode, _mat);
1119template<
class VolumeMeshT>
1121 bool drawModeOverride =
false;
1124 lastDrawMode_ = drawMode();
1125 drawModeOverride =
true;
1128 if(_state.compatibilityProfile())
1129 pickCompat(_state, _target);
1133 if (lastCellDrawMode_)
1144 glDrawArrays(GL_TRIANGLES, 0, cellsBufferManager_.getNumOfVertices());
1150 if (lastFaceDrawMode_)
1160 glDrawArrays(GL_TRIANGLES, 0, facesBufferManager_.getNumOfVertices());
1166 GLenum oldDepthFunc = _state.
depthFunc();
1175 vertexPickBufferManager_.invalidateColors();
1177 pickVertices(_state);
1183 pickEdges(_state, 0);
1189 pickFaces(_state, 0);
1195 pickCells(_state, 0);
1201 vertexPickBufferManager_.invalidateColors();
1203 int nv = mesh_.n_vertices();
1204 int ne = mesh_.n_edges();
1205 int nf = mesh_.n_faces();
1206 int nc = mesh_.n_cells();
1209 pickVertices(_state);
1210 pickEdges(_state, nv);
1211 pickFaces(_state, nv + ne);
1212 pickCells(_state, nv + ne + nf);
1221 lastPickTarget_ = _target;
1223 if(drawModeOverride)
1227template<
class VolumeMeshT>
1230 cellsBufferManager_.clearCutPlanes();
1231 facesBufferManager_.clearCutPlanes();
1232 edgesBufferManager_.clearCutPlanes();
1233 verticesBufferManager_.clearCutPlanes();
1235 cellSelectionBufferManager_.clearCutPlanes();
1236 faceSelectionBufferManager_.clearCutPlanes();
1237 edgeSelectionBufferManager_.clearCutPlanes();
1238 vertexSelectionBufferManager_.clearCutPlanes();
1240 cellPickBufferManager_.clearCutPlanes();
1241 facePickBufferManager_.clearCutPlanes();
1242 edgePickBufferManager_.clearCutPlanes();
1243 vertexPickBufferManager_.clearCutPlanes();
1250template<
class VolumeMeshT>
1253 if (lastDrawMode_ & drawModes_.vertexBasedDrawModes)
1254 vertexPickBufferManager_.enableVertexPrimitives();
1255 else if (lastDrawMode_ & drawModes_.cellBasedDrawModes)
1256 vertexPickBufferManager_.enableVertexOnCellPrimitives();
1258 vertexPickBufferManager_.enableVertexPrimitives();
1260 vertexPickBufferManager_.disableNormals();
1261 vertexPickBufferManager_.enablePickColors();
1265 desc.vertexColors =
true;
1266 desc.vertexTemplateFile =
"Picking/vertexPassColors.glsl";
1267 desc.fragmentTemplateFile =
"Picking/passColors_fs.glsl";
1273 if(!( pickVertexShader_ && pickVertexShader_->
isLinked()))
1276 pickVertexShader_->
use();
1277 vertexPickBufferManager_.getVertexDeclaration()->activateShaderPipeline(pickVertexShader_);
1285 glDrawArrays(GL_POINTS, 0, vertexPickBufferManager_.getNumOfVertices());
1287 vertexPickBufferManager_.getVertexDeclaration()->deactivateShaderPipeline(pickVertexShader_);
1298template<
class VolumeMeshT>
1301 if ((lastDrawMode_ & (drawModes_.cellBasedDrawModes | drawModes_.edgesOnCells)) && !(lastDrawMode_ & (drawModes_.edgeBasedDrawModes & ~drawModes_.edgesOnCells)))
1302 edgePickBufferManager_.enableEdgeOnCellPrimitives();
1304 edgePickBufferManager_.enableEdgePrimitives();
1306 edgePickBufferManager_.enablePickColors();
1307 edgePickBufferManager_.disableNormals();
1311 desc.vertexColors =
true;
1312 desc.vertexTemplateFile =
"Picking/vertexPassColors.glsl";
1313 desc.fragmentTemplateFile =
"Picking/passColors_fs.glsl";
1319 if(!( pickVertexShader_ && pickVertexShader_->
isLinked()))
1321 GLState::bindBuffer(GL_ARRAY_BUFFER, edgePickBufferManager_.getPickBuffer(_state, _offset));
1323 pickVertexShader_->
use();
1324 edgePickBufferManager_.getVertexDeclaration()->activateShaderPipeline(pickVertexShader_);
1332 glDrawArrays(GL_LINES, 0, edgePickBufferManager_.getNumOfVertices());
1334 edgePickBufferManager_.getVertexDeclaration()->deactivateShaderPipeline(pickVertexShader_);
1345template<
class VolumeMeshT>
1348 if (lastDrawMode_ & (drawModes_.faceBasedDrawModes | drawModes_.halffaceBasedDrawModes))
1349 facePickBufferManager_.enableFacePrimitives();
1350 else if (lastDrawMode_ & drawModes_.cellBasedDrawModes)
1351 facePickBufferManager_.enableFaceOnCellPrimitives();
1353 facePickBufferManager_.enableFacePrimitives();
1355 facePickBufferManager_.disableNormals();
1356 facePickBufferManager_.enablePickColors();
1360 desc.vertexColors =
true;
1361 desc.vertexTemplateFile =
"Picking/vertexPassColors.glsl";
1362 desc.fragmentTemplateFile =
"Picking/passColors_fs.glsl";
1368 if(!( pickVertexShader_ && pickVertexShader_->
isLinked()))
1370 GLState::bindBuffer(GL_ARRAY_BUFFER, facePickBufferManager_.getPickBuffer(_state, _offset));
1372 pickVertexShader_->
use();
1373 facePickBufferManager_.getVertexDeclaration()->activateShaderPipeline(pickVertexShader_);
1378 glDrawArrays(GL_TRIANGLES, 0, facePickBufferManager_.getNumOfVertices());
1380 facePickBufferManager_.getVertexDeclaration()->deactivateShaderPipeline(pickVertexShader_);
1388template<
class VolumeMeshT>
1391 cellPickBufferManager_.enablePickColors();
1392 cellPickBufferManager_.disableNormals();
1393 cellPickBufferManager_.enableCellPrimitives();
1397 desc.vertexColors =
true;
1398 desc.vertexTemplateFile =
"Picking/vertexPassColors.glsl";
1399 desc.fragmentTemplateFile =
"Picking/passColors_fs.glsl";
1405 if(!( pickVertexShader_ && pickVertexShader_->
isLinked()))
1407 GLState::bindBuffer(GL_ARRAY_BUFFER, cellPickBufferManager_.getPickBuffer(_state, _offset));
1409 pickVertexShader_->
use();
1410 cellPickBufferManager_.getVertexDeclaration()->activateShaderPipeline(pickVertexShader_);
1416 glDrawArrays(GL_TRIANGLES, 0, cellPickBufferManager_.getNumOfVertices());
1419 cellPickBufferManager_.getVertexDeclaration()->deactivateShaderPipeline(pickVertexShader_);
1426template<
class VolumeMeshT>
1429 normalAttrib_.update_face_normals();
1430 face_normals_calculated_ =
true;
1435template<
class VolumeMeshT>
1438 normalAttrib_.update_vertex_normals();
1439 vertex_normals_calculated_ =
true;
1441 face_normals_calculated_ =
true;
1446template<
class VolumeMeshT>
1448 const Vec3d& _ysize) {
1450 add_cut_plane(Plane(_p, _n, _xsize, _ysize));
1453template<
class VolumeMeshT>
1454void VolumeMeshNodeT<VolumeMeshT>::set_scaling(
double _scale)
1457 cellsBufferManager_.setScale(scale_);
1458 edgesBufferManager_.setScale(scale_);
1459 cellSelectionBufferManager_.setScale(scale_);
1460 faceSelectionBufferManager_.setScale(scale_);
1461 edgeSelectionBufferManager_.setScale(scale_);
1462 vertexSelectionBufferManager_.setScale(scale_);
1463 cellPickBufferManager_.setScale(scale_);
1464 facePickBufferManager_.setScale(scale_);
1465 edgePickBufferManager_.setScale(scale_);
1466 vertexPickBufferManager_.setScale(scale_);
1469template<
class VolumeMeshT>
1470void VolumeMeshNodeT<VolumeMeshT>::set_boundary_only(
bool _boundary)
1472 boundary_only_ = _boundary;
1474 cellsBufferManager_.setBoundaryOnly(_boundary);
1475 facesBufferManager_.setBoundaryOnly(_boundary);
1476 edgesBufferManager_.setBoundaryOnly(_boundary);
1477 verticesBufferManager_.setBoundaryOnly(_boundary);
1479 cellSelectionBufferManager_.setBoundaryOnly(_boundary);
1480 faceSelectionBufferManager_.setBoundaryOnly(_boundary);
1481 edgeSelectionBufferManager_.setBoundaryOnly(_boundary);
1482 vertexSelectionBufferManager_.setBoundaryOnly(_boundary);
1484 cellPickBufferManager_.setBoundaryOnly(_boundary);
1485 facePickBufferManager_.setBoundaryOnly(_boundary);
1486 edgePickBufferManager_.setBoundaryOnly(_boundary);
1487 vertexPickBufferManager_.setScale(_boundary);
1491template<
class VolumeMeshT>
1492void VolumeMeshNodeT<VolumeMeshT>::set_topology_changed(
bool _topology_changed)
1494 if (_topology_changed)
1495 invalidateAllBuffers();
1498template<
class VolumeMeshT>
1499void VolumeMeshNodeT<VolumeMeshT>::set_geometry_changed(
bool _geom_changed)
1502 invalidateAllBuffers();
1505template<
class VolumeMeshT>
1506void VolumeMeshNodeT<VolumeMeshT>::set_color_changed(
bool _color_changed)
1510 cellsBufferManager_.invalidateColors();
1511 facesBufferManager_.invalidateColors();
1512 edgesBufferManager_.invalidateColors();
1513 verticesBufferManager_.invalidateColors();
1518template<
class VolumeMeshT>
1519void VolumeMeshNodeT<VolumeMeshT>::set_texture_changed(
bool _texture_changed)
1521 if (_texture_changed)
1523 cellsBufferManager_.invalidateTexCoords();
1524 facesBufferManager_.invalidateTexCoords();
1525 edgesBufferManager_.invalidateTexCoords();
1526 verticesBufferManager_.invalidateTexCoords();
1531template<
class VolumeMeshT>
1532void VolumeMeshNodeT<VolumeMeshT>::set_selection_changed(
bool _selection_changed)
1534 if (_selection_changed)
1535 invalidateAllSelectionBuffers();
1541template<
class VolumeMeshT>
1542void VolumeMeshNodeT<VolumeMeshT>::add_cut_plane(
const Plane& _p) {
1543 cellsBufferManager_.addCutPlane(_p);
1544 facesBufferManager_.addCutPlane(_p);
1545 edgesBufferManager_.addCutPlane(_p);
1546 verticesBufferManager_.addCutPlane(_p);
1548 cellSelectionBufferManager_.addCutPlane(_p);
1549 faceSelectionBufferManager_.addCutPlane(_p);
1550 edgeSelectionBufferManager_.addCutPlane(_p);
1551 vertexSelectionBufferManager_.addCutPlane(_p);
1553 cellPickBufferManager_.addCutPlane(_p);
1554 facePickBufferManager_.addCutPlane(_p);
1555 edgePickBufferManager_.addCutPlane(_p);
1556 vertexPickBufferManager_.addCutPlane(_p);
static void disableClientState(GLenum _cap)
replaces glDisableClientState, supports locking
static void colorPointer(GLint _size, GLenum _type, GLsizei _stride, const GLvoid *_pointer)
replaces glColorPointer, supports locking
void set_depthFunc(const GLenum &_depth_func)
Call glDepthFunc() to actually change the depth comparison function, and store the new value in this ...
void set_twosided_lighting(bool _b)
set whether transparent or solid objects should be drawn
static void cullFace(GLenum _mode)
replaces glCullFace, supports locking
static void vertexPointer(GLint _size, GLenum _type, GLsizei _stride, const GLvoid *_pointer)
replaces glVertexPointer, supports locking
static void enable(GLenum _cap, bool _warnRemoved=true)
replaces glEnable, but supports locking
const Vec4f & specular_color() const
get specular color
static void normalPointer(GLenum _type, GLsizei _stride, const GLvoid *_pointer)
replaces glNormalPointer, supports locking
const GLMatrixd & modelview() const
get modelview matrix
static void useProgram(GLuint _program)
replaces glUseProgram, supports locking
static void enableClientState(GLenum _cap)
replaces glEnableClientState, supports locking
int viewport_width() const
get viewport width
const Vec4f & base_color() const
get base color (used when lighting is off)
bool pick_set_maximum(size_t _idx)
Set the maximal number of primitives/components of your object.
static bool isClientStateEnabled(GLenum _cap)
returns true, if a client state is enabled
const GLMatrixd & projection() const
get projection matrix
static void blendFunc(GLenum _sfactor, GLenum _dfactor)
replaces glBlendFunc, supports locking
void set_color(const Vec4f &_col)
set color
static void depthRange(GLclampd _zNear, GLclampd _zFar)
replaces glDepthRange, supports locking
static void texcoordPointer(GLint _size, GLenum _type, GLsizei _stride, const GLvoid *_pointer)
replaces glTexcoordPointer, supports locking
static void disable(GLenum _cap, bool _warnRemoved=true)
replaces glDisable, but supports locking
void set_line_width(float _f)
set line width
void set_point_size(float _f)
set point size
const Vec4f & color()
set color
size_t pick_current_index() const
Returns the current color picking index (can be used for caching)
const Vec4f & clear_color() const
get background color
int viewport_height() const
get viewport height
bool twosided_lighting()
get whether transparenet or solid objects should be drawn
float line_width() const
get line width
static void shadeModel(GLenum _mode)
replaces glShadeModel, supports locking
const GLenum & depthFunc() const
get glDepthFunc() that is supposed to be active
static void bindBuffer(GLenum _target, GLuint _buffer)
replaces glBindBuffer, supports locking
float point_size() const
get point size
virtual void addRenderObject(RenderObject *_renderObject)
Callback for the scenegraph nodes, which send new render objects via this function.
void lineWidth(float _sz)
set line width (default: 1.0)
void pointSize(float _sz)
set point size (default: 1.0)
void boundingBox(Vec3d &_bbMin, Vec3d &_bbMax) override
update bounding box
void pickEdges(GLState &_state, unsigned int _offset)
pick edges
void drawCells(GLState &_state, const DrawModes::DrawMode &_drawMode)
renders the cells of the mesh
void pick(GLState &_state, PickTarget _target) override
picking
void drawEdges(GLState &_state, const DrawModes::DrawMode &_drawMode)
renders the edges or halfedges of the mesh
void drawSelection(GLState &_state, const DrawModes::DrawMode &_drawMode)
draw selected primitves
void invalidateAllPickingBuffers()
invalidates all buffers used for picking
void getVertexRenderObjects(IRenderer *_renderer, GLState &_state, const DrawModes::DrawMode &_drawMode, const Material *_mat)
adds render objects for drawing vertices to the given renderer
void getEdgeRenderObjects(IRenderer *_renderer, GLState &_state, const DrawModes::DrawMode &_drawMode, const Material *_mat)
adds render objects for drawing edges or halfedges to the given renderer
void update_vertex_normals()
updates vertex normals
void pickVertices(GLState &_state)
pick vertices
void draw(GLState &_state, const DrawModes::DrawMode &_drawMode) override
draw lines and normals
void invalidateAllSelectionBuffers()
invalidates all buffers used for rendering selected primitives
void drawFaces(GLState &_state, const DrawModes::DrawMode &_drawMode)
renders the faces or halffaces of the mesh
void invalidateAllBuffers()
invalidates all buffers
void getCellRenderObjects(IRenderer *_renderer, GLState &_state, const DrawModes::DrawMode &_drawMode, const Material *_mat)
adds render objects for drawing cells to the given renderer
void getFaceRenderObjects(IRenderer *_renderer, GLState &_state, const DrawModes::DrawMode &_drawMode, const Material *_mat)
adds render objects for drawing faces or halffaces to the given renderer
void drawVertices(GLState &_state, const DrawModes::DrawMode &_drawMode)
renders the vertices of the mesh
DrawModes::DrawMode availableDrawModes() const override
static name of this class
~VolumeMeshNodeT()
Destructor.
void pickCells(GLState &_state, unsigned int _offset)
pick cells
void getRenderObjects(IRenderer *_renderer, GLState &_state, const DrawModes::DrawMode &_drawMode, const Material *_mat) override
Draws the object deferred.
VolumeMeshNodeT(const VolumeMesh &_mesh, OpenVolumeMesh::StatusAttrib &_statusAttrib, OpenVolumeMesh::ColorAttrib< Vec4f > &_colorAttrib, OpenVolumeMesh::NormalAttrib< VolumeMesh > &_normalAttrib, OpenVolumeMesh::TexCoordAttrib< Vec2f > &_texcoordAttrib, const MaterialNode *_matNode, BaseNode *_parent=0, std::string _name="<VolumeMeshNode>")
Constructor.
void update_face_normals()
updates face normals
void pickFaces(GLState &_state, unsigned int _offset)
pick faces
void getSelectionRenderObjects(IRenderer *_renderer, GLState &_state, const DrawModes::DrawMode &_drawMode, const Material *_mat)
adds render objects for drawing selected primitves to the given renderer
void invalidateAllDrawBuffers()
invalidates all buffers used for normal rendering
static ShaderCache * getInstance()
Return instance of the ShaderCache singleton.
GLSL::Program * getProgram(const ShaderGenDesc *_desc, const std::vector< unsigned int > &_mods)
Query a dynamically generated program from cache.
void clearTextures()
disables texture support and removes all texture types
bool isLinked()
Returns if the program object has been succesfully linked.
void disable()
Resets to standard rendering pipeline.
void use()
Enables the program object for using.
void setUniform(const char *_name, GLint _value)
Set int uniform to specified value.
vector_type & maximize(const vector_type &_rhs)
maximize values: same as *this = max(*this, _rhs), but faster
vector_type & minimize(const vector_type &_rhs)
minimize values: same as *this = min(*this, _rhs), but faster
A data structure basing on PolyhedralMesh with specializations for hexahedra.
DrawMode NONE
not a valid draw mode
PickTarget
What target to use for picking.
@ PICK_EDGE
picks edges (may not be implemented for all nodes)
@ PICK_ANYTHING
pick any of the prior targets (should be implemented for all nodes)
@ PICK_CELL
picks faces (may not be implemented for all nodes)
@ PICK_FACE
picks faces (should be implemented for all nodes)
@ PICK_VERTEX
picks verices (may not be implemented for all nodes)
Namespace providing different geometric functions concerning angles.
VectorT< float, 4 > Vec4f
VectorT< float, 3 > Vec3f
VectorT< float, 2 > Vec2f
Interface class between scenegraph and renderer.
Vec3f diffuse
material definitions
ShaderGenDesc shaderDesc
Drawmode and other shader params.
void setupLineRendering(float _lineWidth, const Vec2f &_screenSize)
Setup rendering of thick lines.
const VertexDeclaration * vertexDecl
Defines the vertex buffer layout, ignored if VAO is provided.
GLuint vertexBuffer
VBO, IBO ids, ignored if VAO is provided.
GLenum blendDest
glBlendFunc: GL_SRC_ALPHA, GL_ZERO, GL_ONE, GL_ONE_MINUS_SRC_ALPHA ...
Vec2f depthRange
glDepthRange: (znear, zmax)
void initFromState(GLState *_glState)
Initializes a RenderObject instance.
GLenum depthFunc
GL_LESS, GL_LEQUAL, GL_GREATER ..
void setupPointRendering(float _pointSize, const Vec2f &_screenSize)
Setup rendering of circle points.