File: Textures.h

package info (click to toggle)
spring 98.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 41,928 kB
  • ctags: 60,665
  • sloc: cpp: 356,167; ansic: 39,434; python: 12,228; java: 12,203; awk: 5,856; sh: 1,719; xml: 997; perl: 405; php: 253; objc: 194; makefile: 72; sed: 2
file content (131 lines) | stat: -rw-r--r-- 3,096 bytes parent folder | download | duplicates (3)
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