require 'ruby-processing'
load_library 'opengl'
########################################################
# Original code
# http://lazydog-bookfragments.blogspot.com/2009/05/mirror-of-confusion.html
# Original version written for java processing author 'lazydog'
# aka Ben Notorianni translated to ruby-processing by 'monkstone'
# aka Martin Prout
########################################################
#
# Dimensions of screen.
#
K_WIDTH = 800
K_HEIGHT = 600
#
# Dimensions of texture.
# For fast PCs reduce or remove the denominator.
#
K_TEXTURE_WIDTH = K_WIDTH/2
K_TEXTURE_HEIGHT = K_HEIGHT/2
# following currently required by linux? Otherwise use 'lazydogs' dimensions
#
if java.lang.System.get_property('os.name') == "Linux" then
full_screen
end
def setup
size(K_WIDTH, K_HEIGHT, OPENGL )
#
# P3D doesn't work well in this sketch!
#
library_loaded?(:opengl) ? render_mode(OPENGL) : render_mode(P3D)
@start_t = Time.now.to_f
color_mode RGB, 255
smooth
#
# @history used to store the current frame buffer as a texture.
#
@history = create_image( K_TEXTURE_WIDTH, K_TEXTURE_HEIGHT, RGB )
texture_mode( NORMALIZED )
end
def millis
(@start_t - Time.now.to_f) * 10**6
end
def draw
background( 255 )
translate( width/2, height/2 )
#
# Draw the ground - use a simple grid for detail.
#
# All numbers are fudged to make the grid and ground look about right.
#
hint(DISABLE_DEPTH_TEST)
no_stroke
fill( 240, 189, 180 )
rect( -width/2, 24, width/2, 200 )
fill( 200, 220, 255 )
rect( 0, 24, width, 200 )
stroke( 0 )
stroke_weight( 1.0 )
10.times do |i|
z = -2000 + i * 200
line( -width*10, 200, z, width* 10, 200, z )
x = i* 200
line( -x, 200, -2000, -x, 200, 200 )
line( x, 200, -2000, x, 200, 200 )
end
hint(ENABLE_DEPTH_TEST)
#
# Draw the mirror.
#
# The mirror is animated by rotating around the y-axis.
# The mirror is drawn using the last frame buffer as the reflection in the mirror.
# The view in the mirror is dimmed slightly by drawing an alpha rectangle over it.
# Also, the mirror is oultined to make it stand out a bit.
#
push_matrix()
# rotate_x( 0.03 * Math.sin( millis * 0.0023) )
rotate_y( 0.3 * Math.sin( millis * 0.001) )
translate( -width/2, -height/2, -200 )
no_stroke
begin_shape
texture( @history )
vertex( 0.0, 0.0, 0, 0 )
vertex( width, 0, 1, 0 )
vertex( width, height, 1, 1 )
vertex( 0, height, 0, 1 )
end_shape
fill( 0, 0, 0, 30 )
begin_shape
vertex( 0.0, 0.0 )
vertex( width, 0 )
vertex( width, height )
vertex( 0, height )
end_shape
stroke( 200, 200, 200 )
stroke_weight( 2 )
no_fill
begin_shape()
vertex( 0, 0 )
vertex( width, 0 )
vertex( width, height )
vertex( 0, height )
end_shape(CLOSE)
pop_matrix
#
# Draw the foreground scene.
#
translate( 200 * Math.sin( millis * 0.001 ), 200 * Math.sin( millis* 0.0013 ) )
lights
no_stroke
fill( 238, 80, 70 )
sphere( 100 )
#
# Use the current frame as the texture for the
# mirror in the next frame.
#
# if ( frame_count % 4 == 0 )
@history.copy( get, 0, 0, width, height, 0, 0, K_TEXTURE_WIDTH, K_TEXTURE_HEIGHT )
end
No comments:
Post a Comment