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
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef TERRAIN_TEXTURES_H
#define TERRAIN_TEXTURES_H
#include <string>
#include "Rendering/GL/myGL.h"
class TdfParser;
class CBitmap;
namespace terrain {
struct ILoadCallback;
struct Heightmap;
class TQuad;
struct float2
{
float2() : x(0.0f), y(0.0f) {}
float2(float x, float y) : x(x), y(y) {}
float x;
float 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;
int h;
float* data;
// geo-mip-map chain links
AlphaImage* lowDetail;
AlphaImage* highDetail;
};
//-----------------------------------------------------------------------
// BaseTexture
//-----------------------------------------------------------------------
struct BaseTexture
{
BaseTexture();
virtual ~BaseTexture();
virtual bool ShareTexCoordUnit() { return true; }
// the "texgen vector" is defined as:
// { Xfactor, Zfactor, Xoffset, Zoffset }
virtual void CalcTexGenVector(float* v4);
virtual void SetupTexGen();
virtual bool IsRect() { return false; }
std::string name;
GLuint id;
float2 tilesize;
};
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
|