Parammanagers are really not done well. Added manager-specific shader lists instead of just having them dig down the global list every update.
This commit is contained in:
@@ -537,6 +537,10 @@ void LLViewerShaderMgr::setShaders()
|
||||
{
|
||||
gViewerWindow->setCursor(UI_CURSOR_ARROW);
|
||||
}
|
||||
|
||||
LLWaterParamManager::instance()->updateShaderLinks();
|
||||
LLWLParamManager::instance()->updateShaderLinks();
|
||||
|
||||
gPipeline.createGLBuffers();
|
||||
reentrance = false;
|
||||
}
|
||||
|
||||
@@ -227,14 +227,10 @@ void LLWaterParamManager::propagateParameters(void)
|
||||
if(gPipeline.canUseVertexShaders())
|
||||
{
|
||||
LLViewerShaderMgr::shader_iter shaders_iter, end_shaders;
|
||||
end_shaders = LLViewerShaderMgr::instance()->endShaders();
|
||||
for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
end_shaders = mShaderList.end();
|
||||
for(shaders_iter = mShaderList.begin(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
{
|
||||
if (shaders_iter->mProgramObject != 0
|
||||
&& shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER)
|
||||
{
|
||||
shaders_iter->mUniformsDirty = TRUE;
|
||||
}
|
||||
shaders_iter->mUniformsDirty = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -260,6 +256,28 @@ void LLWaterParamManager::updateShaderUniforms(LLGLSLShader * shader)
|
||||
}
|
||||
}
|
||||
|
||||
void LLWaterParamManager::updateShaderLinks()
|
||||
{
|
||||
mShaderList.clear();
|
||||
LLViewerShaderMgr::shader_iter shaders_iter, end_shaders;
|
||||
end_shaders = LLViewerShaderMgr::instance()->endShaders();
|
||||
for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
{
|
||||
if (shaders_iter->mProgramObject != 0
|
||||
&& shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER)
|
||||
{
|
||||
if( glGetUniformLocationARB(shaders_iter->mProgramObject,"lightnorm")>=0 ||
|
||||
glGetUniformLocationARB(shaders_iter->mProgramObject,"camPosLocal")>=0 ||
|
||||
glGetUniformLocationARB(shaders_iter->mProgramObject,"waterFogColor")>=0 ||
|
||||
glGetUniformLocationARB(shaders_iter->mProgramObject,"waterPlane")>=0 ||
|
||||
glGetUniformLocationARB(shaders_iter->mProgramObject,"waterFogDensity")>=0 ||
|
||||
glGetUniformLocationARB(shaders_iter->mProgramObject,"waterFogKS")>=0 ||
|
||||
glGetUniformLocationARB(shaders_iter->mProgramObject,"distance_multiplier")>=0)
|
||||
mShaderList.push_back(&(*shaders_iter));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLWaterParamManager::update(LLViewerCamera * cam)
|
||||
{
|
||||
LLFastTimer ftm(LLFastTimer::FTM_UPDATE_WLPARAM);
|
||||
@@ -316,14 +334,10 @@ void LLWaterParamManager::update(LLViewerCamera * cam)
|
||||
mWaterFogKS = 1.f/llmax(sunMoonDir.mV[2], WATER_FOG_LIGHT_CLAMP);
|
||||
|
||||
LLViewerShaderMgr::shader_iter shaders_iter, end_shaders;
|
||||
end_shaders = LLViewerShaderMgr::instance()->endShaders();
|
||||
for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
end_shaders = mShaderList.end();
|
||||
for(shaders_iter = mShaderList.begin(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
{
|
||||
if (shaders_iter->mProgramObject != 0
|
||||
&& shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER)
|
||||
{
|
||||
shaders_iter->mUniformsDirty = TRUE;
|
||||
}
|
||||
shaders_iter->mUniformsDirty = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,6 +225,8 @@ public:
|
||||
LLWaterParamManager();
|
||||
~LLWaterParamManager();
|
||||
|
||||
void updateShaderLinks();
|
||||
|
||||
/// load a preset file
|
||||
void loadAllPresets(const std::string & fileName);
|
||||
|
||||
@@ -319,6 +321,7 @@ public:
|
||||
private:
|
||||
LLVector4 mWaterPlane;
|
||||
F32 mWaterFogKS;
|
||||
std::vector<LLGLSLShader *> mShaderList;
|
||||
|
||||
// our parameter manager singleton instance
|
||||
static LLWaterParamManager * sInstance;
|
||||
|
||||
@@ -286,6 +286,25 @@ void LLWLParamManager::updateShaderUniforms(LLGLSLShader * shader)
|
||||
|
||||
}
|
||||
|
||||
void LLWLParamManager::updateShaderLinks()
|
||||
{
|
||||
mShaderList.clear();
|
||||
LLViewerShaderMgr::shader_iter shaders_iter, end_shaders;
|
||||
end_shaders = LLViewerShaderMgr::instance()->endShaders();
|
||||
for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
{
|
||||
if (shaders_iter->mProgramObject != 0
|
||||
&& (gPipeline.canUseWindLightShaders() || shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER))
|
||||
{
|
||||
if( glGetUniformLocationARB(shaders_iter->mProgramObject,"lightnorm")>=0 ||
|
||||
glGetUniformLocationARB(shaders_iter->mProgramObject,"camPosLocal")>=0 ||
|
||||
glGetUniformLocationARB(shaders_iter->mProgramObject,"scene_light_strength")>=0 ||
|
||||
glGetUniformLocationARB(shaders_iter->mProgramObject,"cloud_pos_density1")>=0)
|
||||
mShaderList.push_back(&(*shaders_iter));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLWLParamManager::propagateParameters(void)
|
||||
{
|
||||
LLFastTimer ftm(LLFastTimer::FTM_UPDATE_WLPARAM);
|
||||
@@ -338,15 +357,10 @@ void LLWLParamManager::propagateParameters(void)
|
||||
|
||||
// bind the variables for all shaders only if we're using WindLight
|
||||
LLViewerShaderMgr::shader_iter shaders_iter, end_shaders;
|
||||
end_shaders = LLViewerShaderMgr::instance()->endShaders();
|
||||
for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
end_shaders = mShaderList.end();
|
||||
for(shaders_iter = mShaderList.begin(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
{
|
||||
if (shaders_iter->mProgramObject != 0
|
||||
&& (gPipeline.canUseWindLightShaders()
|
||||
|| shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER))
|
||||
{
|
||||
shaders_iter->mUniformsDirty = TRUE;
|
||||
}
|
||||
shaders_iter->mUniformsDirty = TRUE;
|
||||
}
|
||||
|
||||
// get the cfr version of the sun's direction
|
||||
@@ -401,15 +415,10 @@ void LLWLParamManager::update(LLViewerCamera * cam)
|
||||
mRotatedLightDir = LLVector4(lightNorm3, 0.f);
|
||||
|
||||
LLViewerShaderMgr::shader_iter shaders_iter, end_shaders;
|
||||
end_shaders = LLViewerShaderMgr::instance()->endShaders();
|
||||
for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
end_shaders = mShaderList.end();
|
||||
for(shaders_iter = mShaderList.begin(); shaders_iter != end_shaders; ++shaders_iter)
|
||||
{
|
||||
if (shaders_iter->mProgramObject != 0
|
||||
&& (gPipeline.canUseWindLightShaders()
|
||||
|| shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER))
|
||||
{
|
||||
shaders_iter->mUniformsDirty = TRUE;
|
||||
}
|
||||
shaders_iter->mUniformsDirty = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,6 +129,8 @@ public:
|
||||
LLWLParamManager();
|
||||
~LLWLParamManager();
|
||||
|
||||
void updateShaderLinks();
|
||||
|
||||
/// load a preset file
|
||||
void loadPresets(const std::string & fileName);
|
||||
|
||||
@@ -254,6 +256,7 @@ public:
|
||||
|
||||
|
||||
private:
|
||||
std::vector<LLGLSLShader *> mShaderList;
|
||||
// our parameter manager singleton instance
|
||||
static LLWLParamManager * sInstance;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user