1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
/*
---------------------------------------------------------------------
Terrain Renderer using texture splatting and geomipmapping
Copyright (c) 2006 Jelmer Cnossen
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you
must not claim that you wrote the original software. If you use
this software in a product, an acknowledgment in the product
documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
Jelmer Cnossen
j.cnossen at gmail dot com
---------------------------------------------------------------------
*/
#ifndef TERRAIN_TEXTURES_H
#define TERRAIN_TEXTURES_H
class TdfParser;
class CBitmap;
namespace terrain {
struct ILoadCallback;
struct Heightmap;
class TQuad;
struct float2
{
float2() { x=y=0.0f; }
float2(float X,float Y) : x(X), y(Y) {}
float x,y;
};
//-----------------------------------------------------------------------
// AlphaImage - a single channel image class, used for storing blendmaps
//-----------------------------------------------------------------------
struct AlphaImage {
AlphaImage ();
~AlphaImage ();
enum AreaTestResult {
AREA_ONE, AREA_ZERO, AREA_MIXED
};
void Alloc (int W,int H);
float& at(int x,int y) { return data[y*w+x]; }
bool CopyFromBitmap(CBitmap& bm);
AlphaImage* CreateMipmap ();
void Blit (AlphaImage *dst, int x,int y,int dstx, int dsty, int w ,int h);
bool Save (const char *fn);
AreaTestResult TestArea (int xstart,int ystart,int xend,int yend, float epsilon);
int w,h;
float *data;
AlphaImage *lowDetail, *highDetail; // geomipmap chain links
};
//-----------------------------------------------------------------------
// BaseTexture
//-----------------------------------------------------------------------
struct BaseTexture
{
BaseTexture ();
virtual ~BaseTexture();
virtual bool ShareTexCoordUnit () { return true; }
std::string name;
GLuint id;
float2 tilesize;
// the "texgen vector" is defined as:
// { Xfactor, Zfactor, Xoffset, Zoffset }
virtual void CalcTexGenVector (float *v4);
virtual void SetupTexGen();
virtual bool IsRect() {return false;}
};
struct TiledTexture : public BaseTexture
{
TiledTexture ();
~TiledTexture ();
void Load(const std::string& name, const std::string& section, ILoadCallback *cb, const TdfParser *tdf, bool isBumpmap);
static TiledTexture* CreateFlatBumpmap();
};
struct Blendmap : public BaseTexture
{
Blendmap ();
~Blendmap ();
void Generate (Heightmap *rootHm, int lodLevel, float hmscale, float hmoffset);
void Load(const std::string& name, const std::string& section, Heightmap *heightmap, ILoadCallback *cb, const TdfParser *tdf);
struct GeneratorInfo {
float coverage, noise;
float minSlope, maxSlope;
float minSlopeFuzzy, maxSlopeFuzzy;
float minHeight, maxHeight;
float minHeightFuzzy, maxHeightFuzzy;
};
GeneratorInfo *generatorInfo;
AlphaImage *image; // WIP image pointer
AlphaImage::AreaTestResult curAreaResult;
};
// A bumpmap generated from a heightmap, used to increase detail on distant nodes
struct DetailBumpmap : public BaseTexture
{
~DetailBumpmap();
void CalcTexGenVector (float *v4);
bool ShareTexCoordUnit () { return false; }
TQuad *node;
};
GLuint LoadTexture (const std::string& fn, bool isBumpmap=false);
void SaveImage(const char *fn, int components, GLenum type, int w,int h, void *data);
void SetTexCoordGen(float *tgv);
};
#endif
|