1 /*---------------------------------------------------------------------------*\
5 * Copyright (C) 2000-2002 by the OpenSG Forum *
9 * contact: dirk@opensg.org, gerrit.voss@vossg.org, jbehr@zgdv.de *
11 \*---------------------------------------------------------------------------*/
12 /*---------------------------------------------------------------------------*\
15 * This library is free software; you can redistribute it and/or modify it *
16 * under the terms of the GNU Library General Public License as published *
17 * by the Free Software Foundation, version 2. *
19 * This library is distributed in the hope that it will be useful, but *
20 * WITHOUT ANY WARRANTY; without even the implied warranty of *
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
22 * Library General Public License for more details. *
24 * You should have received a copy of the GNU Library General Public *
25 * License along with this library; if not, write to the Free Software *
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
28 \*---------------------------------------------------------------------------*/
29 /*---------------------------------------------------------------------------*\
37 \*---------------------------------------------------------------------------*/
39 //---------------------------------------------------------------------------
41 //---------------------------------------------------------------------------
46 #include <boost/bind.hpp>
48 #include "OSGConfig.h"
55 #include "OSGDrawEnv.h"
57 #include "OSGTextureEnvChunk.h"
58 #include "OSGTextureBaseChunk.h"
60 //#define OSG_DUMP_TEX
64 // Documentation for this class is emited in the
65 // OSGTextureEnvChunkBase.cpp file.
66 // To modify it, please change the .fcd file (OSGTextureEnvChunk.fcd) and
67 // regenerate the base file.
69 /***************************************************************************\
71 \***************************************************************************/
73 StateChunkClass
TextureEnvChunk::_class("TextureEnv", osgMaxTexImages
, 120);
75 UInt32
TextureEnvChunk::_extPointSprite
= Window::invalidExtensionID
;
76 UInt32
TextureEnvChunk::_extTextureShader
= Window::invalidExtensionID
;
77 UInt32
TextureEnvChunk::_extTextureShader2
= Window::invalidExtensionID
;
78 UInt32
TextureEnvChunk::_extTextureShader3
= Window::invalidExtensionID
;
79 UInt32
TextureEnvChunk::_extTextureLodBias
= Window::invalidExtensionID
;
81 /***************************************************************************\
83 \***************************************************************************/
85 /*-------------------------------------------------------------------------*\
87 \*-------------------------------------------------------------------------*/
89 void TextureEnvChunk::initMethod(InitPhase ePhase
)
91 Inherited::initMethod(ePhase
);
93 if(ePhase
== TypeObject::SystemPost
)
96 Window::registerExtension("GL_ARB_point_sprite" );
98 Window::registerExtension("GL_NV_texture_shader" );
100 Window::registerExtension("GL_NV_texture_shader2" );
102 Window::registerExtension("GL_NV_texture_shader3" );
104 Window::registerExtension("GL_EXT_texture_lod_bias");
106 Window::registerConstant(GL_MAX_TEXTURE_UNITS_ARB
);
107 Window::registerConstant(GL_MAX_TEXTURE_IMAGE_UNITS_ARB
);
108 Window::registerConstant(GL_MAX_TEXTURE_COORDS_ARB
);
112 /***************************************************************************\
114 \***************************************************************************/
116 /*-------------------------------------------------------------------------*\
118 \*-------------------------------------------------------------------------*/
121 /*------------- constructors & destructors --------------------------------*/
123 TextureEnvChunk::TextureEnvChunk(void) :
128 TextureEnvChunk::TextureEnvChunk(const TextureEnvChunk
&source
) :
133 TextureEnvChunk::~TextureEnvChunk(void)
137 /*------------------------- Chunk Class Access ---------------------------*/
139 const StateChunkClass
*TextureEnvChunk::getClass(void) const
144 /*------------------------------ State ------------------------------------*/
146 /*! Texture handler. Create/update a single texture.
147 Also used by derived CubeMap chunk.
150 void TextureEnvChunk::handleTextureShader(Window
*win
, GLenum bindtarget
)
152 #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY)
153 if(!win
->hasExtension(_extTextureShader
))
155 if(getShaderOperation() != GL_NONE
)
156 FINFO(("NV Texture Shaders not supported on Window %p!\n", win
));
160 glErr("textureShader precheck");
162 glTexEnvi(GL_TEXTURE_SHADER_NV
, GL_SHADER_OPERATION_NV
,
163 getShaderOperation());
165 glErr("textureShader setup: operation");
167 if(getShaderOperation() == GL_NONE
)
170 if(bindtarget
== GL_TEXTURE_3D
&& !win
->hasExtension(_extTextureShader2
))
172 FINFO(("NV Texture Shaders 2 not supported on Window %p!\n", win
));
176 if(getShaderInput() != GL_NONE
)
178 glTexEnvi(GL_TEXTURE_SHADER_NV
, GL_PREVIOUS_TEXTURE_INPUT_NV
,
182 glErr("textureShader setup: input");
184 if(getShaderRGBADotProduct() != GL_NONE
)
186 glTexEnvi(GL_TEXTURE_SHADER_NV
,
187 GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV
,
188 getShaderRGBADotProduct());
191 glErr("textureShader setup: rgba dotprod");
193 if(getMFShaderOffsetMatrix()->size() == 4)
195 glTexEnvfv(GL_TEXTURE_SHADER_NV
, GL_OFFSET_TEXTURE_MATRIX_NV
,
196 &((*getMFShaderOffsetMatrix())[0]));
198 glErr("textureShader setup: offset matrix");
200 else if(getMFShaderOffsetMatrix()->size() != 0)
202 FWARNING(("TextureEnvChunk::handleTextureShader: shaderOffsetMatrix "
203 "has to have 4 entries, not %" PRISize
"!\n",
204 getMFShaderOffsetMatrix()->size() ));
207 glTexEnvf(GL_TEXTURE_SHADER_NV
, GL_OFFSET_TEXTURE_SCALE_NV
,
208 getShaderOffsetScale());
210 glErr("textureShader setup: offset scale");
212 glTexEnvf(GL_TEXTURE_SHADER_NV
, GL_OFFSET_TEXTURE_BIAS_NV
,
213 getShaderOffsetBias());
215 glErr("textureShader setup: offset bias");
219 if(getShaderCullModes() & 0x1)
221 cullmodes
[0] = GL_GEQUAL
;
225 cullmodes
[0] = GL_LESS
;
228 if(getShaderCullModes() & 0x2)
230 cullmodes
[1] = GL_GEQUAL
;
234 cullmodes
[1] = GL_LESS
;
237 if(getShaderCullModes() & 0x4)
239 cullmodes
[2] = GL_GEQUAL
;
243 cullmodes
[2] = GL_LESS
;
246 if(getShaderCullModes() & 0x8)
248 cullmodes
[3] = GL_GEQUAL
;
252 cullmodes
[3] = GL_LESS
;
255 glTexEnviv(GL_TEXTURE_SHADER_NV
, GL_CULL_MODES_NV
,
258 glErr("textureShader setup: cull modes");
260 glTexEnvfv(GL_TEXTURE_SHADER_NV
, GL_CONST_EYE_NV
,
261 getShaderConstEye().getValues());
263 glErr("textureShader setup: const eye");
269 glGetTexEnviv(GL_TEXTURE_SHADER_NV
, GL_SHADER_CONSISTENT_NV
,
273 FWARNING(("Texture shaders not consistent!\n"));
279 /*------------------------------- Sync -----------------------------------*/
281 /*! React to field changes.
282 Note: this function also handles CubeTexture changes, make sure to keep
283 it consistent with the cubeTexture specifics
286 void TextureEnvChunk::changed(ConstFieldMaskArg whichField
,
290 Inherited::changed(whichField
, origin
, details
);
293 bool TextureEnvChunk::isTransparent(void) const
295 // Even if the texture has alpha, the Blending is makes the sorting
296 // important, thus textures per se are not transparent
301 /*----------------------------- onCreate --------------------------------*/
303 void TextureEnvChunk::onCreate(const TextureEnvChunk
*source
)
305 Inherited::onCreate(source
);
308 void TextureEnvChunk::onCreateAspect(const TextureEnvChunk
*createAspect
,
309 const TextureEnvChunk
*source
)
311 Inherited::onCreateAspect(createAspect
, source
);
314 /*------------------------------ Output ----------------------------------*/
316 void TextureEnvChunk::dump( UInt32 uiIndent
,
317 const BitVector bvFlags
) const
319 Inherited::dump(uiIndent
, bvFlags
);
321 if((bvFlags
& EnvModeFieldMask
) != 0)
323 indentLog(uiIndent
, PLOG
);
325 << GLDefineMapper::the()->toString(_sfEnvMode
.getValue())
329 if((bvFlags
& EnvColorFieldMask
) != 0)
331 indentLog(uiIndent
, PLOG
);
332 PLOG
<< "envColor " << _sfEnvColor
.getValue() << "\n";
335 if((bvFlags
& EnvCombineRGBFieldMask
) != 0)
337 indentLog(uiIndent
, PLOG
);
338 PLOG
<< "envCombineRGB "
339 << GLDefineMapper::the()->toString(_sfEnvCombineRGB
.getValue())
343 if((bvFlags
& EnvCombineAlphaFieldMask
) != 0)
345 indentLog(uiIndent
, PLOG
);
346 PLOG
<< "envCombineAlpha "
347 << GLDefineMapper::the()->toString(_sfEnvCombineAlpha
.getValue())
351 if((bvFlags
& EnvScaleRGBFieldMask
) != 0)
353 indentLog(uiIndent
, PLOG
);
354 PLOG
<< "envScaleRGB "
355 << _sfEnvScaleRGB
.getValue()
359 if((bvFlags
& EnvScaleAlphaFieldMask
) != 0)
361 indentLog(uiIndent
, PLOG
);
362 PLOG
<< "envScaleAlpha "
363 << _sfEnvScaleAlpha
.getValue()
367 if((bvFlags
& EnvSource0RGBFieldMask
) != 0)
369 indentLog(uiIndent
, PLOG
);
370 PLOG
<< "envSource0RGB "
371 << GLDefineMapper::the()->toString(_sfEnvSource0RGB
.getValue())
375 if((bvFlags
& EnvSource1RGBFieldMask
) != 0)
377 indentLog(uiIndent
, PLOG
);
378 PLOG
<< "envSource1RGB "
379 << GLDefineMapper::the()->toString(_sfEnvSource1RGB
.getValue())
383 if((bvFlags
& EnvSource2RGBFieldMask
) != 0)
385 indentLog(uiIndent
, PLOG
);
386 PLOG
<< "envSource2RGB "
387 << GLDefineMapper::the()->toString(_sfEnvSource2RGB
.getValue())
391 if((bvFlags
& EnvSource0AlphaFieldMask
) != 0)
393 indentLog(uiIndent
, PLOG
);
394 PLOG
<< "envSource0Alpha "
395 << GLDefineMapper::the()->toString(_sfEnvSource0Alpha
.getValue())
399 if((bvFlags
& EnvSource1AlphaFieldMask
) != 0)
401 indentLog(uiIndent
, PLOG
);
402 PLOG
<< "envSource1Alpha "
403 << GLDefineMapper::the()->toString(_sfEnvSource1Alpha
.getValue())
407 if((bvFlags
& EnvSource2AlphaFieldMask
) != 0)
409 indentLog(uiIndent
, PLOG
);
410 PLOG
<< "envSource2Alpha "
411 << GLDefineMapper::the()->toString(_sfEnvSource2Alpha
.getValue())
415 if((bvFlags
& EnvOperand0RGBFieldMask
) != 0)
417 indentLog(uiIndent
, PLOG
);
418 PLOG
<< "envOperand0RGB "
419 << GLDefineMapper::the()->toString(_sfEnvOperand0RGB
.getValue())
423 if((bvFlags
& EnvOperand1RGBFieldMask
) != 0)
425 indentLog(uiIndent
, PLOG
);
426 PLOG
<< "envOperand1RGB "
427 << GLDefineMapper::the()->toString(_sfEnvOperand1RGB
.getValue())
431 if((bvFlags
& EnvOperand2RGBFieldMask
) != 0)
433 indentLog(uiIndent
, PLOG
);
434 PLOG
<< "envOperand2RGB "
435 << GLDefineMapper::the()->toString(_sfEnvOperand2RGB
.getValue())
439 if((bvFlags
& EnvOperand0AlphaFieldMask
) != 0)
441 indentLog(uiIndent
, PLOG
);
442 PLOG
<< "envOperand0Alpha "
443 << GLDefineMapper::the()->toString(_sfEnvOperand0Alpha
.getValue())
447 if((bvFlags
& EnvOperand1AlphaFieldMask
) != 0)
449 indentLog(uiIndent
, PLOG
);
450 PLOG
<< "envOperand1Alpha "
451 << GLDefineMapper::the()->toString(_sfEnvOperand1Alpha
.getValue())
455 if((bvFlags
& EnvOperand2AlphaFieldMask
) != 0)
457 indentLog(uiIndent
, PLOG
);
458 PLOG
<< "envOperand2Alpha "
459 << GLDefineMapper::the()->toString(_sfEnvOperand2Alpha
.getValue())
463 if((bvFlags
& PointSpriteFieldMask
) != 0)
465 indentLog(uiIndent
, PLOG
);
466 PLOG
<< "pointSprite " << _sfPointSprite
.getValue() << "\n";
469 if((bvFlags
& ShaderOperationFieldMask
) != 0)
471 indentLog(uiIndent
, PLOG
);
472 PLOG
<< "shaderOperationAlpha "
473 << GLDefineMapper::the()->toString(_sfShaderOperation
.getValue())
477 if((bvFlags
& ShaderInputFieldMask
) != 0)
479 indentLog(uiIndent
, PLOG
);
480 PLOG
<< "shaderInputAlpha "
481 << GLDefineMapper::the()->toString(_sfShaderInput
.getValue())
485 if((bvFlags
& ShaderOffsetMatrixFieldMask
) != 0)
487 indentLog(uiIndent
, PLOG
);
488 PLOG
<< "shaderOffsetMatrix " << "NIY" << "\n";
491 if((bvFlags
& ShaderOffsetScaleFieldMask
) != 0)
493 indentLog(uiIndent
, PLOG
);
494 PLOG
<< "shaderOffsetScale " << _sfShaderOffsetScale
.getValue() << "\n";
497 if((bvFlags
& ShaderOffsetBiasFieldMask
) != 0)
499 indentLog(uiIndent
, PLOG
);
500 PLOG
<< "shaderOffsetBias " << _sfShaderOffsetBias
.getValue() << "\n";
503 if((bvFlags
& ShaderRGBADotProductFieldMask
) != 0)
505 indentLog(uiIndent
, PLOG
);
506 PLOG
<< "shaderRGBADotProduct "
507 << GLDefineMapper::the()->toString(_sfShaderRGBADotProduct
.getValue())
511 if((bvFlags
& ShaderCullModesFieldMask
) != 0)
513 indentLog(uiIndent
, PLOG
);
514 PLOG
<< "shaderCullModes " << _sfShaderCullModes
.getValue() << "\n";
517 if((bvFlags
& ShaderConstEyeFieldMask
) != 0)
519 indentLog(uiIndent
, PLOG
);
520 PLOG
<< "shaderConstEye " << _sfShaderConstEye
.getValue() << "\n";
523 if((bvFlags
& LodBiasFieldMask
) != 0)
525 indentLog(uiIndent
, PLOG
);
526 PLOG
<< "lodBias " << _sfLodBias
.getValue() << "\n";
531 /*------------------------------ State ------------------------------------*/
534 void TextureEnvChunk::activate(DrawEnv
*pEnv
, UInt32 idx
)
536 #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY)
537 pEnv
->incNumChunkChanges();
539 Window
*win
= pEnv
->getWindow();
541 Real32 nteximages
, ntexcoords
;
543 if((nteximages
= win
->getConstantValue(GL_MAX_TEXTURE_IMAGE_UNITS_ARB
)) ==
544 Window::unknownConstant
)
546 nteximages
= win
->getConstantValue(GL_MAX_TEXTURE_UNITS_ARB
);
548 // sgi doesn't support GL_MAX_TEXTURE_UNITS_ARB!
549 if(nteximages
== Window::unknownConstant
)
553 if((ntexcoords
= win
->getConstantValue(GL_MAX_TEXTURE_COORDS_ARB
)) ==
554 Window::unknownConstant
)
556 ntexcoords
= win
->getConstantValue(GL_MAX_TEXTURE_UNITS_ARB
);
558 // sgi doesn't support GL_MAX_TEXTURE_UNITS_ARB!
559 if(ntexcoords
== Window::unknownConstant
)
563 if(idx
>= static_cast<UInt32
>(nteximages
))
566 FWARNING(("TextureEnvChunk::activate: Trying to bind image unit %d,"
567 " but Window %p only supports %lf!\n",
568 idx
, win
, nteximages
));
573 if(TextureBaseChunk::activateTexture(win
, idx
) == true)
576 #ifdef GL_ARB_point_sprite
577 if(getPointSprite() && win
->hasExtOrVersion(_extPointSprite
, 0x0200))
579 if(idx
< static_cast<UInt32
>(ntexcoords
))
581 glTexEnvi(GL_POINT_SPRITE_ARB
, GL_COORD_REPLACE_ARB
, GL_TRUE
);
586 if(getLodBias() != 0.0f
&& win
->hasExtOrVersion(_extTextureLodBias
, 0x0104))
588 glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT
,
589 GL_TEXTURE_LOD_BIAS_EXT
,
593 Real32 ntexunits
= win
->getConstantValue(GL_MAX_TEXTURE_UNITS_ARB
);
595 // sgi doesn't support GL_MAX_TEXTURE_UNITS_ARB!
596 if(ntexunits
== Window::unknownConstant
)
599 if(idx
< static_cast<UInt32
>(ntexunits
))
602 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, getEnvMode());
604 glTexEnvfv(GL_TEXTURE_ENV
,
605 GL_TEXTURE_ENV_COLOR
,
606 getEnvColor().getValuesRGBA());
608 if(getEnvMode() == GL_COMBINE_EXT
)
610 glTexEnvi(GL_TEXTURE_ENV
,
612 getEnvCombineRGB ());
614 glTexEnvf(GL_TEXTURE_ENV
,
618 glTexEnvi(GL_TEXTURE_ENV
,
620 getEnvSource0RGB ());
622 glTexEnvi(GL_TEXTURE_ENV
,
624 getEnvSource1RGB ());
626 glTexEnvi(GL_TEXTURE_ENV
,
628 getEnvSource2RGB ());
630 glTexEnvi(GL_TEXTURE_ENV
,
632 getEnvOperand0RGB());
634 glTexEnvi(GL_TEXTURE_ENV
,
636 getEnvOperand1RGB());
638 glTexEnvi(GL_TEXTURE_ENV
,
640 getEnvOperand2RGB());
643 glTexEnvi(GL_TEXTURE_ENV
,
644 GL_COMBINE_ALPHA_EXT
,
645 getEnvCombineAlpha ());
647 glTexEnvf(GL_TEXTURE_ENV
,
649 getEnvScaleAlpha ());
651 glTexEnvi(GL_TEXTURE_ENV
,
652 GL_SOURCE0_ALPHA_EXT
,
653 getEnvSource0Alpha ());
655 glTexEnvi(GL_TEXTURE_ENV
,
656 GL_SOURCE1_ALPHA_EXT
,
657 getEnvSource1Alpha ());
659 glTexEnvi(GL_TEXTURE_ENV
,
660 GL_SOURCE2_ALPHA_EXT
,
661 getEnvSource2Alpha ());
663 glTexEnvi(GL_TEXTURE_ENV
,
664 GL_OPERAND0_ALPHA_EXT
,
665 getEnvOperand0Alpha());
667 glTexEnvi(GL_TEXTURE_ENV
,
668 GL_OPERAND1_ALPHA_EXT
,
669 getEnvOperand1Alpha());
671 glTexEnvi(GL_TEXTURE_ENV
,
672 GL_OPERAND2_ALPHA_EXT
,
673 getEnvOperand2Alpha());
676 TextureEnvChunk::handleTextureShader(
678 pEnv
->getActiveTexTarget(idx
));
681 getShaderOperation() != GL_NONE
&&
682 win
->hasExtension(_extTextureShader
) == true )
684 glEnable(GL_TEXTURE_SHADER_NV
);
691 glErr("TextureEnvChunk::activate");
694 void TextureEnvChunk::changeFrom(DrawEnv
*pEnv
,
698 #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY)
699 // change from me to me?
700 // this assumes I haven't changed in the meantime.
701 // is that a valid assumption?
705 pEnv
->incNumChunkChanges();
707 TextureEnvChunk
*oldp
= dynamic_cast<TextureEnvChunk
*>(old
);
709 glErr("TextureEnvChunk::changeFrom precheck");
711 Window
*win
= pEnv
->getWindow();
713 Real32 nteximages
, ntexcoords
;
715 if((nteximages
= win
->getConstantValue(GL_MAX_TEXTURE_IMAGE_UNITS_ARB
)) ==
716 Window::unknownConstant
)
718 nteximages
= win
->getConstantValue(GL_MAX_TEXTURE_UNITS_ARB
);
720 // sgi doesn't support GL_MAX_TEXTURE_UNITS_ARB!
721 if(nteximages
== Window::unknownConstant
)
725 if((ntexcoords
= win
->getConstantValue(GL_MAX_TEXTURE_COORDS_ARB
)) ==
726 Window::unknownConstant
)
728 ntexcoords
= win
->getConstantValue(GL_MAX_TEXTURE_UNITS_ARB
);
730 // sgi doesn't support GL_MAX_TEXTURE_UNITS_ARB!
731 if(ntexcoords
== Window::unknownConstant
)
735 if(idx
>= nteximages
)
738 FWARNING(("TextureEnvChunk::changeFrom: Trying to bind image unit %d,"
739 " but Window %p only supports %lf!\n",
740 idx
, win
, nteximages
));
745 if(TextureBaseChunk::activateTexture(win
, idx
))
746 return; // trying to use too many textures
748 #ifdef GL_ARB_point_sprite
751 if(oldp
->getPointSprite() != getPointSprite() &&
752 win
->hasExtOrVersion(_extPointSprite
, 0x0200))
754 glTexEnvi(GL_POINT_SPRITE_ARB
,
755 GL_COORD_REPLACE_ARB
,
761 if(oldp
->getLodBias() != getLodBias() &&
762 win
->hasExtOrVersion(_extTextureLodBias
, 0x0104))
764 glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT
,
765 GL_TEXTURE_LOD_BIAS_EXT
,
769 Real32 ntexunits
= win
->getConstantValue(GL_MAX_TEXTURE_UNITS_ARB
);
771 // sgi doesn't support GL_MAX_TEXTURE_UNITS_ARB!
772 if(ntexunits
== Window::unknownConstant
)
777 if(oldp
->getEnvMode() != getEnvMode())
779 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, getEnvMode());
782 glTexEnvfv(GL_TEXTURE_ENV
,
783 GL_TEXTURE_ENV_COLOR
,
784 getEnvColor().getValuesRGBA());
786 if(getEnvMode() == GL_COMBINE_EXT
)
788 glTexEnvi(GL_TEXTURE_ENV
,
790 getEnvCombineRGB ());
792 glTexEnvf(GL_TEXTURE_ENV
,
796 glTexEnvi(GL_TEXTURE_ENV
,
798 getEnvSource0RGB ());
800 glTexEnvi(GL_TEXTURE_ENV
,
802 getEnvSource1RGB ());
804 glTexEnvi(GL_TEXTURE_ENV
,
806 getEnvSource2RGB ());
808 glTexEnvi(GL_TEXTURE_ENV
,
810 getEnvOperand0RGB());
812 glTexEnvi(GL_TEXTURE_ENV
,
814 getEnvOperand1RGB());
816 glTexEnvi(GL_TEXTURE_ENV
,
818 getEnvOperand2RGB());
822 glTexEnvi(GL_TEXTURE_ENV
,
823 GL_COMBINE_ALPHA_EXT
,
824 getEnvCombineAlpha ());
826 glTexEnvf(GL_TEXTURE_ENV
,
828 getEnvScaleAlpha ());
830 glTexEnvi(GL_TEXTURE_ENV
,
831 GL_SOURCE0_ALPHA_EXT
,
832 getEnvSource0Alpha ());
834 glTexEnvi(GL_TEXTURE_ENV
,
835 GL_SOURCE1_ALPHA_EXT
,
836 getEnvSource1Alpha ());
838 glTexEnvi(GL_TEXTURE_ENV
,
839 GL_SOURCE2_ALPHA_EXT
,
840 getEnvSource2Alpha ());
842 glTexEnvi(GL_TEXTURE_ENV
,
843 GL_OPERAND0_ALPHA_EXT
,
844 getEnvOperand0Alpha());
846 glTexEnvi(GL_TEXTURE_ENV
,
847 GL_OPERAND1_ALPHA_EXT
,
848 getEnvOperand1Alpha());
850 glTexEnvi(GL_TEXTURE_ENV
,
851 GL_OPERAND2_ALPHA_EXT
,
852 getEnvOperand2Alpha());
855 if(win
->hasExtension(_extTextureShader
))
857 if( getShaderOperation() != GL_NONE
&&
858 oldp
->getShaderOperation() == GL_NONE
)
860 handleTextureShader(win
,
861 pEnv
->getActiveTexTarget(idx
));
864 glEnable(GL_TEXTURE_SHADER_NV
);
866 else if( getShaderOperation() == GL_NONE
&&
867 oldp
->getShaderOperation() != GL_NONE
)
869 glTexEnvi(GL_TEXTURE_SHADER_NV
,
870 GL_SHADER_OPERATION_NV
,
875 glDisable(GL_TEXTURE_SHADER_NV
);
884 glErr("TextureEnvChunk::changeFrom");
888 void TextureEnvChunk::deactivate(DrawEnv
*pEnv
, UInt32 idx
)
890 #if !defined(OSG_OGL_COREONLY) || defined(OSG_CHECK_COREONLY)
891 Window
*win
= pEnv
->getWindow();
893 Real32 nteximages
, ntexcoords
;
895 if((nteximages
= win
->getConstantValue(GL_MAX_TEXTURE_IMAGE_UNITS_ARB
)) ==
896 Window::unknownConstant
)
898 nteximages
= win
->getConstantValue(GL_MAX_TEXTURE_UNITS_ARB
);
900 // sgi doesn't support GL_MAX_TEXTURE_UNITS_ARB!
901 if(nteximages
== Window::unknownConstant
)
905 if((ntexcoords
= win
->getConstantValue(GL_MAX_TEXTURE_COORDS_ARB
)) ==
906 Window::unknownConstant
)
908 ntexcoords
= win
->getConstantValue(GL_MAX_TEXTURE_UNITS_ARB
);
910 // sgi doesn't support GL_MAX_TEXTURE_UNITS_ARB!
911 if(ntexcoords
== Window::unknownConstant
)
915 if(idx
>= static_cast<UInt32
>(nteximages
))
918 FWARNING(("CubeTextureEnvChunk::deactivate: Trying to bind image unit "
919 "%d, but Window %p only supports %lf!\n",
920 idx
, win
, nteximages
));
925 bool isActive
= false;
927 #ifdef GL_ARB_point_sprite
928 if(getPointSprite() &&
929 win
->hasExtOrVersion(_extPointSprite
, 0x0200) &&
930 idx
< static_cast<UInt32
>(ntexcoords
) )
934 TextureBaseChunk::activateTexture(win
, idx
);
938 glTexEnvi(GL_POINT_SPRITE_ARB
, GL_COORD_REPLACE_ARB
, GL_FALSE
);
942 if(getLodBias() != 0.0f
&& win
->hasExtOrVersion(_extTextureLodBias
, 0x0104))
946 TextureBaseChunk::activateTexture(win
, idx
);
950 glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT
,
951 GL_TEXTURE_LOD_BIAS_EXT
,
956 Real32 ntexunits
= win
->getConstantValue(GL_MAX_TEXTURE_UNITS_ARB
);
958 if(ntexunits
== Window::unknownConstant
)
961 if(idx
>= static_cast<UInt32
>(ntexunits
))
963 return; // tetxures >= MTU are not enabled and don't have an env
967 TextureBaseChunk::activateTexture(win
, idx
);
970 glTexEnvi(GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_REPLACE
);
972 glTexEnvfv(GL_TEXTURE_ENV
,
973 GL_TEXTURE_ENV_COLOR
,
974 Vec4f::Null
.getValues());
976 if(getShaderOperation() != GL_NONE
&&
977 win
->hasExtension(_extTextureShader
))
979 glTexEnvi(GL_TEXTURE_SHADER_NV
, GL_SHADER_OPERATION_NV
, GL_NONE
);
982 glDisable(GL_TEXTURE_SHADER_NV
);
988 glErr("TextureEnvChunk::deactivate");
991 /*-------------------------- Comparison -----------------------------------*/
993 Real32
TextureEnvChunk::switchCost(StateChunk
*OSG_CHECK_ARG(chunk
))
998 bool TextureEnvChunk::operator < (const StateChunk
&other
) const
1000 return this < &other
;
1003 bool TextureEnvChunk::operator == (const StateChunk
&other
) const
1005 TextureEnvChunk
const *tother
=
1006 dynamic_cast<TextureEnvChunk
const*>(&other
);
1015 getEnvMode () == tother
->getEnvMode ();
1017 if(returnValue
== true && getEnvMode() == GL_COMBINE_EXT
)
1020 getEnvCombineRGB () == tother
->getEnvCombineRGB () &&
1022 getEnvSource0RGB () == tother
->getEnvSource0RGB () &&
1023 getEnvSource1RGB () == tother
->getEnvSource1RGB () &&
1024 getEnvSource2RGB () == tother
->getEnvSource2RGB () &&
1026 getEnvOperand0RGB() == tother
->getEnvOperand0RGB () &&
1027 getEnvOperand1RGB() == tother
->getEnvOperand1RGB () &&
1028 getEnvOperand2RGB() == tother
->getEnvOperand2RGB () &&
1030 getEnvCombineAlpha () == tother
->getEnvCombineAlpha () &&
1032 getEnvSource0Alpha () == tother
->getEnvSource0Alpha () &&
1033 getEnvSource1Alpha () == tother
->getEnvSource1Alpha () &&
1034 getEnvSource2Alpha () == tother
->getEnvSource2Alpha () &&
1036 getEnvOperand0Alpha() == tother
->getEnvOperand0Alpha() &&
1037 getEnvOperand1Alpha() == tother
->getEnvOperand1Alpha() &&
1038 getEnvOperand2Alpha() == tother
->getEnvOperand2Alpha();
1042 (( getEnvScaleRGB () - tother
->getEnvScaleRGB ()) <
1043 TypeTraits
<Real32
>::getDefaultEps() ) &&
1044 ((tother
->getEnvScaleRGB () - getEnvScaleRGB ()) <
1045 TypeTraits
<Real32
>::getDefaultEps() ) &&
1046 (( getEnvScaleAlpha() - tother
->getEnvScaleAlpha()) <
1047 TypeTraits
<Real32
>::getDefaultEps() ) &&
1048 ((tother
->getEnvScaleAlpha() - getEnvScaleAlpha()) <
1049 TypeTraits
<Real32
>::getDefaultEps() );
1055 bool TextureEnvChunk::operator != (const StateChunk
&other
) const
1057 return ! (*this == other
);