File: TerrainTextureGLSL.h

package info (click to toggle)
spring 103.0%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 43,720 kB
  • ctags: 63,685
  • sloc: cpp: 368,283; ansic: 33,988; python: 12,417; java: 12,203; awk: 5,879; sh: 1,846; xml: 655; perl: 405; php: 211; objc: 194; makefile: 77; sed: 2
file content (111 lines) | stat: -rw-r--r-- 2,567 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
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef _TERRAIN_TEXTURE_GLSL_H_
#define _TERRAIN_TEXTURE_GLSL_H_

#include "TerrainTexture.h"

namespace terrain 
{
	struct Blendmap;
	struct TiledTexture;
	class BufferTexture;

	struct GLSLBaseShader : public IShaderSetup
	{
		virtual void Setup(NodeSetupParams& params) = 0;
		virtual void Cleanup() = 0;
	};

	struct SimpleCopyShader 
	{
		SimpleCopyShader(BufferTexture* src);
		~SimpleCopyShader();

		void Setup();
		void Cleanup();

		BufferTexture* source;
		GLhandleARB vertexShader;
		GLhandleARB fragmentShader;
		GLhandleARB program;
	};

	struct SimpleCopyNodeShader : public GLSLBaseShader
	{
		SimpleCopyNodeShader(SimpleCopyShader* scs) :
			shader(scs) {}

		void Setup(NodeSetupParams& params) { shader->Setup(); }
		void Cleanup() { shader->Cleanup(); }

		SimpleCopyShader* shader;
	};

	struct NodeGLSLShader : public GLSLBaseShader
	{
		NodeGLSLShader();
		~NodeGLSLShader();
		
		std::string GetDebugDesc();
		uint GetVertexDataRequirements();
		void GetTextureUnits(BaseTexture* tex, int& imageUnit, int& coordUnit);

		void BindTSM(Vector3* buf, uint vertexSize);
		void UnbindTSM();

		std::vector<BaseTexture*> texUnits; // texture image units
		std::vector<BaseTexture*> texCoordGen; // textures that are used for texture coordinate generation

		GLhandleARB vertexShader;
		GLhandleARB fragmentShader;
		GLhandleARB program;

		GLint tsmAttrib; // attribute ID of tangent space matrix
		GLint wsLightDirLocation, wsEyePosLocation; // location for wsLightDir
		uint vertBufReq;
		std::string debugstr;

		GLint shadowMapLocation;
		GLint shadowMatrixLocation;
		GLint shadowParamsLocation;

		BufferTexture* renderBuffer; // 0 for normal display

		void Setup(NodeSetupParams& params);
		void Cleanup();
	};

	class GLSLShaderHandler : public ITexShaderHandler
	{
	public:
		GLSLShaderHandler();
		~GLSLShaderHandler();

		// ITexShaderHandler interface
		void BeginPass(const std::vector<Blendmap*>& blendmaps, const std::vector<TiledTexture*>& textures, int pass);
		void EndPass() {}

		void BeginTexturing();
		void EndTexturing();

		void BuildNodeSetup(ShaderDef* shaderDef, RenderSetup* renderSetup);
		bool SetupShader(IShaderSetup* shadercfg, NodeSetupParams& params);

		void BeginBuild();
		void EndBuild();

		int MaxTextureUnits();
		int MaxTextureCoords();
	protected:
		GLSLBaseShader* curShader;

		BufferTexture* buffer;
		std::vector<RenderSetup*> renderSetups;

		SimpleCopyShader* scShader;
	};
};

#endif // _TERRAIN_TEXTURE_GLSL_H_