/* 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 _ddgHeightMap_Class_ #define _ddgHeightMap_Class_ #include "util/ddgerror.h" #include "math/ddgvec.h" class WEXP ddgHeightMap { short* _pixbuffer; unsigned short _cols; unsigned short _rows; float _scale; float _base; public: ddgHeightMap( void ) : _pixbuffer(0), _scale(1), _base(0) {} ddgHeightMap( unsigned short r, unsigned short c) : _pixbuffer(0), _scale(1), _base(0) { allocate(r,c); } ~ddgHeightMap(); short *buffer(void) { return _pixbuffer; } unsigned short cols(void) { return _cols; } unsigned short rows(void) { return _rows; } bool allocate( unsigned short r, unsigned short c); void set(unsigned short r, unsigned short c, short d1) { ddgAssert(r < _rows && c < _cols); _pixbuffer[(r*_cols+c)+0] = d1; } short get(unsigned short r, unsigned short c, short *d1 = 0) { ddgAssert(r < _rows && c < _cols); short s = _pixbuffer[(r*_cols+c)+0]; if (d1) *d1 = s; return s; } static inline float sconvert(short n, float base, float scale) { return (n + 0x7FFF) * scale + base; } static inline short siconvert(float n, float base, float scale) { return (short) ddgUtil::clamp((n - base ) / scale - 0x7FFF,-0x7FFF,0x7FFF); } inline short iconvert(float n) { return siconvert(n, _base, _scale ); } inline float convert(short n) { return sconvert(n, _base, _scale); } float getf(unsigned short r, unsigned short c, float *d1 = 0) { ddgAssert(r < _rows && c < _cols); float s = convert( _pixbuffer[(r*_cols+c)+0] ); if (d1) *d1 = s; return s; } bool readMemory( unsigned short *buf ); bool loadTerrain(const char *filename); bool readTGN(const void *buf, unsigned long size); bool readRAW(const char *filename, int w, int h); bool readTGN(const char *filename); bool writeTGN(const char *filename); bool readPGM(const char* data, int desired_max); bool generateHeights(unsigned int r, unsigned int c, float octaves); ddgHeightMap * ddgHeightMap::quadify( void ); void canyonize(float strength ); void glaciate(float strength ); void setMinMax(float b = 0, float d = 1) { _scale = (d-b)/0xFFFF; _base = b; } void setScaleAndBase(float s, float b = 0) { _scale = s*_scale; _base += b; } float scale(void) { return _scale; } float base(void) { return _base; } void scale(float s ); void translate(float t ); int mini(void); int maxi(void); void setmax( int m); void setmin( int m); void scalef(float s ) { scale( iconvert(s)); } void translatef(float t ) { translate( iconvert(t)); } float minf(void) { return convert(mini()); } float maxf(void) { return convert(maxi()); } void setmaxf( float m) { setmax( iconvert(m)); } void setminf( float m) { setmin( iconvert(m)); } void closeEdge(float l); void sin(void); bool saveAsTGA(const char *filename); bool createSpectralMap(int level, float smoothness); void vertexNormal(ddgVector3& normal, long row, long col, float gridSpacing); }; #endif