- new version of the renderer. Ready for the upcoming MeshLab release...

This commit is contained in:
granzuglia 2016-06-04 16:20:59 +00:00
parent c54c85768a
commit 0f9cf2e947
4 changed files with 923 additions and 453 deletions

View File

@ -26,17 +26,18 @@
#include <vector> #include <vector>
#include <string> #include <string>
#include <bitset>
namespace vcg namespace vcg
{ {
struct GLMeshAttributesInfo struct GLMeshAttributesInfo
{ {
struct GLBOException : public std::exception struct Exception : public std::exception
{ {
GLBOException(const char* text) Exception(const char* text)
:std::exception(),_text(text) {} :std::exception(),_text(text) {}
~GLBOException() throw() {} ~Exception() throw() {}
inline const char* what() const throw() {return _text.c_str();} inline const char* what() const throw() {return _text.c_str();}
private: private:
std::string _text; std::string _text;
@ -52,10 +53,9 @@ namespace vcg
static const unsigned int ATT_FACENORMAL = 2; static const unsigned int ATT_FACENORMAL = 2;
static const unsigned int ATT_VERTCOLOR = 3; static const unsigned int ATT_VERTCOLOR = 3;
static const unsigned int ATT_FACECOLOR = 4; static const unsigned int ATT_FACECOLOR = 4;
static const unsigned int ATT_MESHCOLOR = 5; static const unsigned int ATT_VERTTEXTURE = 5;
static const unsigned int ATT_VERTTEXTURE = 6; static const unsigned int ATT_WEDGETEXTURE = 6;
static const unsigned int ATT_WEDGETEXTURE = 7; enum {ATT_ARITY = 7};
enum {ATT_ARITY = 8};
ATT_NAMES() ATT_NAMES()
@ -66,14 +66,14 @@ namespace vcg
ATT_NAMES(unsigned int att) ATT_NAMES(unsigned int att)
{ {
if ((att < ATT_VERTPOSITION) || (att >= ATT_NAMES::enumArity())) if ((att < ATT_VERTPOSITION) || (att >= ATT_NAMES::enumArity()))
throw GLBOException("Out of range value\n"); throw Exception("Out of range value\n");
else else
_val = att; _val = att;
} }
static unsigned int enumArity() static unsigned int enumArity()
{ {
return ATT_ARITY; return ATT_NAMES::ATT_ARITY;
} }
operator unsigned int() const operator unsigned int() const
@ -96,30 +96,24 @@ namespace vcg
}; };
enum PRIMITIVE_MODALITY enum PRIMITIVE_MODALITY
{ {
PR_NONE = 0x00000000, PR_POINTS = 0,
PR_BBOX = 0x00000001, PR_WIREFRAME_EDGES = 1,
PR_POINTS = 0x00000002, PR_WIREFRAME_TRIANGLES = 2,
PR_WIREFRAME_EDGES = 0x00000004, PR_SOLID = 3,
PR_WIREFRAME_TRIANGLES = 0x00000008, PR_ARITY = 4
PR_SOLID = 0x00000010
}; };
typedef unsigned int PRIMITIVE_MODALITY_MASK; static PRIMITIVE_MODALITY next(PRIMITIVE_MODALITY pm)
static PRIMITIVE_MODALITY_MASK addPrimitiveModality(const PRIMITIVE_MODALITY_MASK& mask,PRIMITIVE_MODALITY newpm)
{ {
PRIMITIVE_MODALITY_MASK res(mask); int tmp = static_cast<int>(pm);
res = res | newpm; if (tmp == PR_ARITY)
return res; throw Exception("PRIMITIVE_MODALITY iterator: PR_ARITY passed as parameter!");
++tmp;
return static_cast<PRIMITIVE_MODALITY>(tmp);
} }
static PRIMITIVE_MODALITY_MASK removePrimitiveModality(const PRIMITIVE_MODALITY_MASK& mask,PRIMITIVE_MODALITY removedpm) typedef std::bitset<PR_ARITY> PRIMITIVE_MODALITY_MASK;
{
PRIMITIVE_MODALITY_MASK res(mask);
res = res & ~(removedpm);
return res;
}
template<typename ATT_NAMES_DERIVED_CLASS> template<typename ATT_NAMES_DERIVED_CLASS>
class RenderingAtts class RenderingAtts
@ -169,24 +163,23 @@ namespace vcg
bool operator[](unsigned int ind) const bool operator[](unsigned int ind) const
{ {
if (ind >= ATT_NAMES_DERIVED_CLASS::enumArity()) if (ind >= ATT_NAMES_DERIVED_CLASS::enumArity())
throw GLBOException("Out of range value\n"); throw Exception("Out of range value\n");
return _atts[ind]; return _atts[ind];
} }
bool& operator[](unsigned int ind) bool& operator[](unsigned int ind)
{ {
if (ind >= ATT_NAMES_DERIVED_CLASS::enumArity()) if (ind >= ATT_NAMES_DERIVED_CLASS::enumArity())
throw GLBOException("Out of range value\n"); throw Exception("Out of range value\n");
return _atts[ind]; return _atts[ind];
} }
void reset(bool posactivated = false) void reset()
{ {
//delete[] _atts; //delete[] _atts;
//_atts = new bool[ATT_NAMES_DERIVED_CLASS::enumArity()]; //_atts = new bool[ATT_NAMES_DERIVED_CLASS::enumArity()];
for(unsigned int ii = 0;ii < ATT_NAMES_DERIVED_CLASS::enumArity();++ii) for(unsigned int ii = 0;ii < ATT_NAMES_DERIVED_CLASS::enumArity();++ii)
_atts[ii] = false; _atts[ii] = false;
_atts[ATT_NAMES_DERIVED_CLASS::ATT_VERTPOSITION] = posactivated;
} }
static RenderingAtts<ATT_NAMES_DERIVED_CLASS> unionSet(const RenderingAtts<ATT_NAMES_DERIVED_CLASS>& a,const RenderingAtts<ATT_NAMES_DERIVED_CLASS>& b) static RenderingAtts<ATT_NAMES_DERIVED_CLASS> unionSet(const RenderingAtts<ATT_NAMES_DERIVED_CLASS>& a,const RenderingAtts<ATT_NAMES_DERIVED_CLASS>& b)
@ -238,13 +231,14 @@ namespace vcg
// rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FACENORMAL] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FACENORMAL] && vcg::tri::HasPerFaceNormal(mesh); // rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FACENORMAL] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FACENORMAL] && vcg::tri::HasPerFaceNormal(mesh);
// rqatt[ATT_NAMES_DERIVED_CLASS::ATT_VERTCOLOR] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_VERTCOLOR] && vcg::tri::HasPerVertexColor(mesh); // rqatt[ATT_NAMES_DERIVED_CLASS::ATT_VERTCOLOR] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_VERTCOLOR] && vcg::tri::HasPerVertexColor(mesh);
// rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FACECOLOR] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FACECOLOR] && vcg::tri::HasPerFaceColor(mesh); // rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FACECOLOR] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FACECOLOR] && vcg::tri::HasPerFaceColor(mesh);
// rqatt[ATT_NAMES_DERIVED_CLASS::ATT_MESHCOLOR] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_MESHCOLOR]; // rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FIXEDCOLOR] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_FIXEDCOLOR];
// rqatt[ATT_NAMES_DERIVED_CLASS::ATT_VERTTEXTURE] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_VERTTEXTURE] && vcg::tri::HasPerVertexTexCoord(mesh); // rqatt[ATT_NAMES_DERIVED_CLASS::ATT_VERTTEXTURE] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_VERTTEXTURE] && vcg::tri::HasPerVertexTexCoord(mesh);
// rqatt[ATT_NAMES_DERIVED_CLASS::ATT_WEDGETEXTURE] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_WEDGETEXTURE] && vcg::tri::HasPerWedgeTexCoord(mesh); // rqatt[ATT_NAMES_DERIVED_CLASS::ATT_WEDGETEXTURE] = rqatt[ATT_NAMES_DERIVED_CLASS::ATT_WEDGETEXTURE] && vcg::tri::HasPerWedgeTexCoord(mesh);
//} //}
protected: protected:
/*an array of enumArity() bool values*/ /*an array of enumArity() bool values*/
bool _atts[ATT_NAMES_DERIVED_CLASS::ATT_ARITY]; bool _atts[ATT_NAMES_DERIVED_CLASS::ATT_ARITY];
//std::bitset<ATT_NAMES_DERIVED_CLASS::ATT_ARITY> _atts;
}; };
typedef RenderingAtts<ATT_NAMES> RendAtts; typedef RenderingAtts<ATT_NAMES> RendAtts;
@ -273,6 +267,25 @@ namespace vcg
_currentlyallocated.clear(); _currentlyallocated.clear();
_perviewdata.clear(); _perviewdata.clear();
} }
static const char* primitiveName(size_t ind)
{
static std::string res;
if (ind == size_t(PR_POINTS))
res = std::string("PR_POINTS");
if (ind == size_t(PR_WIREFRAME_EDGES))
res = std::string("PR_WIREFRAME_EDGES");
if (ind == size_t(PR_WIREFRAME_TRIANGLES))
res = std::string("PR_WIREFRAME_TRIANGLES");
if (ind == size_t(PR_SOLID))
res = std::string("PR_SOLID");
return res.c_str();
}
}; };
protected: protected:
@ -283,10 +296,10 @@ namespace vcg
/*A triangles meshes rendered in wireframe or in solid wireframe, in order to save GPU memory, use the glPolygonMode approach*/ /*A triangles meshes rendered in wireframe or in solid wireframe, in order to save GPU memory, use the glPolygonMode approach*/
/*Edges meshes uses the edges index array just for a matter of coherence*/ /*Edges meshes uses the edges index array just for a matter of coherence*/
/*WARNING!!!! to be changed whit ATT_NAMES::enumArity() + 1 (and so on...) as soon as constexpr will be supported by most of the old c++ compilers*/ /*WARNING!!!! to be changed whit ATT_NAMES::enumArity() (and so on...) as soon as constexpr will be supported by most of the old c++ compilers*/
static const unsigned int ATT_VERTINDICES = 8; static const unsigned int ATT_VERTINDICES = 7;
static const unsigned int ATT_EDGEINDICES = 9; static const unsigned int ATT_EDGEINDICES = 8;
enum {ATT_ARITY = 10}; enum {ATT_ARITY = 9};
INT_ATT_NAMES() INT_ATT_NAMES()
:ATT_NAMES() :ATT_NAMES()
@ -297,14 +310,14 @@ namespace vcg
:ATT_NAMES() :ATT_NAMES()
{ {
if ((att < INT_ATT_NAMES::ATT_VERTPOSITION) || (att >= INT_ATT_NAMES::enumArity())) if ((att < INT_ATT_NAMES::ATT_VERTPOSITION) || (att >= INT_ATT_NAMES::enumArity()))
throw GLBOException("Out of range value\n"); throw Exception("Out of range value\n");
else else
_val = att; _val = att;
} }
static unsigned int enumArity() static unsigned int enumArity()
{ {
return ATT_ARITY; return INT_ATT_NAMES::ATT_ARITY;
} }
operator unsigned int() const operator unsigned int() const
@ -344,29 +357,12 @@ namespace vcg
(*this)[INT_ATT_NAMES::ATT_EDGEINDICES] = isEdgeIndexingRequired(pm); (*this)[INT_ATT_NAMES::ATT_EDGEINDICES] = isEdgeIndexingRequired(pm);
} }
InternalRendAtts(const RendAtts& reqatt,PRIMITIVE_MODALITY_MASK pm)
:RenderingAtts<INT_ATT_NAMES>()
{
for(unsigned int ii = 0;ii < ATT_NAMES::enumArity();++ii)
{
bool somethingtorender = (pm != ((unsigned int) PR_NONE));
(*this)[ii] = reqatt[ii] && somethingtorender;
}
(*this)[INT_ATT_NAMES::ATT_VERTINDICES] = isVertexIndexingRequired(reqatt,pm);
(*this)[INT_ATT_NAMES::ATT_EDGEINDICES] = isEdgeIndexingRequired(pm);
}
InternalRendAtts(const RenderingAtts<INT_ATT_NAMES>& r) InternalRendAtts(const RenderingAtts<INT_ATT_NAMES>& r)
:RenderingAtts<INT_ATT_NAMES>(r) :RenderingAtts<INT_ATT_NAMES>(r)
{ {
} }
static InternalRendAtts create(const RendAtts& rqatts,PRIMITIVE_MODALITY_MASK pm)
{
return InternalRendAtts(rqatts,pm);
}
//upcast from InternalRendAtts to RendAtts //upcast from InternalRendAtts to RendAtts
operator RendAtts() const operator RendAtts() const
{ {
@ -376,7 +372,12 @@ namespace vcg
return rendatt; return rendatt;
} }
InternalRendAtts& setIndexingIfNeeded(PRIMITIVE_MODALITY pm)
{
(*this)[INT_ATT_NAMES::ATT_VERTINDICES] = isVertexIndexingRequired((*this),pm);
(*this)[INT_ATT_NAMES::ATT_EDGEINDICES] = isEdgeIndexingRequired(pm);
return (*this);
}
static bool isPerVertexAttribute(INT_ATT_NAMES name) static bool isPerVertexAttribute(INT_ATT_NAMES name)
{ {
@ -393,58 +394,12 @@ namespace vcg
return (!replicatedPipelineNeeded(rqatt) && ((pm == PR_SOLID) || (pm == PR_WIREFRAME_TRIANGLES))); return (!replicatedPipelineNeeded(rqatt) && ((pm == PR_SOLID) || (pm == PR_WIREFRAME_TRIANGLES)));
} }
static bool isVertexIndexingRequired(const RendAtts& rqatt,PRIMITIVE_MODALITY_MASK pm)
{
bool required = false;
if (pm == ((unsigned int) PR_NONE))
return false;
if (pm & PR_POINTS)
required = required || isVertexIndexingRequired(rqatt,PR_POINTS);
if (pm & PR_WIREFRAME_EDGES)
required = required || isVertexIndexingRequired(rqatt,PR_WIREFRAME_EDGES);
if (pm & PR_WIREFRAME_TRIANGLES)
required = required || isVertexIndexingRequired(rqatt,PR_WIREFRAME_TRIANGLES);
if (pm & PR_SOLID)
required = required || isVertexIndexingRequired(rqatt,PR_SOLID);
if (pm & PR_BBOX)
required = required || isVertexIndexingRequired(rqatt,PR_BBOX);
return required;
}
static bool isEdgeIndexingRequired(PRIMITIVE_MODALITY pm) static bool isEdgeIndexingRequired(PRIMITIVE_MODALITY pm)
{ {
return (pm == PR_WIREFRAME_EDGES); return (pm == PR_WIREFRAME_EDGES);
} }
static bool isEdgeIndexingRequired(PRIMITIVE_MODALITY_MASK pm) /*static void suggestedMinimalAttributeSetForPrimitiveModalityMask(PRIMITIVE_MODALITY_MASK pm,RenderingAtts<INT_ATT_NAMES>& atts)
{
bool required = false;
//if (pm & PR_POINTS)
// required = isEdgeIndexingRequired(PR_POINTS);
//if (pm & PR_WIREFRAME_TRIANGLES)
// required = isEdgeIndexingRequired(PR_WIREFRAME_TRIANGLES);
if (pm & PR_WIREFRAME_EDGES)
required = isEdgeIndexingRequired(PR_WIREFRAME_EDGES);
//if (pm & PR_SOLID)
// required = isEdgeIndexingRequired(PR_SOLID);
//if (pm & PR_BBOX)
// required = isEdgeIndexingRequired(PR_BBOX);
return required;
}
static void suggestedMinimalAttributeSetForPrimitiveModalityMask(PRIMITIVE_MODALITY_MASK pm,RenderingAtts<INT_ATT_NAMES>& atts)
{ {
if ((pm == (unsigned int)(PR_NONE)) || (pm == (unsigned int)(PR_BBOX))) if ((pm == (unsigned int)(PR_NONE)) || (pm == (unsigned int)(PR_BBOX)))
{ {
@ -469,7 +424,7 @@ namespace vcg
atts[INT_ATT_NAMES::ATT_VERTINDICES] = true; atts[INT_ATT_NAMES::ATT_VERTINDICES] = true;
} }
} }*/
}; };
}; };
} }

