This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/freestyle/intern/scene_graph/IndexedFaceSet.cpp
Maxime Curioni 9a1217e559 soc-2008-mxcurioni: first version of lib3ds code. It does NOT work yet and has to be debugged. It can be activate in app_blender/api.cpp by replacing the FRS_scene_3ds_export call in FRS_prepare, by FRS_load_mesh.
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.
2008-08-07 15:04:25 +00:00

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)));
}