All of the reference to the original Material class were renamed to FrsMaterial to resolve a name collision with Blender. To keep the window context necessary to draw the strokes after RE_Database_FromScene has been called, the display_clear function is used.
322 lines
7.6 KiB
C++
Executable File
322 lines
7.6 KiB
C++
Executable File
|
|
//
|
|
// Copyright (C) : Please refer to the COPYRIGHT file distributed
|
|
// with this source distribution.
|
|
//
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU General Public License
|
|
// as published by the Free Software Foundation; either version 2
|
|
// of the License, or (at your option) any later version.
|
|
//
|
|
// This program 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 General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "IndexedFaceSet.h"
|
|
|
|
IndexedFaceSet::IndexedFaceSet()
|
|
: Rep()
|
|
{
|
|
_Vertices = NULL;
|
|
_Normals = NULL;
|
|
_FrsMaterials = 0;
|
|
_TexCoords = 0;
|
|
_VSize = 0;
|
|
_NSize = 0;
|
|
_MSize = 0;
|
|
_TSize = 0;
|
|
_NumFaces = 0;
|
|
_NumVertexPerFace = NULL;
|
|
_FaceStyle = NULL;
|
|
_VIndices = NULL;
|
|
_VISize = 0;
|
|
_NIndices = NULL;
|
|
_NISize = 0;
|
|
_MIndices = NULL;
|
|
_MISize = 0;
|
|
_TIndices = NULL;
|
|
_TISize = 0;
|
|
_displayList = 0;
|
|
}
|
|
|
|
IndexedFaceSet::IndexedFaceSet( real *iVertices, unsigned iVSize,
|
|
real *iNormals, unsigned iNSize,
|
|
FrsMaterial **iMaterials, unsigned iMSize,
|
|
real *iTexCoords, unsigned iTSize,
|
|
unsigned iNumFaces, unsigned *iNumVertexPerFace, TRIANGLES_STYLE *iFaceStyle,
|
|
unsigned *iVIndices, unsigned iVISize,
|
|
unsigned *iNIndices, unsigned iNISize,
|
|
unsigned *iMIndices, unsigned iMISize,
|
|
unsigned *iTIndices, unsigned iTISize,
|
|
unsigned iCopy)
|
|
: Rep()
|
|
{
|
|
if(1 == iCopy)
|
|
{
|
|
_VSize = iVSize;
|
|
_Vertices = new real[_VSize];
|
|
memcpy(_Vertices, iVertices, iVSize*sizeof(real));
|
|
|
|
_NSize = iNSize;
|
|
_Normals = new real[_NSize];
|
|
memcpy(_Normals, iNormals, iNSize*sizeof(real));
|
|
|
|
_MSize = iMSize;
|
|
_FrsMaterials = 0;
|
|
if(iMaterials){
|
|
_FrsMaterials = new FrsMaterial*[_MSize];
|
|
for(unsigned i=0; i<_MSize; ++i)
|
|
_FrsMaterials[i] = new FrsMaterial(*(iMaterials[i]));
|
|
}
|
|
_TSize = iTSize;
|
|
_TexCoords = 0;
|
|
if(_TSize){
|
|
_TexCoords = new real[_TSize];
|
|
memcpy(_TexCoords, iTexCoords, iTSize*sizeof(real));
|
|
}
|
|
|
|
_NumFaces = iNumFaces;
|
|
_NumVertexPerFace = new unsigned[_NumFaces];
|
|
memcpy(_NumVertexPerFace, iNumVertexPerFace, _NumFaces*sizeof(unsigned));
|
|
|
|
_FaceStyle = new TRIANGLES_STYLE[_NumFaces];
|
|
memcpy(_FaceStyle, iFaceStyle, _NumFaces*sizeof(TRIANGLES_STYLE));
|
|
|
|
_VISize = iVISize;
|
|
_VIndices = new unsigned[_VISize];
|
|
memcpy(_VIndices, iVIndices, _VISize*sizeof(unsigned));
|
|
|
|
_NISize = iNISize;
|
|
_NIndices = new unsigned[_NISize];
|
|
memcpy(_NIndices, iNIndices, _NISize*sizeof(unsigned));
|
|
|
|
_MISize = iMISize;
|
|
_MIndices = 0;
|
|
if(iMIndices){
|
|
_MIndices = new unsigned[_MISize];
|
|
memcpy(_MIndices, iMIndices, _MISize*sizeof(unsigned));
|
|
}
|
|
_TISize = iTISize;
|
|
_TIndices = 0;
|
|
if(_TISize){
|
|
_TIndices = new unsigned[_TISize];
|
|
memcpy(_TIndices, iTIndices, _TISize*sizeof(unsigned));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_VSize = iVSize;
|
|
_Vertices = iVertices;
|
|
|
|
_NSize = iNSize;
|
|
_Normals = iNormals;
|
|
|
|
_MSize = iMSize;
|
|
_FrsMaterials = 0;
|
|
if(iMaterials)
|
|
_FrsMaterials = iMaterials;
|
|
|
|
_TSize = iTSize;
|
|
_TexCoords = iTexCoords;
|
|
|
|
_NumFaces = iNumFaces;
|
|
_NumVertexPerFace = iNumVertexPerFace;
|
|
_FaceStyle = iFaceStyle;
|
|
|
|
_VISize = iVISize;
|
|
_VIndices = iVIndices;
|
|
|
|
_NISize = iNISize;
|
|
_NIndices = iNIndices;
|
|
|
|
_MISize = iMISize;
|
|
_MIndices = 0;
|
|
if(iMISize)
|
|
_MIndices = iMIndices;
|
|
|
|
_TISize = iTISize;
|
|
_TIndices = iTIndices;
|
|
}
|
|
|
|
_displayList = 0;
|
|
}
|
|
|
|
IndexedFaceSet::IndexedFaceSet( const IndexedFaceSet& iBrother)
|
|
:Rep(iBrother)
|
|
{
|
|
_VSize = iBrother.vsize();
|
|
_Vertices = new real[_VSize];
|
|
memcpy(_Vertices, iBrother.vertices(), _VSize*sizeof(real));
|
|
|
|
_NSize = iBrother.nsize();
|
|
_Normals = new real[_NSize];
|
|
memcpy(_Normals, iBrother.normals(), _NSize*sizeof(real));
|
|
|
|
_MSize = iBrother.msize();
|
|
if(_MSize){
|
|
_FrsMaterials = new FrsMaterial*[_MSize];
|
|
for(unsigned i=0; i<_MSize; ++i){
|
|
_FrsMaterials[i] = new FrsMaterial(*(iBrother._FrsMaterials[i]));
|
|
}
|
|
}else{
|
|
_FrsMaterials = 0;
|
|
}
|
|
|
|
_TSize = iBrother.tsize();
|
|
_TexCoords = 0;
|
|
if(_TSize){
|
|
_TexCoords = new real[_TSize];
|
|
memcpy(_TexCoords, iBrother.texCoords(), _TSize*sizeof(real));
|
|
}
|
|
|
|
_NumFaces = iBrother.numFaces();
|
|
_NumVertexPerFace = new unsigned[_NumFaces];
|
|
memcpy(_NumVertexPerFace, iBrother.numVertexPerFaces(), _NumFaces*sizeof(unsigned));
|
|
|
|
_FaceStyle = new TRIANGLES_STYLE[_NumFaces];
|
|
memcpy(_FaceStyle, iBrother.trianglesStyle(), _NumFaces*sizeof(TRIANGLES_STYLE));
|
|
|
|
_VISize = iBrother.visize();
|
|
_VIndices = new unsigned[_VISize];
|
|
memcpy(_VIndices, iBrother.vindices(), _VISize*sizeof(unsigned));
|
|
|
|
_NISize = iBrother.nisize();
|
|
_NIndices = new unsigned[_NISize];
|
|
memcpy(_NIndices, iBrother.nindices(), _NISize*sizeof(unsigned));
|
|
|
|
_MISize = iBrother.misize();
|
|
if(_MISize){
|
|
_MIndices = new unsigned[_MISize];
|
|
memcpy(_MIndices, iBrother.mindices(), _MISize*sizeof(unsigned));
|
|
}else{
|
|
_MIndices=0;
|
|
}
|
|
|
|
_TISize = iBrother.tisize();
|
|
_TIndices = 0;
|
|
if(_TISize){
|
|
_TIndices = new unsigned[_TISize];
|
|
memcpy(_TIndices, iBrother.tindices(), _TISize*sizeof(unsigned));
|
|
}
|
|
|
|
_displayList = 0;
|
|
}
|
|
|
|
IndexedFaceSet::~IndexedFaceSet()
|
|
{
|
|
if(NULL != _Vertices)
|
|
{
|
|
delete [] _Vertices;
|
|
_Vertices = NULL;
|
|
}
|
|
|
|
if(NULL != _Normals)
|
|
{
|
|
delete [] _Normals;
|
|
_Normals = NULL;
|
|
}
|
|
|
|
if(NULL != _FrsMaterials)
|
|
{
|
|
for(unsigned i=0; i<_MSize; ++i)
|
|
delete _FrsMaterials[i];
|
|
delete [] _FrsMaterials;
|
|
_FrsMaterials = NULL;
|
|
}
|
|
|
|
if(NULL != _TexCoords)
|
|
{
|
|
delete [] _TexCoords;
|
|
_TexCoords = NULL;
|
|
}
|
|
|
|
if(NULL != _NumVertexPerFace)
|
|
{
|
|
delete [] _NumVertexPerFace;
|
|
_NumVertexPerFace = NULL;
|
|
}
|
|
|
|
if(NULL != _FaceStyle)
|
|
{
|
|
delete [] _FaceStyle;
|
|
_FaceStyle = NULL;
|
|
}
|
|
|
|
if(NULL != _VIndices)
|
|
{
|
|
delete [] _VIndices;
|
|
_VIndices = NULL;
|
|
}
|
|
|
|
if(NULL != _NIndices)
|
|
{
|
|
delete [] _NIndices;
|
|
_NIndices = NULL;
|
|
}
|
|
|
|
if(NULL != _MIndices)
|
|
{
|
|
delete [] _MIndices;
|
|
_MIndices = NULL;
|
|
}
|
|
if(NULL != _TIndices)
|
|
{
|
|
delete [] _TIndices;
|
|
_TIndices = NULL;
|
|
}
|
|
// should find a way to deallocates the displayList
|
|
// glDeleteLists(GLuint list, GLSizei range)
|
|
_displayList = 0;
|
|
}
|
|
|
|
void IndexedFaceSet::accept(SceneVisitor& v) {
|
|
Rep::accept(v);
|
|
v.visitIndexedFaceSet(*this);
|
|
}
|
|
|
|
void IndexedFaceSet::ComputeBBox()
|
|
{
|
|
real XMax = _Vertices[0];
|
|
real YMax = _Vertices[1];
|
|
real ZMax = _Vertices[2];
|
|
|
|
real XMin = _Vertices[0];
|
|
real YMin = _Vertices[1];
|
|
real ZMin = _Vertices[2];
|
|
|
|
// parse all the coordinates to find
|
|
// the Xmax, YMax, ZMax
|
|
real *v = _Vertices;
|
|
|
|
for(unsigned i=0; i<_VSize/3; i++)
|
|
{
|
|
// X
|
|
if(*v > XMax)
|
|
XMax = *v;
|
|
if(*v < XMin)
|
|
XMin = *v;
|
|
v++;
|
|
|
|
if(*v > YMax)
|
|
YMax = *v;
|
|
if(*v < YMin)
|
|
YMin = *v;
|
|
v++;
|
|
|
|
if(*v > ZMax)
|
|
ZMax = *v;
|
|
if(*v < ZMin)
|
|
ZMin = *v;
|
|
v++;
|
|
}
|
|
|
|
setBBox(BBox<Vec3r>(Vec3r(XMin, YMin, ZMin), Vec3r(XMax, YMax, ZMax)));
|
|
}
|