diff options
author | Jacek Antonelli | 2009-04-30 13:04:20 -0500 |
---|---|---|
committer | Jacek Antonelli | 2009-04-30 13:07:16 -0500 |
commit | ca8149ca6d157eb4b5fc8ba0e5ba3a6e56f72e7e (patch) | |
tree | 8348301d0ac44a524f1819b777686bf086907d76 /linden/indra/newview/lldrawpoolalpha.cpp | |
parent | Second Life viewer sources 1.22.11 (diff) | |
download | meta-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.cpp | 305 |
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 | ||
57 | BOOL LLDrawPoolAlpha::sShowDebugAlpha = FALSE; | 58 | BOOL LLDrawPoolAlpha::sShowDebugAlpha = FALSE; |
58 | 59 | ||
59 | 60 | static BOOL deferred_render = FALSE; | |
60 | 61 | ||
61 | LLDrawPoolAlpha::LLDrawPoolAlpha(U32 type) : | 62 | LLDrawPoolAlpha::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 | ||
79 | S32 LLDrawPoolAlpha::getNumDeferredPasses() | ||
80 | { | ||
81 | return 1; | ||
82 | } | ||
83 | |||
84 | void LLDrawPoolAlpha::beginDeferredPass(S32 pass) | ||
85 | { | ||
86 | |||
87 | } | ||
88 | |||
89 | void 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 | |||
102 | void LLDrawPoolAlpha::renderDeferred(S32 pass) | ||
103 | { | ||
104 | |||
105 | } | ||
106 | |||
107 | |||
108 | S32 LLDrawPoolAlpha::getNumPostDeferredPasses() | ||
109 | { | ||
110 | return 1; | ||
111 | } | ||
112 | |||
113 | void 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 | |||
129 | void LLDrawPoolAlpha::endPostDeferredPass(S32 pass) | ||
130 | { | ||
131 | deferred_render = FALSE; | ||
132 | endRenderPass(pass); | ||
133 | } | ||
134 | |||
135 | void LLDrawPoolAlpha::renderPostDeferred(S32 pass) | ||
136 | { | ||
137 | render(pass); | ||
138 | } | ||
139 | |||
78 | void LLDrawPoolAlpha::beginRenderPass(S32 pass) | 140 | void 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 | |||
138 | void 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 | ||
180 | void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture) | 260 | void 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 | ||