1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-03 19:52:10 +01:00
LibrePilot/ground/src/libs/glc_lib/geometry/glc_primitivegroup.h

321 lines
8.5 KiB
C
Raw Normal View History

/****************************************************************************
This file is part of the GLC-lib library.
Copyright (C) 2005-2008 Laurent Ribon (laumaya@users.sourceforge.net)
Version 2.0.0, packaged on July 2010.
http://glc-lib.sourceforge.net
GLC-lib is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
GLC-lib is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with GLC-lib; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
//! \file glc_primitivegroup.h interface for the GLC_PrimitiveGroup class.
#ifndef GLC_PRIMITIVEGROUP_H_
#define GLC_PRIMITIVEGROUP_H_
#include "../glc_ext.h"
#include "../glc_global.h"
#include "glc_config.h"
//////////////////////////////////////////////////////////////////////
//! \class GLC_PrimitiveGroup
/*! \brief GLC_PrimitiveGroup : Triangles, Strip and fan index*/
/*! An GLC_PrimitiveGroup is used to stored Triangles, strips and fans index
* Grouped by material*/
//////////////////////////////////////////////////////////////////////
class GLC_LIB_EXPORT GLC_PrimitiveGroup
{
friend QDataStream &operator<<(QDataStream &, const GLC_PrimitiveGroup &);
friend QDataStream &operator>>(QDataStream &, GLC_PrimitiveGroup &);
public:
//////////////////////////////////////////////////////////////////////
/*! @name Constructor / Destructor */
//@{
//////////////////////////////////////////////////////////////////////
//! Default constructor
GLC_PrimitiveGroup(GLC_uint id= 0);
//! Copy constructor
GLC_PrimitiveGroup(const GLC_PrimitiveGroup&);
//! Copy constructor
GLC_PrimitiveGroup(const GLC_PrimitiveGroup&, GLC_uint);
//! = operator
GLC_PrimitiveGroup& operator=(const GLC_PrimitiveGroup&);
~GLC_PrimitiveGroup();
//@}
//////////////////////////////////////////////////////////////////////
/*! \name Get Functions*/
//@{
//////////////////////////////////////////////////////////////////////
public:
//! Return the class Chunk ID
static quint32 chunckID();
//! Return true if the group is finished
inline bool isFinished() const
{return m_IsFinished;}
//! Return the group id
inline GLC_uint id() const
{return m_Id;}
//! Return true if the group contains triangles
inline bool containsTriangles() const
{return m_TrianglesIndexSize > 0;}
//! Return true if the group contains triangles group id
inline bool containsTrianglesGroupId() const
{return !m_TrianglesId.isEmpty();}
//! Return the Triangle group ID
inline GLC_uint triangleGroupId(int index)
{return m_TrianglesId.at(index);}
//! Return the size of list of triangles index of the group
inline int trianglesIndexSize() const
{return m_TrianglesIndexSize;}
//! Return the size of list of triangles index of the group
inline const IndexSizes& trianglesIndexSizes() const
{return m_TrianglesGroupsSizes;}
//! Return the list of triangles index of the group
inline const IndexList& trianglesIndex() const
{
Q_ASSERT(!m_IsFinished);
return m_TrianglesIndex;
}
//! Return the offset of triangles index
inline const GLvoid* trianglesIndexOffset() const
{return m_TrianglesGroupOffset.first();}
//! Return the offset of triangles index
inline int trianglesIndexOffseti() const
{return m_TrianglesGroupOffseti.first();}
//! Return the offset of triangles index
inline const OffsetVector& trianglesGroupOffset() const
{return m_TrianglesGroupOffset;}
//! Return the offset of triangles index
inline const OffsetVectori& trianglesGroupOffseti() const
{return m_TrianglesGroupOffseti;}
//! Return true if the group contains strips
inline bool containsStrip() const
{return m_TrianglesStripSize > 0;}
//! Return true if the group contains strips group id
inline bool containsStripGroupId() const
{return !m_StripsId.isEmpty();}
//! Return the strip ID
inline GLC_uint stripGroupId(int index)
{return m_StripsId.at(index);}
//! Return the size of index of strips
inline int stripsIndexSize() const
{return m_TrianglesStripSize;}
//! Return the list of index of strips
inline const IndexList& stripsIndex() const
{
Q_ASSERT(!m_IsFinished);
return m_StripsIndex;
}
//! Return the vector of strips sizes
inline const IndexSizes& stripsSizes() const
{return m_StripIndexSizes;}
//! Return the vector of strip offset
inline const OffsetVector& stripsOffset() const
{return m_StripIndexOffset;}
//! Return the vector of strip offset
inline const OffsetVectori& stripsOffseti() const
{return m_StripIndexOffseti;}
//! Return true if the group contains fans
inline bool containsFan() const
{return m_TrianglesFanSize > 0;}
//! Return true if the group contains fans group id
inline bool containsFanGroupId() const
{return !m_FansId.isEmpty();}
//! Return the fan ID
inline GLC_uint fanGroupId(int index)
{return m_FansId.at(index);}
//! Return the size of index of fans
inline int fansIndexSize() const
{return m_TrianglesFanSize;}
//! Return the list of index of fans
inline const IndexList& fansIndex() const
{
Q_ASSERT(!m_IsFinished);
return m_FansIndex;
}
//! Return the vector of fans sizes
inline const IndexSizes& fansSizes() const
{return m_FansIndexSizes;}
//! Return the vector of strip offset
inline const OffsetVector& fansOffset() const
{return m_FanIndexOffset;}
//! Return the vector of strip offset
inline const OffsetVectori& fansOffseti() const
{return m_FanIndexOffseti;}
//@}
//////////////////////////////////////////////////////////////////////
/*! \name Set Functions*/
//@{
//////////////////////////////////////////////////////////////////////
public:
//! Set the group id
inline void setId(GLC_uint id)
{m_Id= id;}
//! Add triangles to the group
void addTriangles(const IndexList& input, GLC_uint id= 0);
//! Set the triangle index offset
void setTrianglesOffset(GLvoid* pOffset);
//! Set the triangle index offset
void setTrianglesOffseti(int offset);
//! Add triangle strip to the group
void addTrianglesStrip(const IndexList&, GLC_uint id= 0);
//! Set base triangle strip offset
void setBaseTrianglesStripOffset(GLvoid*);
//! Set base triangle strip offset
void setBaseTrianglesStripOffseti(int);
//! Add triangle fan to the group
void addTrianglesFan(const IndexList&, GLC_uint id= 0);
//! Set base triangle fan offset
void setBaseTrianglesFanOffset(GLvoid*);
//! Set base triangle fan offset
void setBaseTrianglesFanOffseti(int);
//! Change index to VBO mode
void changeToVboMode();
//! The mesh wich use this group is finished
inline void finish()
{
m_TrianglesIndex.clear();
m_StripsIndex.clear();
m_FansIndex.clear();
m_IsFinished= true;
}
//! Clear the group
void clear();
//@}
//////////////////////////////////////////////////////////////////////
// Private members
//////////////////////////////////////////////////////////////////////
private:
//! Grouped material id
GLC_uint m_Id;
//! Triangles index list
IndexList m_TrianglesIndex;
//! Triangles groups index size
IndexSizes m_TrianglesGroupsSizes;
//! Vector of triangles group offset
OffsetVector m_TrianglesGroupOffset;
OffsetVectori m_TrianglesGroupOffseti;
//! Triangles groups id
QList<GLC_uint> m_TrianglesId;
//! Strips index list
IndexList m_StripsIndex;
//! Strips index size
IndexSizes m_StripIndexSizes;
//! Vector of strips offset
OffsetVector m_StripIndexOffset;
OffsetVectori m_StripIndexOffseti;
//! Strips id
QList<GLC_uint> m_StripsId;
//! Fans index list
IndexList m_FansIndex;
//! Fans index size
IndexSizes m_FansIndexSizes;
//! Vector of fan Offset
OffsetVector m_FanIndexOffset;
OffsetVectori m_FanIndexOffseti;
//! Fans id
QList<GLC_uint> m_FansId;
//! Flag to know if the group is finish
int m_IsFinished;
//! Flag to know if there is triangles
int m_TrianglesIndexSize;
//! Flag to know if there is triangles strip
int m_TrianglesStripSize;
//! Flag to know if there is triangles fan
int m_TrianglesFanSize;
//! Class chunk id
static quint32 m_ChunkId;
};
//! Non-member stream operator
QDataStream &operator<<(QDataStream &, const GLC_PrimitiveGroup &);
QDataStream &operator>>(QDataStream &, GLC_PrimitiveGroup &);
#endif /* GLC_PRIMITIVEGROUP_H_ */