/*
Copyright (C) 1997, 1998, 1999, 2000 by Alex Pfaffe, Klaus Hartmann
(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.
Written by Klaus Hartmann.
*/
#ifndef __ddgEco_Class__
#define __ddgEco_Class__
// Include used DDG headers
#include "struct/ddghemap.h"
#include "struct/ddgimage.h"
#include "util/ddgutil.h"
struct ddgEcoLightSource
{
// Direction vector to the light source
float x;
float y;
float z;
// RGB intensities of the light
float Ir;
float Ig;
float Ib;
};
struct ddgEcosystem
{
unsigned char m_user;
unsigned char m_colorR;
unsigned char m_colorG;
unsigned char m_colorB;
float m_elevLine;
float m_minSlope;
float m_maxSlope;
float m_elevSkew;
float m_elevSkewAzimuth;
// Filename of the texture that is to be used for this ecosystem
char * mp_texture;
};
struct ddgEcoParams
{
ddgHeightMap * mp_heightMap;
ddgImage * mp_baseTexture;
ddgEcosystem * mp_ecosystems;
long m_numEcosystems;
ddgEcoLightSource * mp_lights;
long m_numLights;
ddgImage * mp_ecoMap;
bool m_filter;
bool m_randomAdditions;
};
struct ddgEcoListEntry
{
public:
unsigned char m_user;
unsigned char m_colorR;
unsigned char m_colorG;
unsigned char m_colorB;
float m_elevLine;
float m_minSlope;
float m_maxSlope;
float m_elevSkewAzimuth;
float m_elevSkew;
float m_elevSkewX;
float m_elevSkewZ;
ddgImage * mp_texture;
};
class ddgEcoSynthesizer
{
public:
ddgEcoSynthesizer();
virtual ~ddgEcoSynthesizer();
void Destroy();
bool Initialize(ddgEcoParams& params);
void Synthesize(bool randomAdditions);
void FilterTexture();
private:
float BiLerp(
float nwElev,
float neElev,
float seElev,
float swElev,
float tHorz,
float tVert);
void VertexNormal(ddgVector3& normal, long row, long col, float gridSpacing);
void Illuminate(ddgVector3& intensity, ddgVector3& normal);
ddgEcoListEntry * Classify(float elev, ddgVector3& normal, unsigned char& index);
void GetDetailColor(
unsigned char * p_color,
ddgEcoListEntry * p_entry,
long texX,
long texY);
private:
ddgEcoListEntry * mp_ecosystems;
long m_numEcosystems;
ddgHeightMap * mp_heightMap;
ddgImage * mp_baseTexture;
ddgEcoLightSource * mp_lights;
long m_numLights;
ddgImage * mp_ecoMap;
};
class ddgEco
{
public:
ddgEco();
virtual ~ddgEco();
public:
bool Synthesize(ddgEcoParams& params);
private:
ddgEcoSynthesizer m_synthesizer;
};
#endif