Skip to content
Snippets Groups Projects
Commit e907a2fb authored by Brad Payne (Vir Linden)'s avatar Brad Payne (Vir Linden)
Browse files

merge

parents 642ea00a 5c17bfd5
No related branches found
No related tags found
No related merge requests found
...@@ -457,7 +457,8 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, ...@@ -457,7 +457,8 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0,
gGL.flush(); gGL.flush();
if (!source.mFBO || !mFBO) if (!source.mFBO || !mFBO)
{ {
llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl; llwarns << "Cannot copy framebuffer contents for non FBO render targets." << llendl;
return;
} }
......
...@@ -57,7 +57,7 @@ float getDepth(vec2 pos_screen) ...@@ -57,7 +57,7 @@ float getDepth(vec2 pos_screen)
float calc_cof(float depth) float calc_cof(float depth)
{ {
float sc = abs(depth-focal_distance)/-depth*blur_constant; float sc = (depth-focal_distance)/-depth*blur_constant;
sc /= magnification; sc /= magnification;
...@@ -79,9 +79,10 @@ void main() ...@@ -79,9 +79,10 @@ void main()
vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
float sc = calc_cof(depth); float sc = calc_cof(depth);
sc = min(abs(sc), max_cof); sc = min(sc, max_cof);
sc = max(sc, -max_cof);
vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
gl_FragColor.rgb = diff.rgb + bloom.rgb; gl_FragColor.rgb = diff.rgb + bloom.rgb;
gl_FragColor.a = sc/max_cof; gl_FragColor.a = sc/max_cof*0.5+0.5;
} }
...@@ -48,7 +48,7 @@ void main() ...@@ -48,7 +48,7 @@ void main()
vec4 diff = texture2DRect(lightMap, vary_fragcoord.xy); vec4 diff = texture2DRect(lightMap, vary_fragcoord.xy);
float a = min(diff.a * max_cof*res_scale*res_scale, 1.0); float a = min(abs(diff.a*2.0-1.0) * max_cof*res_scale*res_scale, 1.0);
if (a > 0.25 && a < 0.75) if (a > 0.25 && a < 0.75)
{ //help out the transition a bit { //help out the transition a bit
......
...@@ -42,7 +42,7 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc) ...@@ -42,7 +42,7 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc)
{ {
vec4 s = texture2DRect(diffuseRect, tc); vec4 s = texture2DRect(diffuseRect, tc);
float sc = s.a*max_cof; float sc = abs(s.a*2.0-1.0)*max_cof;
if (sc > min_sc) //sampled pixel is more "out of focus" than current sample radius if (sc > min_sc) //sampled pixel is more "out of focus" than current sample radius
{ {
...@@ -57,6 +57,20 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc) ...@@ -57,6 +57,20 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc)
} }
} }
void dofSampleNear(inout vec4 diff, inout float w, float min_sc, vec2 tc)
{
vec4 s = texture2DRect(diffuseRect, tc);
float wg = 0.25;
// de-weight dull areas to make highlights 'pop'
wg += s.r+s.g+s.b;
diff += wg*s;
w += wg;
}
void main() void main()
{ {
vec2 tc = vary_fragcoord.xy; vec2 tc = vary_fragcoord.xy;
...@@ -66,12 +80,30 @@ void main() ...@@ -66,12 +80,30 @@ void main()
{ {
float w = 1.0; float w = 1.0;
float sc = diff.a*max_cof; float sc = (diff.a*2.0-1.0)*max_cof;
float PI = 3.14159265358979323846264; float PI = 3.14159265358979323846264;
// sample quite uniformly spaced points within a circle, for a circular 'bokeh' // sample quite uniformly spaced points within a circle, for a circular 'bokeh'
if (sc > 0.5)
{
while (sc > 0.5)
{
int its = int(max(1.0,(sc*3.7)));
for (int i=0; i<its; ++i)
{
float ang = sc+i*2*PI/its; // sc is added for rotary perturbance
float samp_x = sc*sin(ang);
float samp_y = sc*cos(ang);
// you could test sample coords against an interesting non-circular aperture shape here, if desired.
dofSampleNear(diff, w, sc, vary_fragcoord.xy + vec2(samp_x,samp_y));
}
sc -= 1.0;
}
}
else if (sc < -0.5)
{ {
sc = abs(sc);
while (sc > 0.5) while (sc > 0.5)
{ {
int its = int(max(1.0,(sc*3.7))); int its = int(max(1.0,(sc*3.7)));
...@@ -86,7 +118,7 @@ void main() ...@@ -86,7 +118,7 @@ void main()
sc -= 1.0; sc -= 1.0;
} }
} }
diff /= w; diff /= w;
} }
......
...@@ -3163,8 +3163,13 @@ void LLViewerLODTexture::processTextureStats() ...@@ -3163,8 +3163,13 @@ void LLViewerLODTexture::processTextureStats()
S32 current_discard = getDiscardLevel(); S32 current_discard = getDiscardLevel();
if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLViewerTexture::BOOST_SCULPTED && current_discard >= 0) if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLViewerTexture::BOOST_SCULPTED && current_discard >= 0)
{ {
if(desired_discard_bias_max <= sDesiredDiscardBias && !mForceToSaveRawImage)
{
//needs to release texture memory urgently
scaleDown() ;
}
// Limit the amount of GL memory bound each frame // Limit the amount of GL memory bound each frame
if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale && else if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale &&
(!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel))
{ {
scaleDown() ; scaleDown() ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment