aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/lldrawpoolalpha.cpp
diff options
context:
space:
mode:
authorJacek Antonelli2009-04-30 13:04:20 -0500
committerJacek Antonelli2009-04-30 13:07:16 -0500
commitca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e (patch)
tree8348301d0ac44a524f1819b777686bf086907d76 /linden/indra/newview/lldrawpoolalpha.cpp
parentSecond Life viewer sources 1.22.11 (diff)
downloadmeta-impy-ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e.zip
meta-impy-ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e.tar.gz
meta-impy-ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e.tar.bz2
meta-impy-ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e.tar.xz
Second Life viewer sources 1.23.0-RC
Diffstat (limited to 'linden/indra/newview/lldrawpoolalpha.cpp')
-rw-r--r--linden/indra/newview/lldrawpoolalpha.cpp305
1 files changed, 195 insertions, 110 deletions
diff --git a/linden/indra/newview/lldrawpoolalpha.cpp b/linden/indra/newview/lldrawpoolalpha.cpp
index 2452ee8..7e470bd 100644
--- a/linden/indra/newview/lldrawpoolalpha.cpp
+++ b/linden/indra/newview/lldrawpoolalpha.cpp
@@ -17,7 +17,8 @@
17 * There are special exceptions to the terms and conditions of the GPL as 17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception 20 * online at
21 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
21 * 22 *
22 * By copying, modifying or distributing this software, you acknowledge 23 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 24 * that you have read and understood your obligations described above,
@@ -56,7 +57,7 @@
56 57
57BOOL LLDrawPoolAlpha::sShowDebugAlpha = FALSE; 58BOOL LLDrawPoolAlpha::sShowDebugAlpha = FALSE;
58 59
59 60static BOOL deferred_render = FALSE;
60 61
61LLDrawPoolAlpha::LLDrawPoolAlpha(U32 type) : 62LLDrawPoolAlpha::LLDrawPoolAlpha(U32 type) :
62 LLRenderPass(type), current_shader(NULL), target_shader(NULL), 63 LLRenderPass(type), current_shader(NULL), target_shader(NULL),
@@ -75,6 +76,67 @@ void LLDrawPoolAlpha::prerender()
75 mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT); 76 mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
76} 77}
77 78
79S32 LLDrawPoolAlpha::getNumDeferredPasses()
80{
81 return 1;
82}
83
84void LLDrawPoolAlpha::beginDeferredPass(S32 pass)
85{
86
87}
88
89void LLDrawPoolAlpha::endDeferredPass(S32 pass)
90{
91 gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.4f);
92 {
93 LLFastTimer t(LLFastTimer::FTM_RENDER_GRASS);
94 gDeferredTreeProgram.bind();
95 LLGLEnable test(GL_ALPHA_TEST);
96 //render alpha masked objects
97 LLRenderPass::renderTexture(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
98 }
99 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
100}
101
102void LLDrawPoolAlpha::renderDeferred(S32 pass)
103{
104
105}
106
107
108S32 LLDrawPoolAlpha::getNumPostDeferredPasses()
109{
110 return 1;
111}
112
113void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
114{
115 LLFastTimer t(LLFastTimer::FTM_RENDER_ALPHA);
116
117 simple_shader = &gDeferredAlphaProgram;
118 fullbright_shader = &gDeferredFullbrightProgram;
119
120 deferred_render = TRUE;
121 if (mVertexShaderLevel > 0)
122 {
123 // Start out with no shaders.
124 current_shader = target_shader = NULL;
125 }
126 gPipeline.enableLightsDynamic();
127}
128
129void LLDrawPoolAlpha::endPostDeferredPass(S32 pass)
130{
131 deferred_render = FALSE;
132 endRenderPass(pass);
133}
134
135void LLDrawPoolAlpha::renderPostDeferred(S32 pass)
136{
137 render(pass);
138}
139
78void LLDrawPoolAlpha::beginRenderPass(S32 pass) 140void LLDrawPoolAlpha::beginRenderPass(S32 pass)
79{ 141{
80 LLFastTimer t(LLFastTimer::FTM_RENDER_ALPHA); 142 LLFastTimer t(LLFastTimer::FTM_RENDER_ALPHA);
@@ -114,12 +176,40 @@ void LLDrawPoolAlpha::render(S32 pass)
114{ 176{
115 LLFastTimer t(LLFastTimer::FTM_RENDER_ALPHA); 177 LLFastTimer t(LLFastTimer::FTM_RENDER_ALPHA);
116 178
117 LLGLDepthTest depth(GL_TRUE, LLDrawPoolWater::sSkipScreenCopy ? GL_TRUE : GL_FALSE);
118
119 LLGLSPipelineAlpha gls_pipeline_alpha; 179 LLGLSPipelineAlpha gls_pipeline_alpha;
120 180
181 if (LLPipeline::sFastAlpha && !deferred_render)
182 {
183 gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f);
184 if (mVertexShaderLevel > 0)
185 {
186 if (!LLPipeline::sRenderDeferred)
187 {
188 simple_shader->bind();
189 pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
190 }
191 fullbright_shader->bind();
192 pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask());
193 LLGLSLShader::bindNoShader();
194 }
195 else
196 {
197 gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
198 pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask());
199 gPipeline.enableLightsDynamic();
200 pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
201 }
202 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
203 }
204
205 LLGLDepthTest depth(GL_TRUE, LLDrawPoolWater::sSkipScreenCopy ? GL_TRUE : GL_FALSE);
121 renderAlpha(getVertexDataMask()); 206 renderAlpha(getVertexDataMask());
122 207
208 if (deferred_render && current_shader != NULL)
209 {
210 gPipeline.unbindDeferredShader(*current_shader);
211 }
212
123 if (sShowDebugAlpha) 213 if (sShowDebugAlpha)
124 { 214 {
125 if(gPipeline.canUseWindLightShaders()) 215 if(gPipeline.canUseWindLightShaders())
@@ -131,20 +221,7 @@ void LLDrawPoolAlpha::render(S32 pass)
131 LLViewerImage::sSmokeImagep->addTextureStats(1024.f*1024.f); 221 LLViewerImage::sSmokeImagep->addTextureStats(1024.f*1024.f);
132 gGL.getTexUnit(0)->bind(LLViewerImage::sSmokeImagep.get()); 222 gGL.getTexUnit(0)->bind(LLViewerImage::sSmokeImagep.get());
133 renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX | 223 renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
134 LLVertexBuffer::MAP_TEXCOORD); 224 LLVertexBuffer::MAP_TEXCOORD0);
135 }
136}
137
138void LLDrawPoolAlpha::renderAlpha(U32 mask)
139{
140 for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
141 {
142 LLSpatialGroup* group = *i;
143 if (group->mSpatialPartition->mRenderByGroup &&
144 !group->isDead())
145 {
146 renderGroupAlpha(group,LLRenderPass::PASS_ALPHA,mask,TRUE);
147 }
148 } 225 }
149} 226}
150 227
@@ -168,7 +245,10 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
168 } 245 }
169 246
170 LLRenderPass::applyModelMatrix(params); 247 LLRenderPass::applyModelMatrix(params);
171 248 if (params.mGroup)
249 {
250 params.mGroup->rebuildMesh();
251 }
172 params.mVertexBuffer->setBuffer(mask); 252 params.mVertexBuffer->setBuffer(mask);
173 params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); 253 params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
174 gPipeline.addTrianglesDrawn(params.mCount/3); 254 gPipeline.addTrianglesDrawn(params.mCount/3);
@@ -177,40 +257,15 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
177 } 257 }
178} 258}
179 259
180void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture) 260void LLDrawPoolAlpha::renderAlpha(U32 mask)
181{ 261{
182 BOOL initialized_lighting = FALSE; 262 BOOL initialized_lighting = FALSE;
183 BOOL light_enabled = TRUE; 263 BOOL light_enabled = TRUE;
184 BOOL is_particle = FALSE; 264 //BOOL is_particle = FALSE;
185 BOOL use_shaders = (LLPipeline::sUnderWaterRender && gPipeline.canUseVertexShaders()) 265 BOOL use_shaders = (LLPipeline::sUnderWaterRender && gPipeline.canUseVertexShaders())
186 || gPipeline.canUseWindLightShadersOnObjects(); 266 || gPipeline.canUseWindLightShadersOnObjects();
187 F32 dist;
188
189 // check to see if it's a particle and if it's "close"
190 is_particle = !LLPipeline::sUnderWaterRender && (group->mSpatialPartition->mDrawableType == LLPipeline::RENDER_TYPE_PARTICLES);
191 dist = group->mDistance;
192 267
193 // don't use shader if debug setting is off and it's close or if it's a particle 268 // check to see if it's a particle and if it's "close"
194 // and it's close
195 if(is_particle && !gSavedSettings.getBOOL("RenderUseShaderNearParticles"))
196 {
197 if((dist < LLViewerCamera::getInstance()->getFar() * gSavedSettings.getF32("RenderShaderParticleThreshold")))
198 {
199 use_shaders = FALSE;
200 }
201 }
202
203 LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[type];
204
205 if (group->mSpatialPartition->mDrawableType == LLPipeline::RENDER_TYPE_CLOUDS)
206 {
207 if (!gSavedSettings.getBOOL("SkyUseClassicClouds"))
208 {
209 return;
210 }
211 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
212 }
213 else
214 { 269 {
215 if (LLPipeline::sImpostorRender) 270 if (LLPipeline::sImpostorRender)
216 { 271 {
@@ -222,79 +277,109 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask
222 } 277 }
223 } 278 }
224 279
225 for (LLSpatialGroup::drawmap_elem_t::iterator k = draw_info.begin(); k != draw_info.end(); ++k) 280 for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
226 { 281 {
227 LLDrawInfo& params = **k; 282 LLSpatialGroup* group = *i;
228 283 if (group->mSpatialPartition->mRenderByGroup &&
229 LLRenderPass::applyModelMatrix(params); 284 !group->isDead())
230
231 if (texture && params.mTexture.notNull())
232 { 285 {
233 gGL.getTexUnit(0)->activate(); 286 LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[LLRenderPass::PASS_ALPHA];
234 gGL.getTexUnit(0)->bind(params.mTexture.get());
235 params.mTexture->addTextureStats(params.mVSize);
236 if (params.mTextureMatrix)
237 {
238 glMatrixMode(GL_TEXTURE);
239 glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
240 gPipeline.mTextureMatrixOps++;
241 }
242 }
243 287
244 if (params.mFullbright) 288 for (LLSpatialGroup::drawmap_elem_t::iterator k = draw_info.begin(); k != draw_info.end(); ++k)
245 {
246 // Turn off lighting if it hasn't already been so.
247 if (light_enabled || !initialized_lighting)
248 { 289 {
249 initialized_lighting = TRUE; 290 LLDrawInfo& params = **k;
250 if (use_shaders) 291
292 LLRenderPass::applyModelMatrix(params);
293
294 if (params.mTexture.notNull())
251 { 295 {
252 target_shader = fullbright_shader; 296 gGL.getTexUnit(0)->activate();
297 gGL.getTexUnit(0)->bind(params.mTexture.get());
298 params.mTexture->addTextureStats(params.mVSize);
299 if (params.mTextureMatrix)
300 {
301 glMatrixMode(GL_TEXTURE);
302 glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
303 gPipeline.mTextureMatrixOps++;
304 }
253 } 305 }
254 else 306
307 if (params.mFullbright)
255 { 308 {
256 gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); 309 // Turn off lighting if it hasn't already been so.
310 if (light_enabled || !initialized_lighting)
311 {
312 initialized_lighting = TRUE;
313 if (use_shaders)
314 {
315 target_shader = fullbright_shader;
316 }
317 else
318 {
319 gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
320 }
321 light_enabled = FALSE;
322 }
323 }
324 // Turn on lighting if it isn't already.
325 else if (!light_enabled || !initialized_lighting)
326 {
327 initialized_lighting = TRUE;
328 if (use_shaders)
329 {
330 target_shader = simple_shader;
331 }
332 else
333 {
334 gPipeline.enableLightsDynamic();
335 }
336 light_enabled = TRUE;
257 } 337 }
258 light_enabled = FALSE;
259 }
260 }
261 // Turn on lighting if it isn't already.
262 else if (!light_enabled || !initialized_lighting)
263 {
264 initialized_lighting = TRUE;
265 if (use_shaders)
266 {
267 target_shader = simple_shader;
268 }
269 else
270 {
271 gPipeline.enableLightsDynamic();
272 }
273 light_enabled = TRUE;
274 }
275 338
276 // If we need shaders, and we're not ALREADY using the proper shader, then bind it 339 // If we need shaders, and we're not ALREADY using the proper shader, then bind it
277 // (this way we won't rebind shaders unnecessarily). 340 // (this way we won't rebind shaders unnecessarily).
278 if(use_shaders && (current_shader != target_shader)) 341 if(use_shaders && (current_shader != target_shader))
279 { 342 {
280 llassert(target_shader != NULL); 343 llassert(target_shader != NULL);
281 current_shader = target_shader; 344 if (deferred_render && current_shader != NULL)
282 current_shader->bind(); 345 {
283 } 346 gPipeline.unbindDeferredShader(*current_shader);
284 else if (!use_shaders && current_shader != NULL) 347 }
285 { 348 current_shader = target_shader;
286 LLGLSLShader::bindNoShader(); 349 if (deferred_render)
287 current_shader = NULL; 350 {
288 } 351 gPipeline.bindDeferredShader(*current_shader);
352 }
353 else
354 {
355 current_shader->bind();
356 }
357 }
358 else if (!use_shaders && current_shader != NULL)
359 {
360 LLGLSLShader::bindNoShader();
361 if (deferred_render)
362 {
363 gPipeline.unbindDeferredShader(*current_shader);
364 }
365 current_shader = NULL;
366 }
289 367
290 params.mVertexBuffer->setBuffer(mask); 368 if (params.mGroup)
291 params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); 369 {
292 gPipeline.addTrianglesDrawn(params.mCount/3); 370 params.mGroup->rebuildMesh();
371 }
372 params.mVertexBuffer->setBuffer(mask);
373 params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
374 gPipeline.addTrianglesDrawn(params.mCount/3);
293 375
294 if (params.mTextureMatrix && texture && params.mTexture.notNull()) 376 if (params.mTextureMatrix && params.mTexture.notNull())
295 { 377 {
296 glLoadIdentity(); 378 gGL.getTexUnit(0)->activate();
297 glMatrixMode(GL_MODELVIEW); 379 glLoadIdentity();
380 glMatrixMode(GL_MODELVIEW);
381 }
382 }
298 } 383 }
299 } 384 }
300 385