6
#include "BL_Material.h"
9
#include "MT_Matrix4x4.h"
10
#include "MT_Matrix3x3.h"
11
#include "KX_PyMath.h"
12
#include "MEM_guardedalloc.h"
14
#include "RAS_GLExtensionManager.h"
15
#include "RAS_MeshObject.h"
16
#include "RAS_IRasterizer.h"
18
#define spit(x) std::cout << x << std::endl;
20
#define SORT_UNIFORMS 1
21
#define UNIFORM_MAX_LEN sizeof(float)*16
22
#define MAX_LOG_LEN 262144 // bounds
24
BL_Uniform::BL_Uniform(int data_size)
32
MT_assert((int)mDataLen <= UNIFORM_MAX_LEN);
33
mData = (void*)MEM_mallocN(mDataLen, "shader-uniform-alloc");
37
BL_Uniform::~BL_Uniform()
47
void BL_Uniform::Apply(class BL_Shader *shader)
50
MT_assert(mType > UNI_NONE && mType < UNI_MAX && mData);
58
float *f = (float*)mData;
59
glUniform1fARB(mLoc,(GLfloat)*f);
63
glUniform1iARB(mLoc, (GLint)*f);
66
float *f = (float*)mData;
67
glUniform2fvARB(mLoc,1, (GLfloat*)f);
70
float *f = (float*)mData;
71
glUniform3fvARB(mLoc,1,(GLfloat*)f);
74
float *f = (float*)mData;
75
glUniform4fvARB(mLoc,1,(GLfloat*)f);
79
glUniform2ivARB(mLoc,1,(GLint*)f);
83
glUniform3ivARB(mLoc,1,(GLint*)f);
87
glUniform4ivARB(mLoc,1,(GLint*)f);
90
float *f = (float*)mData;
91
glUniformMatrix4fvARB(mLoc, 1, mTranspose?GL_TRUE:GL_FALSE,(GLfloat*)f);
94
float *f = (float*)mData;
95
glUniformMatrix3fvARB(mLoc, 1, mTranspose?GL_TRUE:GL_FALSE,(GLfloat*)f);
102
void BL_Uniform::SetData(int location, int type,bool transpose)
111
const bool BL_Shader::Ok()const
113
return (mShader !=0 && mOk && mUse);
116
BL_Shader::BL_Shader(PyTypeObject *T)
128
// if !GLEW_ARB_shader_objects this class will not be used
129
//for (int i=0; i<MAXTEX; i++) {
130
// mSampler[i] = BL_Sampler();
134
BL_Shader::~BL_Shader()
136
//for (int i=0; i<MAXTEX; i++){
137
// if(mSampler[i].mOwn) {
138
// if(mSampler[i].mTexture)
139
// mSampler[i].mTexture->DeleteTex();
145
glDeleteObjectARB(mShader);
151
glUseProgramObjectARB(0);
154
void BL_Shader::ClearUniforms()
156
BL_UniformVec::iterator it = mUniforms.begin();
157
while(it != mUniforms.end()){
164
BL_UniformVecDef::iterator itp = mPreDef.begin();
165
while(itp != mPreDef.end()) {
174
BL_Uniform *BL_Shader::FindUniform(const int location)
177
BL_UniformVec::iterator it = mUniforms.begin();
178
while(it != mUniforms.end()) {
179
if((*it)->GetLocation() == location)
187
void BL_Shader::SetUniformfv(int location, int type, float *param,int size, bool transpose)
190
BL_Uniform *uni= FindUniform(location);
192
memcpy(uni->getData(), param, size);
193
uni->SetData(location, type, transpose);
196
uni = new BL_Uniform(size);
197
memcpy(uni->getData(), param, size);
199
uni->SetData(location, type, transpose);
200
mUniforms.push_back(uni);
206
void BL_Shader::SetUniformiv(int location, int type, int *param,int size, bool transpose)
209
BL_Uniform *uni= FindUniform(location);
211
memcpy(uni->getData(), param, size);
212
uni->SetData(location, type, transpose);
215
uni = new BL_Uniform(size);
216
memcpy(uni->getData(), param, size);
217
uni->SetData(location, type, transpose);
218
mUniforms.push_back(uni);
225
void BL_Shader::ApplyShader()
231
for(unsigned int i=0; i<mUniforms.size(); i++)
232
mUniforms[i]->Apply(this);
238
void BL_Shader::UnloadShader()
244
bool BL_Shader::LinkProgram()
246
int vertlen = 0, fraglen=0, proglen=0;
247
int vertstatus=0, fragstatus=0, progstatus=0;
248
unsigned int tmpVert=0, tmpFrag=0, tmpProg=0;
255
if(!vertProg || !fragProg){
256
spit("Invalid GLSL sources");
259
if( !GLEW_ARB_fragment_shader) {
260
spit("Fragment shaders not supported");
263
if( !GLEW_ARB_vertex_shader) {
264
spit("Vertex shaders not supported");
268
// -- vertex shader ------------------
269
tmpVert = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
270
glShaderSourceARB(tmpVert, 1, (const char**)&vertProg, 0);
271
glCompileShaderARB(tmpVert);
272
glGetObjectParameterivARB(tmpVert, GL_OBJECT_INFO_LOG_LENGTH_ARB,(GLint*) &vertlen);
275
if( vertlen > 0 && vertlen < MAX_LOG_LEN){
276
logInf = (char*)MEM_mallocN(vertlen, "vert-log");
277
glGetInfoLogARB(tmpVert, vertlen, (GLsizei*)&char_len, logInf);
279
spit("---- Vertex Shader Error ----");
285
// check for compile errors
286
glGetObjectParameterivARB(tmpVert, GL_OBJECT_COMPILE_STATUS_ARB,(GLint*)&vertstatus);
288
spit("---- Vertex shader failed to compile ----");
292
// -- fragment shader ----------------
293
tmpFrag = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
294
glShaderSourceARB(tmpFrag, 1,(const char**)&fragProg, 0);
295
glCompileShaderARB(tmpFrag);
296
glGetObjectParameterivARB(tmpFrag, GL_OBJECT_INFO_LOG_LENGTH_ARB, (GLint*) &fraglen);
297
if(fraglen >0 && fraglen < MAX_LOG_LEN){
298
logInf = (char*)MEM_mallocN(fraglen, "frag-log");
299
glGetInfoLogARB(tmpFrag, fraglen,(GLsizei*) &char_len, logInf);
301
spit("---- Fragment Shader Error ----");
308
glGetObjectParameterivARB(tmpFrag, GL_OBJECT_COMPILE_STATUS_ARB, (GLint*) &fragstatus);
310
spit("---- Fragment shader failed to compile ----");
315
// -- program ------------------------
316
// set compiled vert/frag shader & link
317
tmpProg = glCreateProgramObjectARB();
318
glAttachObjectARB(tmpProg, tmpVert);
319
glAttachObjectARB(tmpProg, tmpFrag);
320
glLinkProgramARB(tmpProg);
321
glGetObjectParameterivARB(tmpProg, GL_OBJECT_INFO_LOG_LENGTH_ARB, (GLint*) &proglen);
322
glGetObjectParameterivARB(tmpProg, GL_OBJECT_LINK_STATUS_ARB, (GLint*) &progstatus);
325
if(proglen > 0 && proglen < MAX_LOG_LEN) {
326
logInf = (char*)MEM_mallocN(proglen, "prog-log");
327
glGetInfoLogARB(tmpProg, proglen, (GLsizei*)&char_len, logInf);
329
spit("---- GLSL Program ----");
337
spit("---- GLSL program failed to link ----");
343
glDeleteObjectARB(tmpVert);
344
glDeleteObjectARB(tmpFrag);
351
glDeleteObjectARB(tmpVert);
355
glDeleteObjectARB(tmpFrag);
360
glDeleteObjectARB(tmpProg);
370
const char *BL_Shader::GetVertPtr()
372
return vertProg?vertProg:0;
375
const char *BL_Shader::GetFragPtr()
377
return fragProg?fragProg:0;
380
void BL_Shader::SetVertPtr( char *vert )
385
void BL_Shader::SetFragPtr( char *frag )
390
unsigned int BL_Shader::GetProg()
395
//const BL_Sampler* BL_Shader::GetSampler(int i)
397
// MT_assert(i<=MAXTEX);
398
// return &mSampler[i];
401
void BL_Shader::SetSampler(int loc, int unit)
403
if( GLEW_ARB_fragment_shader &&
404
GLEW_ARB_vertex_shader &&
405
GLEW_ARB_shader_objects
408
glUniform1iARB(loc, unit);
412
//void BL_Shader::InitializeSampler(int unit, BL_Texture* texture)
414
// MT_assert(unit<=MAXTEX);
415
// mSampler[unit].mTexture = texture;
416
// mSampler[unit].mLoc =-1;
417
// mSampler[unit].mOwn = 0;
420
void BL_Shader::SetProg(bool enable)
422
if( GLEW_ARB_fragment_shader &&
423
GLEW_ARB_vertex_shader &&
424
GLEW_ARB_shader_objects
427
if( mShader != 0 && mOk && enable) {
428
glUseProgramObjectARB(mShader);
431
glUseProgramObjectARB(0);
436
void BL_Shader::Update( const RAS_MeshSlot & ms, RAS_IRasterizer* rasty )
438
if(!Ok() || !mPreDef.size())
441
if( GLEW_ARB_fragment_shader &&
442
GLEW_ARB_vertex_shader &&
443
GLEW_ARB_shader_objects
447
model.setValue(ms.m_OpenGLMatrix);
448
const MT_Matrix4x4& view = rasty->GetViewMatrix();
450
if(mAttr==SHD_TANGENT)
451
ms.m_mesh->SetMeshModified(true);
453
BL_UniformVecDef::iterator it;
454
for(it = mPreDef.begin(); it!= mPreDef.end(); it++)
456
BL_DefUniform *uni = (*it);
457
if(uni->mLoc == -1) continue;
463
SetUniform(uni->mLoc, model);
466
case MODELMATRIX_TRANSPOSE:
468
SetUniform(uni->mLoc, model, true);
471
case MODELMATRIX_INVERSE:
474
SetUniform(uni->mLoc, model);
477
case MODELMATRIX_INVERSETRANSPOSE:
480
SetUniform(uni->mLoc, model, true);
483
case MODELVIEWMATRIX:
485
SetUniform(uni->mLoc, view*model);
489
case MODELVIEWMATRIX_TRANSPOSE:
491
MT_Matrix4x4 mat(view*model);
492
SetUniform(uni->mLoc, mat, true);
495
case MODELVIEWMATRIX_INVERSE:
497
MT_Matrix4x4 mat(view*model);
499
SetUniform(uni->mLoc, mat);
502
case MODELVIEWMATRIX_INVERSETRANSPOSE:
504
MT_Matrix4x4 mat(view*model);
506
SetUniform(uni->mLoc, mat, true);
511
MT_Point3 pos(rasty->GetCameraPosition());
512
SetUniform(uni->mLoc, pos);
517
SetUniform(uni->mLoc, view);
520
case VIEWMATRIX_TRANSPOSE:
522
SetUniform(uni->mLoc, view, true);
525
case VIEWMATRIX_INVERSE:
527
MT_Matrix4x4 viewinv = view;
529
SetUniform(uni->mLoc, view);
532
case VIEWMATRIX_INVERSETRANSPOSE:
534
MT_Matrix4x4 viewinv = view;
536
SetUniform(uni->mLoc, view, true);
541
SetUniform(uni->mLoc, (float)rasty->GetTime());
552
int BL_Shader::GetAttribLocation(const STR_String& name)
554
if( GLEW_ARB_fragment_shader &&
555
GLEW_ARB_vertex_shader &&
556
GLEW_ARB_shader_objects
559
return glGetAttribLocationARB(mShader, name.ReadPtr());
565
void BL_Shader::BindAttribute(const STR_String& attr, int loc)
567
if( GLEW_ARB_fragment_shader &&
568
GLEW_ARB_vertex_shader &&
569
GLEW_ARB_shader_objects
572
glBindAttribLocationARB(mShader, loc, attr.ReadPtr());
576
int BL_Shader::GetUniformLocation(const STR_String& name)
578
if( GLEW_ARB_fragment_shader &&
579
GLEW_ARB_vertex_shader &&
580
GLEW_ARB_shader_objects
583
MT_assert(mShader!=0);
584
int location = glGetUniformLocationARB(mShader, name.ReadPtr());
586
spit("Invalid uniform value: " << name.ReadPtr() << ".");
593
void BL_Shader::SetUniform(int uniform, const MT_Tuple2& vec)
595
if( GLEW_ARB_fragment_shader &&
596
GLEW_ARB_vertex_shader &&
597
GLEW_ARB_shader_objects
602
glUniform2fvARB(uniform, 1, value);
607
void BL_Shader::SetUniform(int uniform, const MT_Tuple3& vec)
609
if( GLEW_ARB_fragment_shader &&
610
GLEW_ARB_vertex_shader &&
611
GLEW_ARB_shader_objects
616
glUniform3fvARB(uniform, 1, value);
620
void BL_Shader::SetUniform(int uniform, const MT_Tuple4& vec)
622
if( GLEW_ARB_fragment_shader &&
623
GLEW_ARB_vertex_shader &&
624
GLEW_ARB_shader_objects
629
glUniform4fvARB(uniform, 1, value);
633
void BL_Shader::SetUniform(int uniform, const unsigned int& val)
635
if( GLEW_ARB_fragment_shader &&
636
GLEW_ARB_vertex_shader &&
637
GLEW_ARB_shader_objects
640
glUniform1iARB(uniform, val);
644
void BL_Shader::SetUniform(int uniform, const int val)
646
if( GLEW_ARB_fragment_shader &&
647
GLEW_ARB_vertex_shader &&
648
GLEW_ARB_shader_objects
651
glUniform1iARB(uniform, val);
655
void BL_Shader::SetUniform(int uniform, const float& val)
657
if( GLEW_ARB_fragment_shader &&
658
GLEW_ARB_vertex_shader &&
659
GLEW_ARB_shader_objects
662
glUniform1fARB(uniform, val);
666
void BL_Shader::SetUniform(int uniform, const MT_Matrix4x4& vec, bool transpose)
668
if( GLEW_ARB_fragment_shader &&
669
GLEW_ARB_vertex_shader &&
670
GLEW_ARB_shader_objects
674
// note: getValue gives back column major as needed by OpenGL
676
glUniformMatrix4fvARB(uniform, 1, transpose?GL_TRUE:GL_FALSE, value);
680
void BL_Shader::SetUniform(int uniform, const MT_Matrix3x3& vec, bool transpose)
682
if( GLEW_ARB_fragment_shader &&
683
GLEW_ARB_vertex_shader &&
684
GLEW_ARB_shader_objects
688
value[0] = (float)vec[0][0]; value[1] = (float)vec[1][0]; value[2] = (float)vec[2][0];
689
value[3] = (float)vec[0][1]; value[4] = (float)vec[1][1]; value[5] = (float)vec[2][1];
690
value[6] = (float)vec[0][2]; value[7] = (float)vec[1][2]; value[7] = (float)vec[2][2];
691
glUniformMatrix3fvARB(uniform, 1, transpose?GL_TRUE:GL_FALSE, value);
695
void BL_Shader::SetUniform(int uniform, const float* val, int len)
697
if( GLEW_ARB_fragment_shader &&
698
GLEW_ARB_vertex_shader &&
699
GLEW_ARB_shader_objects
703
glUniform2fvARB(uniform, 1,(GLfloat*)val);
705
glUniform3fvARB(uniform, 1,(GLfloat*)val);
707
glUniform4fvARB(uniform, 1,(GLfloat*)val);
713
void BL_Shader::SetUniform(int uniform, const int* val, int len)
715
if( GLEW_ARB_fragment_shader &&
716
GLEW_ARB_vertex_shader &&
717
GLEW_ARB_shader_objects
721
glUniform2ivARB(uniform, 1, (GLint*)val);
723
glUniform3ivARB(uniform, 1, (GLint*)val);
725
glUniform4ivARB(uniform, 1, (GLint*)val);
732
PyObject* BL_Shader::_getattr(const STR_String& attr)
734
_getattr_up(PyObjectPlus);
738
PyMethodDef BL_Shader::Methods[] =
741
KX_PYMETHODTABLE( BL_Shader, setSource ),
742
KX_PYMETHODTABLE( BL_Shader, delSource ),
743
KX_PYMETHODTABLE( BL_Shader, getVertexProg ),
744
KX_PYMETHODTABLE( BL_Shader, getFragmentProg ),
745
KX_PYMETHODTABLE( BL_Shader, setNumberOfPasses ),
746
KX_PYMETHODTABLE( BL_Shader, validate),
748
KX_PYMETHODTABLE( BL_Shader, isValid),
749
KX_PYMETHODTABLE( BL_Shader, setUniform1f ),
750
KX_PYMETHODTABLE( BL_Shader, setUniform2f ),
751
KX_PYMETHODTABLE( BL_Shader, setUniform3f ),
752
KX_PYMETHODTABLE( BL_Shader, setUniform4f ),
753
KX_PYMETHODTABLE( BL_Shader, setUniform1i ),
754
KX_PYMETHODTABLE( BL_Shader, setUniform2i ),
755
KX_PYMETHODTABLE( BL_Shader, setUniform3i ),
756
KX_PYMETHODTABLE( BL_Shader, setUniform4i ),
757
KX_PYMETHODTABLE( BL_Shader, setAttrib ),
759
KX_PYMETHODTABLE( BL_Shader, setUniformfv ),
760
KX_PYMETHODTABLE( BL_Shader, setUniformiv ),
761
KX_PYMETHODTABLE( BL_Shader, setUniformDef ),
763
KX_PYMETHODTABLE( BL_Shader, setSampler ),
764
KX_PYMETHODTABLE( BL_Shader, setUniformMatrix4 ),
765
KX_PYMETHODTABLE( BL_Shader, setUniformMatrix3 ),
767
{NULL,NULL} //Sentinel
771
PyTypeObject BL_Shader::Type = {
772
PyObject_HEAD_INIT(&PyType_Type)
787
PyParentObject BL_Shader::Parents[] = {
794
KX_PYMETHODDEF_DOC( BL_Shader, setSource," setSource(vertexProgram, fragmentProgram)" )
796
if(mShader !=0 && mOk )
803
if( PyArg_ParseTuple(args, "ssi", &v, &f, &apply) )
807
if( LinkProgram() ) {
808
glUseProgramObjectARB( mShader );
821
KX_PYMETHODDEF_DOC( BL_Shader, delSource, "delSource( )" )
824
glUseProgramObjectARB(0);
826
glDeleteObjectARB(mShader);
833
KX_PYMETHODDEF_DOC( BL_Shader, isValid, "isValid()" )
835
return PyInt_FromLong( ( mShader !=0 && mOk ) );
838
KX_PYMETHODDEF_DOC( BL_Shader, getVertexProg ,"getVertexProg( )" )
840
return PyString_FromString(vertProg?vertProg:"");
843
KX_PYMETHODDEF_DOC( BL_Shader, getFragmentProg ,"getFragmentProg( )" )
845
return PyString_FromString(fragProg?fragProg:"");
848
KX_PYMETHODDEF_DOC( BL_Shader, validate, "validate()")
854
PyErr_Format(PyExc_TypeError, "invalid shader object");
858
glValidateProgramARB(mShader);
859
glGetObjectParameterivARB(mShader, GL_OBJECT_VALIDATE_STATUS_ARB,(GLint*) &stat);
862
if(stat > 0 && stat < MAX_LOG_LEN) {
864
char *logInf = (char*)MEM_mallocN(stat, "validate-log");
866
glGetInfoLogARB(mShader, stat,(GLsizei*) &char_len, logInf);
868
spit("---- GLSL Validation ----");
878
KX_PYMETHODDEF_DOC( BL_Shader, setSampler, "setSampler(name, index)" )
884
const char *uniform="";
886
if(PyArg_ParseTuple(args, "si", &uniform, &index))
888
int loc = GetUniformLocation(uniform);
890
if(index >= MAXTEX && index < 0)
891
spit("Invalid texture sample index: " << index);
894
SetUniformiv(loc, BL_Uniform::UNI_INT, &index, (sizeof(int)) );
896
SetUniform(loc, index);
898
//if(index <= MAXTEX)
899
// mSampler[index].mLoc = loc;
901
// spit("Invalid texture sample index: " << index);
908
KX_PYMETHODDEF_DOC( BL_Shader, setNumberOfPasses, "setNumberOfPasses( max-pass )" )
911
if(!PyArg_ParseTuple(args, "i", &pass))
919
KX_PYMETHODDEF_DOC( BL_Shader, setUniform1f, "setUniform1f(name, fx)" )
925
const char *uniform="";
927
if(PyArg_ParseTuple(args, "sf", &uniform, &value ))
929
int loc = GetUniformLocation(uniform);
933
SetUniformfv(loc, BL_Uniform::UNI_FLOAT, &value, sizeof(float));
935
SetUniform( loc, (float)value );
944
KX_PYMETHODDEF_DOC( BL_Shader, setUniform2f , "setUniform2f(name, fx, fy)")
949
const char *uniform="";
950
float array[2]={ 0,0 };
951
if(PyArg_ParseTuple(args, "sff", &uniform, &array[0],&array[1] ))
953
int loc = GetUniformLocation(uniform);
957
SetUniformfv(loc, BL_Uniform::UNI_FLOAT2, array, (sizeof(float)*2) );
959
SetUniform(loc, array, 2);
968
KX_PYMETHODDEF_DOC( BL_Shader, setUniform3f, "setUniform3f(name, fx,fy,fz) ")
973
const char *uniform="";
974
float array[3]={0,0,0};
975
if(PyArg_ParseTuple(args, "sfff", &uniform, &array[0],&array[1],&array[2]))
977
int loc = GetUniformLocation(uniform);
981
SetUniformfv(loc, BL_Uniform::UNI_FLOAT3, array, (sizeof(float)*3) );
983
SetUniform(loc, array, 3);
993
KX_PYMETHODDEF_DOC( BL_Shader, setUniform4f, "setUniform4f(name, fx,fy,fz, fw) ")
998
const char *uniform="";
999
float array[4]={0,0,0,0};
1000
if(PyArg_ParseTuple(args, "sffff", &uniform, &array[0],&array[1],&array[2], &array[3]))
1002
int loc = GetUniformLocation(uniform);
1005
#ifdef SORT_UNIFORMS
1006
SetUniformfv(loc, BL_Uniform::UNI_FLOAT4, array, (sizeof(float)*4) );
1008
SetUniform(loc, array, 4);
1017
KX_PYMETHODDEF_DOC( BL_Shader, setUniform1i, "setUniform1i(name, ix)" )
1022
const char *uniform="";
1024
if(PyArg_ParseTuple(args, "si", &uniform, &value ))
1026
int loc = GetUniformLocation(uniform);
1029
#ifdef SORT_UNIFORMS
1030
SetUniformiv(loc, BL_Uniform::UNI_INT, &value, sizeof(int));
1032
SetUniform(loc, (int)value);
1041
KX_PYMETHODDEF_DOC( BL_Shader, setUniform2i , "setUniform2i(name, ix, iy)")
1046
const char *uniform="";
1047
int array[2]={ 0,0 };
1048
if(PyArg_ParseTuple(args, "sii", &uniform, &array[0],&array[1] ))
1050
int loc = GetUniformLocation(uniform);
1053
#ifdef SORT_UNIFORMS
1054
SetUniformiv(loc, BL_Uniform::UNI_INT2, array, sizeof(int)*2);
1056
SetUniform(loc, array, 2);
1065
KX_PYMETHODDEF_DOC( BL_Shader, setUniform3i, "setUniform3i(name, ix,iy,iz) ")
1071
const char *uniform="";
1072
int array[3]={0,0,0};
1073
if(PyArg_ParseTuple(args, "siii", &uniform, &array[0],&array[1],&array[2]))
1075
int loc = GetUniformLocation(uniform);
1078
#ifdef SORT_UNIFORMS
1079
SetUniformiv(loc, BL_Uniform::UNI_INT3, array, sizeof(int)*3);
1081
SetUniform(loc, array, 3);
1089
KX_PYMETHODDEF_DOC( BL_Shader, setUniform4i, "setUniform4i(name, ix,iy,iz, iw) ")
1094
const char *uniform="";
1095
int array[4]={0,0,0, 0};
1096
if(PyArg_ParseTuple(args, "siiii", &uniform, &array[0],&array[1],&array[2], &array[3] ))
1098
int loc = GetUniformLocation(uniform);
1101
#ifdef SORT_UNIFORMS
1102
SetUniformiv(loc, BL_Uniform::UNI_INT4, array, sizeof(int)*4);
1104
SetUniform(loc, array, 4);
1112
KX_PYMETHODDEF_DOC( BL_Shader, setUniformfv , "setUniformfv( float (list2 or list3 or list4) )")
1117
const char *uniform = "";
1118
PyObject *listPtr =0;
1119
float array_data[4] = {0.f,0.f,0.f,0.f};
1121
if(PyArg_ParseTuple(args, "sO", &uniform, &listPtr))
1123
int loc = GetUniformLocation(uniform);
1126
if(PySequence_Check(listPtr))
1128
unsigned int list_size = PySequence_Size(listPtr);
1130
for(unsigned int i=0; (i<list_size && i<4); i++)
1132
PyObject *item = PySequence_GetItem(listPtr, i);
1133
array_data[i] = (float)PyFloat_AsDouble(item);
1141
float array2[2] = { array_data[0],array_data[1] };
1142
#ifdef SORT_UNIFORMS
1143
SetUniformfv(loc, BL_Uniform::UNI_FLOAT2, array2, sizeof(float)*2);
1145
SetUniform(loc, array2, 2);
1151
float array3[3] = { array_data[0],array_data[1],array_data[2] };
1152
#ifdef SORT_UNIFORMS
1153
SetUniformfv(loc, BL_Uniform::UNI_FLOAT3, array3, sizeof(float)*3);
1155
SetUniform(loc, array3, 3);
1161
float array4[4] = { array_data[0],array_data[1],array_data[2],array_data[3] };
1162
#ifdef SORT_UNIFORMS
1163
SetUniformfv(loc, BL_Uniform::UNI_FLOAT4, array4, sizeof(float)*4);
1165
SetUniform(loc, array4, 4);
1171
PyErr_Format(PyExc_TypeError, "Invalid list size");
1181
KX_PYMETHODDEF_DOC( BL_Shader, setUniformiv, "setUniformiv( int (list2 or list3 or list4) )")
1186
const char *uniform = "";
1187
PyObject *listPtr =0;
1188
int array_data[4] = {0,0,0,0};
1190
if(PyArg_ParseTuple(args, "sO", &uniform, &listPtr))
1192
int loc = GetUniformLocation(uniform);
1195
if(PySequence_Check(listPtr))
1197
unsigned int list_size = PySequence_Size(listPtr);
1199
for(unsigned int i=0; (i<list_size && i<4); i++)
1201
PyObject *item = PySequence_GetItem(listPtr, i);
1202
array_data[i] = PyInt_AsLong(item);
1209
int array2[2] = { array_data[0],array_data[1]};
1210
#ifdef SORT_UNIFORMS
1211
SetUniformiv(loc, BL_Uniform::UNI_INT2, array2, sizeof(int)*2);
1213
SetUniform(loc, array2, 2);
1219
int array3[3] = { array_data[0],array_data[1],array_data[2] };
1220
#ifdef SORT_UNIFORMS
1221
SetUniformiv(loc, BL_Uniform::UNI_INT3, array3, sizeof(int)*3);
1224
SetUniform(loc, array3, 3);
1230
int array4[4] = { array_data[0],array_data[1],array_data[2],array_data[3] };
1231
#ifdef SORT_UNIFORMS
1232
SetUniformiv(loc, BL_Uniform::UNI_INT4, array4, sizeof(int)*4);
1235
SetUniform(loc, array4, 4);
1241
PyErr_Format(PyExc_TypeError, "Invalid list size");
1252
KX_PYMETHODDEF_DOC( BL_Shader, setUniformMatrix4,
1253
"setUniformMatrix4(uniform-name, mat-4x4, transpose(row-major=true, col-major=false)" )
1266
const char *uniform="";
1268
int transp=1; // MT_ is row major so transpose by default....
1269
if(PyArg_ParseTuple(args, "sO|i",&uniform, &matrix,&transp))
1271
int loc = GetUniformLocation(uniform);
1274
if (PyObject_IsMT_Matrix(matrix, 4))
1277
if (PyMatTo(matrix, mat))
1279
#ifdef SORT_UNIFORMS
1281
SetUniformfv(loc, BL_Uniform::UNI_MAT4, matr, (sizeof(float)*16), (transp!=0) );
1283
SetUniform(loc,mat,(transp!=0));
1294
KX_PYMETHODDEF_DOC( BL_Shader, setUniformMatrix3,
1295
"setUniformMatrix3(uniform-name, list[3x3], transpose(row-major=true, col-major=false)" )
1307
const char *uniform="";
1309
int transp=1; // MT_ is row major so transpose by default....
1310
if(PyArg_ParseTuple(args, "sO|i",&uniform, &matrix,&transp))
1312
int loc = GetUniformLocation(uniform);
1315
if (PyObject_IsMT_Matrix(matrix, 3))
1318
if (PyMatTo(matrix, mat))
1320
#ifdef SORT_UNIFORMS
1322
SetUniformfv(loc, BL_Uniform::UNI_MAT3, matr, (sizeof(float)*9), (transp!=0) );
1324
SetUniform(loc,mat,(transp!=0));
1335
KX_PYMETHODDEF_DOC( BL_Shader, setAttrib, "setAttrib(enum)" )
1341
if(PyArg_ParseTuple(args, "i", &attr )) {
1343
PyErr_Format(PyExc_ValueError, "invalid shader object");
1347
glUseProgramObjectARB(mShader);
1348
glBindAttribLocationARB(mShader, mAttr, "Tangent");
1355
KX_PYMETHODDEF_DOC( BL_Shader, setUniformDef, "setUniformDef(name, enum)" )
1361
const char *uniform="";
1363
if(PyArg_ParseTuple(args, "si",&uniform, &nloc))
1365
int loc = GetUniformLocation(uniform);
1368
bool defined = false;
1369
BL_UniformVecDef::iterator it = mPreDef.begin();
1370
while(it != mPreDef.end()) {
1371
if((*it)->mLoc == loc) {
1382
BL_DefUniform *uni = new BL_DefUniform();
1386
mPreDef.push_back(uni);