Initial sauer
[SauerbratenRemote.git] / src / engine / texture.h
blob88299ec0bb7a0c978d42f66b199e785823727a34
1 // GL_ARB_vertex_program, GL_ARB_fragment_program
2 extern PFNGLGENPROGRAMSARBPROC glGenPrograms_;
3 extern PFNGLDELETEPROGRAMSARBPROC glDeletePrograms_;
4 extern PFNGLBINDPROGRAMARBPROC glBindProgram_;
5 extern PFNGLPROGRAMSTRINGARBPROC glProgramString_;
6 extern PFNGLGETPROGRAMIVARBPROC glGetProgramiv_;
7 extern PFNGLPROGRAMENVPARAMETER4FARBPROC glProgramEnvParameter4f_;
8 extern PFNGLPROGRAMENVPARAMETER4FVARBPROC glProgramEnvParameter4fv_;
10 // GL_ARB_shading_language_100, GL_ARB_shader_objects, GL_ARB_fragment_shader, GL_ARB_vertex_shader
11 extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObject_;
12 extern PFNGLDELETEOBJECTARBPROC glDeleteObject_;
13 extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObject_;
14 extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObject_;
15 extern PFNGLSHADERSOURCEARBPROC glShaderSource_;
16 extern PFNGLCOMPILESHADERARBPROC glCompileShader_;
17 extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameteriv_;
18 extern PFNGLATTACHOBJECTARBPROC glAttachObject_;
19 extern PFNGLGETINFOLOGARBPROC glGetInfoLog_;
20 extern PFNGLLINKPROGRAMARBPROC glLinkProgram_;
21 extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocation_;
22 extern PFNGLUNIFORM4FVARBPROC glUniform4fv_;
23 extern PFNGLUNIFORM1IARBPROC glUniform1i_;
25 extern int renderpath;
27 enum { R_FIXEDFUNCTION = 0, R_ASMSHADER, R_GLSLANG };
29 enum { SHPARAM_VERTEX = 0, SHPARAM_PIXEL, SHPARAM_UNIFORM };
31 #define RESERVEDSHADERPARAMS 16
32 #define MAXSHADERPARAMS 8
34 struct ShaderParam
36 const char *name;
37 int type, index, loc;
38 float val[4];
41 struct LocalShaderParamState : ShaderParam
43 float curval[4];
45 LocalShaderParamState()
47 memset(curval, 0, sizeof(curval));
49 LocalShaderParamState(const ShaderParam &p) : ShaderParam(p)
51 memset(curval, 0, sizeof(curval));
55 struct ShaderParamState
57 const char *name;
58 float val[4];
59 bool dirty, local;
61 ShaderParamState()
62 : name(NULL), dirty(false), local(false)
64 memset(val, 0, sizeof(val));
68 enum
70 SHADER_DEFAULT = 0,
71 SHADER_NORMALSLMS = 1<<0,
72 SHADER_ENVMAP = 1<<1,
73 SHADER_GLSLANG = 1<<2
76 #define MAXSHADERDETAIL 3
77 #define MAXVARIANTROWS 4
79 extern int shaderdetail;
81 struct Slot;
83 struct Shader
85 static Shader *lastshader;
87 char *name;
88 int type;
89 GLuint vs, ps;
90 GLhandleARB program, vsobj, psobj;
91 vector<LocalShaderParamState> defaultparams, extparams;
92 Shader *altshader, *fastshader[MAXSHADERDETAIL];
93 vector<Shader *> variants[MAXVARIANTROWS];
94 LocalShaderParamState *extvertparams[RESERVEDSHADERPARAMS], *extpixparams[RESERVEDSHADERPARAMS];
95 bool used, native;
97 Shader() : name(NULL), type(SHADER_DEFAULT), vs(0), ps(0), program(0), vsobj(0), psobj(0), altshader(NULL), used(false), native(true)
100 ~Shader()
102 DELETEA(name);
105 void allocenvparams(Slot *slot = NULL);
106 void flushenvparams(Slot *slot = NULL);
107 void setslotparams(Slot &slot);
108 void bindprograms();
110 Shader *variant(int col, int row = 0)
112 if(!this || renderpath==R_FIXEDFUNCTION) return this;
113 Shader *s = shaderdetail < MAXSHADERDETAIL ? fastshader[shaderdetail] : this;
114 return row>=0 && row<MAXVARIANTROWS && s->variants[row].inrange(col) ? s->variants[row][col] : s;
117 void set(Slot *slot = NULL)
119 if(!this || renderpath==R_FIXEDFUNCTION) return;
120 if(this!=lastshader)
122 if(shaderdetail < MAXSHADERDETAIL) fastshader[shaderdetail]->bindprograms();
123 else bindprograms();
125 lastshader->flushenvparams(slot);
126 if(slot) lastshader->setslotparams(*slot);
130 // management of texture slots
131 // each texture slot can have multiple texture frames, of which currently only the first is used
132 // additional frames can be used for various shaders
134 struct Texture
136 char *name;
137 int xs, ys, bpp;
138 GLuint gl;
139 uchar *alphamask;
141 Texture() : alphamask(NULL) {}
144 enum
146 TEX_DIFFUSE = 0,
147 TEX_UNKNOWN,
148 TEX_DECAL,
149 TEX_NORMAL,
150 TEX_GLOW,
151 TEX_SPEC,
152 TEX_DEPTH,
153 TEX_ENVMAP
156 struct Slot
158 struct Tex
160 int type;
161 Texture *t;
162 string name;
163 int rotation, xoffset, yoffset;
164 float scale;
165 int combined;
168 vector<Tex> sts;
169 Shader *shader;
170 vector<ShaderParam> params;
171 bool loaded;
172 char *autograss;
173 Texture *grasstex, *thumbnail;
175 void reset()
177 sts.setsize(0);
178 shader = NULL;
179 params.setsize(0);
180 loaded = false;
181 DELETEA(autograss);
182 grasstex = NULL;
183 thumbnail = NULL;
186 Slot() : autograss(NULL) { reset(); }
189 struct cubemapside
191 GLenum target;
192 const char *name;
195 extern cubemapside cubemapsides[6];
197 extern Texture *notexture;
199 extern Shader *defaultshader, *notextureshader, *nocolorshader, *foggedshader, *foggednotextureshader;
201 extern Shader *lookupshaderbyname(const char *name);
203 extern Texture *loadthumbnail(Slot &slot);
205 extern void setslotshader(Slot &s);
207 extern void setenvparamf(const char *name, int type, int index, float x = 0, float y = 0, float z = 0, float w = 0);
208 extern void setenvparamfv(const char *name, int type, int index, const float *v);
209 extern void flushenvparam(int type, int index, bool local = false);
210 extern void setlocalparamf(const char *name, int type, int index, float x = 0, float y = 0, float z = 0, float w = 0);
211 extern void setlocalparamfv(const char *name, int type, int index, const float *v);
213 extern ShaderParam *findshaderparam(Slot &s, const char *name, int type, int index);
215 extern int maxtmus, nolights, nowater, nomasks;
216 extern void inittmus();
217 extern void resettmu(int n);
218 extern void scaletmu(int n, int rgbscale, int alphascale = 0);
219 extern void colortmu(int n, float r = 0, float g = 0, float b = 0, float a = 0);
220 extern void setuptmu(int n, const char *rgbfunc = NULL, const char *alphafunc = NULL);
222 #define MAXDYNLIGHTS 5