264 lines
18 KiB
C++
264 lines
18 KiB
C++
/*
|
|
Copyright (c) 2013 Khaled Mammou - Advanced Micro Devices, Inc.
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
*/
|
|
|
|
|
|
#pragma once
|
|
#ifndef O3DGC_INDEXED_FACE_SET_H
|
|
#define O3DGC_INDEXED_FACE_SET_H
|
|
|
|
#include "o3dgcCommon.h"
|
|
|
|
namespace o3dgc
|
|
{
|
|
template<class T>
|
|
class IndexedFaceSet
|
|
{
|
|
public:
|
|
//! Constructor.
|
|
IndexedFaceSet(void)
|
|
{
|
|
memset(this, 0, sizeof(IndexedFaceSet));
|
|
m_ccw = true;
|
|
m_solid = true;
|
|
m_convex = true;
|
|
m_isTriangularMesh = true;
|
|
m_creaseAngle = 30;
|
|
};
|
|
//! Destructor.
|
|
~IndexedFaceSet(void) {};
|
|
|
|
unsigned long GetNCoordIndex() const { return m_nCoordIndex ;}
|
|
// only coordIndex is supported
|
|
unsigned long GetNCoord() const { return m_nCoord ;}
|
|
unsigned long GetNNormal() const { return m_nNormal ;}
|
|
unsigned long GetNFloatAttribute(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
return m_nFloatAttribute[a];
|
|
}
|
|
unsigned long GetNIntAttribute(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES);
|
|
return m_nIntAttribute[a];
|
|
}
|
|
unsigned long GetNumFloatAttributes() const { return m_numFloatAttributes;}
|
|
unsigned long GetNumIntAttributes() const { return m_numIntAttributes ;}
|
|
const Real * GetCoordMin () const { return m_coordMin;}
|
|
const Real * GetCoordMax () const { return m_coordMax;}
|
|
const Real * GetNormalMin () const { return m_normalMin;}
|
|
const Real * GetNormalMax () const { return m_normalMax;}
|
|
Real GetCoordMin (int j) const { return m_coordMin[j] ;}
|
|
Real GetCoordMax (int j) const { return m_coordMax[j] ;}
|
|
Real GetNormalMin (int j) const { return m_normalMin[j] ;}
|
|
Real GetNormalMax (int j) const { return m_normalMax[j] ;}
|
|
|
|
O3DGCIFSFloatAttributeType GetFloatAttributeType(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
return m_typeFloatAttribute[a];
|
|
}
|
|
O3DGCIFSIntAttributeType GetIntAttributeType(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES);
|
|
return m_typeIntAttribute[a];
|
|
}
|
|
unsigned long GetFloatAttributeDim(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
return m_dimFloatAttribute[a];
|
|
}
|
|
unsigned long GetIntAttributeDim(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES);
|
|
return m_dimIntAttribute[a];
|
|
}
|
|
const Real * GetFloatAttributeMin(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
return &(m_minFloatAttribute[a * O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES]);
|
|
}
|
|
const Real * GetFloatAttributeMax(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
return &(m_maxFloatAttribute[a * O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES]);
|
|
}
|
|
Real GetFloatAttributeMin(unsigned long a, unsigned long dim) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
assert(dim < O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES);
|
|
return m_minFloatAttribute[a * O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES + dim];
|
|
}
|
|
Real GetFloatAttributeMax(unsigned long a, unsigned long dim) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
assert(dim < O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES);
|
|
return m_maxFloatAttribute[a * O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES + dim];
|
|
}
|
|
Real GetCreaseAngle() const { return m_creaseAngle ;}
|
|
bool GetCCW() const { return m_ccw ;}
|
|
bool GetSolid() const { return m_solid ;}
|
|
bool GetConvex() const { return m_convex ;}
|
|
bool GetIsTriangularMesh() const { return m_isTriangularMesh;}
|
|
const unsigned long * GetIndexBufferID() const { return m_indexBufferID ;}
|
|
const T * GetCoordIndex() const { return m_coordIndex;}
|
|
T * GetCoordIndex() { return m_coordIndex;}
|
|
Real * GetCoord() const { return m_coord ;}
|
|
Real * GetNormal() const { return m_normal ;}
|
|
Real * GetFloatAttribute(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
return m_floatAttribute[a];
|
|
}
|
|
long * GetIntAttribute(unsigned long a) const
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES);
|
|
return m_intAttribute[a] ;
|
|
}
|
|
// only coordIndex is supported
|
|
void SetNNormalIndex(unsigned long) {}
|
|
void SetNTexCoordIndex(unsigned long) {}
|
|
void SetNFloatAttributeIndex(int, unsigned long) {}
|
|
void SetNIntAttributeIndex (int, unsigned long) {}
|
|
// per triangle attributes not supported
|
|
void SetNormalPerVertex(bool) {}
|
|
void SetColorPerVertex(bool) {}
|
|
void SetFloatAttributePerVertex(int, bool){}
|
|
void SetIntAttributePerVertex (int, bool){}
|
|
void SetNCoordIndex (unsigned long nCoordIndex) { m_nCoordIndex = nCoordIndex;}
|
|
void SetNCoord (unsigned long nCoord) { m_nCoord = nCoord ;}
|
|
void SetNNormal (unsigned long nNormal) { m_nNormal = nNormal ;}
|
|
void SetNumFloatAttributes(unsigned long numFloatAttributes)
|
|
{
|
|
assert(numFloatAttributes < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
m_numFloatAttributes = numFloatAttributes;
|
|
}
|
|
void SetNumIntAttributes (unsigned long numIntAttributes)
|
|
{
|
|
assert(numIntAttributes < O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES);
|
|
m_numIntAttributes = numIntAttributes;
|
|
}
|
|
void SetCreaseAngle (Real creaseAngle) { m_creaseAngle = creaseAngle ;}
|
|
void SetCCW (bool ccw) { m_ccw = ccw ;}
|
|
void SetSolid (bool solid) { m_solid = solid ;}
|
|
void SetConvex (bool convex) { m_convex = convex ;}
|
|
void SetIsTriangularMesh (bool isTriangularMesh) { m_isTriangularMesh = isTriangularMesh;}
|
|
void SetCoordMin (int j, Real min) { m_coordMin[j] = min;}
|
|
void SetCoordMax (int j, Real max) { m_coordMax[j] = max;}
|
|
void SetNormalMin (int j, Real min) { m_normalMin[j] = min;}
|
|
void SetNormalMax (int j, Real max) { m_normalMax[j] = max;}
|
|
void SetNFloatAttribute(unsigned long a, unsigned long nFloatAttribute)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
m_nFloatAttribute[a] = nFloatAttribute;
|
|
}
|
|
void SetNIntAttribute(unsigned long a, unsigned long nIntAttribute)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES);
|
|
m_nIntAttribute[a] = nIntAttribute;
|
|
}
|
|
void SetFloatAttributeDim(unsigned long a, unsigned long d)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
m_dimFloatAttribute[a] = d;
|
|
}
|
|
void SetIntAttributeDim(unsigned long a, unsigned long d)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES);
|
|
m_dimIntAttribute[a] = d;
|
|
}
|
|
void SetFloatAttributeType(unsigned long a, O3DGCIFSFloatAttributeType t)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
m_typeFloatAttribute[a] = t;
|
|
}
|
|
void SetIntAttributeType(unsigned long a, O3DGCIFSIntAttributeType t)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES);
|
|
m_typeIntAttribute[a] = t;
|
|
}
|
|
void SetFloatAttributeMin(unsigned long a, unsigned long dim, Real min)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
assert(dim < O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES);
|
|
m_minFloatAttribute[a * O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES + dim] = min;
|
|
}
|
|
void SetFloatAttributeMax(unsigned long a, unsigned long dim, Real max)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
assert(dim < O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES);
|
|
m_maxFloatAttribute[a * O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES + dim] = max;
|
|
}
|
|
void SetIndexBufferID (unsigned long * const indexBufferID) { m_indexBufferID = indexBufferID;}
|
|
void SetCoordIndex (T * const coordIndex) { m_coordIndex = coordIndex;}
|
|
void SetCoord (Real * const coord ) { m_coord = coord ;}
|
|
void SetNormal (Real * const normal ) { m_normal = normal ;}
|
|
void SetFloatAttribute (unsigned long a, Real * const floatAttribute)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES);
|
|
m_floatAttribute[a] = floatAttribute;
|
|
}
|
|
void SetIntAttribute (unsigned long a, long * const intAttribute)
|
|
{
|
|
assert(a < O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES);
|
|
m_intAttribute[a] = intAttribute ;
|
|
}
|
|
void ComputeMinMax(O3DGCSC3DMCQuantizationMode quantMode);
|
|
|
|
private:
|
|
// triangles list
|
|
unsigned long m_nCoordIndex;
|
|
T * m_coordIndex;
|
|
unsigned long * m_indexBufferID;
|
|
// coord, normals, texcoord and color
|
|
unsigned long m_nCoord;
|
|
unsigned long m_nNormal;
|
|
Real m_coordMin [3];
|
|
Real m_coordMax [3];
|
|
Real m_normalMin [3];
|
|
Real m_normalMax [3];
|
|
Real * m_coord;
|
|
Real * m_normal;
|
|
// other attributes
|
|
unsigned long m_numFloatAttributes;
|
|
unsigned long m_numIntAttributes;
|
|
O3DGCIFSFloatAttributeType m_typeFloatAttribute [O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES];
|
|
O3DGCIFSIntAttributeType m_typeIntAttribute [O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES ];
|
|
unsigned long m_nFloatAttribute [O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES];
|
|
unsigned long m_nIntAttribute [O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES ];
|
|
unsigned long m_dimFloatAttribute [O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES];
|
|
unsigned long m_dimIntAttribute [O3DGC_SC3DMC_MAX_NUM_INT_ATTRIBUTES ];
|
|
Real m_minFloatAttribute [O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES * O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES];
|
|
Real m_maxFloatAttribute [O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES * O3DGC_SC3DMC_MAX_DIM_ATTRIBUTES];
|
|
Real * m_floatAttribute [O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES];
|
|
long * m_intAttribute [O3DGC_SC3DMC_MAX_NUM_FLOAT_ATTRIBUTES];
|
|
// mesh info
|
|
Real m_creaseAngle;
|
|
bool m_ccw;
|
|
bool m_solid;
|
|
bool m_convex;
|
|
bool m_isTriangularMesh;
|
|
};
|
|
}
|
|
#include "o3dgcIndexedFaceSet.inl" // template implementation
|
|
#endif // O3DGC_INDEXED_FACE_SET_H
|
|
|