1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
2 
3 #ifndef GEOMETRYBUFFER_H
4 #define GEOMETRYBUFFER_H
5 
6 #include "Rendering/GL/FBO.h"
7 #include "System/type2.h"
8 
9 namespace GL {
10 	struct GeometryBuffer {
11 	public:
12 		enum {
13 			ATTACHMENT_NORMTEX = 0, // shading (not geometric) normals
14 			ATTACHMENT_DIFFTEX = 1, // diffuse texture fragments
15 			ATTACHMENT_SPECTEX = 2, // specular texture fragments
16 			ATTACHMENT_EMITTEX = 3, // emissive texture fragments
17 			ATTACHMENT_MISCTEX = 4, // custom data for Lua UnitRendering shaders
18 			ATTACHMENT_ZVALTEX = 5, // fragment depth-values (must be last)
19 			ATTACHMENT_COUNT   = 6,
20 		};
21 
GeometryBufferGeometryBuffer22 		GeometryBuffer() : bufferName(NULL) { Init(); }
~GeometryBufferGeometryBuffer23 		~GeometryBuffer() { Kill(); }
24 
25 		void Init();
26 		void Kill();
27 
28 		void DetachTextures(const bool init);
29 		void DrawDebug(unsigned int texID);
SetNameGeometryBuffer30 		void SetName(const char* name) { bufferName = name; }
31 
HasAttachmentsGeometryBuffer32 		bool HasAttachments() const { return (bufferTextureIDs[0] != 0); }
ValidGeometryBuffer33 		bool Valid() const { return (buffer.IsValid()); }
34 		bool Create(const int2 size);
35 		bool Update(const bool init);
36 
GetBufferTextureGeometryBuffer37 		GLuint GetBufferTexture(unsigned int idx) const { return bufferTextureIDs[idx]; }
GetBufferAttachmentGeometryBuffer38 		GLuint GetBufferAttachment(unsigned int idx) const { return bufferAttachments[idx]; }
39 
GetObjectGeometryBuffer40 		const FBO& GetObject() const { return buffer; }
GetObjectGeometryBuffer41 		      FBO& GetObject()       { return buffer; }
42 
BindGeometryBuffer43 		void Bind() { buffer.Bind(); }
UnBindGeometryBuffer44 		void UnBind() { buffer.Unbind(); }
45 
GetCurrSizeGeometryBuffer46 		int2 GetCurrSize() const { return currBufferSize; }
GetPrevSizeGeometryBuffer47 		int2 GetPrevSize() const { return prevBufferSize; }
48 
49 		int2 GetWantedSize(bool allowed) const;
50 
51 	private:
52 		FBO buffer;
53 
54 		GLuint bufferTextureIDs[ATTACHMENT_COUNT];
55 		GLenum bufferAttachments[ATTACHMENT_COUNT];
56 
57 		int2 prevBufferSize;
58 		int2 currBufferSize;
59 
60 		const char* bufferName;
61 	};
62 }
63 
64 #endif
65 
66