/*
Copyright (C) 1997, 1998, 1999, 2000 by Alex Pfaffe
(Digital Dawn Graphics Inc)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _ddgFacet_Class_
#define _ddgFacet_Class_
#include "math/ddgvec.h"
#include "struct/ddgnode.h"
#include "util/ddgerror.h"
// This class stores static information needed to perform
// spherical classification and uses this to perform culling
// operations.
// Algorithm to optimize backface culling of large polygon sets.
// Define a static array of the normal vectors (sN) of an icosahedron.
// This represents and evenly spaced set of normals (20) in R3.
// Enumerate sN in such a way that vectors i and (i+10)%20 = <0,0,0> holds
// true. Two vector pointing in opposite directions.
//
// Preprocessing step for each triangle in the polyset:
// Calculate the normal tN and find out in which sector sN the triangle should
// be associated with based on the minimum angle between tN and sN.
// Add triangle t into the appropriate category.
//
// Memory overhead 20 arrays with a combined storage space of n integer
// indices into the triangle array.
//
// At runtime determine which sector most faces the camera and render the
// fixed set of arrays which are associated with that sector.
// For icosahedron
#include "render/ddgvbuf.h"
class WEXP ddgFacetSet : public ddgDLNode {
typedef ddgDLNode super;
friend class ddgClippedFacetSet;
static ddgVector3 _icovertices[12];
static int _icopolygons[20][3];
unsigned int _pcount;
bool subdivide( ddgVector3 v1, ddgVector3 v2, ddgVector3 v3, long depth);
unsigned int _levels;
ddgVector3 *_vertices;
public:
ddgFacetSet(unsigned int l = 0) : _vertices(0),_levels(l),_pcount(0) { }
~ddgFacetSet();
bool init(ddgContext *ctx);
bool draw(ddgContext *ctx);
unsigned int count(void) { return _pcount; }
};
class WEXP ddgClippedFacetSet : public ddgFacetSet {
typedef ddgFacetSet super;
bool *_on;
ddgVector3 *_centre;
float _faceAngle;
float _clipAngle;
float _visAngle;
public:
ddgClippedFacetSet(unsigned int l = 0) : ddgFacetSet(l), _on(0),_centre(0) { }
~ddgClippedFacetSet();
bool init(ddgContext *ctx);
bool draw(ddgContext *ctx);
bool active(int i) { return _on[i]; }
unsigned char classify( ddgVector3 v);
bool clipVisibleSet(ddgContext *ctx );
void setFacet( unsigned int i, bool a )
{ ddgAssert(i<count()); _on[i] = a; }
};
#endif