1 /************************************************************************
3 * voxelands - 3d voxel world sandbox game
4 * Copyright (C) Lisa 'darkrose' Milne 2016 <lisa@ltmnet.com>
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>
18 ************************************************************************/
27 static shader_t
*shaders
= NULL
;
29 #ifndef _HAVE_SHADER_TYPE
30 #define _HAVE_SHADER_TYPE
31 typedef struct shader_s
{
32 struct shader_s
*prev
;
33 struct shader_s
*next
;
41 shader_t
*shader_create(char* name
)
49 if (snprintf(buff
,512,"%s_vertex.glsl",name
) >= 512)
51 vert
= file_load("shader",buff
);
54 if (snprintf(buff
,512,"%s_fragment.glsl",name
) >= 512) {
58 frag
= file_load("shader",buff
);
64 s
= malloc(sizeof(shader_t
));
71 strncpy(s
->name
,name
,256);
74 s
->vert
= glCreateShader(GL_VERTEX_SHADER
);
81 s
->frag
= glCreateShader(GL_FRAGMENT_SHADER
);
89 glShaderSource(s
->vert
, 1, (const GLchar
**)&vert
->data
,NULL
);
90 glShaderSource(s
->frag
, 1, (const GLchar
**)&frag
->data
,NULL
);
92 glCompileShader(s
->vert
);
93 glGetShaderiv(s
->vert
,GL_COMPILE_STATUS
,&i
);
95 glGetShaderInfoLog(s
->vert
,512,&i
,buff
);
96 vlprintf("Vertex Shader failed to compile: %s",buff
);
103 glCompileShader(s
->frag
);
104 glGetShaderiv(s
->frag
,GL_COMPILE_STATUS
,&i
);
106 glGetShaderInfoLog(s
->frag
,512,&i
,buff
);
107 vlprintf("Fragment Shader failed to compile: %s",buff
);
114 s
->program
= glCreateProgram();
115 glAttachShader(s
->program
,s
->vert
);
116 glAttachShader(s
->program
,s
->frag
);
117 glLinkProgram(s
->program
);
118 glValidateProgram(s
->program
);
123 shaders
= list_push(&shaders
,s
);
129 void shader_free(shader_t
*s
)
137 glDetachShader(s
->program
,s
->vert
);
138 glDetachShader(s
->program
,s
->frag
);
139 glDeleteShader(s
->vert
);
140 glDeleteShader(s
->frag
);
141 glDeleteProgram(s
->program
);
146 /* bind an attribute to a shader */
147 int shader_attribute(shader_t
*s
, int att
, char* name
)
152 glBindAttribLocation(s
->program
,att
,name
);
153 glLinkProgram(s
->program
);
154 glValidateProgram(s
->program
);
159 /* set a shader uniform value */
160 int shader_uniform_int(shader_t
*s
, char* name
, int value
)
166 var
= glGetUniformLocation(s
->program
,name
);
167 glUniform1i(var
,value
);
172 /* set a shader uniform value */
173 int shader_uniform_float(shader_t
*s
, char* name
, float value
)
179 var
= glGetUniformLocation(s
->program
,name
);
180 glUniform1f(var
,value
);
185 /* set a shader uniform value */
186 int shader_uniform_v2(shader_t
*s
, char* name
, v2_t
*value
)
192 var
= glGetUniformLocation(s
->program
,name
);
193 glUniform2f(var
,value
->x
,value
->y
);
198 /* set a shader uniform value */
199 int shader_uniform_v3(shader_t
*s
, char* name
, v3_t
*value
)
205 var
= glGetUniformLocation(s
->program
,name
);
206 glUniform3f(var
,value
->x
,value
->y
,value
->z
);
211 /* set a shader uniform value */
212 int shader_uniform_matrix(shader_t
*s
, char* name
, matrix_t
*value
)
218 var
= glGetUniformLocation(s
->program
,name
);
219 glUniformMatrix4fv(var
,1,GL_FALSE
,value
->data
);
225 int shader_enable(shader_t
*s
)
230 glUseProgram(s
->program
);
236 /* stop using a shader */
237 int shader_disable(shader_t
*s
)
239 if (!s
|| !s
->active
)