Fixes to BlendFunc - adding missing ZERO handling.
Improved handling of alpha values in DXT1 compression.
This commit is contained in:
parent
bc8bd29646
commit
1cf0be9963
@ -247,6 +247,7 @@ void State::apply(const StateSet* dstate)
|
|||||||
apply();
|
apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_reportGLErrors) checkGLErrors("end of State::apply(StateSet*)");
|
||||||
}
|
}
|
||||||
|
|
||||||
void State::apply()
|
void State::apply()
|
||||||
@ -271,6 +272,8 @@ void State::apply()
|
|||||||
if (unit<_textureAttributeMapList.size()) applyAttributeMap(_textureAttributeMapList[unit]);
|
if (unit<_textureAttributeMapList.size()) applyAttributeMap(_textureAttributeMapList[unit]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_reportGLErrors) checkGLErrors("end of State::apply()");
|
||||||
}
|
}
|
||||||
|
|
||||||
void State::haveAppliedMode(StateAttribute::GLMode mode,StateAttribute::GLModeValue value)
|
void State::haveAppliedMode(StateAttribute::GLMode mode,StateAttribute::GLModeValue value)
|
||||||
|
@ -111,7 +111,7 @@ typedef struct _DDSURFACEDESC2
|
|||||||
} DDSURFACEDESC2;
|
} DDSURFACEDESC2;
|
||||||
|
|
||||||
#define DDPF_ALPHAPIXELS 0x00000001l
|
#define DDPF_ALPHAPIXELS 0x00000001l
|
||||||
#define DDPF_FOURCC 0x00000004l
|
#define DDPF_FOURCC 0x00000004l
|
||||||
#define DDPF_RGB 0x00000040l
|
#define DDPF_RGB 0x00000040l
|
||||||
|
|
||||||
#ifndef MAKEFOURCC
|
#ifndef MAKEFOURCC
|
||||||
@ -133,6 +133,8 @@ osg::Image* ReadDDSFile(const char *filename)
|
|||||||
{
|
{
|
||||||
osg::Image* osgImage = new osg::Image();
|
osg::Image* osgImage = new osg::Image();
|
||||||
|
|
||||||
|
osgImage->setFileName(filename);
|
||||||
|
|
||||||
DDSURFACEDESC2 ddsd;
|
DDSURFACEDESC2 ddsd;
|
||||||
|
|
||||||
char filecode[4];
|
char filecode[4];
|
||||||
@ -192,11 +194,20 @@ osg::Image* ReadDDSFile(const char *filename)
|
|||||||
// Compressed formats.
|
// Compressed formats.
|
||||||
else if(ddsd.ddpfPixelFormat.dwFlags & DDPF_FOURCC)
|
else if(ddsd.ddpfPixelFormat.dwFlags & DDPF_FOURCC)
|
||||||
{
|
{
|
||||||
|
bool usingAlpha = ddsd.ddpfPixelFormat.dwFlags & DDPF_ALPHAPIXELS;
|
||||||
switch(ddsd.ddpfPixelFormat.dwFourCC)
|
switch(ddsd.ddpfPixelFormat.dwFourCC)
|
||||||
{
|
{
|
||||||
case FOURCC_DXT1:
|
case FOURCC_DXT1:
|
||||||
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
|
if (usingAlpha)
|
||||||
pixelFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
|
{
|
||||||
|
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
|
||||||
|
pixelFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
|
||||||
|
pixelFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case FOURCC_DXT3:
|
case FOURCC_DXT3:
|
||||||
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
|
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
|
||||||
@ -230,8 +241,26 @@ osg::Image* ReadDDSFile(const char *filename)
|
|||||||
{
|
{
|
||||||
// Now set mipmap data (offsets into image raw data).
|
// Now set mipmap data (offsets into image raw data).
|
||||||
osg::Image::MipmapDataType mipmaps;
|
osg::Image::MipmapDataType mipmaps;
|
||||||
// Number of offsets in osg is one less than num_mipmaps
|
|
||||||
// because it's assumed that first offset is 0.
|
//This is to complete mipmap sequence until level Nx1
|
||||||
|
|
||||||
|
//debugging messages
|
||||||
|
float power2_s = logf((float)s)/logf((float)2);
|
||||||
|
float power2_t = logf((float)t)/logf((float)2);
|
||||||
|
|
||||||
|
osg::notify(osg::INFO) << "ReadDDSFile info : ddsd.dwMipMapCount = "<<ddsd.dwMipMapCount<<std::endl;
|
||||||
|
osg::notify(osg::INFO) << "ReadDDSFile info : s = "<<s<<std::endl;
|
||||||
|
osg::notify(osg::INFO) << "ReadDDSFile info : t = "<<t<<std::endl;
|
||||||
|
osg::notify(osg::INFO) << "ReadDDSFile info : power2_s="<<power2_s<<std::endl;
|
||||||
|
osg::notify(osg::INFO) << "ReadDDSFile info : power2_t="<<power2_t<<std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
//Alberto's fix, which I can't quite figure out why its needed..
|
||||||
|
// int prop = (int)(s>=t ? (s/t) : (t/s));
|
||||||
|
// prop = (int)(log(prop)/log(2));
|
||||||
|
// mipmaps.resize(ddsd.dwMipMapCount+prop);
|
||||||
|
|
||||||
|
|
||||||
mipmaps.resize(ddsd.dwMipMapCount-1);
|
mipmaps.resize(ddsd.dwMipMapCount-1);
|
||||||
|
|
||||||
// Handle compressed mipmaps.
|
// Handle compressed mipmaps.
|
||||||
|
@ -82,6 +82,7 @@ bool BlendFunc_matchModeStr(const char* str,int& mode)
|
|||||||
else if (strcmp(str,"SRC_ALPHA")==0) mode = BlendFunc::SRC_ALPHA;
|
else if (strcmp(str,"SRC_ALPHA")==0) mode = BlendFunc::SRC_ALPHA;
|
||||||
else if (strcmp(str,"SRC_ALPHA_SATURATE")==0) mode = BlendFunc::SRC_ALPHA_SATURATE;
|
else if (strcmp(str,"SRC_ALPHA_SATURATE")==0) mode = BlendFunc::SRC_ALPHA_SATURATE;
|
||||||
else if (strcmp(str,"SRC_COLOR")==0) mode = BlendFunc::SRC_COLOR;
|
else if (strcmp(str,"SRC_COLOR")==0) mode = BlendFunc::SRC_COLOR;
|
||||||
|
else if (strcmp(str,"ZERO")==0) mode = BlendFunc::ZERO;
|
||||||
else return false;
|
else return false;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user