Merge branch 'master' of git://github.com/lkalif/SingularityViewer
This commit is contained in:
@@ -52,6 +52,14 @@ if (DARWIN)
|
||||
)
|
||||
endif (DARWIN)
|
||||
|
||||
if (LINUX)
|
||||
configure_file(
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh.in
|
||||
${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh
|
||||
@ONLY
|
||||
)
|
||||
endif (LINUX)
|
||||
|
||||
# Compose the version.
|
||||
set(viewer_VERSION "${vMAJOR}.${vMINOR}.${vPATCH}.${vBUILD}")
|
||||
if (viewer_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$")
|
||||
|
||||
@@ -304,6 +304,7 @@ PFNGLUNIFORM3IVARBPROC glUniform3ivARB = NULL;
|
||||
PFNGLUNIFORM4IVARBPROC glUniform4ivARB = NULL;
|
||||
PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB = NULL;
|
||||
PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB = NULL;
|
||||
PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv = NULL;
|
||||
PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB = NULL;
|
||||
PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB = NULL;
|
||||
PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL;
|
||||
@@ -469,7 +470,8 @@ LLGLManager::LLGLManager() :
|
||||
mGLSLVersionMinor(0),
|
||||
mVRAM(0),
|
||||
mGLMaxVertexRange(0),
|
||||
mGLMaxIndexRange(0)
|
||||
mGLMaxIndexRange(0),
|
||||
mGLMaxVertexUniformComponents(0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -715,6 +717,12 @@ bool LLGLManager::initGL()
|
||||
mNumTextureImageUnits = llmin(num_tex_image_units, 32);
|
||||
}
|
||||
|
||||
if (mHasVertexShader)
|
||||
{
|
||||
//According to the spec, the resulting value should never be less than 512. We need at least 1024 to use skinned shaders.
|
||||
glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &mGLMaxVertexUniformComponents);
|
||||
}
|
||||
|
||||
if (LLRender::sGLCoreProfile)
|
||||
{
|
||||
mNumTextureUnits = llmin(mNumTextureImageUnits, MAX_GL_TEXTURE_UNITS);
|
||||
@@ -964,6 +972,10 @@ void LLGLManager::initExtensions()
|
||||
mHasAdaptiveVsync = ExtensionExists("GLX_EXT_swap_control_tear", gGLHExts.mSysExts);
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_texture_swizzle
|
||||
mHasTextureSwizzle = ExtensionExists("GL_ARB_texture_swizzle", gGLHExts.mSysExts);
|
||||
#endif
|
||||
|
||||
#if LL_LINUX || LL_SOLARIS
|
||||
llinfos << "initExtensions() checking shell variables to adjust features..." << llendl;
|
||||
// Our extension support for the Linux Client is very young with some
|
||||
@@ -989,6 +1001,7 @@ void LLGLManager::initExtensions()
|
||||
mHasVertexShader = FALSE;
|
||||
mHasFragmentShader = FALSE;
|
||||
mHasAdaptiveVsync = FALSE;
|
||||
mHasTextureSwizzle = FALSE;
|
||||
LL_WARNS("RenderInit") << "GL extension support DISABLED via LL_GL_NOEXT" << LL_ENDL;
|
||||
}
|
||||
else if (getenv("LL_GL_BASICEXT")) /* Flawfinder: ignore */
|
||||
@@ -1269,6 +1282,7 @@ void LLGLManager::initExtensions()
|
||||
glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform4ivARB");
|
||||
glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix2fvARB");
|
||||
glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3fvARB");
|
||||
glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3x4fv");
|
||||
glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix4fvARB");
|
||||
glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterfvARB");
|
||||
glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterivARB");
|
||||
|
||||
@@ -114,6 +114,7 @@ public:
|
||||
BOOL mHasDebugOutput;
|
||||
|
||||
BOOL mHasAdaptiveVsync;
|
||||
BOOL mHasTextureSwizzle;
|
||||
|
||||
// Vendor-specific extensions
|
||||
BOOL mIsATI;
|
||||
@@ -151,6 +152,8 @@ public:
|
||||
S32 mVRAM; // VRAM in MB
|
||||
S32 mGLMaxVertexRange;
|
||||
S32 mGLMaxIndexRange;
|
||||
|
||||
S32 mGLMaxVertexUniformComponents;
|
||||
|
||||
void getPixelFormat(); // Get the best pixel format
|
||||
|
||||
|
||||
@@ -152,6 +152,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB;
|
||||
extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB;
|
||||
extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB;
|
||||
extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
|
||||
extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv;
|
||||
extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
|
||||
extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB;
|
||||
extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
|
||||
@@ -415,6 +416,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB;
|
||||
extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB;
|
||||
extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB;
|
||||
extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
|
||||
extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv;
|
||||
extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
|
||||
extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB;
|
||||
extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
|
||||
@@ -656,6 +658,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB;
|
||||
extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB;
|
||||
extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB;
|
||||
extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
|
||||
extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv;
|
||||
extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
|
||||
extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB;
|
||||
extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
|
||||
|
||||
@@ -933,6 +933,23 @@ void LLGLSLShader::uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, c
|
||||
}
|
||||
}
|
||||
|
||||
void LLGLSLShader::uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v)
|
||||
{
|
||||
if (mProgramObject > 0)
|
||||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
UNIFORM_ERRS << "Uniform index out of bounds." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (mUniform[index] >= 0)
|
||||
{
|
||||
glUniformMatrix3x4fv(mUniform[index], count, transpose, v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v)
|
||||
{
|
||||
if (mProgramObject > 0)
|
||||
|
||||
@@ -100,6 +100,7 @@ public:
|
||||
void uniform2i(const LLStaticHashedString& uniform, GLint i, GLint j);
|
||||
void uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
|
||||
void uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
|
||||
void uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
|
||||
void uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
|
||||
void uniform1i(const LLStaticHashedString& uniform, GLint i);
|
||||
void uniform1f(const LLStaticHashedString& uniform, GLfloat v);
|
||||
|
||||
@@ -235,6 +235,8 @@ S32 LLImageGL::dataFormatBits(S32 dataformat)
|
||||
case GL_ALPHA: return 8;
|
||||
case GL_COLOR_INDEX: return 8;
|
||||
case GL_LUMINANCE_ALPHA: return 16;
|
||||
case GL_RED: return 8;
|
||||
case GL_RG: return 16;
|
||||
case GL_RGB: return 24;
|
||||
case GL_RGB8: return 24;
|
||||
case GL_RGBA: return 32;
|
||||
@@ -271,6 +273,8 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat)
|
||||
case GL_ALPHA: return 1;
|
||||
case GL_COLOR_INDEX: return 1;
|
||||
case GL_LUMINANCE_ALPHA: return 2;
|
||||
case GL_RED: return 1;
|
||||
case GL_RG: return 2;
|
||||
case GL_RGB: return 3;
|
||||
case GL_RGBA: return 4;
|
||||
case GL_BGRA: return 4; // Used for QuickTime media textures on the Mac
|
||||
@@ -811,6 +815,12 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
|
||||
glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
if (LLRender::sGLCoreProfile)
|
||||
{
|
||||
glGenerateMipmap(mTarget);
|
||||
}
|
||||
stop_glerror();
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1078,91 +1088,108 @@ static LLFastTimer::DeclareTimer FTM_SET_MANUAL_IMAGE("setManualImage");
|
||||
void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels, bool allow_compression)
|
||||
{
|
||||
LLFastTimer t(FTM_SET_MANUAL_IMAGE);
|
||||
bool use_scratch = false;
|
||||
U32* scratch = NULL;
|
||||
std::vector<U32> scratch;
|
||||
if (LLRender::sGLCoreProfile)
|
||||
{
|
||||
if (pixformat == GL_ALPHA && pixtype == GL_UNSIGNED_BYTE)
|
||||
{ //GL_ALPHA is deprecated, convert to RGBA
|
||||
use_scratch = true;
|
||||
scratch = new U32[width*height];
|
||||
#ifdef GL_ARB_texture_swizzle
|
||||
if(gGLManager.mHasTextureSwizzle)
|
||||
{
|
||||
if (pixformat == GL_ALPHA)
|
||||
{ //GL_ALPHA is deprecated, convert to RGBA
|
||||
const GLint mask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask);
|
||||
pixformat = GL_RED;
|
||||
intformat = GL_R8;
|
||||
}
|
||||
|
||||
U32 pixel_count = (U32) (width*height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
{
|
||||
U8* pix = (U8*) &scratch[i];
|
||||
pix[0] = pix[1] = pix[2] = 0;
|
||||
pix[3] = ((U8*) pixels)[i];
|
||||
}
|
||||
|
||||
pixformat = GL_RGBA;
|
||||
intformat = GL_RGBA8;
|
||||
if (pixformat == GL_LUMINANCE)
|
||||
{ //GL_LUMINANCE is deprecated, convert to GL_RGBA
|
||||
const GLint mask[] = {GL_RED, GL_RED, GL_RED, GL_ONE};
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask);
|
||||
pixformat = GL_RED;
|
||||
intformat = GL_R8;
|
||||
}
|
||||
|
||||
if (pixformat == GL_LUMINANCE_ALPHA)
|
||||
{ //GL_LUMINANCE_ALPHA is deprecated, convert to RGBA
|
||||
const GLint mask[] = {GL_RED, GL_RED, GL_RED, GL_GREEN};
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask);
|
||||
pixformat = GL_RG;
|
||||
intformat = GL_RG8;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (pixformat == GL_ALPHA && pixtype == GL_UNSIGNED_BYTE)
|
||||
{ //GL_ALPHA is deprecated, convert to RGBA
|
||||
scratch.resize(width*height);
|
||||
pixels = &scratch[0];
|
||||
|
||||
if (pixformat == GL_LUMINANCE && pixtype == GL_UNSIGNED_BYTE)
|
||||
{ //GL_LUMINANCE is deprecated, convert to GL_RGBA
|
||||
use_scratch = true;
|
||||
scratch = new U32[width*height];
|
||||
U32 pixel_count = (U32) (width*height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
{
|
||||
U8* pix = (U8*) &scratch[i];
|
||||
pix[0] = pix[1] = pix[2] = 0;
|
||||
pix[3] = ((U8*) pixels)[i];
|
||||
}
|
||||
|
||||
U32 pixel_count = (U32) (width*height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
{
|
||||
U8 lum = ((U8*) pixels)[i];
|
||||
pixformat = GL_RGBA;
|
||||
intformat = GL_RGBA8;
|
||||
}
|
||||
|
||||
U8* pix = (U8*) &scratch[i];
|
||||
pix[0] = pix[1] = pix[2] = lum;
|
||||
pix[3] = 1.f;
|
||||
}
|
||||
|
||||
pixformat = GL_RGBA;
|
||||
intformat = GL_RGBA8;
|
||||
}
|
||||
if (pixformat == GL_LUMINANCE_ALPHA && pixtype == GL_UNSIGNED_BYTE)
|
||||
{ //GL_LUMINANCE_ALPHA is deprecated, convert to RGBA
|
||||
scratch.resize(width*height);
|
||||
pixels = &scratch[0];
|
||||
|
||||
U32 pixel_count = (U32) (width*height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
{
|
||||
U8 lum = ((U8*) pixels)[i*2+0];
|
||||
U8 alpha = ((U8*) pixels)[i*2+1];
|
||||
|
||||
if (pixformat == GL_LUMINANCE_ALPHA && pixtype == GL_UNSIGNED_BYTE)
|
||||
{ //GL_LUMINANCE_ALPHA is deprecated, convert to RGBA
|
||||
use_scratch = true;
|
||||
scratch = new U32[width*height];
|
||||
U8* pix = (U8*) &scratch[i];
|
||||
pix[0] = pix[1] = pix[2] = lum;
|
||||
pix[3] = alpha;
|
||||
}
|
||||
|
||||
U32 pixel_count = (U32) (width*height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
{
|
||||
U8 lum = ((U8*) pixels)[i*2+0];
|
||||
U8 alpha = ((U8*) pixels)[i*2+1];
|
||||
pixformat = GL_RGBA;
|
||||
intformat = GL_RGBA8;
|
||||
}
|
||||
|
||||
U8* pix = (U8*) &scratch[i];
|
||||
pix[0] = pix[1] = pix[2] = lum;
|
||||
pix[3] = alpha;
|
||||
}
|
||||
|
||||
pixformat = GL_RGBA;
|
||||
intformat = GL_RGBA8;
|
||||
}
|
||||
if (pixformat == GL_LUMINANCE && pixtype == GL_UNSIGNED_BYTE)
|
||||
{ //GL_LUMINANCE_ALPHA is deprecated, convert to RGB
|
||||
scratch.resize(width*height);
|
||||
pixels = &scratch[0];
|
||||
|
||||
if (pixformat == GL_LUMINANCE && pixtype == GL_UNSIGNED_BYTE)
|
||||
{ //GL_LUMINANCE_ALPHA is deprecated, convert to RGB
|
||||
use_scratch = true;
|
||||
scratch = new U32[width*height];
|
||||
U32 pixel_count = (U32) (width*height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
{
|
||||
U8 lum = ((U8*) pixels)[i];
|
||||
|
||||
U32 pixel_count = (U32) (width*height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
{
|
||||
U8 lum = ((U8*) pixels)[i];
|
||||
|
||||
U8* pix = (U8*) &scratch[i];
|
||||
pix[0] = pix[1] = pix[2] = lum;
|
||||
pix[3] = 255;
|
||||
}
|
||||
|
||||
pixformat = GL_RGBA;
|
||||
intformat = GL_RGB8;
|
||||
U8* pix = (U8*) &scratch[i];
|
||||
pix[0] = pix[1] = pix[2] = lum;
|
||||
pix[3] = 255;
|
||||
}
|
||||
|
||||
pixformat = GL_RGBA;
|
||||
intformat = GL_RGB8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (LLImageGL::sCompressTextures && allow_compression)
|
||||
{
|
||||
switch (intformat)
|
||||
{
|
||||
case GL_RED:
|
||||
case GL_R8:
|
||||
intformat = GL_COMPRESSED_RED;
|
||||
break;
|
||||
case GL_RG:
|
||||
case GL_RG8:
|
||||
intformat = GL_COMPRESSED_RG;
|
||||
break;
|
||||
case GL_RGB:
|
||||
case GL_RGB8:
|
||||
intformat = GL_COMPRESSED_RGB;
|
||||
@@ -1190,13 +1217,8 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, use_scratch ? scratch : pixels);
|
||||
glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, pixels);
|
||||
stop_glerror();
|
||||
|
||||
if (use_scratch)
|
||||
{
|
||||
delete [] scratch;
|
||||
}
|
||||
}
|
||||
|
||||
//create an empty GL texture: just create a texture name
|
||||
@@ -1776,7 +1798,7 @@ void LLImageGL::calcAlphaChannelOffsetAndStride()
|
||||
}
|
||||
}
|
||||
|
||||
std::map<LLGLuint, std::list<std::pair<std::string,std::string> > > sTextureMaskMap;
|
||||
//std::map<LLGLuint, std::list<std::pair<std::string,std::string> > > sTextureMaskMap;
|
||||
void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
|
||||
{
|
||||
if(!mNeedsAlphaAndPickMask || !mCanMask)
|
||||
@@ -1897,7 +1919,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
|
||||
|
||||
mMaskRMSE = sqrt(sum)/255.0;
|
||||
|
||||
std::list<std::pair<std::string,std::string> > &data = sTextureMaskMap[getTexName()];
|
||||
/*std::list<std::pair<std::string,std::string> > &data = sTextureMaskMap[getTexName()];
|
||||
data.clear();
|
||||
data.push_back(std::make_pair("RMSE", llformat("%f",mMaskRMSE)));
|
||||
data.push_back(std::make_pair(" sum", llformat("%lf",sum)));
|
||||
@@ -1908,7 +1930,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
|
||||
data.push_back(std::make_pair(" stride", llformat("%i",S32(mAlphaOffset))));
|
||||
data.push_back(std::make_pair(" split", llformat("%u|%u|%u",lowerhalftotal,midrangetotal,upperhalftotal)));
|
||||
data.push_back(std::make_pair(" alphatotal", llformat("%u",alphatotal)));
|
||||
data.push_back(std::make_pair(" alphatotal/48", llformat("%u",length/48)));
|
||||
data.push_back(std::make_pair(" alphatotal/48", llformat("%u",length/48)));*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -471,10 +471,8 @@ void LLPostProcess::createNoiseTexture()
|
||||
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mNoiseTexture);
|
||||
stop_glerror();
|
||||
|
||||
if(gGLManager.mGLVersion >= 4.f)
|
||||
LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_R8, NOISE_SIZE, NOISE_SIZE, GL_RED, GL_UNSIGNED_BYTE, &buffer[0], false);
|
||||
else
|
||||
LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_LUMINANCE8, NOISE_SIZE, NOISE_SIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, &buffer[0], false);
|
||||
LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_LUMINANCE8, NOISE_SIZE, NOISE_SIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, &buffer[0], false);
|
||||
|
||||
stop_glerror();
|
||||
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
|
||||
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP);
|
||||
|
||||
@@ -1169,7 +1169,7 @@ void LLRender::syncLightState()
|
||||
shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, 8, diffuse[0].mV);
|
||||
shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
|
||||
//HACK -- duplicate sunlight color for compatibility with drivers that can't deal with multiple shader objects referencing the same uniform
|
||||
shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
|
||||
shader->uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2199,7 +2199,15 @@ void LLRender::texCoord2fv(const GLfloat* tc)
|
||||
|
||||
void LLRender::color4ub(const GLubyte& r, const GLubyte& g, const GLubyte& b, const GLubyte& a)
|
||||
{
|
||||
mColorsp[mCount] = LLColor4U(r,g,b,a);
|
||||
if (!LLGLSLShader::sCurBoundShaderPtr ||
|
||||
LLGLSLShader::sCurBoundShaderPtr->mAttributeMask & LLVertexBuffer::MAP_COLOR)
|
||||
{
|
||||
mColorsp[mCount] = LLColor4U(r,g,b,a);
|
||||
}
|
||||
else
|
||||
{ //not using shaders or shader reads color from a uniform
|
||||
diffuseColor4ub(r,g,b,a);
|
||||
}
|
||||
}
|
||||
void LLRender::color4ubv(const GLubyte* c)
|
||||
{
|
||||
|
||||
@@ -235,8 +235,6 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
|
||||
// Create the GL context and set it up for windowed or fullscreen, as appropriate.
|
||||
if(createContext(x, y, width, height, 32, fullscreen, vsync_mode))
|
||||
{
|
||||
gGLManager.initGL();
|
||||
|
||||
//start with arrow cursor
|
||||
initCursors();
|
||||
setCursor( UI_CURSOR_ARROW );
|
||||
@@ -721,9 +719,11 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B
|
||||
}
|
||||
#endif // LL_X11
|
||||
|
||||
gGLManager.initGL();
|
||||
|
||||
#if SDL_VERSION_ATLEAST(1,3,0)
|
||||
// Disable vertical sync for swap
|
||||
if (vsync_mode == 0)
|
||||
if (vsync_mode == 0 || (!gGLManager.mHasAdaptiveVsync && vsync_mode == -1))
|
||||
{
|
||||
LL_DEBUGS("Window") << "Disabling vertical sync" << LL_ENDL;
|
||||
SDL_GL_SetSwapInterval(0);
|
||||
@@ -744,20 +744,11 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B
|
||||
}
|
||||
#else // SDL_VERSION_ATLEAST(1,3,0)
|
||||
#ifdef SDL_GL_SWAP_CONTROL
|
||||
if (vsync_mode == 0)
|
||||
if (vsync_mode <= 0)
|
||||
{
|
||||
LL_DEBUGS("Window") << "Disabling vertical sync" << LL_ENDL;
|
||||
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);
|
||||
}
|
||||
else if(vsync_mode == -1)
|
||||
{
|
||||
LL_DEBUGS("Window") << "Enabling adaptive vertical sync" << LL_ENDL;
|
||||
if(SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, -1) == -1)
|
||||
{
|
||||
LL_DEBUGS("Window") << "Failed to enable adaptive vertical sync. Disabling vsync." << LL_ENDL;
|
||||
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Window") << "Enabling vertical sync" << LL_ENDL;
|
||||
@@ -793,8 +784,6 @@ BOOL LLWindowSDL::switchContext(BOOL fullscreen, const LLCoordScreen &size, cons
|
||||
result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, vsync_mode);
|
||||
if (result)
|
||||
{
|
||||
gGLManager.initGL();
|
||||
|
||||
//start with arrow cursor
|
||||
initCursors();
|
||||
setCursor( UI_CURSOR_ARROW );
|
||||
|
||||
@@ -1652,7 +1652,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co
|
||||
// Disable vertical sync for swap
|
||||
if(wglSwapIntervalEXT)
|
||||
{
|
||||
if (vsync_mode == 0)
|
||||
if (vsync_mode == 0 || (!gGLManager.mHasAdaptiveVsync && vsync_mode == -1))
|
||||
{
|
||||
LL_INFOS("Window") << "Disabling vertical sync" << LL_ENDL;
|
||||
wglSwapIntervalEXT(0);
|
||||
|
||||
@@ -1800,7 +1800,7 @@ if (PACKAGE)
|
||||
if (LINUX)
|
||||
list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged")
|
||||
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2")
|
||||
set(VIEWER_EXE_GLOBS "singularity-do-not-run-directly SLPlugin")
|
||||
set(VIEWER_EXE_GLOBS "${VIEWER_BRANDING_ID}-do-not-run-directly SLPlugin")
|
||||
set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*")
|
||||
set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest)
|
||||
endif (LINUX)
|
||||
|
||||
@@ -22,16 +22,11 @@
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#define FLT_MAX 3.402823466e+38
|
||||
|
||||
ATTRIBUTE vec4 weight4;
|
||||
|
||||
uniform mat3 matrixPalette[52];
|
||||
uniform vec3 translationPalette[52];
|
||||
uniform mat3x4 matrixPalette[52];
|
||||
uniform float maxWeight;
|
||||
|
||||
|
||||
|
||||
mat4 getObjectSkinnedTransform()
|
||||
{
|
||||
int i;
|
||||
@@ -49,22 +44,21 @@ mat4 getObjectSkinnedTransform()
|
||||
int i3 = int(index.z);
|
||||
int i4 = int(index.w);
|
||||
|
||||
mat3 mat = mat3(matrixPalette[i1])*w.x;
|
||||
mat += mat3(matrixPalette[i2])*w.y;
|
||||
mat += mat3(matrixPalette[i3])*w.z;
|
||||
mat += mat3(matrixPalette[i4])*w.w;
|
||||
|
||||
mat3 mat = matrixPalette[i1]*w.x;
|
||||
mat += matrixPalette[i2]*w.y;
|
||||
mat += matrixPalette[i3]*w.z;
|
||||
mat += matrixPalette[i4]*w.w;
|
||||
|
||||
vec3 trans = translationPalette[i1]*w.x;
|
||||
trans += translationPalette[i2]*w.y;
|
||||
trans += translationPalette[i3]*w.z;
|
||||
trans += translationPalette[i4]*w.w;
|
||||
vec3 trans = vec3(matrixPalette[i1][0].w,matrixPalette[i1][1].w,matrixPalette[i1][2].w)*w.x;
|
||||
trans += vec3(matrixPalette[i2][0].w,matrixPalette[i2][1].w,matrixPalette[i2][2].w)*w.y;
|
||||
trans += vec3(matrixPalette[i3][0].w,matrixPalette[i3][1].w,matrixPalette[i3][2].w)*w.z;
|
||||
trans += vec3(matrixPalette[i4][0].w,matrixPalette[i4][1].w,matrixPalette[i4][2].w)*w.w;
|
||||
|
||||
mat4 ret;
|
||||
|
||||
ret[0] = vec4(mat[0].xyz, 0);
|
||||
ret[1] = vec4(mat[1].xyz, 0);
|
||||
ret[2] = vec4(mat[2].xyz, 0);
|
||||
ret[0] = vec4(mat[0], 0);
|
||||
ret[1] = vec4(mat[1], 0);
|
||||
ret[2] = vec4(mat[2], 0);
|
||||
ret[3] = vec4(trans, sum);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -465,15 +465,21 @@ void main()
|
||||
discard;
|
||||
}
|
||||
#endif
|
||||
#ifdef FOR_IMPOSTOR
|
||||
/*#ifdef FOR_IMPOSTOR
|
||||
// Insure we don't pollute depth with invis pixels in impostor rendering
|
||||
//
|
||||
if (final_alpha < 0.01)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
#endif
|
||||
#endif*/
|
||||
|
||||
//Always do this.
|
||||
if (final_alpha < 0.004)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
vec4 pos = vec4(vary_position, 1.0);
|
||||
|
||||
float shadow = 1.0;
|
||||
@@ -549,7 +555,7 @@ void main()
|
||||
|
||||
|
||||
#ifdef FOR_IMPOSTOR
|
||||
vec4 color = vec4(diff.rgb,final_alpha);
|
||||
vec4 color = vec4(diff.rgb,final_alpha); //Impostor needs alpha.
|
||||
#else
|
||||
|
||||
vec4 gamma_diff = diff;
|
||||
|
||||
@@ -42,6 +42,8 @@ void main()
|
||||
float shadow = 1.0;
|
||||
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;
|
||||
if(color.a < .01)
|
||||
discard;
|
||||
color.rgb = pow(color.rgb, vec3(2.2));
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
|
||||
@@ -537,6 +537,10 @@ void main()
|
||||
#endif
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
if(diffcol.a < .01)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
vec3 gamma_diff = diffcol.rgb;
|
||||
diffcol.rgb = srgb_to_linear(diffcol.rgb);
|
||||
#endif
|
||||
|
||||
@@ -39,7 +39,7 @@ VARYING vec2 vary_texcoord0;
|
||||
|
||||
void default_lighting()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; //Shader is used on alpha faces too. Need alpha component.
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
|
||||
@@ -41,15 +41,13 @@ VARYING vec2 vary_texcoord0;
|
||||
|
||||
void default_lighting()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
|
||||
@@ -40,15 +40,13 @@ VARYING vec2 vary_texcoord0;
|
||||
|
||||
void fullbright_lighting()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy);
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; //Shader is used on alpha faces too. Need alpha component.
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(texture_gamma));
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
|
||||
@@ -42,15 +42,13 @@ VARYING vec2 vary_texcoord0;
|
||||
|
||||
void fullbright_lighting()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(texture_gamma));
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ VARYING vec2 vary_texcoord0;
|
||||
|
||||
void fullbright_lighting_water()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; //Shader is used on alpha faces too. Need alpha component.
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
|
||||
@@ -41,6 +41,11 @@ void default_lighting()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
|
||||
|
||||
if(color.a < .004)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
|
||||
@@ -39,7 +39,7 @@ VARYING vec2 vary_texcoord0;
|
||||
|
||||
void default_lighting_water()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; //Shader is used on alpha faces too. Need alpha component.
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
|
||||
@@ -39,6 +39,11 @@ void default_lighting_water()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
|
||||
|
||||
if(color.a < .004)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
frag_color = applyWaterFog(color);
|
||||
|
||||
@@ -41,6 +41,11 @@ void default_lighting_water()
|
||||
{
|
||||
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
|
||||
|
||||
if(color.a < .004)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
frag_color = applyWaterFog(color);
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
uniform vec4 sunlight_color_copy;
|
||||
uniform vec3 sunlight_color_copy;
|
||||
uniform vec4 light_ambient;
|
||||
|
||||
vec3 atmosAmbient(vec3 light)
|
||||
|
||||
@@ -301,6 +301,10 @@ RenderObjectBump 0 0
|
||||
list OpenGLPre15
|
||||
RenderVBOEnable 1 0
|
||||
|
||||
list OpenGLPre21
|
||||
RenderAvatarVP 0 0
|
||||
RenderAvatarCloth 0 0
|
||||
|
||||
list OpenGLPre30
|
||||
RenderDeferred 0 0
|
||||
RenderMaxTextureIndex 1 1
|
||||
@@ -486,6 +490,7 @@ Disregard128DefaultDrawDistance 1 0
|
||||
list ATIOldDriver
|
||||
RenderAvatarVP 0 0
|
||||
RenderAvatarCloth 0 0
|
||||
RenderDeferred 0 0
|
||||
|
||||
// ATI cards generally perform better when not using VBOs for streaming data
|
||||
|
||||
@@ -596,3 +601,7 @@ RenderShaderLightingMaxLevel 1 2
|
||||
list NVIDIA_GeForce_Go_7900
|
||||
RenderShaderLightingMaxLevel 1 2
|
||||
|
||||
list VertexUniformsLT1024
|
||||
RenderAvatarVP 0 0
|
||||
RenderAvatarCloth 0 0
|
||||
RenderDeferred 0 0
|
||||
|
||||
@@ -301,6 +301,11 @@ RenderObjectBump 0 0
|
||||
list OpenGLPre15
|
||||
RenderVBOEnable 1 0
|
||||
|
||||
list OpenGLPre21
|
||||
RenderAvatarVP 0 0
|
||||
RenderAvatarCloth 0 0
|
||||
RenderDeferred 0 0
|
||||
|
||||
list IntelPre30
|
||||
RenderAnisotropic 1 0
|
||||
// Avoid some Intel crashes on Linux
|
||||
@@ -458,6 +463,7 @@ Disregard128DefaultDrawDistance 1 0
|
||||
list ATIOldDriver
|
||||
RenderAvatarVP 0 0
|
||||
RenderAvatarCloth 0 0
|
||||
RenderDeferred 0 0
|
||||
// Avoid driver crashes with some features on Linux with old ATI drivers
|
||||
UseOcclusion 0 0
|
||||
WindLightUseAtmosShaders 0 0
|
||||
@@ -563,3 +569,7 @@ RenderShaderLightingMaxLevel 1 2
|
||||
list NVIDIA_GeForce_Go_7900
|
||||
RenderShaderLightingMaxLevel 1 2
|
||||
|
||||
list VertexUniformsLT1024
|
||||
RenderAvatarVP 0 0
|
||||
RenderAvatarCloth 0 0
|
||||
RenderDeferred 0 0
|
||||
@@ -296,6 +296,11 @@ RenderObjectBump 0 0
|
||||
list OpenGLPre15
|
||||
RenderVBOEnable 1 0
|
||||
|
||||
list OpenGLPre21
|
||||
RenderAvatarVP 0 0
|
||||
RenderAvatarCloth 0 0
|
||||
RenderDeferred 0 0
|
||||
|
||||
list TexUnit8orLess
|
||||
RenderDeferredSSAO 0 0
|
||||
|
||||
@@ -521,3 +526,7 @@ Disregard128DefaultDrawDistance 1 0
|
||||
list NVIDIA_GeForce_Go_7400
|
||||
Disregard128DefaultDrawDistance 1 0
|
||||
|
||||
list VertexUniformsLT1024
|
||||
RenderAvatarVP 0 0
|
||||
RenderAvatarCloth 0 0
|
||||
RenderDeferred 0 0
|
||||
@@ -64,7 +64,7 @@ if [ -n "$ASCENDED_DEVELOPER" ]; then
|
||||
elif [ "$ASCENDED_DEVELOPER" = "2" ]; then
|
||||
export LL_WRAPPER='valgrind --smc-check=all --error-limit=no --log-file=secondlife.vg --leak-check=full --suppressions=/usr/lib/valgrind/glibc-2.5.supp --suppressions=secondlife-i686.supp'
|
||||
elif [ "$ASCENDED_DEVELOPER" = "3" ]; then
|
||||
export LL_WRAPPER='strace -f -ff -o singularity.strace'
|
||||
export LL_WRAPPER='strace -f -ff -o @VIEWER_BRANDING_ID@.strace'
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -142,7 +142,7 @@ if [ -n "$LL_TCMALLOC" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
export VIEWER_BINARY='singularity-do-not-run-directly'
|
||||
export VIEWER_BINARY='@VIEWER_BRANDING_ID@-do-not-run-directly'
|
||||
BINARY_TYPE=$(expr match "$(file -b bin/$VIEWER_BINARY)" '\(.*executable\)' | sed -e 's/ / /g')
|
||||
if [ "${BINARY_TYPE}" == "ELF 64-bit LSB executable" ]; then
|
||||
SL_ENV+='LD_LIBRARY_PATH="`pwd`/lib64:`pwd`/lib32:$LD_LIBRARY_PATH"'
|
||||
@@ -356,7 +356,7 @@ void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4& color)
|
||||
|
||||
void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color)
|
||||
{
|
||||
glColor4ubv(color.mV);
|
||||
gGL.diffuseColor4ubv(color.mV);
|
||||
}
|
||||
|
||||
void LLFacePool::LLOverrideFaceColor::setColor(F32 r, F32 g, F32 b, F32 a)
|
||||
|
||||
@@ -135,27 +135,13 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
|
||||
gPipeline.mDeferredDepth.copyContents(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(), gPipeline.mDeferredScreen.getHeight(),
|
||||
0, 0, gPipeline.mDeferredDepth.getWidth(), gPipeline.mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
|
||||
gPipeline.mDeferredDepth.bindTarget();
|
||||
simple_shader = fullbright_shader = &gObjectFullbrightAlphaMaskProgram;
|
||||
gObjectFullbrightAlphaMaskProgram.bind();
|
||||
gObjectFullbrightAlphaMaskProgram.setMinimumAlpha(0.33f);
|
||||
simple_shader = fullbright_shader = &gObjectFullbrightProgram[1<<SHD_ALPHA_MASK_BIT];
|
||||
fullbright_shader->bind();
|
||||
fullbright_shader->setMinimumAlpha(0.33f);
|
||||
}
|
||||
|
||||
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{
|
||||
emissive_shader = &gDeferredEmissiveProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
emissive_shader = &gObjectEmissiveWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
emissive_shader = &gObjectEmissiveProgram;
|
||||
}
|
||||
}
|
||||
llassert_always(LLPipeline::sRenderDeferred);
|
||||
emissive_shader = &gDeferredEmissiveProgram;
|
||||
|
||||
deferred_render = TRUE;
|
||||
|
||||
@@ -173,7 +159,7 @@ void LLDrawPoolAlpha::endPostDeferredPass(S32 pass)
|
||||
{
|
||||
gPipeline.mDeferredDepth.flush();
|
||||
gPipeline.mScreen.bindTarget();
|
||||
gObjectFullbrightAlphaMaskProgram.unbind();
|
||||
gObjectFullbrightProgram[1<<SHD_ALPHA_MASK_BIT].unbind();
|
||||
}
|
||||
|
||||
deferred_render = FALSE;
|
||||
@@ -189,25 +175,10 @@ void LLDrawPoolAlpha::beginRenderPass(S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_RENDER_ALPHA);
|
||||
|
||||
if (LLPipeline::sImpostorRender)
|
||||
{
|
||||
simple_shader = &gObjectSimpleImpostorProgram;
|
||||
fullbright_shader = &gObjectFullbrightProgram;
|
||||
emissive_shader = &gObjectEmissiveProgram;
|
||||
}
|
||||
else if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
simple_shader = &gObjectSimpleWaterProgram;
|
||||
fullbright_shader = &gObjectFullbrightWaterProgram;
|
||||
emissive_shader = &gObjectEmissiveWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
simple_shader = &gObjectSimpleProgram;
|
||||
fullbright_shader = &gObjectFullbrightProgram;
|
||||
emissive_shader = &gObjectEmissiveProgram;
|
||||
}
|
||||
|
||||
simple_shader = &gObjectSimpleProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT];
|
||||
fullbright_shader = &gObjectFullbrightProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT];
|
||||
emissive_shader = &gObjectEmissiveProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT];
|
||||
|
||||
// Start out with no shaders.
|
||||
current_shader = target_shader = NULL;
|
||||
|
||||
@@ -267,20 +238,14 @@ void LLDrawPoolAlpha::render(S32 pass)
|
||||
|
||||
if (mVertexShaderLevel > 0)
|
||||
{
|
||||
if (LLPipeline::sImpostorRender)
|
||||
{
|
||||
fullbright_shader->bind();
|
||||
fullbright_shader->setMinimumAlpha(0.5f);
|
||||
simple_shader->bind();
|
||||
simple_shader->setMinimumAlpha(0.5f);
|
||||
}
|
||||
else
|
||||
{
|
||||
fullbright_shader->bind();
|
||||
fullbright_shader->setMinimumAlpha(0.f);
|
||||
simple_shader->bind();
|
||||
simple_shader->setMinimumAlpha(0.f);
|
||||
}
|
||||
float min_alpha = LLPipeline::sImpostorRender ? 0.5f : 0.004f;
|
||||
|
||||
fullbright_shader->bind();
|
||||
fullbright_shader->setMinimumAlpha(min_alpha);
|
||||
simple_shader->bind();
|
||||
simple_shader->setMinimumAlpha(min_alpha);
|
||||
emissive_shader->bind();
|
||||
emissive_shader->setMinimumAlpha(min_alpha);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -536,7 +501,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)
|
||||
if (params.mTexture.notNull())
|
||||
{
|
||||
params.mTexture->addTextureStats(params.mVSize);
|
||||
if (mat)
|
||||
if (use_shaders && mat && current_shader)
|
||||
{
|
||||
current_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, params.mTexture);
|
||||
}
|
||||
|
||||
@@ -731,6 +731,12 @@ void LLDrawPoolAvatar::endDeferredRigid()
|
||||
|
||||
void LLDrawPoolAvatar::beginSkinned()
|
||||
{
|
||||
if(!gPipeline.canUseVertexShaders())
|
||||
{
|
||||
sVertexProgram = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
@@ -765,12 +771,9 @@ void LLDrawPoolAvatar::beginSkinned()
|
||||
}
|
||||
else
|
||||
{
|
||||
if(gPipeline.canUseVertexShaders())
|
||||
{
|
||||
// software skinning, use a basic shader for windlight.
|
||||
// TODO: find a better fallback method for software skinning.
|
||||
sVertexProgram->bind();
|
||||
}
|
||||
// software skinning, use a basic shader for windlight.
|
||||
// TODO: find a better fallback method for software skinning.
|
||||
sVertexProgram->bind();
|
||||
}
|
||||
|
||||
if (LLGLSLShader::sNoFixedFunction)
|
||||
@@ -787,17 +790,12 @@ void LLDrawPoolAvatar::endSkinned()
|
||||
sRenderingSkinned = FALSE;
|
||||
sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
|
||||
gGL.getTexUnit(0)->activate();
|
||||
sVertexProgram->unbind();
|
||||
sShaderLevel = mVertexShaderLevel;
|
||||
}
|
||||
else
|
||||
|
||||
if(sVertexProgram)
|
||||
{
|
||||
if(gPipeline.canUseVertexShaders())
|
||||
{
|
||||
// software skinning, use a basic shader for windlight.
|
||||
// TODO: find a better fallback method for software skinning.
|
||||
sVertexProgram->unbind();
|
||||
}
|
||||
sVertexProgram->unbind();
|
||||
}
|
||||
|
||||
gGL.getTexUnit(0)->activate();
|
||||
@@ -805,44 +803,29 @@ void LLDrawPoolAvatar::endSkinned()
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedSimple()
|
||||
{
|
||||
if (sShaderLevel > 0)
|
||||
sDiffuseChannel = 0;
|
||||
if(!gPipeline.canUseVertexShaders())
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectSimpleWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectSimpleProgram;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gObjectSimpleNonIndexedWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gObjectSimpleNonIndexedProgram;
|
||||
}
|
||||
sVertexProgram = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
{
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
}
|
||||
sVertexProgram = &gObjectSimpleProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT | 1<<SHD_NO_INDEX_BIT | (sShaderLevel>0)<<SHD_SKIN_BIT];
|
||||
llassert_always(sVertexProgram->mProgramObject > 0);
|
||||
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endRiggedSimple()
|
||||
{
|
||||
LLVertexBuffer::unbind();
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
{
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
if(!sVertexProgram)
|
||||
return;
|
||||
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedAlpha()
|
||||
@@ -868,39 +851,21 @@ void LLDrawPoolAvatar::endRiggedFullbrightAlpha()
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedGlow()
|
||||
{
|
||||
if (sShaderLevel > 0)
|
||||
sDiffuseChannel = 0;
|
||||
if(!gPipeline.canUseVertexShaders())
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectEmissiveWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectEmissiveProgram;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gObjectEmissiveNonIndexedWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gObjectEmissiveNonIndexedProgram;
|
||||
}
|
||||
sVertexProgram = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
{
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, LLPipeline::sRenderDeferred ? 2.2f : 1.1f);
|
||||
//F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
//sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
}
|
||||
sVertexProgram = &gObjectEmissiveProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT | 1<<SHD_NO_INDEX_BIT | (sShaderLevel>0)<<SHD_SKIN_BIT];
|
||||
llassert_always(sVertexProgram->mProgramObject > 0);
|
||||
|
||||
sVertexProgram->bind();
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, LLPipeline::sRenderDeferred ? 2.2f : 1.1f);
|
||||
//F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
//sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endRiggedGlow()
|
||||
{
|
||||
endRiggedFullbright();
|
||||
@@ -908,165 +873,114 @@ void LLDrawPoolAvatar::endRiggedGlow()
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedFullbright()
|
||||
{
|
||||
if (sShaderLevel > 0)
|
||||
sDiffuseChannel = 0;
|
||||
if(!gPipeline.canUseVertexShaders())
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectFullbrightWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram = &gDeferredSkinnedFullbrightProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectFullbrightProgram;
|
||||
}
|
||||
}
|
||||
sVertexProgram = NULL;
|
||||
return;
|
||||
}
|
||||
if (sShaderLevel > 0 && !LLPipeline::sUnderWaterRender && LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram = &gDeferredSkinnedFullbrightProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gObjectFullbrightNonIndexedWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gObjectFullbrightNonIndexedProgram;
|
||||
}
|
||||
sVertexProgram = &gObjectFullbrightProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT | 1<<SHD_NO_INDEX_BIT | (sShaderLevel>0)<<SHD_SKIN_BIT];
|
||||
}
|
||||
llassert_always(sVertexProgram->mProgramObject > 0);
|
||||
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
sVertexProgram->bind();
|
||||
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
//F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
//sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
}
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
//F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
//sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endRiggedFullbright()
|
||||
{
|
||||
LLVertexBuffer::unbind();
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
{
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
if(!sVertexProgram)
|
||||
return;
|
||||
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedShinySimple()
|
||||
{
|
||||
if (sShaderLevel > 0)
|
||||
if(!gPipeline.canUseVertexShaders())
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectShinySimpleWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectShinySimpleProgram;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gObjectShinyNonIndexedWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gObjectShinyNonIndexedProgram;
|
||||
}
|
||||
sVertexProgram = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
{
|
||||
sVertexProgram->bind();
|
||||
LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
}
|
||||
sVertexProgram = &gObjectSimpleProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT | 1<<SHD_NO_INDEX_BIT | (sShaderLevel>0)<<SHD_SKIN_BIT | 1<<SHD_SHINY_BIT];
|
||||
llassert_always(sVertexProgram->mProgramObject > 0);
|
||||
|
||||
sVertexProgram->bind();
|
||||
LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endRiggedShinySimple()
|
||||
{
|
||||
LLVertexBuffer::unbind();
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
{
|
||||
LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
if(!sVertexProgram)
|
||||
return;
|
||||
|
||||
LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
|
||||
{
|
||||
if (sShaderLevel > 0)
|
||||
if(!gPipeline.canUseVertexShaders())
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectFullbrightShinyWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram = &gDeferredSkinnedFullbrightShinyProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectFullbrightShinyProgram;
|
||||
}
|
||||
}
|
||||
sVertexProgram = NULL;
|
||||
return;
|
||||
}
|
||||
if (sShaderLevel > 0 && !LLPipeline::sUnderWaterRender && LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram = &gDeferredSkinnedFullbrightShinyProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gObjectFullbrightShinyNonIndexedWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gObjectFullbrightShinyNonIndexedProgram;
|
||||
}
|
||||
sVertexProgram = &gObjectFullbrightProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT | 1<<SHD_NO_INDEX_BIT | (sShaderLevel>0)<<SHD_SKIN_BIT | 1<<SHD_SHINY_BIT];
|
||||
}
|
||||
llassert_always(sVertexProgram->mProgramObject > 0);
|
||||
|
||||
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
sVertexProgram->bind();
|
||||
LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram->bind();
|
||||
LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
//F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
//sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
}
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
//F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
//sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endRiggedFullbrightShiny()
|
||||
{
|
||||
LLVertexBuffer::unbind();
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
{
|
||||
LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
if(!sVertexProgram)
|
||||
return;
|
||||
|
||||
LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -1633,41 +1547,35 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
|
||||
stop_glerror();
|
||||
|
||||
F32 mp[JOINT_COUNT*9];
|
||||
|
||||
F32 transp[JOINT_COUNT*3];
|
||||
F32 mp[JOINT_COUNT*12];
|
||||
|
||||
for (U32 i = 0; i < count; ++i)
|
||||
{
|
||||
F32* m = (F32*) mat[i].mMatrix;
|
||||
|
||||
U32 idx = i*9;
|
||||
U32 idx = i*12;
|
||||
|
||||
mp[idx+0] = m[0];
|
||||
mp[idx+1] = m[1];
|
||||
mp[idx+2] = m[2];
|
||||
mp[idx+3] = m[12];
|
||||
|
||||
mp[idx+3] = m[4];
|
||||
mp[idx+4] = m[5];
|
||||
mp[idx+5] = m[6];
|
||||
mp[idx+4] = m[4];
|
||||
mp[idx+5] = m[5];
|
||||
mp[idx+6] = m[6];
|
||||
mp[idx+7] = m[13];
|
||||
|
||||
mp[idx+6] = m[8];
|
||||
mp[idx+7] = m[9];
|
||||
mp[idx+8] = m[10];
|
||||
|
||||
idx = i*3;
|
||||
|
||||
transp[idx+0] = m[12];
|
||||
transp[idx+1] = m[13];
|
||||
transp[idx+2] = m[14];
|
||||
mp[idx+8] = m[8];
|
||||
mp[idx+9] = m[9];
|
||||
mp[idx+10] = m[10];
|
||||
mp[idx+11] = m[14];
|
||||
}
|
||||
|
||||
LLDrawPoolAvatar::sVertexProgram->uniformMatrix3fv(LLViewerShaderMgr::AVATAR_MATRIX,
|
||||
LLDrawPoolAvatar::sVertexProgram->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX,
|
||||
count,
|
||||
FALSE,
|
||||
(GLfloat*) mp);
|
||||
|
||||
LLDrawPoolAvatar::sVertexProgram->uniform3fv(LLShaderMgr::AVATAR_TRANSLATION, count, transp);
|
||||
LLDrawPoolAvatar::sVertexProgram->uniform1f(LLShaderMgr::AVATAR_MAX_WEIGHT, F32(count-1));
|
||||
|
||||
stop_glerror();
|
||||
@@ -1690,7 +1598,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
const LLTextureEntry* te = face->getTextureEntry();
|
||||
LLMaterial* mat = te->getMaterialParams().get();
|
||||
|
||||
if (mat)
|
||||
if (mat && is_deferred_render)
|
||||
{
|
||||
gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP));
|
||||
gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP));
|
||||
@@ -1720,7 +1628,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram->setMinimumAlpha(0.f);
|
||||
sVertexProgram->setMinimumAlpha(0.004f);
|
||||
}
|
||||
|
||||
for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
|
||||
@@ -1735,7 +1643,19 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
else
|
||||
{
|
||||
gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture());
|
||||
sVertexProgram->setMinimumAlpha(0.f);
|
||||
|
||||
if(sVertexProgram)
|
||||
{
|
||||
if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)
|
||||
{
|
||||
sVertexProgram->setMinimumAlpha(mat->getAlphaMaskCutoff()/255.f);
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram->setMinimumAlpha(0.004f);
|
||||
}
|
||||
}
|
||||
|
||||
if (normal_channel > -1)
|
||||
{
|
||||
LLDrawPoolBump::bindBumpMap(face, normal_channel);
|
||||
@@ -1864,7 +1784,7 @@ void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
|
||||
|
||||
renderRigged(avatar, RIGGED_ALPHA);
|
||||
//gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
gGL.setColorMask(true, false);
|
||||
}
|
||||
}
|
||||
@@ -1882,7 +1802,7 @@ void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
|
||||
|
||||
renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
|
||||
//gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
gGL.setColorMask(true, false);
|
||||
}
|
||||
}
|
||||
@@ -1952,6 +1872,8 @@ void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)
|
||||
facep->setRiggedIndex(type, mRiggedFace[type].size());
|
||||
facep->setPool(this);
|
||||
mRiggedFace[type].push_back(facep);
|
||||
|
||||
facep->mShinyInAlpha = type == RIGGED_DEFERRED_SIMPLE || type == RIGGED_DEFERRED_BUMP || type == RIGGED_FULLBRIGHT_SHINY || type == RIGGED_SHINY;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep)
|
||||
|
||||
@@ -349,14 +349,7 @@ void LLDrawPoolBump::beginShiny(bool invisible)
|
||||
|
||||
if (getVertexShaderLevel() > 0)
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
shader = &gObjectShinyWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
shader = &gObjectShinyProgram;
|
||||
}
|
||||
shader = &gObjectSimpleProgram[LLPipeline::sUnderWaterRender<<SHD_WATER_BIT | 1<<SHD_SHINY_BIT];
|
||||
shader->bind();
|
||||
}
|
||||
else
|
||||
@@ -516,20 +509,13 @@ void LLDrawPoolBump::beginFullbrightShiny()
|
||||
|
||||
// Second pass: environment map
|
||||
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
if(!LLPipeline::sUnderWaterRender && LLPipeline::sRenderDeferred)
|
||||
{
|
||||
shader = &gObjectFullbrightShinyWaterProgram;
|
||||
shader = &gDeferredFullbrightShinyProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{
|
||||
shader = &gDeferredFullbrightShinyProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
shader = &gObjectFullbrightShinyProgram;
|
||||
}
|
||||
shader = &gObjectFullbrightProgram[LLPipeline::sUnderWaterRender<<SHD_WATER_BIT | 1<<SHD_SHINY_BIT];
|
||||
}
|
||||
|
||||
LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL;
|
||||
|
||||
@@ -108,7 +108,7 @@ void LLDrawPoolGlow::render(S32 pass)
|
||||
//should never get here without basic shaders enabled
|
||||
llassert(shader_level > 0);
|
||||
|
||||
LLGLSLShader* shader = LLPipeline::sUnderWaterRender ? &gObjectEmissiveWaterProgram : &gObjectEmissiveProgram;
|
||||
LLGLSLShader* shader = &gObjectEmissiveProgram[LLPipeline::sUnderWaterRender<<SHD_WATER_BIT];
|
||||
shader->bind();
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{
|
||||
@@ -154,18 +154,7 @@ void LLDrawPoolSimple::beginRenderPass(S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_RENDER_SIMPLE);
|
||||
|
||||
if (LLPipeline::sImpostorRender)
|
||||
{
|
||||
simple_shader = &gObjectSimpleImpostorProgram;
|
||||
}
|
||||
else if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
simple_shader = &gObjectSimpleWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
simple_shader = &gObjectSimpleProgram;
|
||||
}
|
||||
simple_shader = &gObjectSimpleProgram[LLPipeline::sUnderWaterRender<<SHD_WATER_BIT];
|
||||
|
||||
if (mVertexShaderLevel > 0)
|
||||
{
|
||||
@@ -251,14 +240,7 @@ void LLDrawPoolAlphaMask::beginRenderPass(S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_RENDER_ALPHA_MASK);
|
||||
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
simple_shader = &gObjectSimpleWaterAlphaMaskProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
simple_shader = &gObjectSimpleAlphaMaskProgram;
|
||||
}
|
||||
simple_shader = &gObjectSimpleProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT];
|
||||
|
||||
if (mVertexShaderLevel > 0)
|
||||
{
|
||||
@@ -324,14 +306,7 @@ void LLDrawPoolFullbrightAlphaMask::beginRenderPass(S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_RENDER_ALPHA_MASK);
|
||||
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
simple_shader = &gObjectFullbrightWaterAlphaMaskProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
simple_shader = &gObjectFullbrightAlphaMaskProgram;
|
||||
}
|
||||
simple_shader = &gObjectFullbrightProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT];
|
||||
|
||||
if (mVertexShaderLevel > 0)
|
||||
{
|
||||
@@ -460,11 +435,7 @@ void LLDrawPoolGrass::beginRenderPass(S32 pass)
|
||||
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
simple_shader = &gObjectAlphaMaskNonIndexedWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
simple_shader = &gObjectAlphaMaskNonIndexedProgram;
|
||||
simple_shader = &gObjectSimpleProgram[1<<SHD_ALPHA_MASK_BIT | LLPipeline::sUnderWaterRender<<SHD_WATER_BIT | 1<<SHD_NO_INDEX_BIT];
|
||||
}
|
||||
|
||||
if (mVertexShaderLevel > 0)
|
||||
@@ -592,14 +563,7 @@ void LLDrawPoolFullbright::beginRenderPass(S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
|
||||
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
fullbright_shader = &gObjectFullbrightWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
fullbright_shader = &gObjectFullbrightProgram;
|
||||
}
|
||||
fullbright_shader = &gObjectFullbrightProgram[LLPipeline::sUnderWaterRender<<SHD_WATER_BIT];
|
||||
}
|
||||
|
||||
void LLDrawPoolFullbright::endRenderPass(S32 pass)
|
||||
@@ -662,12 +626,11 @@ void LLDrawPoolFullbrightAlphaMask::beginPostDeferredPass(S32 pass)
|
||||
|
||||
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
|
||||
{
|
||||
gObjectFullbrightAlphaMaskProgram.bind();
|
||||
gObjectFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
|
||||
gObjectFullbrightProgram[1<<SHD_ALPHA_MASK_BIT].bind();
|
||||
gObjectFullbrightProgram[1<<SHD_ALPHA_MASK_BIT].uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
gDeferredFullbrightAlphaMaskWaterProgram.bind();
|
||||
@@ -696,7 +659,7 @@ void LLDrawPoolFullbrightAlphaMask::endPostDeferredPass(S32 pass)
|
||||
{
|
||||
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
|
||||
{
|
||||
gObjectFullbrightAlphaMaskProgram.unbind();
|
||||
gObjectFullbrightProgram[1<<SHD_ALPHA_MASK_BIT].unbind();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -68,8 +68,8 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
|
||||
LLFacePool(POOL_TERRAIN),
|
||||
mTexturep(texturep)
|
||||
{
|
||||
U32 format = GL_ALPHA8;
|
||||
U32 int_format = GL_ALPHA;
|
||||
U32 format = GL_ALPHA;
|
||||
U32 int_format = GL_ALPHA8;
|
||||
|
||||
// Hack!
|
||||
sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
|
||||
@@ -77,7 +77,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
|
||||
mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga",
|
||||
TRUE, LLGLTexture::BOOST_UI,
|
||||
LLViewerTexture::FETCHED_TEXTURE,
|
||||
format, int_format,
|
||||
int_format, format,
|
||||
LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
|
||||
|
||||
//gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());
|
||||
@@ -86,7 +86,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
|
||||
m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c",
|
||||
TRUE, LLGLTexture::BOOST_UI,
|
||||
LLViewerTexture::FETCHED_TEXTURE,
|
||||
format, int_format,
|
||||
int_format, format,
|
||||
LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
|
||||
|
||||
//gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
|
||||
|
||||
@@ -166,6 +166,8 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
|
||||
mBoundingSphereRadius = 0.0f ;
|
||||
|
||||
mHasMedia = FALSE ;
|
||||
|
||||
mShinyInAlpha = false;
|
||||
}
|
||||
|
||||
void LLFace::destroy()
|
||||
@@ -1298,53 +1300,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
||||
if (rebuild_color) // FALSE if tep == NULL
|
||||
{ //decide if shiny goes in alpha channel of color
|
||||
|
||||
static const LLCachedControl<bool> alt_batching("SHAltBatching",true);
|
||||
if (tep &&
|
||||
((!alt_batching && getPoolType() != LLDrawPool::POOL_ALPHA) ||
|
||||
(alt_batching && getPoolType() != LLDrawPool::POOL_ALPHA &&
|
||||
getPoolType() != LLDrawPool::POOL_ALPHA_MASK &&
|
||||
getPoolType() != LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK && // <--- alpha channel MUST contain transparency, not shiny
|
||||
(getPoolType() != LLDrawPool::POOL_SIMPLE || LLPipeline::sRenderDeferred)))) // Impostor pass for simple uses alpha masking. Need to be opaque.
|
||||
if(mShinyInAlpha)
|
||||
{
|
||||
LLMaterial* mat = tep->getMaterialParams().get();
|
||||
|
||||
bool shiny_in_alpha = alt_batching ? true : false;
|
||||
|
||||
if(alt_batching)
|
||||
{
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{ //store shiny in alpha if we don't have a specular map
|
||||
if (getPoolType() == LLDrawPool::POOL_MATERIALS && mat->getSpecularID().notNull())
|
||||
{
|
||||
shiny_in_alpha = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{
|
||||
if (!mat || mat->getSpecularID().isNull())
|
||||
{
|
||||
shiny_in_alpha = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!mat || mat->getDiffuseAlphaMode() != LLMaterial::DIFFUSE_ALPHA_MODE_MASK)
|
||||
{
|
||||
shiny_in_alpha = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(getPoolType() == LLDrawPool::POOL_FULLBRIGHT)
|
||||
{
|
||||
color.mV[3] = 1.f; //Simple fullbright reads alpha for fog contrib, not shiny/transparency, so since opaque, force to 1.
|
||||
}
|
||||
else if (shiny_in_alpha)
|
||||
{
|
||||
GLfloat alpha[4] =
|
||||
GLfloat alpha[4] =
|
||||
{
|
||||
0.00f,
|
||||
0.25f,
|
||||
@@ -1352,9 +1310,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
||||
0.75f
|
||||
};
|
||||
|
||||
llassert(tep->getShiny() <= 3);
|
||||
color.mV[3] = U8 (alpha[tep->getShiny()] * 255);
|
||||
}
|
||||
llassert(tep->getShiny() <= 3);
|
||||
|
||||
color.mV[3] = U8 (alpha[tep->getShiny()] * 255);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -263,6 +263,8 @@ public:
|
||||
LLMatrix4* mNormalMapMatrix;
|
||||
LLDrawInfo* mDrawInfo;
|
||||
|
||||
bool mShinyInAlpha;
|
||||
|
||||
private:
|
||||
LLPointer<LLVertexBuffer> mVertexBuffer;
|
||||
|
||||
|
||||
@@ -634,13 +634,17 @@ void LLFeatureManager::applyBaseMasks()
|
||||
{
|
||||
maskFeatures("Intel");
|
||||
}
|
||||
if (gGLManager.mGLVersion < 1.5f)
|
||||
{
|
||||
maskFeatures("OpenGLPre15");
|
||||
}
|
||||
if (gGLManager.mGLVersion < 3.f)
|
||||
{
|
||||
maskFeatures("OpenGLPre30");
|
||||
if(gGLManager.mGLVersion < 2.1f || glUniformMatrix3x4fv == NULL) //glUniformMatrix3x4fv is part of glsl 1.20 spec.
|
||||
{
|
||||
maskFeatures("OpenGLPre21");
|
||||
if (gGLManager.mGLVersion < 1.5f)
|
||||
{
|
||||
maskFeatures("OpenGLPre15");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (gGLManager.mNumTextureImageUnits <= 8)
|
||||
{
|
||||
@@ -650,6 +654,10 @@ void LLFeatureManager::applyBaseMasks()
|
||||
{
|
||||
maskFeatures("MapBufferRange");
|
||||
}
|
||||
if (gGLManager.mGLMaxVertexUniformComponents < 1024)
|
||||
{
|
||||
maskFeatures("VertexUniformsLT1024");
|
||||
}
|
||||
|
||||
// now mask by gpu string
|
||||
// Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
|
||||
|
||||
@@ -2777,7 +2777,7 @@ void renderComplexityDisplay(LLDrawable* drawablep)
|
||||
// don't highlight objects below the threshold
|
||||
if (cost > gSavedSettings.getS32("RenderComplexityThreshold"))
|
||||
{
|
||||
glColor4f(color[0],color[1],color[2],0.5f);
|
||||
gGL.diffuseColor4f(color[0],color[1],color[2],0.5f);
|
||||
|
||||
|
||||
S32 num_faces = drawablep->getNumFaces();
|
||||
@@ -4462,7 +4462,7 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
|
||||
mAlphaMaskCutoff(0.5f),
|
||||
mDiffuseAlphaMode(0)
|
||||
{
|
||||
mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset);
|
||||
//mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset);
|
||||
|
||||
mDebugColor = (rand() << 16) + rand();
|
||||
}
|
||||
|
||||
@@ -105,57 +105,20 @@ LLGLSLShader gUIProgram(LLViewerShaderMgr::SHADER_INTERFACE);
|
||||
LLGLSLShader gSolidColorProgram(LLViewerShaderMgr::SHADER_INTERFACE);
|
||||
|
||||
//object shaders
|
||||
LLGLSLShader gObjectSimpleProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectSimpleImpostorProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShaderArray<LLViewerShaderMgr::SHADER_OBJECT> gObjectSimpleProgram[1<<SHD_COUNT];
|
||||
LLGLSLShaderArray<LLViewerShaderMgr::SHADER_OBJECT> gObjectFullbrightProgram[1<<SHD_COUNT];
|
||||
LLGLSLShaderArray<LLViewerShaderMgr::SHADER_OBJECT> gObjectEmissiveProgram[1<<SHD_SHINY_BIT];
|
||||
LLGLSLShader gObjectPreviewProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectSimpleWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectSimpleAlphaMaskProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectSimpleWaterAlphaMaskProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectEmissiveProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectEmissiveWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightAlphaMaskProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightWaterAlphaMaskProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightShinyProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightShinyWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectShinyProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectShinyWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectBumpProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gTreeProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gTreeWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightNoColorProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightNoColorWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
|
||||
LLGLSLShader gObjectSimpleNonIndexedProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectSimpleNonIndexedTexGenProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectSimpleNonIndexedTexGenWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectSimpleNonIndexedWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectAlphaMaskNonIndexedProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectAlphaMaskNonIndexedWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectAlphaMaskNoColorProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectAlphaMaskNoColorWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightNonIndexedProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightNonIndexedWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectEmissiveNonIndexedProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectEmissiveNonIndexedWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightShinyNonIndexedProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectShinyNonIndexedProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gObjectShinyNonIndexedWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
|
||||
//object hardware skinning shaders
|
||||
LLGLSLShader gSkinnedObjectSimpleProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gSkinnedObjectFullbrightProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gSkinnedObjectEmissiveProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gSkinnedObjectFullbrightShinyProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gSkinnedObjectShinySimpleProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
|
||||
LLGLSLShader gSkinnedObjectSimpleWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gSkinnedObjectFullbrightWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gSkinnedObjectEmissiveWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
LLGLSLShader gSkinnedObjectShinySimpleWaterProgram(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
|
||||
//environment shaders
|
||||
LLGLSLShader gTerrainProgram(LLViewerShaderMgr::SHADER_ENVIRONMENT);
|
||||
@@ -473,7 +436,7 @@ void LLViewerShaderMgr::setShaders()
|
||||
mVertexShaderLevel[SHADER_AVATAR] = 3;
|
||||
mMaxAvatarShaderLevel = 3;
|
||||
|
||||
if (gSavedSettings.getBOOL("RenderAvatarVP") && loadShadersObject())
|
||||
if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP") && gSavedSettings.getBOOL("RenderAvatarVP") && loadShadersObject())
|
||||
{ //hardware skinning is enabled and rigged attachment shaders loaded correctly
|
||||
BOOL avatar_cloth = gSavedSettings.getBOOL("RenderAvatarCloth");
|
||||
S32 avatar_class = 1;
|
||||
@@ -1880,22 +1843,6 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
||||
unloadShaderClass(SHADER_OBJECT);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectSimpleNonIndexedProgram.mName = "Non indexed Shader";
|
||||
gObjectSimpleNonIndexedProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectSimpleNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectSimpleNonIndexedProgram.mFeatures.hasGamma = true;
|
||||
gObjectSimpleNonIndexedProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectSimpleNonIndexedProgram.mFeatures.hasLighting = true;
|
||||
gObjectSimpleNonIndexedProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectSimpleNonIndexedProgram.mShaderFiles.clear();
|
||||
gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectSimpleNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectSimpleNonIndexedProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
@@ -1913,24 +1860,6 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
||||
success = gObjectSimpleNonIndexedTexGenProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectSimpleNonIndexedWaterProgram.mName = "Non indexed Water Shader";
|
||||
gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectSimpleNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectSimpleNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectSimpleNonIndexedWaterProgram.mFeatures.hasLighting = true;
|
||||
gObjectSimpleNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectSimpleNonIndexedWaterProgram.mShaderFiles.clear();
|
||||
gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectSimpleNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectSimpleNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectSimpleNonIndexedWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectSimpleNonIndexedTexGenWaterProgram.mName = "Non indexed tex-gen Water Shader";
|
||||
@@ -1948,41 +1877,6 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
||||
success = gObjectSimpleNonIndexedTexGenWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectAlphaMaskNonIndexedProgram.mName = "Non indexed alpha mask Shader";
|
||||
gObjectAlphaMaskNonIndexedProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectAlphaMaskNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectAlphaMaskNonIndexedProgram.mFeatures.hasGamma = true;
|
||||
gObjectAlphaMaskNonIndexedProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectAlphaMaskNonIndexedProgram.mFeatures.hasLighting = true;
|
||||
gObjectAlphaMaskNonIndexedProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectAlphaMaskNonIndexedProgram.mFeatures.hasAlphaMask = true;
|
||||
gObjectAlphaMaskNonIndexedProgram.mShaderFiles.clear();
|
||||
gObjectAlphaMaskNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleNonIndexedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectAlphaMaskNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectAlphaMaskNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectAlphaMaskNonIndexedProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mName = "Non indexed alpha mask Water Shader";
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasLighting = true;
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasAlphaMask = true;
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.clear();
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleNonIndexedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectAlphaMaskNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectAlphaMaskNonIndexedWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectAlphaMaskNoColorProgram.mName = "No color alpha mask Shader";
|
||||
@@ -2053,68 +1947,6 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
||||
success = gTreeWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightNonIndexedProgram.mName = "Non Indexed Fullbright Shader";
|
||||
gObjectFullbrightNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightNonIndexedProgram.mFeatures.hasGamma = true;
|
||||
gObjectFullbrightNonIndexedProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightNonIndexedProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightNonIndexedProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectFullbrightNonIndexedProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectFullbrightNonIndexedProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightNonIndexedWaterProgram.mName = "Non Indexed Fullbright Water Shader";
|
||||
gObjectFullbrightNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightNonIndexedWaterProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectFullbrightNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectFullbrightNonIndexedWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectEmissiveNonIndexedProgram.mName = "Non Indexed Emissive Shader";
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.hasGamma = true;
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.hasTransport = true;
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.isFullbright = true;
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectEmissiveNonIndexedProgram.mShaderFiles.clear();
|
||||
gObjectEmissiveNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectEmissiveNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectEmissiveNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectEmissiveNonIndexedProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectEmissiveNonIndexedWaterProgram.mName = "Non Indexed Emissive Water Shader";
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.isFullbright = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.hasTransport = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.clear();
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectEmissiveNonIndexedWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightNoColorProgram.mName = "Non Indexed no color Fullbright Shader";
|
||||
@@ -2146,73 +1978,6 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
||||
success = gObjectFullbrightNoColorWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectShinyNonIndexedProgram.mName = "Non Indexed Shiny Shader";
|
||||
gObjectShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectShinyNonIndexedProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectShinyNonIndexedProgram.mFeatures.hasGamma = true;
|
||||
gObjectShinyNonIndexedProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectShinyNonIndexedProgram.mFeatures.isShiny = true;
|
||||
gObjectShinyNonIndexedProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectShinyNonIndexedProgram.mShaderFiles.clear();
|
||||
gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectShinyNonIndexedProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectShinyNonIndexedWaterProgram.mName = "Non Indexed Shiny Water Shader";
|
||||
gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectShinyNonIndexedWaterProgram.mFeatures.isShiny = true;
|
||||
gObjectShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectShinyNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectShinyNonIndexedWaterProgram.mShaderFiles.clear();
|
||||
gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectShinyNonIndexedWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightShinyNonIndexedProgram.mName = "Non Indexed Fullbright Shiny Shader";
|
||||
gObjectFullbrightShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightShinyNonIndexedProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightShinyNonIndexedProgram.mFeatures.isShiny = true;
|
||||
gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasGamma = true;
|
||||
gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightShinyNonIndexedProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectFullbrightShinyNonIndexedProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mName = "Non Indexed Fullbright Shiny Water Shader";
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isShiny = true;
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasGamma = true;
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectFullbrightShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectFullbrightShinyNonIndexedWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gImpostorProgram.mName = "Impostor Shader";
|
||||
@@ -2244,58 +2009,112 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectSimpleProgram.mName = "Simple Shader";
|
||||
gObjectSimpleProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectSimpleProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectSimpleProgram.mFeatures.hasGamma = true;
|
||||
gObjectSimpleProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectSimpleProgram.mFeatures.hasLighting = true;
|
||||
gObjectSimpleProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectSimpleProgram.mShaderFiles.clear();
|
||||
gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectSimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectSimpleProgram.createShader(NULL, NULL);
|
||||
for(U32 i = 0; i < (U32)1<<SHD_COUNT; ++i)
|
||||
{
|
||||
bool mask = i & 1<<SHD_ALPHA_MASK_BIT;
|
||||
bool fog = i & 1<<SHD_WATER_BIT;
|
||||
bool no_index = i & 1<<SHD_NO_INDEX_BIT;
|
||||
bool skin = i & 1<<SHD_SKIN_BIT;
|
||||
bool shiny = i & 1<<SHD_SHINY_BIT;
|
||||
|
||||
std::string name;
|
||||
if(shiny) name += " Shiny";
|
||||
if(skin) name += " Skinned";
|
||||
if(no_index) name += " Non-Indexed";
|
||||
if(mask) name += " Alpha Mask";
|
||||
if(fog) name += " Water";
|
||||
|
||||
if(no_index && !mask)
|
||||
{
|
||||
continue; //all non-indexed shaders here have alphamasks;
|
||||
}
|
||||
|
||||
if(skin && (!no_index || mVertexShaderLevel[SHADER_AVATAR] < 1))
|
||||
{
|
||||
continue; //Skins are always non-indexed.
|
||||
}
|
||||
|
||||
if(shiny && mask && !skin && !no_index)
|
||||
{
|
||||
continue; //non-skinned indexed shiny does not support alphamasking
|
||||
}
|
||||
|
||||
|
||||
|
||||
LLShaderFeatures features;
|
||||
features.calculatesLighting = true;
|
||||
features.calculatesAtmospherics = true;
|
||||
features.hasAtmospherics = true;
|
||||
features.hasLighting = !shiny;
|
||||
features.mIndexedTextureChannels = 0;
|
||||
features.hasGamma = !fog;
|
||||
features.hasWaterFog = fog;
|
||||
features.hasAlphaMask = mask;
|
||||
features.disableTextureIndex = no_index;
|
||||
features.hasObjectSkinning = skin;
|
||||
features.isShiny = shiny;
|
||||
|
||||
gObjectSimpleProgram[i].mName = std::string("Simple") + name + " Shader";
|
||||
gObjectSimpleProgram[i].mFeatures = features;
|
||||
gObjectSimpleProgram[i].mShaderFiles.clear();
|
||||
if(!shiny)
|
||||
{
|
||||
gObjectSimpleProgram[i].mShaderFiles.push_back(make_pair(skin ? "objects/simpleSkinnedV.glsl" : "objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectSimpleProgram[i].mShaderFiles.push_back(make_pair(fog ? "objects/simpleWaterF.glsl" : "objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
}
|
||||
else
|
||||
{
|
||||
gObjectSimpleProgram[i].mShaderFiles.push_back(make_pair(skin ? "objects/shinySimpleSkinnedV.glsl" : "objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectSimpleProgram[i].mShaderFiles.push_back(make_pair(fog ? "objects/shinyWaterF.glsl" : "objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
}
|
||||
gObjectSimpleProgram[i].mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
if(fog)
|
||||
gObjectSimpleProgram[i].mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
if(!(success = gObjectSimpleProgram[i].createShader(NULL, NULL)))
|
||||
break;
|
||||
|
||||
features.calculatesLighting = false;
|
||||
features.hasLighting = false;
|
||||
features.hasTransport = true;
|
||||
features.hasAtmospherics = false;
|
||||
features.isFullbright = true;
|
||||
features.hasGamma |= (shiny && fog);
|
||||
|
||||
gObjectFullbrightProgram[i].mName = std::string("Fullbright") + name + " Shader";
|
||||
gObjectFullbrightProgram[i].mFeatures = features;
|
||||
gObjectFullbrightProgram[i].mShaderFiles.clear();
|
||||
if(!shiny)
|
||||
{
|
||||
gObjectFullbrightProgram[i].mShaderFiles.push_back(make_pair(skin ? "objects/fullbrightSkinnedV.glsl" : "objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightProgram[i].mShaderFiles.push_back(make_pair(fog ? "objects/fullbrightWaterF.glsl" : "objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
}
|
||||
else
|
||||
{
|
||||
gObjectFullbrightProgram[i].mShaderFiles.push_back(make_pair(skin ? "objects/fullbrightShinySkinnedV.glsl" : "objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightProgram[i].mShaderFiles.push_back(make_pair(fog ? "objects/fullbrightShinyWaterF.glsl" : "objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
}
|
||||
gObjectFullbrightProgram[i].mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
if(fog)
|
||||
gObjectFullbrightProgram[i].mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
if(!(success = gObjectFullbrightProgram[i].createShader(NULL, NULL)))
|
||||
break;
|
||||
|
||||
if(!shiny)
|
||||
{
|
||||
gObjectEmissiveProgram[i].mName = std::string("Emissive") + name + " Shader";
|
||||
gObjectEmissiveProgram[i].mFeatures = features;
|
||||
gObjectEmissiveProgram[i].mShaderFiles.clear();
|
||||
gObjectEmissiveProgram[i].mShaderFiles.push_back(make_pair(skin ? "objects/emissiveSkinnedV.glsl" : "objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectEmissiveProgram[i].mShaderFiles.push_back(make_pair(fog ? "objects/fullbrightWaterF.glsl" : "objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectEmissiveProgram[i].mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
if(fog)
|
||||
gObjectEmissiveProgram[i].mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
if(!(success = gObjectEmissiveProgram[i].createShader(NULL, NULL)))
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectSimpleImpostorProgram.mName = "Simple Impostor Shader";
|
||||
gObjectSimpleImpostorProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectSimpleImpostorProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectSimpleImpostorProgram.mFeatures.hasGamma = true;
|
||||
gObjectSimpleImpostorProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectSimpleImpostorProgram.mFeatures.hasLighting = true;
|
||||
gObjectSimpleImpostorProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
// force alpha mask version of lighting so we can weed out
|
||||
// transparent pixels from impostor temp buffer
|
||||
//
|
||||
gObjectSimpleImpostorProgram.mFeatures.hasAlphaMask = true;
|
||||
gObjectSimpleImpostorProgram.mShaderFiles.clear();
|
||||
gObjectSimpleImpostorProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectSimpleImpostorProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectSimpleImpostorProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
|
||||
success = gObjectSimpleImpostorProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectSimpleWaterProgram.mName = "Simple Water Shader";
|
||||
gObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectSimpleWaterProgram.mFeatures.hasLighting = true;
|
||||
gObjectSimpleWaterProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectSimpleWaterProgram.mShaderFiles.clear();
|
||||
gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectSimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectSimpleWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectBumpProgram.mName = "Bump Shader";
|
||||
@@ -2318,390 +2137,6 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
||||
gObjectBumpProgram.unbind();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectSimpleAlphaMaskProgram.mName = "Simple Alpha Mask Shader";
|
||||
gObjectSimpleAlphaMaskProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectSimpleAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectSimpleAlphaMaskProgram.mFeatures.hasGamma = true;
|
||||
gObjectSimpleAlphaMaskProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectSimpleAlphaMaskProgram.mFeatures.hasLighting = true;
|
||||
gObjectSimpleAlphaMaskProgram.mFeatures.hasAlphaMask = true;
|
||||
gObjectSimpleAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectSimpleAlphaMaskProgram.mShaderFiles.clear();
|
||||
gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectSimpleAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectSimpleAlphaMaskProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectSimpleWaterAlphaMaskProgram.mName = "Simple Water Alpha Mask Shader";
|
||||
gObjectSimpleWaterAlphaMaskProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectSimpleWaterAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasLighting = true;
|
||||
gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasAlphaMask = true;
|
||||
gObjectSimpleWaterAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectSimpleWaterAlphaMaskProgram.mShaderFiles.clear();
|
||||
gObjectSimpleWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectSimpleWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectSimpleWaterAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectSimpleWaterAlphaMaskProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectSimpleWaterAlphaMaskProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightProgram.mName = "Fullbright Shader";
|
||||
gObjectFullbrightProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightProgram.mFeatures.hasGamma = true;
|
||||
gObjectFullbrightProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectFullbrightProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectFullbrightProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightWaterProgram.mName = "Fullbright Water Shader";
|
||||
gObjectFullbrightWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectFullbrightWaterProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightWaterProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectFullbrightWaterProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectFullbrightWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectEmissiveProgram.mName = "Emissive Shader";
|
||||
gObjectEmissiveProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectEmissiveProgram.mFeatures.hasGamma = true;
|
||||
gObjectEmissiveProgram.mFeatures.hasTransport = true;
|
||||
gObjectEmissiveProgram.mFeatures.isFullbright = true;
|
||||
gObjectEmissiveProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectEmissiveProgram.mShaderFiles.clear();
|
||||
gObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectEmissiveProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectEmissiveWaterProgram.mName = "Emissive Water Shader";
|
||||
gObjectEmissiveWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectEmissiveWaterProgram.mFeatures.isFullbright = true;
|
||||
gObjectEmissiveWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectEmissiveWaterProgram.mFeatures.hasTransport = true;
|
||||
gObjectEmissiveWaterProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectEmissiveWaterProgram.mShaderFiles.clear();
|
||||
gObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectEmissiveWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectEmissiveWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectEmissiveWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightAlphaMaskProgram.mName = "Fullbright Alpha Mask Shader";
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.hasGamma = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.hasAlphaMask = true;
|
||||
gObjectFullbrightAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectFullbrightAlphaMaskProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectFullbrightAlphaMaskProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mName = "Fullbright Water Shader";
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mFeatures.hasAlphaMask = true;
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectFullbrightWaterAlphaMaskProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectFullbrightWaterAlphaMaskProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectShinyProgram.mName = "Shiny Shader";
|
||||
gObjectShinyProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectShinyProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectShinyProgram.mFeatures.hasGamma = true;
|
||||
gObjectShinyProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectShinyProgram.mFeatures.isShiny = true;
|
||||
gObjectShinyProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectShinyProgram.mShaderFiles.clear();
|
||||
gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectShinyProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectShinyWaterProgram.mName = "Shiny Water Shader";
|
||||
gObjectShinyWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectShinyWaterProgram.mFeatures.calculatesLighting = true;
|
||||
gObjectShinyWaterProgram.mFeatures.isShiny = true;
|
||||
gObjectShinyWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectShinyWaterProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectShinyWaterProgram.mShaderFiles.clear();
|
||||
gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectShinyWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightShinyProgram.mName = "Fullbright Shiny Shader";
|
||||
gObjectFullbrightShinyProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightShinyProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightShinyProgram.mFeatures.isShiny = true;
|
||||
gObjectFullbrightShinyProgram.mFeatures.hasGamma = true;
|
||||
gObjectFullbrightShinyProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightShinyProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectFullbrightShinyProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectFullbrightShinyProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightShinyWaterProgram.mName = "Fullbright Shiny Water Shader";
|
||||
gObjectFullbrightShinyWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true;
|
||||
gObjectFullbrightShinyWaterProgram.mFeatures.isShiny = true;
|
||||
gObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true;
|
||||
gObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true;
|
||||
gObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectFullbrightShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
|
||||
gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectFullbrightShinyWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (mVertexShaderLevel[SHADER_AVATAR] > 0)
|
||||
{ //load hardware skinned attachment shaders
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectSimpleProgram.mName = "Skinned Simple Shader";
|
||||
gSkinnedObjectSimpleProgram.mFeatures.calculatesLighting = true;
|
||||
gSkinnedObjectSimpleProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectSimpleProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectSimpleProgram.mFeatures.hasAtmospherics = true;
|
||||
gSkinnedObjectSimpleProgram.mFeatures.hasLighting = true;
|
||||
gSkinnedObjectSimpleProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectSimpleProgram.mFeatures.hasAlphaMask = true;
|
||||
gSkinnedObjectSimpleProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectSimpleProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectSimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectSimpleProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectFullbrightProgram.mName = "Skinned Fullbright Shader";
|
||||
gSkinnedObjectFullbrightProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectFullbrightProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectFullbrightProgram.mFeatures.hasTransport = true;
|
||||
gSkinnedObjectFullbrightProgram.mFeatures.isFullbright = true;
|
||||
gSkinnedObjectFullbrightProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectFullbrightProgram.mFeatures.hasAlphaMask = true;
|
||||
gSkinnedObjectFullbrightProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectFullbrightProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectFullbrightProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectFullbrightProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectEmissiveProgram.mName = "Skinned Emissive Shader";
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.hasTransport = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.isFullbright = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectEmissiveProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectEmissiveProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectEmissiveWaterProgram.mName = "Skinned Emissive Water Shader";
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.hasTransport = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.isFullbright = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectEmissiveWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectEmissiveWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectFullbrightShinyProgram.mName = "Skinned Fullbright Shiny Shader";
|
||||
gSkinnedObjectFullbrightShinyProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectFullbrightShinyProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectFullbrightShinyProgram.mFeatures.hasTransport = true;
|
||||
gSkinnedObjectFullbrightShinyProgram.mFeatures.isShiny = true;
|
||||
gSkinnedObjectFullbrightShinyProgram.mFeatures.isFullbright = true;
|
||||
gSkinnedObjectFullbrightShinyProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectFullbrightShinyProgram.mFeatures.hasAlphaMask = true;
|
||||
gSkinnedObjectFullbrightShinyProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectFullbrightShinyProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectFullbrightShinyProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectShinySimpleProgram.mName = "Skinned Shiny Simple Shader";
|
||||
gSkinnedObjectShinySimpleProgram.mFeatures.calculatesLighting = true;
|
||||
gSkinnedObjectShinySimpleProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectShinySimpleProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectShinySimpleProgram.mFeatures.hasAtmospherics = true;
|
||||
gSkinnedObjectShinySimpleProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectShinySimpleProgram.mFeatures.hasAlphaMask = true;
|
||||
gSkinnedObjectShinySimpleProgram.mFeatures.isShiny = true;
|
||||
gSkinnedObjectShinySimpleProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectShinySimpleProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectShinySimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectShinySimpleProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectSimpleWaterProgram.mName = "Skinned Simple Water Shader";
|
||||
gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;
|
||||
gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectSimpleWaterProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
|
||||
gSkinnedObjectSimpleWaterProgram.mFeatures.hasLighting = true;
|
||||
gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gSkinnedObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectSimpleWaterProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectSimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectSimpleWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectFullbrightWaterProgram.mName = "Skinned Fullbright Water Shader";
|
||||
gSkinnedObjectFullbrightWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectFullbrightWaterProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectFullbrightWaterProgram.mFeatures.hasTransport = true;
|
||||
gSkinnedObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
|
||||
gSkinnedObjectFullbrightWaterProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectFullbrightWaterProgram.mFeatures.hasAlphaMask = true;
|
||||
gSkinnedObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gSkinnedObjectFullbrightWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
gSkinnedObjectFullbrightWaterProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectFullbrightWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectFullbrightWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mName = "Skinned Fullbright Shiny Water Shader";
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isShiny = true;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasAlphaMask = true;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectFullbrightShinyWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectShinySimpleWaterProgram.mName = "Skinned Shiny Simple Water Shader";
|
||||
gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesLighting = true;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasAtmospherics = true;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasAlphaMask = true;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mFeatures.isShiny = true;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectShinySimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectShinySimpleWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if( !success )
|
||||
{
|
||||
|
||||
@@ -32,6 +32,16 @@
|
||||
|
||||
#define LL_DEFERRED_MULTI_LIGHT_COUNT 16
|
||||
|
||||
enum
|
||||
{
|
||||
SHD_ALPHA_MASK_BIT = 0,
|
||||
SHD_WATER_BIT,
|
||||
SHD_NO_INDEX_BIT,
|
||||
SHD_SKIN_BIT,
|
||||
SHD_SHINY_BIT,
|
||||
SHD_COUNT
|
||||
};
|
||||
|
||||
class LLViewerShaderMgr: public LLShaderMgr
|
||||
{
|
||||
public:
|
||||
@@ -208,32 +218,17 @@ extern LLGLSLShader gTwoTextureAddProgram;
|
||||
extern LLGLSLShader gOneTextureNoColorProgram;
|
||||
|
||||
//object shaders
|
||||
extern LLGLSLShader gObjectSimpleProgram;
|
||||
extern LLGLSLShader gObjectSimpleImpostorProgram;
|
||||
|
||||
extern LLGLSLShaderArray<LLViewerShaderMgr::SHADER_OBJECT> gObjectSimpleProgram[1<<SHD_COUNT];
|
||||
extern LLGLSLShaderArray<LLViewerShaderMgr::SHADER_OBJECT> gObjectFullbrightProgram[1<<SHD_COUNT];
|
||||
extern LLGLSLShaderArray<LLViewerShaderMgr::SHADER_OBJECT> gObjectEmissiveProgram[1<<SHD_SHINY_BIT];
|
||||
extern LLGLSLShader gObjectPreviewProgram;
|
||||
extern LLGLSLShader gObjectSimpleAlphaMaskProgram;
|
||||
extern LLGLSLShader gObjectSimpleWaterProgram;
|
||||
extern LLGLSLShader gObjectSimpleWaterAlphaMaskProgram;
|
||||
extern LLGLSLShader gObjectSimpleNonIndexedProgram;
|
||||
extern LLGLSLShader gObjectSimpleNonIndexedTexGenProgram;
|
||||
extern LLGLSLShader gObjectSimpleNonIndexedTexGenWaterProgram;
|
||||
extern LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
|
||||
extern LLGLSLShader gObjectAlphaMaskNonIndexedProgram;
|
||||
extern LLGLSLShader gObjectAlphaMaskNonIndexedWaterProgram;
|
||||
extern LLGLSLShader gObjectAlphaMaskNoColorProgram;
|
||||
extern LLGLSLShader gObjectAlphaMaskNoColorWaterProgram;
|
||||
extern LLGLSLShader gObjectFullbrightProgram;
|
||||
extern LLGLSLShader gObjectFullbrightWaterProgram;
|
||||
extern LLGLSLShader gObjectFullbrightNoColorProgram;
|
||||
extern LLGLSLShader gObjectFullbrightNoColorWaterProgram;
|
||||
extern LLGLSLShader gObjectEmissiveProgram;
|
||||
extern LLGLSLShader gObjectEmissiveWaterProgram;
|
||||
extern LLGLSLShader gObjectFullbrightAlphaMaskProgram;
|
||||
extern LLGLSLShader gObjectFullbrightWaterAlphaMaskProgram;
|
||||
extern LLGLSLShader gObjectFullbrightNonIndexedProgram;
|
||||
extern LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
|
||||
extern LLGLSLShader gObjectEmissiveNonIndexedProgram;
|
||||
extern LLGLSLShader gObjectEmissiveNonIndexedWaterProgram;
|
||||
extern LLGLSLShader gObjectBumpProgram;
|
||||
extern LLGLSLShader gTreeProgram;
|
||||
extern LLGLSLShader gTreeWaterProgram;
|
||||
@@ -241,28 +236,6 @@ extern LLGLSLShader gTreeWaterProgram;
|
||||
extern LLGLSLShader gObjectSimpleLODProgram;
|
||||
extern LLGLSLShader gObjectFullbrightLODProgram;
|
||||
|
||||
extern LLGLSLShader gObjectFullbrightShinyProgram;
|
||||
extern LLGLSLShader gObjectFullbrightShinyWaterProgram;
|
||||
extern LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
|
||||
extern LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
|
||||
|
||||
extern LLGLSLShader gObjectShinyProgram;
|
||||
extern LLGLSLShader gObjectShinyWaterProgram;
|
||||
extern LLGLSLShader gObjectShinyNonIndexedProgram;
|
||||
extern LLGLSLShader gObjectShinyNonIndexedWaterProgram;
|
||||
|
||||
extern LLGLSLShader gSkinnedObjectSimpleProgram;
|
||||
extern LLGLSLShader gSkinnedObjectFullbrightProgram;
|
||||
extern LLGLSLShader gSkinnedObjectEmissiveProgram;
|
||||
extern LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
|
||||
extern LLGLSLShader gSkinnedObjectShinySimpleProgram;
|
||||
|
||||
extern LLGLSLShader gSkinnedObjectSimpleWaterProgram;
|
||||
extern LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
|
||||
extern LLGLSLShader gSkinnedObjectEmissiveWaterProgram;
|
||||
extern LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
|
||||
extern LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
|
||||
|
||||
//environment shaders
|
||||
extern LLGLSLShader gTerrainProgram;
|
||||
extern LLGLSLShader gTerrainWaterProgram;
|
||||
|
||||
@@ -259,7 +259,7 @@ extern void toggle_debug_menus(void*);
|
||||
// LLDebugText
|
||||
//
|
||||
|
||||
extern std::map<LLGLuint, std::list<std::pair<std::string,std::string> > > sTextureMaskMap;
|
||||
//extern std::map<LLGLuint, std::list<std::pair<std::string,std::string> > > sTextureMaskMap;
|
||||
|
||||
class LLDebugText
|
||||
{
|
||||
@@ -356,7 +356,7 @@ public:
|
||||
LLViewerTexture* imagep = obj->getTEImage(te);
|
||||
if(imagep && imagep != (LLViewerTexture*)LLViewerFetchedTexture::sDefaultImagep.get())
|
||||
{
|
||||
LLGLuint tex = imagep->getTexName();
|
||||
/*LLGLuint tex = imagep->getTexName();
|
||||
std::map<LLGLuint, std::list<std::pair<std::string,std::string> > >::iterator it = sTextureMaskMap.find(tex);
|
||||
if(it != sTextureMaskMap.end())
|
||||
{
|
||||
@@ -365,7 +365,7 @@ public:
|
||||
{
|
||||
addText(xpos, ypos, llformat(" %s: %s", it2->first.c_str(), it2->second.c_str())); ypos += y_inc;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
static const LLCachedControl<bool> use_rmse_auto_mask("SHUseRMSEAutoMask",false);
|
||||
static const LLCachedControl<F32> auto_mask_max_rmse("SHAutoMaskMaxRMSE",.09f);
|
||||
addText(xpos, ypos, llformat("Mask: %s", imagep->getIsAlphaMask(use_rmse_auto_mask ? auto_mask_max_rmse : -1.f) ? "TRUE":"FALSE")); ypos += y_inc;
|
||||
@@ -1641,10 +1641,6 @@ LLViewerWindow::LLViewerWindow(
|
||||
resetSnapshotLoc();
|
||||
|
||||
S32 vsync_mode = gSavedSettings.getS32("SHRenderVsyncMode");
|
||||
if(vsync_mode == -1 && !gGLManager.mHasAdaptiveVsync)
|
||||
{
|
||||
vsync_mode = 0; //Disable vsync if adaptive is desired yet isn't supported.
|
||||
}
|
||||
|
||||
// create window
|
||||
mWindow = LLWindowManager::createWindow(this,
|
||||
|
||||
@@ -777,6 +777,11 @@ void LLGrassPartition::getGeometry(LLSpatialGroup* group)
|
||||
}
|
||||
}
|
||||
|
||||
if(vertex_count > 0)
|
||||
{
|
||||
buffer->validateRange(0, vertex_count - 1, index_count, 0);
|
||||
}
|
||||
|
||||
buffer->flush();
|
||||
mFaceList.clear();
|
||||
}
|
||||
|
||||
@@ -988,6 +988,11 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
|
||||
//for alpha sorting
|
||||
facep->setDrawInfo(info);
|
||||
}
|
||||
|
||||
if(facep->getGeomCount() > 0)
|
||||
{
|
||||
buffer->validateRange(facep->getGeomIndex(), facep->getGeomIndex() + facep->getGeomCount() - 1, facep->getIndicesCount(), facep->getIndicesStart());
|
||||
}
|
||||
}
|
||||
|
||||
mFaceList.clear();
|
||||
|
||||
@@ -4149,6 +4149,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
||||
return;
|
||||
}
|
||||
|
||||
if(!facep->mShinyInAlpha)
|
||||
facep->mShinyInAlpha = (type == LLRenderPass::PASS_FULLBRIGHT_SHINY) ||
|
||||
(type == LLRenderPass::PASS_INVISI_SHINY) ||
|
||||
(type == LLRenderPass::PASS_SHINY) ||
|
||||
(LLPipeline::sRenderDeferred && type == LLRenderPass::PASS_BUMP) ||
|
||||
(LLPipeline::sRenderDeferred && type == LLRenderPass::PASS_SIMPLE);
|
||||
|
||||
//add face to drawmap
|
||||
LLSpatialGroup::drawmap_elem_t& draw_vec = group->mDrawMap[type];
|
||||
|
||||
@@ -4206,8 +4213,9 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
||||
U32 pool_type = facep->getPoolType();
|
||||
|
||||
bool cmp_bump = (type == LLRenderPass::PASS_BUMP) || (type == LLRenderPass::PASS_POST_BUMP);
|
||||
bool cmp_mat = (!alt_batching) || LLPipeline::sRenderDeferred && /*facep->getTextureEntry()->getColor().mV[3] >= 0.999f &&*/
|
||||
((pool_type == LLDrawPool::POOL_MATERIALS) || (pool_type == LLDrawPool::POOL_ALPHA));
|
||||
bool cmp_mat = (!alt_batching) || LLPipeline::sRenderDeferred &&
|
||||
((pool_type == LLDrawPool::POOL_MATERIALS) || (pool_type == LLDrawPool::POOL_ALPHA)) ||
|
||||
pool_type == LLDrawPool::POOL_ALPHA_MASK || pool_type == LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK;
|
||||
bool cmp_shiny = (!alt_batching) ? !!mat : (mat && cmp_mat);
|
||||
bool cmp_fullbright = !alt_batching || cmp_shiny || pool_type == LLDrawPool::POOL_ALPHA;
|
||||
|
||||
@@ -4287,7 +4295,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
||||
draw_vec[idx]->mTextureList.resize(index+1);
|
||||
draw_vec[idx]->mTextureList[index] = tex;
|
||||
}
|
||||
draw_vec[idx]->validate();
|
||||
//draw_vec[idx]->validate();
|
||||
update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[0]);
|
||||
update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[1]);
|
||||
}
|
||||
@@ -4371,7 +4379,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
|
||||
draw_info->mTextureList[index] = tex;
|
||||
}
|
||||
|
||||
draw_info->validate();
|
||||
//draw_info->validate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5871,7 +5879,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac
|
||||
//for debugging, set last time face was updated vs moved
|
||||
facep->updateRebuildFlags();
|
||||
|
||||
if (!LLPipeline::sDelayVBUpdate)
|
||||
//Singu Note: Moved to after registerFace calls, as those update LLFace::mShinyInAlpha, which is needed before updating the vertex buffer.
|
||||
/*if (!LLPipeline::sDelayVBUpdate)
|
||||
{ //copy face geometry into vertex buffer
|
||||
LLDrawable* drawablep = facep->getDrawable();
|
||||
LLVOVolume* vobj = drawablep->getVOVolume();
|
||||
@@ -5896,11 +5905,10 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac
|
||||
{
|
||||
vobj->updateRelativeXform(false);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
index_offset += facep->getGeomCount();
|
||||
indices_index += facep->getIndicesCount();
|
||||
facep->mShinyInAlpha = false;
|
||||
|
||||
static const LLCachedControl<bool> alt_batching("SHAltBatching",true);
|
||||
|
||||
@@ -6316,10 +6324,46 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac
|
||||
registerFace(group, facep, LLRenderPass::PASS_GLOW);
|
||||
}
|
||||
}
|
||||
|
||||
//Singu Note: LLFace::mShinyInAlpha has been updated by now. We're good to go.
|
||||
if (!LLPipeline::sDelayVBUpdate)
|
||||
{ //copy face geometry into vertex buffer
|
||||
LLDrawable* drawablep = facep->getDrawable();
|
||||
LLVOVolume* vobj = drawablep->getVOVolume();
|
||||
LLVolume* volume = vobj->getVolume();
|
||||
|
||||
if (drawablep->isState(LLDrawable::ANIMATED_CHILD))
|
||||
{
|
||||
vobj->updateRelativeXform(true);
|
||||
}
|
||||
|
||||
U32 te_idx = facep->getTEOffset();
|
||||
|
||||
llassert(!facep->isState(LLFace::RIGGED));
|
||||
|
||||
if (!facep->getGeometryVolume(*volume, te_idx,
|
||||
vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset,true))
|
||||
{
|
||||
llwarns << "Failed to get geometry for face!" << llendl;
|
||||
}
|
||||
|
||||
if (drawablep->isState(LLDrawable::ANIMATED_CHILD))
|
||||
{
|
||||
vobj->updateRelativeXform(false);
|
||||
}
|
||||
}
|
||||
|
||||
index_offset += facep->getGeomCount();
|
||||
indices_index += facep->getIndicesCount();
|
||||
|
||||
++face_iter;
|
||||
}
|
||||
|
||||
if(index_offset > 0)
|
||||
{
|
||||
buffer->validateRange(0, index_offset - 1, indices_index, 0);
|
||||
}
|
||||
|
||||
buffer->flush();
|
||||
}
|
||||
|
||||
|
||||
@@ -741,13 +741,13 @@ class LinuxManifest(ViewerManifest):
|
||||
self.path("featuretable_linux.txt")
|
||||
|
||||
def wrapper_name(self):
|
||||
return 'singularity'
|
||||
return self.viewer_branding_id()
|
||||
|
||||
def binary_name(self):
|
||||
return 'singularity-do-not-run-directly'
|
||||
return self.viewer_branding_id() + '-do-not-run-directly'
|
||||
|
||||
def icon_name(self):
|
||||
return "singularity_icon.png"
|
||||
return self.viewer_branding_id() + "_icon.png"
|
||||
|
||||
def package_finish(self):
|
||||
if 'installer_name' in self.args:
|
||||
|
||||
Reference in New Issue
Block a user