132
128
void KX_BlenderMaterial::OnConstruction()
134
130
// for each unique material...
135
#ifdef GL_ARB_multitexture
136
/* will be used to switch textures
138
gTextureDict = PyDict_New();
141
132
for(i=0; i<mMaterial->num_enabled; i++) {
142
bgl::blActiveTextureARB(GL_TEXTURE0_ARB+i);
143
#ifdef GL_ARB_texture_cube_map
133
BL_Texture::ActivateUnit(i);
144
134
if( mMaterial->mapping[i].mapping & USEENV ) {
145
135
if(!RAS_EXT_support._ARB_texture_cube_map) {
146
136
spit("CubeMap textures not supported");
149
if(!mTextures[i].InitCubeMap( mMaterial->cubemap[i] ) )
139
if(!mTextures[i].InitCubeMap(i, mMaterial->cubemap[i] ) )
150
140
spit("unable to initialize image("<<i<<") in "<<
151
141
mMaterial->matname<< ", image will not be available");
155
#endif//GL_ARB_texture_cube_map
156
145
if( mMaterial->img[i] ) {
157
if( ! mTextures[i].InitFromImage(mMaterial->img[i], (mMaterial->flag[i] &MIPMAP)!=0 ))
146
if( ! mTextures[i].InitFromImage(i, mMaterial->img[i], (mMaterial->flag[i] &MIPMAP)!=0 ))
158
147
spit("unable to initialize image("<<i<<") in "<<
159
148
mMaterial->matname<< ", image will not be available");
161
#ifdef GL_ARB_texture_cube_map
163
#endif//GL_ARB_texture_cube_map
164
/*PyDict_SetItemString(gTextureDict, mTextures[i].GetName().Ptr(), PyInt_FromLong(mTextures[i]));*/
166
#endif//GL_ARB_multitexture
168
152
mBlendFunc[0] =0;
169
153
mBlendFunc[1] =0;
172
156
void KX_BlenderMaterial::OnExit()
174
#ifdef GL_ARB_multitexture
176
#ifdef GL_ARB_shader_objects
177
if( RAS_EXT_support._ARB_shader_objects && mShader ) {
178
159
//note, the shader here is allocated, per unique material
179
160
//and this function is called per face
180
bgl::blUseProgramObjectARB(0);
184
#endif //GL_ARB_shader_objects
166
BL_Texture::ActivateFirst();
186
167
for(int i=0; i<mMaterial->num_enabled; i++) {
187
bgl::blActiveTextureARB(GL_TEXTURE0_ARB+i);
168
BL_Texture::ActivateUnit(i);
189
169
mTextures[i].DeleteTex();
191
glMatrixMode(GL_TEXTURE);
193
glMatrixMode(GL_MODELVIEW);
195
#ifdef GL_ARB_texture_cube_map
196
if(RAS_EXT_support._ARB_texture_cube_map)
197
glDisable(GL_TEXTURE_CUBE_MAP_ARB);
198
#endif//GL_ARB_texture_cube_map
200
glDisable(GL_TEXTURE_2D);
201
glDisable(GL_TEXTURE_GEN_S);
202
glDisable(GL_TEXTURE_GEN_T);
203
glDisable(GL_TEXTURE_GEN_R);
204
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
170
mTextures[i].DisableUnit();
207
/*if (gTextureDict) {
208
PyDict_Clear(gTextureDict);
209
Py_DECREF(gTextureDict);
213
bgl::blActiveTextureARB(GL_TEXTURE0_ARB);
215
#ifdef GL_ARB_texture_cube_map
216
if(RAS_EXT_support._ARB_texture_cube_map)
217
glDisable(GL_TEXTURE_CUBE_MAP_ARB);
218
#endif//GL_ARB_texture_cube_map
220
glDisable(GL_TEXTURE_2D);
222
#endif//GL_ARB_multitexture
224
// make sure multi texture units
225
// revert back to blender...
227
173
if( mMaterial->tface )
228
174
set_tpage(mMaterial->tface);
232
void KX_BlenderMaterial::DisableTexData()
235
#ifdef GL_ARB_multitexture
236
int i=(MAXTEX>=bgl::max_texture_units?bgl::max_texture_units:MAXTEX)-1;
238
bgl::blActiveTextureARB(GL_TEXTURE0_ARB+i);
239
glMatrixMode(GL_TEXTURE);
241
glMatrixMode(GL_MODELVIEW);
243
#ifdef GL_ARB_texture_cube_map
244
if(RAS_EXT_support._ARB_texture_cube_map)
245
glDisable(GL_TEXTURE_CUBE_MAP_ARB);
246
#endif//GL_ARB_texture_cube_map
248
glDisable(GL_TEXTURE_2D);
249
glDisable(GL_TEXTURE_GEN_S);
250
glDisable(GL_TEXTURE_GEN_T);
251
glDisable(GL_TEXTURE_GEN_R);
252
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
254
#endif//GL_ARB_multitexture
258
void KX_BlenderMaterial::setShaderData( bool enable )
260
#ifdef GL_ARB_multitexture
261
#ifdef GL_ARB_shader_objects
178
void KX_BlenderMaterial::setShaderData( bool enable, RAS_IRasterizer *ras)
263
180
MT_assert(RAS_EXT_support._ARB_shader_objects && mShader);
266
183
if( !enable || !mShader->Ok() ) {
267
184
// frame cleanup.
268
bgl::blUseProgramObjectARB( 0 );
185
mShader->SetProg(false);
186
BL_Texture::DisableAllTextures();
274
bgl::blUseProgramObjectARB( mShader->GetProg() );
190
BL_Texture::DisableAllTextures();
191
mShader->SetProg(true);
193
BL_Texture::ActivateFirst();
195
mShader->ApplyShader();
276
197
// for each enabled unit
277
198
for(i=0; i<mMaterial->num_enabled; i++) {
279
const uSampler *samp = mShader->getSampler(i);
280
if( samp->loc == -1 || samp->glTexture == 0 ) continue;
282
bgl::blActiveTextureARB(GL_TEXTURE0_ARB+i);
284
#ifdef GL_ARB_texture_cube_map
285
if( mMaterial->mapping[i].mapping &USEENV ) {
286
glBindTexture( GL_TEXTURE_CUBE_MAP_ARB, samp->glTexture /* mTextures[i]*/ );
287
glEnable( GL_TEXTURE_CUBE_MAP_ARB );
290
#endif//GL_ARB_texture_cube_map
291
glBindTexture( GL_TEXTURE_2D, samp->glTexture /*mTextures[i]*/ );
292
glEnable( GL_TEXTURE_2D );
293
#ifdef GL_ARB_texture_cube_map
295
#endif//GL_ARB_texture_cube_map
297
bgl::blUniform1iARB(samp->loc, i );
199
if(!mTextures[i].Ok()) continue;
200
mTextures[i].ActivateTexture();
201
mTextures[0].SetMapping(mMaterial->mapping[i].mapping);
300
204
if(!mUserDefBlend) {
301
205
setDefaultBlending();
208
// tested to be valid enums
304
209
glEnable(GL_BLEND);
305
// tested to be valid enums
306
210
glBlendFunc(mBlendFunc[0], mBlendFunc[1]);
309
#endif//GL_ARB_shader_objects
310
#endif//GL_ARB_multitexture
314
void KX_BlenderMaterial::setTexData( bool enable )
215
void KX_BlenderMaterial::setTexData( bool enable, RAS_IRasterizer *ras)
316
#ifdef GL_ARB_multitexture
319
#ifdef GL_ARB_shader_objects
320
if(RAS_EXT_support._ARB_shader_objects) {
321
// switch back to fixed func
322
bgl::blUseProgramObjectARB( 0 );
324
#endif//GL_ARB_shader_objects
217
if(RAS_EXT_support._ARB_shader_objects && mShader)
218
mShader->SetProg(false);
220
BL_Texture::DisableAllTextures();
224
BL_Texture::ActivateFirst();
334
226
if( mMaterial->IdMode == DEFAULT_BLENDER ) {
335
227
setDefaultBlending();
339
231
if( mMaterial->IdMode == TEXFACE ) {
341
232
// no material connected to the object
343
if( !mTextures[0].Ok() ) return;
344
bgl::blActiveTextureARB(GL_TEXTURE0_ARB);
345
glBindTexture( GL_TEXTURE_2D, mTextures[0] );
346
glEnable(GL_TEXTURE_2D);
347
setTextureEnvironment( -1 ); // modulate
348
setEnvMap( (mMaterial->mapping[0].mapping &USEREFL)!=0 );
233
if( mTextures[0].Ok() ) {
234
mTextures[0].ActivateTexture();
235
mTextures[0].setTexEnv(0, true);
236
mTextures[0].SetMapping(mMaterial->mapping[0].mapping);
349
237
setDefaultBlending();
356
// for each enabled unit
357
243
for(i=0; (i<mMaterial->num_enabled); i++) {
358
244
if( !mTextures[i].Ok() ) continue;
360
bgl::blActiveTextureARB(GL_TEXTURE0_ARB+i);
362
#ifdef GL_ARB_texture_cube_map
363
// use environment maps
364
if( mMaterial->mapping[i].mapping &USEENV && RAS_EXT_support._ARB_texture_cube_map ) {
365
glBindTexture( GL_TEXTURE_CUBE_MAP_ARB, mTextures[i] );
366
glEnable(GL_TEXTURE_CUBE_MAP_ARB);
367
setTextureEnvironment( i );
369
if( mMaterial->mapping[i].mapping &USEREFL )
370
setEnvMap( true, true );
371
else if(mMaterial->mapping[i].mapping &USEOBJ)
372
setObjectMatrixData(i);
374
setTexMatrixData( i );
378
#endif//GL_ARB_texture_cube_map
379
glBindTexture( GL_TEXTURE_2D, mTextures[i] );
380
glEnable( GL_TEXTURE_2D );
381
setTextureEnvironment( i );
383
if( mMaterial->mapping[i].mapping &USEREFL ){
386
else if(mMaterial->mapping[i].mapping &USEOBJ){
387
setObjectMatrixData(i);
390
setTexMatrixData( i );
393
#ifdef GL_ARB_texture_cube_map
395
#endif//GL_ARB_texture_cube_map
246
mTextures[i].ActivateTexture();
247
mTextures[i].setTexEnv(mMaterial);
248
mode = mMaterial->mapping[i].mapping;
251
setObjectMatrixData(i, ras);
253
mTextures[i].SetMapping(mode);
256
setTexMatrixData( i );
397
259
if(!mUserDefBlend) {
398
260
setDefaultBlending();
401
263
glEnable(GL_BLEND);
402
// tested to be valid enums
403
264
glBlendFunc(mBlendFunc[0], mBlendFunc[1]);
406
#endif//GL_ARB_multitexture
576
#ifdef GL_ARB_shader_objects
578
#endif//GL_ARB_shader_objects
582
void KX_BlenderMaterial::setTextureEnvironment( int textureIndex )
584
#ifndef GL_ARB_texture_env_combine
585
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
588
if(textureIndex == -1 || !RAS_EXT_support._ARB_texture_env_combine){
589
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
593
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
595
GLfloat blend_operand = GL_SRC_COLOR;
596
GLfloat blend_operand_prev = GL_SRC_COLOR;
598
GLenum combiner = GL_COMBINE_RGB_ARB;
599
GLenum source0 = GL_SOURCE0_RGB_ARB;
600
GLenum source1 = GL_SOURCE1_RGB_ARB;
601
GLenum source2 = GL_SOURCE2_RGB_ARB;
602
GLenum op0 = GL_OPERAND0_RGB_ARB;
603
GLenum op1 = GL_OPERAND1_RGB_ARB;
604
GLenum op2 = GL_OPERAND2_RGB_ARB;
605
GLfloat alphaOp = GL_SRC_ALPHA;
607
// switch to alpha combiners
608
if( (mMaterial->flag[textureIndex] &TEXALPHA) ) {
609
combiner = GL_COMBINE_ALPHA_ARB;
610
source0 = GL_SOURCE0_ALPHA_ARB;
611
source1 = GL_SOURCE1_ALPHA_ARB;
612
source2 = GL_SOURCE2_ALPHA_ARB;
613
op0 = GL_OPERAND0_ALPHA_ARB;
614
op1 = GL_OPERAND1_ALPHA_ARB;
615
op2 = GL_OPERAND2_ALPHA_ARB;
616
blend_operand = GL_SRC_ALPHA;
391
void KX_BlenderMaterial::ActivateMeshSlot(const KX_MeshSlot & ms, RAS_IRasterizer* rasty) const
393
if(mShader && RAS_EXT_support._ARB_shader_objects)
394
mShader->Update(ms, rasty);
397
void KX_BlenderMaterial::ActivatGLMaterials( RAS_IRasterizer* rasty )const
399
rasty->SetSpecularity(
400
mMaterial->speccolor[0]*mMaterial->spec_f,
401
mMaterial->speccolor[1]*mMaterial->spec_f,
402
mMaterial->speccolor[2]*mMaterial->spec_f,
406
rasty->SetShinyness( mMaterial->hard );
409
mMaterial->matcolor[0]*mMaterial->ref+mMaterial->emit,
410
mMaterial->matcolor[1]*mMaterial->ref+mMaterial->emit,
411
mMaterial->matcolor[2]*mMaterial->ref+mMaterial->emit,
415
mMaterial->matcolor[0]*mMaterial->emit,
416
mMaterial->matcolor[1]*mMaterial->emit,
417
mMaterial->matcolor[2]*mMaterial->emit,
420
rasty->SetAmbient(mMaterial->amb);
421
if (mMaterial->material)
422
rasty->SetPolygonOffset(-mMaterial->material->zoffs, 0.0);
426
void KX_BlenderMaterial::ActivateTexGen(RAS_IRasterizer *ras) const
428
if(mShader && RAS_EXT_support._ARB_shader_objects)
429
if(mShader->GetAttribute() == BL_Shader::SHD_TANGENT)
430
ras->SetAttrib(RAS_IRasterizer::RAS_TEXTANGENT);
432
for(int i=0; i<mMaterial->num_enabled; i++) {
433
int mode = mMaterial->mapping[i].mapping;
619
if(mMaterial->flag[textureIndex] &TEXNEG) {
620
blend_operand_prev = GL_ONE_MINUS_SRC_ALPHA;
621
blend_operand = GL_ONE_MINUS_SRC_ALPHA;
625
if(mMaterial->flag[textureIndex] &TEXNEG) {
626
blend_operand_prev=GL_ONE_MINUS_SRC_COLOR;
627
blend_operand = GL_ONE_MINUS_SRC_COLOR;
630
bool using_alpha = false;
632
if(mMaterial->flag[textureIndex] &USEALPHA){
633
alphaOp = GL_ONE_MINUS_SRC_ALPHA;
636
else if(mMaterial->flag[textureIndex] &USENEGALPHA){
637
alphaOp = GL_SRC_ALPHA;
641
switch( mMaterial->blend_mode[textureIndex] ) {
644
// ------------------------------
647
base_col[0] = base_col[1] = base_col[2] = 0.f;
648
base_col[3] = 1.f-mMaterial->color_blend[textureIndex];
649
glTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR,base_col );
651
glTexEnvf( GL_TEXTURE_ENV, combiner, GL_INTERPOLATE_ARB);
652
glTexEnvf( GL_TEXTURE_ENV, source0, GL_PREVIOUS_ARB);
653
glTexEnvf( GL_TEXTURE_ENV, op0, blend_operand_prev );
654
glTexEnvf( GL_TEXTURE_ENV, source1, GL_TEXTURE );
655
glTexEnvf( GL_TEXTURE_ENV, op1, blend_operand);
657
glTexEnvf( GL_TEXTURE_ENV, source2, GL_CONSTANT_ARB );
659
glTexEnvf( GL_TEXTURE_ENV, source2, GL_TEXTURE );
661
glTexEnvf( GL_TEXTURE_ENV, op2, alphaOp);
665
// ------------------------------
666
glTexEnvf( GL_TEXTURE_ENV, combiner, GL_MODULATE);
667
glTexEnvf( GL_TEXTURE_ENV, source0, GL_PREVIOUS_ARB);
668
glTexEnvf( GL_TEXTURE_ENV, op0, blend_operand_prev);
669
glTexEnvf( GL_TEXTURE_ENV, source1, GL_TEXTURE );
671
glTexEnvf( GL_TEXTURE_ENV, op1, alphaOp);
673
glTexEnvf( GL_TEXTURE_ENV, op1, blend_operand);
677
// ------------------------------
678
glTexEnvf( GL_TEXTURE_ENV, combiner, GL_ADD_SIGNED_ARB);
679
glTexEnvf( GL_TEXTURE_ENV, source0, GL_PREVIOUS_ARB );
680
glTexEnvf( GL_TEXTURE_ENV, op0, blend_operand_prev );
681
glTexEnvf( GL_TEXTURE_ENV, source1, GL_TEXTURE );
683
glTexEnvf( GL_TEXTURE_ENV, op1, alphaOp);
685
glTexEnvf( GL_TEXTURE_ENV, op1, blend_operand);
689
// ------------------------------
690
glTexEnvf( GL_TEXTURE_ENV, combiner, GL_SUBTRACT_ARB);
691
glTexEnvf( GL_TEXTURE_ENV, source0, GL_PREVIOUS_ARB );
692
glTexEnvf( GL_TEXTURE_ENV, op0, blend_operand_prev );
693
glTexEnvf( GL_TEXTURE_ENV, source1, GL_TEXTURE );
694
glTexEnvf( GL_TEXTURE_ENV, op1, blend_operand);
698
// ------------------------------
699
glTexEnvf( GL_TEXTURE_ENV, combiner, GL_ADD);
700
glTexEnvf( GL_TEXTURE_ENV, source0, GL_PREVIOUS_ARB );
701
glTexEnvf( GL_TEXTURE_ENV, op0, blend_operand_prev );
702
glTexEnvf( GL_TEXTURE_ENV, source1, GL_TEXTURE );
704
glTexEnvf( GL_TEXTURE_ENV, op1, alphaOp);
706
glTexEnvf( GL_TEXTURE_ENV, op1, blend_operand);
709
glTexEnvf( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1.0);
710
#endif //!GL_ARB_texture_env_combine
435
if( mode &(USEREFL|USEOBJ))
436
ras->SetTexCoords(RAS_IRasterizer::RAS_TEXCO_GEN, i);
437
else if(mode &USEORCO)
438
ras->SetTexCoords(RAS_IRasterizer::RAS_TEXCO_ORCO, i);
439
else if(mode &USENORM)
440
ras->SetTexCoords(RAS_IRasterizer::RAS_TEXCO_NORM, i);
442
ras->SetTexCoords(RAS_IRasterizer::RAS_TEXCO_UV1, i);
443
else if(mode &USETANG)
444
ras->SetTexCoords(RAS_IRasterizer::RAS_TEXTANGENT, i);
446
ras->SetTexCoords(RAS_IRasterizer::RAS_TEXCO_DISABLE, i);
713
450
bool KX_BlenderMaterial::setDefaultBlending()
731
void KX_BlenderMaterial::setEnvMap(bool val, bool cube)
733
#ifdef GL_ARB_texture_cube_map
734
if( cube && RAS_EXT_support._ARB_texture_cube_map )
736
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB );
737
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
738
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
740
glEnable(GL_TEXTURE_GEN_S);
741
glEnable(GL_TEXTURE_GEN_T);
742
glEnable(GL_TEXTURE_GEN_R);
745
#endif//GL_ARB_texture_cube_map
747
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
748
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
750
glEnable(GL_TEXTURE_GEN_S);
751
glEnable(GL_TEXTURE_GEN_T);
752
glEnable(GL_TEXTURE_GEN_R);
755
glDisable(GL_TEXTURE_GEN_S);
756
glDisable(GL_TEXTURE_GEN_T);
757
glDisable(GL_TEXTURE_GEN_R);
759
#ifdef GL_ARB_texture_cube_map
761
#endif//GL_ARB_texture_cube_map
765
468
void KX_BlenderMaterial::setTexMatrixData(int i)
767
470
glMatrixMode(GL_TEXTURE);
768
471
glLoadIdentity();
771
mMaterial->mapping[i].scale[0],
772
mMaterial->mapping[i].scale[1],
773
mMaterial->mapping[i].scale[2]
473
#ifdef GL_ARB_texture_cube_map
474
if( RAS_EXT_support._ARB_texture_cube_map &&
475
mTextures[i].GetTextureType() == GL_TEXTURE_CUBE_MAP_ARB &&
476
mMaterial->mapping[i].mapping & USEREFL) {
478
mMaterial->mapping[i].scale[0],
479
-mMaterial->mapping[i].scale[1],
480
-mMaterial->mapping[i].scale[2]
487
mMaterial->mapping[i].scale[0],
488
mMaterial->mapping[i].scale[1],
489
mMaterial->mapping[i].scale[2]
776
493
mMaterial->mapping[i].offsets[0],
777
494
mMaterial->mapping[i].offsets[1],