diff options
author | ericu@google.com <ericu@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-19 01:34:31 +0000 |
---|---|---|
committer | ericu@google.com <ericu@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-19 01:34:31 +0000 |
commit | b26c6df09911b5cba8b944bb8dc75ffd479b37ad (patch) | |
tree | d572b4a8d73739001bd8e4c374c5e0468bd03f18 /o3d/samples | |
parent | 19132f5e56873a226220d41f01434b2fc52e3a85 (diff) | |
download | chromium_src-b26c6df09911b5cba8b944bb8dc75ffd479b37ad.zip chromium_src-b26c6df09911b5cba8b944bb8dc75ffd479b37ad.tar.gz chromium_src-b26c6df09911b5cba8b944bb8dc75ffd479b37ad.tar.bz2 |
Review URL: http://codereview.chromium.org/132023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18781 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d/samples')
-rw-r--r-- | o3d/samples/juggler.html | 100 |
1 files changed, 66 insertions, 34 deletions
diff --git a/o3d/samples/juggler.html b/o3d/samples/juggler.html index 3dc01f1..066b84b 100644 --- a/o3d/samples/juggler.html +++ b/o3d/samples/juggler.html @@ -216,7 +216,7 @@ function unload() { } </script> </head> -<body style="width: 100%; height: 100%;"> +<body style="width: 95%; height: 95%;"> <table style="width: 100%; height: 100%;"> <tr> <td> @@ -226,12 +226,20 @@ function unload() { <form name="the_form"> <input type="radio" name="radio_group" value="3" onclick=updateNum()>3 Balls - <input type="radio" name="radio_group" value="5" checked + <input type="radio" name="radio_group" value="5" onclick=updateNum()>5 Balls <input type="radio" name="radio_group" value="7" onclick=updateNum()>7 Balls <input type="radio" name="radio_group" value="9" onclick=updateNum()>9 Balls + <input type="radio" name="radio_group" value="11" checked + onclick=updateNum()>11 Balls + <input type="radio" name="radio_group" value="13" + onclick=updateNum()>13 Balls + <input type="radio" name="radio_group" value="15" + onclick=updateNum()>15 Balls + <input type="radio" name="radio_group" value="17" + onclick=updateNum()>17 Balls <input type="checkbox" name="check_box" checked onclick=toggleRenderCallback()>Animate </form> @@ -286,6 +294,8 @@ float length_2(in float2 v) { } // Draw the balls in a single arc. +// Returns 1 if the pixel is within a ball, 0 if it isn't, and a value in +// between for pixels right on the edge, for antialiasing. float drawBallsInArc(in float pi, in float4 offset, in float2 source_hand, @@ -318,6 +328,9 @@ float drawBallsInArc(in float pi, float4 ZX = Z.x; float4 ZY = Z.y; float4 len_2 = (ZX - x) * (ZX - x) + (ZY - y) * (ZY - y); + + // This antialiasing fuzzes the balls just a bit larger than they would + // otherwise be. float4 temp = clamp((len_2 - ball_radius_2) / threshold, 0, 1); // One minus the product of all entries in temp. @@ -325,24 +338,24 @@ float drawBallsInArc(in float pi, return 1 - temp.x * temp.y; } -float drawAirborneBalls(in float pi, - in float4 offset, - in float2 right_hand, - in float2 left_hand, - in float height_factor, - in float baseline, - in float ball_radius_2, - in float hand_swing_radius, - in float2 Z, - in float threshold) { - // The expression below is one minus a product. The first factor in the - // product is responsible for balls moving from right to left, and the second - // factor is responsible for balls moving from left to right. - return 1 - - (1 - drawBallsInArc(pi, offset, right_hand, left_hand, height_factor, - baseline, ball_radius_2, hand_swing_radius, Z, threshold)) * - (1 - drawBallsInArc(pi, offset + 1, left_hand, right_hand, height_factor, - baseline, ball_radius_2, -hand_swing_radius, Z, threshold)); +float4 drawAirborneBalls(in float pi, + in float4 offset, + in float2 right_hand, + in float2 left_hand, + in float height_factor, + in float baseline, + in float ball_radius_2, + in float hand_swing_radius, + in float2 Z, + in float threshold) { + float value = + // balls going right to left + (drawBallsInArc(pi, offset, right_hand, left_hand, height_factor, + baseline, ball_radius_2, hand_swing_radius, Z, threshold) + + // balls going left to right + drawBallsInArc(pi, offset + 1, left_hand, right_hand, height_factor, + baseline, ball_radius_2, -hand_swing_radius, Z, threshold)); + return float4(value, value, value, value); } /** @@ -351,21 +364,22 @@ float drawAirborneBalls(in float pi, float4 pixelShaderMain(PixelShaderInput input) : COLOR { const float pi = 3.14159265; - const float baseline = -1.2; + const float baseline = -1.4; const float2 right_hand = float2(0.8, baseline); const float2 left_hand = float2(-0.8, baseline); - const float hand_swing_radius = 0.3; - const float hand_radius_2 = 0.15 * 0.15; - const float ball_radius_2 = 0.1 * 0.1; + const float hand_swing_radius = 0.25; + const float hand_radius = 0.15; + const float hand_radius_2 = hand_radius * hand_radius; + const float ball_radius = 0.08; + const float ball_radius_2 = ball_radius * ball_radius; - const float4 ball_color = float4(1, 1, 1, 1); const float4 right_hand_color = float4(1, 0, 0, 1); const float4 left_hand_color = float4(0, 0, 1, 1); const float4 background_color = float4(0, 0, 0, 0); const float threshold = 0.002; // Used in clamp for antialiasing. - float height_factor = num; + float height_factor = num * 0.75; float2 Z = input.texCoord; @@ -379,12 +393,15 @@ float4 pixelShaderMain(PixelShaderInput input) : COLOR { // It's kind of like a rudimentary z-buffer. float4 result = background_color; - // Draw the hands. - result += (1 - result.a) * ( + // Draw the hands. The antialiasing here fuzzes the hands just a little bit + // smaller than they would otherwise be. That's the opposite of what we do + // for the balls, just because it happens to be cheaper here to do smaller and + // cheaper in drawBallsInArc to do larger. + result += clamp((hand_radius_2 - length_2(Z - r_h)) / threshold, 0, 1) * (Z.y < r_h.y) * right_hand_color + clamp((hand_radius_2 - length_2(Z - l_h)) / threshold, 0, 1) * - (Z.y < l_h.y) * left_hand_color); + (Z.y < l_h.y) * left_hand_color; // Draw the ball in the hand. There is always a ball in exactly one hand, and // which hand that is alternates. @@ -394,15 +411,30 @@ float4 pixelShaderMain(PixelShaderInput input) : COLOR { } else { hand = l_h; } - result += (1 - result.a) * ball_color * - clamp((ball_radius_2 - length_2(Z - hand)) / threshold, 0, 1); + // The antialiasing here fuzzes the balls just a bit bigger than they would + // otherwise be. This is more work than making them smaller [the extra + // subtraction in the "1 - clamp..." below], but inverting it in + // drawBallsInArc would be more expensive, and they have to match so that the + // balls are all the same size. + result += (1 - result.a) * + (1 - clamp((length_2(Z - hand) - ball_radius_2) / threshold, 0, 1)); + // Draw airborne balls. float4 offset = float4(0, 2, 4, 6); + result += (1 - result.a) * drawAirborneBalls(pi, + offset, + right_hand, + left_hand, + height_factor, + baseline, + ball_radius_2, + hand_swing_radius, + Z, + threshold); - // For each of up-to-4 pairs of balls you want to add, increment offsets by + // For each up-to-4 pairs of balls you want to add, increment offset by // (8, 8, 8, 8) and call drawAirborneBalls again. - - // Draw airborne balls. + offset += 8; result += (1 - result.a) * drawAirborneBalls(pi, offset, right_hand, |