Merge pull request #443 from mp3butcher/osgSampler1

Add MinLOD MaxLOD and LODBias to Texture
This commit is contained in:
OpenSceneGraph git repository
2018-01-14 12:40:34 +00:00
committed by GitHub
4 changed files with 72 additions and 2 deletions

View File

@@ -4,7 +4,7 @@
SET(OPENSCENEGRAPH_MAJOR_VERSION 3)
SET(OPENSCENEGRAPH_MINOR_VERSION 5)
SET(OPENSCENEGRAPH_PATCH_VERSION 10)
SET(OPENSCENEGRAPH_SOVERSION 154)
SET(OPENSCENEGRAPH_SOVERSION 155)
# set to 0 when not a release candidate, non zero means that any generated

View File

@@ -521,6 +521,24 @@ class OSG_EXPORT Texture : public osg::StateAttribute
/** Gets the maximum anisotropy value. */
inline float getMaxAnisotropy() const { return _maxAnisotropy; }
/** Sets the minimum level of detail value. */
void setMinLOD(float minlod);
/** Gets the minimum level of detail value. */
inline float getMinLOD() const { return _minlod; }
/** Sets the maximum level of detail value. */
void setMaxLOD(float maxlod);
/** Gets the maximum level of detail value. */
inline float getMaxLOD() const { return _maxlod; }
/** Gets the level of detail bias value. */
void setLODBias(float lodbias);
/** Sets the level of detail bias value. */
inline float getLODBias() const { return _lodbias; }
/** Configure the source of texture swizzling for all channels */
inline void setSwizzle(const Vec4i& swizzle) { _swizzle = swizzle; dirtyTextureParameters(); };
@@ -839,6 +857,9 @@ class OSG_EXPORT Texture : public osg::StateAttribute
FilterMode _min_filter;
FilterMode _mag_filter;
float _maxAnisotropy;
float _minlod;
float _maxlod;
float _lodbias;
Vec4i _swizzle;
bool _useHardwareMipMapGeneration;
bool _unrefImageDataAfterApply;

View File

@@ -1228,6 +1228,9 @@ Texture::Texture():
_min_filter(LINEAR_MIPMAP_LINEAR), // trilinear
_mag_filter(LINEAR),
_maxAnisotropy(1.0f),
_minlod(0.0f),
_maxlod(-1.0f),
_lodbias(0.0f),
_swizzle(GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA),
_useHardwareMipMapGeneration(true),
_unrefImageDataAfterApply(false),
@@ -1255,6 +1258,9 @@ Texture::Texture(const Texture& text,const CopyOp& copyop):
_min_filter(text._min_filter),
_mag_filter(text._mag_filter),
_maxAnisotropy(text._maxAnisotropy),
_minlod(text._minlod),
_maxlod(text._maxlod),
_lodbias(text._lodbias),
_swizzle(text._swizzle),
_useHardwareMipMapGeneration(text._useHardwareMipMapGeneration),
_unrefImageDataAfterApply(text._unrefImageDataAfterApply),
@@ -1288,6 +1294,9 @@ int Texture::compareTexture(const Texture& rhs) const
COMPARE_StateAttribute_Parameter(_min_filter)
COMPARE_StateAttribute_Parameter(_mag_filter)
COMPARE_StateAttribute_Parameter(_maxAnisotropy)
COMPARE_StateAttribute_Parameter(_minlod)
COMPARE_StateAttribute_Parameter(_maxlod)
COMPARE_StateAttribute_Parameter(_lodbias)
COMPARE_StateAttribute_Parameter(_swizzle)
COMPARE_StateAttribute_Parameter(_useHardwareMipMapGeneration)
COMPARE_StateAttribute_Parameter(_internalFormatMode)
@@ -1336,7 +1345,6 @@ void Texture::setWrap(WrapParameter which, WrapMode wrap)
case WRAP_R : _wrap_r = wrap; dirtyTextureParameters(); break;
default : OSG_WARN<<"Error: invalid 'which' passed Texture::setWrap("<<(unsigned int)which<<","<<(unsigned int)wrap<<")"<<std::endl; break;
}
}
@@ -1382,6 +1390,32 @@ void Texture::setMaxAnisotropy(float anis)
}
}
void Texture::setMinLOD(float anis)
{
if (_minlod!=anis)
{
_minlod = anis;
dirtyTextureParameters();
}
}
void Texture::setMaxLOD(float anis)
{
if (_maxlod!=anis)
{
_maxlod = anis;
dirtyTextureParameters();
}
}
void Texture::setLODBias(float anis)
{
if (_lodbias!=anis)
{
_lodbias = anis;
dirtyTextureParameters();
}
}
/** Force a recompile on next apply() of associated OpenGL texture objects.*/
void Texture::dirtyTextureObject()
@@ -1984,6 +2018,14 @@ void Texture::applyTexParameters(GLenum target, State& state) const
glTexParameteri(target, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
}
}
// if range is valid
if( _maxlod - _minlod >= 0)
{
glTexParameterf(target, GL_TEXTURE_MIN_LOD, _minlod);
glTexParameterf(target, GL_TEXTURE_MAX_LOD, _maxlod);
}
glTexParameterf(target, GL_TEXTURE_LOD_BIAS, _lodbias);
getTextureParameterDirty(state.getContextID()) = false;

View File

@@ -249,6 +249,7 @@ REGISTER_OBJECT_WRAPPER( Texture,
ADD_ENUM_VALUE( LUMINANCE );
ADD_ENUM_VALUE( INTENSITY );
ADD_ENUM_VALUE( ALPHA );
ADD_ENUM_VALUE( NONE );
END_ENUM_SERIALIZER(); // _shadow_texture_mode
ADD_FLOAT_SERIALIZER( ShadowAmbient, 0.0f ); // _shadow_ambient
@@ -265,4 +266,10 @@ REGISTER_OBJECT_WRAPPER( Texture,
UPDATE_TO_VERSION_SCOPED( 98 )
ADD_USER_SERIALIZER( Swizzle ); // _swizzle
}
{
UPDATE_TO_VERSION_SCOPED( 155 )
ADD_FLOAT_SERIALIZER( MinLOD, 0.0f );
ADD_FLOAT_SERIALIZER( MaxLOD, -1.0f );
ADD_FLOAT_SERIALIZER( LODBias, 0.0f );
}
}