File diff suppressed because it is too large Load Diff

View File

@ -29,10 +29,11 @@
#include <wrap/qt/qt_thread_safe_texture_names_container.h> #include <wrap/qt/qt_thread_safe_texture_names_container.h>
#include <wrap/gl/gl_mesh_attributes_multi_viewer_bo_manager.h> #include <wrap/gl/gl_mesh_attributes_multi_viewer_bo_manager.h>
#include <QString> #include <QString>
#include <QReadWriteLock>
namespace vcg namespace vcg
{ {
template<typename MESH_TYPE,typename UNIQUE_VIEW_ID_TYPE,typename GL_OPTIONS_DERIVED_TYPE = vcg::PerViewPerRenderingModalityGLOptions> template<typename MESH_TYPE,typename UNIQUE_VIEW_ID_TYPE,typename GL_OPTIONS_DERIVED_TYPE = vcg::RenderingModalityGLOptions>
class QtThreadSafeGLMeshAttributesMultiViewerBOManager : public vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE> class QtThreadSafeGLMeshAttributesMultiViewerBOManager : public vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE>
{ {
public: public:
@ -43,22 +44,22 @@ namespace vcg
~QtThreadSafeGLMeshAttributesMultiViewerBOManager() {} ~QtThreadSafeGLMeshAttributesMultiViewerBOManager() {}
void meshAttributesUpdated(bool hasmeshconnectivitychanged,const vcg::GLMeshAttributesInfo::RendAtts& changedrendatts) void meshAttributesUpdated(bool hasmeshconnectivitychanged,const RendAtts& changedrendatts)
{ {
QWriteLocker locker(&_lock); QWriteLocker locker(&_lock);
vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE>::meshAttributesUpdated(hasmeshconnectivitychanged,changedrendatts); vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE>::meshAttributesUpdated(hasmeshconnectivitychanged,changedrendatts);
} }
bool getPerViewInfo(UNIQUE_VIEW_ID_TYPE viewid,vcg::GLMeshAttributesInfo::PRIMITIVE_MODALITY_MASK* mask,vcg::GLMeshAttributesInfo::RendAtts* rendatts,GL_OPTIONS_DERIVED_TYPE* opts) bool getPerViewInfo(UNIQUE_VIEW_ID_TYPE viewid,PerViewData<GL_OPTIONS_DERIVED_TYPE>& dt) const
{ {
QReadLocker locker(&_lock); QReadLocker locker(&_lock);
return vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE>::getPerViewInfo(viewid,mask,rendatts,opts); return vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE>::getPerViewInfo(viewid,dt);
} }
void setPerViewInfo(UNIQUE_VIEW_ID_TYPE viewid,vcg::GLMeshAttributesInfo::PRIMITIVE_MODALITY_MASK pm,const vcg::GLMeshAttributesInfo::RendAtts& reqatts) void setPerViewInfo(UNIQUE_VIEW_ID_TYPE viewid,const PerViewData<GL_OPTIONS_DERIVED_TYPE>& dt)
{ {
QWriteLocker locker(&_lock); QWriteLocker locker(&_lock);
vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE>::setPerViewInfo(viewid,pm,reqatts); vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE>::setPerViewInfo(viewid,dt);
} }
void removeView(UNIQUE_VIEW_ID_TYPE viewid) void removeView(UNIQUE_VIEW_ID_TYPE viewid)
@ -105,7 +106,7 @@ namespace vcg
QWriteLocker locker(&_lock); QWriteLocker locker(&_lock);
vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE>::setGLOptions(viewid,opts); vcg::NotThreadSafeGLMeshAttributesMultiViewerBOManager<MESH_TYPE,UNIQUE_VIEW_ID_TYPE,GL_OPTIONS_DERIVED_TYPE>::setGLOptions(viewid,opts);
} }
void setDebugMode(bool activatedebugmodality) void setDebugMode(bool activatedebugmodality)
{ {
QWriteLocker locker(&_lock); QWriteLocker locker(&_lock);

View File

@ -80,12 +80,12 @@ namespace vcg
void acquiredMemory(std::ptrdiff_t mem) void acquiredMemory(std::ptrdiff_t mem)
{ {
if (mem > _originaltotalmemory) /*if (mem > _originaltotalmemory)
throw MemoryInfo::MemoryInfoException("It has been requested more memory than the total one.\\n"); throw MemoryInfo::MemoryInfoException("It has been requested more memory than the total one.\\n");
else else
if (mem > _currentfreememory) if (mem > _currentfreememory)
throw MemoryInfo::MemoryInfoException("It has been requested more memory than the free available one.\\n"); throw MemoryInfo::MemoryInfoException("It has been requested more memory than the free available one.\\n");
else else*/
_currentfreememory -= mem; _currentfreememory -= mem;
} }
@ -101,9 +101,9 @@ namespace vcg
void releasedMemory(std::ptrdiff_t mem = 0) void releasedMemory(std::ptrdiff_t mem = 0)
{ {
if (mem > _originaltotalmemory) /*if (mem > _originaltotalmemory)
throw MemoryInfo::MemoryInfoException("It has been released more memory than the total one. Something strange happened!\\n"); throw MemoryInfo::MemoryInfoException("It has been released more memory than the total one. Something strange happened!\\n");
else else*/
_currentfreememory += mem; _currentfreememory += mem;
} }