/* 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