/*
Copyright (C) 1997, 1998, 1999 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 _ddgTerrain_Class_
#define _ddgTerrain_Class_
#include "render/ddgnode.h"
#include "math/ddgvec.h"
#include "struct/ddghemap.h"
#include "struct/ddgimage.h"
#include "render/ddgparam.h"
// THIS CLASS IS NOT UPTODATE
#define ddgQSIZE 32
class ddgQTree;
class WEXP ddgTerrain : public ddgNode
{
typedef ddgNode super;
unsigned int _qsize;
unsigned int _tsize;
ddgStr _hfile;
ddgStr _nfile;
short _maxLOD;
short *_LODs;
ddgVector3 _offset;
ddgVector3 _scale;
ddgQTree* _tree;
public:
ddgHeightMap *heights;
ddgImage *normals; // NO LONGER POSSIBLE TO DO THIS!
ddgParamSet paramset;
ddgParamB culling;
ddgParamB smooth;
ddgParamB debug;
ddgParamB lod;
ddgParam lodFactor;
ddgParamB bbox;
ddgContext *context;
ddgTerrain();
ddgTerrain( unsigned int r, unsigned int c );
~ddgTerrain();
void offset( float x, float y, float z )
{ _offset.set(x,y,z); }
ddgVector3 *offset( void )
{ return &_offset; }
void scale( float x, float y, float z )
{ _scale.set(x,y,z); }
ddgVector3 scale( void ) { return _scale; }
unsigned int rows( void )
{ return heights->rows(); }
unsigned int cols( void )
{ return heights->cols(); }
void qsize( unsigned int q )
{ _qsize = q; _tsize=(((cols()>rows()?cols():rows())-2)/_qsize)*_qsize; }
unsigned int qsize(void)
{ return _qsize; }
void tsize( unsigned int t )
{ _tsize = t; }
unsigned int tsize(void) { return _tsize; }
void hfile( char * f)
{ _hfile.assign(f);}
char *hfile(void)
{ return _hfile; }
void nfile( char *f )
{ _nfile.assign(f); }
char *nfile(void)
{ return _nfile; }
void setLOD( unsigned int r, unsigned int c, short t)
{ _LODs[r * _tsize/_qsize + c] = t; }
short getLOD( unsigned int r, unsigned int c )
{
if (r < 0 || c < 0 || r > 3 || c >> 3) return -1;
return _LODs[r * _tsize/_qsize + c];
}
short maxLOD(void)
{ return _maxLOD;}
bool init( ddgContext *ctx );
bool draw( ddgContext *ctx );
int tri;
int bcount;
ddgContext::Quality quality;
};
ostream& operator << ( ostream&s, ddgTerrain t );
ostream& operator << ( ostream&s, ddgTerrain* t );
class ddgQTree
{
public:
static ddgTerrain * t;
unsigned short _min;
unsigned short _max;
ddgQTree *_quads[4];
bool init( unsigned int l, unsigned int r, unsigned int c );
bool visible( unsigned int l, unsigned int r, unsigned int c );
bool draw( unsigned int l, unsigned int r, unsigned int c );
bool drop( ddgVector3*, ddgVector3*, ddgVector3*, ddgVector3* );
};
#endif