| 163 | | bufN = ur_makeBuffer( UT_SHADER, sizeof(Shader) + (count - 1), &buf ); |
| | 166 | if( count ) |
| | 167 | { |
| | 168 | ShaderParam* pend; |
| | 169 | UCell* cval; |
| | 170 | |
| | 171 | // We have parameters - make context to hold shader & params. |
| | 172 | |
| | 173 | ur_makeContext( cell, count + 1 ); |
| | 174 | ur_internWord( cell, UR_ATOM_SHADER ); |
| | 175 | |
| | 176 | cval = ur_blockPtr( cell->ctx.valBlk )->ptr.cells; |
| | 177 | |
| | 178 | pi = param; |
| | 179 | pend = param + count; |
| | 180 | while( pi != pend ) |
| | 181 | { |
| | 182 | ur_internWord( cell, pi->name ); |
| | 183 | |
| | 184 | ++cval; |
| | 185 | switch( pi->type ) |
| | 186 | { |
| | 187 | case GL_FLOAT: |
| | 188 | ur_initType( cval, UT_DECIMAL ); |
| | 189 | ur_decimal( cval ) = 0.0; |
| | 190 | break; |
| | 191 | |
| | 192 | case GL_FLOAT_VEC2_ARB: |
| | 193 | case GL_FLOAT_VEC3_ARB: |
| | 194 | //case GL_FLOAT_VEC4_ARB: |
| | 195 | ur_initType( cval, UT_VEC3 ); |
| | 196 | cval->vec3.xyz[0] = 0.0f; |
| | 197 | cval->vec3.xyz[1] = 0.0f; |
| | 198 | cval->vec3.xyz[2] = 0.0f; |
| | 199 | break; |
| | 200 | |
| | 201 | case GL_INT: |
| | 202 | ur_initType( cval, UT_INT ); |
| | 203 | ur_int( cval ) = 0; |
| | 204 | break; |
| | 205 | |
| | 206 | case GL_INT_VEC2_ARB: |
| | 207 | case GL_INT_VEC3_ARB: |
| | 208 | //case GL_INT_VEC4_ARB: |
| | 209 | ur_initType( cval, UT_COORD ); |
| | 210 | break; |
| | 211 | |
| | 212 | case GL_BOOL_ARB: |
| | 213 | ur_initType( cval, UT_LOGIC ); |
| | 214 | ur_int( cval ) = 0; |
| | 215 | break; |
| | 216 | |
| | 217 | default: |
| | 218 | ur_initType( cval, UT_NONE ); |
| | 219 | break; |
| | 220 | } |
| | 221 | |
| | 222 | ++pi; |
| | 223 | } |
| | 224 | } |
| | 225 | |
| | 226 | bufN = ur_makeBuffer( UT_SHADER, |
| | 227 | sizeof(Shader) + sizeof(ShaderParam) * (count - 1), |
| | 228 | &buf ); |
| 184 | | if( ur_is(cell, UT_SHADER) ) |
| | 255 | if( ur_is(cell, UT_CONTEXT) ) |
| | 256 | { |
| | 257 | UCell* cval; |
| | 258 | ShaderParam* pi; |
| | 259 | ShaderParam* pend; |
| | 260 | |
| | 261 | cval = ur_blockPtr( cell->ctx.valBlk )->ptr.cells; |
| | 262 | if( cval && ur_is(cval, UT_SHADER) ) |
| | 263 | { |
| | 264 | Shader* sh = (Shader*) ur_bufPtr( cval->series.n )->ptr; |
| | 265 | glUseProgramObjectARB( sh->program ); |
| | 266 | |
| | 267 | pi = sh->param; |
| | 268 | pend = sh->param + sh->paramCount; |
| | 269 | while( pi != pend ) |
| | 270 | { |
| | 271 | // There is no cell type checking or conversion here for speed. |
| | 272 | // If the user loads bad types then we'll just get garbage. |
| | 273 | |
| | 274 | ++cval; |
| | 275 | switch( pi->type ) |
| | 276 | { |
| | 277 | case GL_FLOAT: |
| | 278 | glUniform1fARB( pi->location, ur_decimal(cval) ); |
| | 279 | break; |
| | 280 | |
| | 281 | case GL_FLOAT_VEC2_ARB: |
| | 282 | glUniform2fvARB( pi->location, 1, cval->vec3.xyz ); |
| | 283 | break; |
| | 284 | |
| | 285 | case GL_FLOAT_VEC3_ARB: |
| | 286 | glUniform3fvARB( pi->location, 1, cval->vec3.xyz ); |
| | 287 | break; |
| | 288 | |
| | 289 | //case GL_FLOAT_VEC4_ARB: |
| | 290 | |
| | 291 | case GL_INT: |
| | 292 | case GL_BOOL_ARB: |
| | 293 | glUniform1iARB( pi->location, ur_int(cval) ); |
| | 294 | break; |
| | 295 | |
| | 296 | case GL_INT_VEC2_ARB: |
| | 297 | glUniform2iARB( pi->location, |
| | 298 | cval->coord.elem[0], |
| | 299 | cval->coord.elem[1] ); |
| | 300 | break; |
| | 301 | |
| | 302 | case GL_INT_VEC3_ARB: |
| | 303 | glUniform3iARB( pi->location, |
| | 304 | cval->coord.elem[0], |
| | 305 | cval->coord.elem[1], |
| | 306 | cval->coord.elem[2] ); |
| | 307 | break; |
| | 308 | |
| | 309 | //case GL_INT_VEC4_ARB: |
| | 310 | } |
| | 311 | ++pi; |
| | 312 | } |
| | 313 | /* |
| | 314 | glUniform1fARB( loc_specularCoeff, specular_coefficient ); |
| | 315 | */ |
| | 316 | |
| | 317 | return; |
| | 318 | } |
| | 319 | } |
| | 320 | else if( ur_is(cell, UT_SHADER) ) |