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
41 struct LocalShaderParamState
: ShaderParam
45 LocalShaderParamState()
47 memset(curval
, 0, sizeof(curval
));
49 LocalShaderParamState(const ShaderParam
&p
) : ShaderParam(p
)
51 memset(curval
, 0, sizeof(curval
));
55 struct ShaderParamState
62 : name(NULL
), dirty(false), local(false)
64 memset(val
, 0, sizeof(val
));
71 SHADER_NORMALSLMS
= 1<<0,
76 #define MAXSHADERDETAIL 3
77 #define MAXVARIANTROWS 4
79 extern int shaderdetail
;
85 static Shader
*lastshader
;
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
];
97 Shader() : name(NULL
), type(SHADER_DEFAULT
), vs(0), ps(0), program(0), vsobj(0), psobj(0), altshader(NULL
), used(false), native(true)
105 void allocenvparams(Slot
*slot
= NULL
);
106 void flushenvparams(Slot
*slot
= NULL
);
107 void setslotparams(Slot
&slot
);
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;
122 if(shaderdetail
< MAXSHADERDETAIL
) fastshader
[shaderdetail
]->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
141 Texture() : alphamask(NULL
) {}
163 int rotation
, xoffset
, yoffset
;
170 vector
<ShaderParam
> params
;
173 Texture
*grasstex
, *thumbnail
;
186 Slot() : autograss(NULL
) { reset(); }
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