ruby-processing 2.4.4 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rpextras.jar +0 -0
- data/lib/ruby-processing.rb +8 -6
- data/lib/ruby-processing/app.rb +54 -67
- data/lib/ruby-processing/config.rb +7 -7
- data/lib/ruby-processing/exporters/application_exporter.rb +37 -38
- data/lib/ruby-processing/exporters/base_exporter.rb +34 -37
- data/lib/ruby-processing/exporters/creator.rb +27 -25
- data/lib/ruby-processing/helper_methods.rb +18 -22
- data/lib/ruby-processing/helpers/numeric.rb +5 -6
- data/lib/ruby-processing/helpers/string.rb +11 -20
- data/lib/ruby-processing/library_loader.rb +33 -35
- data/lib/ruby-processing/runner.rb +118 -65
- data/lib/ruby-processing/runners/base.rb +21 -26
- data/lib/ruby-processing/runners/live.rb +3 -4
- data/lib/ruby-processing/runners/run.rb +1 -3
- data/lib/ruby-processing/runners/watch.rb +8 -8
- data/lib/ruby-processing/version.rb +1 -1
- data/lib/templates/application/lib/args.txt.erb +1 -1
- data/lib/templates/application/run.erb +3 -3
- data/library/control_panel/control_panel.rb +29 -29
- data/library/fastmath/fastmath.rb +3 -0
- data/library/file_chooser/file_chooser.rb +11 -13
- data/library/vecmath/vecmath.rb +6 -35
- data/samples/Rakefile +3 -1
- data/samples/configRP5/configRP5.pde +150 -0
- data/samples/contributed/Rakefile +6 -6
- data/samples/contributed/animator.rb +6 -6
- data/samples/contributed/bezier_playground.rb +29 -68
- data/samples/contributed/circle_collision.rb +6 -13
- data/samples/contributed/elegant_ball.rb +14 -17
- data/samples/contributed/empathy.rb +8 -5
- data/samples/contributed/fibonacci_sphere.rb +10 -49
- data/samples/contributed/full_screen.rb +1 -1
- data/samples/contributed/grapher.rb +10 -9
- data/samples/contributed/gravity.rb +11 -16
- data/samples/contributed/jwishy.rb +18 -20
- data/samples/contributed/quadraticvertex.rb +26 -26
- data/samples/external_library/java_processing/custom/landscape.rb +6 -4
- data/samples/external_library/java_processing/hemesh/twin_iso.rb +69 -71
- data/samples/external_library/java_processing/pbox2d/bumpy_surface_noise.rb +57 -0
- data/samples/external_library/java_processing/pbox2d/contact_test.rb +23 -0
- data/samples/external_library/java_processing/pbox2d/data/java_args.txt +2 -0
- data/samples/external_library/java_processing/pbox2d/library/custom_shape/custom_shape.rb +158 -0
- data/samples/external_library/java_processing/pbox2d/library/particle_system/particle_system.rb +212 -0
- data/samples/external_library/java_processing/pbox2d/library/surface/surface.rb +154 -0
- data/samples/external_library/java_processing/pbox2d/liquidy.rb +58 -0
- data/samples/external_library/java_processing/pbox2d/polygons.rb +58 -0
- data/samples/external_library/java_processing/toxiclibs/library/vbo/vbo.rb +52 -0
- data/samples/external_library/java_processing/toxiclibs/model_align.rb +9 -16
- data/samples/processing_app/basics/color/color_wheel.rb +1 -1
- data/samples/processing_app/basics/form/regular_polygon.rb +2 -2
- data/samples/processing_app/basics/form/rgb_cube.rb +2 -2
- data/samples/processing_app/basics/form/shape_primitives.rb +1 -1
- data/samples/processing_app/basics/form/star.rb +2 -2
- data/samples/processing_app/basics/input/clock.rb +21 -16
- data/samples/processing_app/basics/input/storing_input.rb +6 -6
- data/samples/processing_app/basics/math/additive_wave.rb +1 -1
- data/samples/processing_app/basics/math/sine.rb +2 -2
- data/samples/processing_app/basics/math/sine_cosine.rb +1 -1
- data/samples/processing_app/basics/math/sine_wave.rb +1 -1
- data/samples/processing_app/basics/objects/inheritance.rb +2 -0
- data/samples/processing_app/basics/objects/inheritance_two.rb +88 -0
- data/samples/processing_app/basics/objects/module.rb +89 -0
- data/samples/processing_app/{library/vecmath/drawolver.rb → basics/objects/module_two.rb} +1 -1
- data/samples/processing_app/basics/objects/multiple_constructors.rb +5 -0
- data/samples/processing_app/basics/objects/struct.rb +38 -0
- data/samples/processing_app/basics/structure/recursion2.rb +1 -1
- data/samples/processing_app/basics/transform/birds.rb +7 -10
- data/samples/processing_app/basics/transform/library/bird/bird.rb +3 -3
- data/samples/processing_app/basics/transform/rotate.rb +1 -1
- data/samples/processing_app/basics/transform/rotate1.rb +1 -1
- data/samples/processing_app/basics/transform/rotate_x_y.rb +1 -1
- data/samples/processing_app/demos/graphics/bezier_patch.rb +1 -38
- data/samples/processing_app/demos/graphics/trefoil.rb +50 -40
- data/samples/processing_app/demos/graphics/wiggling.rb +36 -38
- data/samples/processing_app/demos/performance/cubic_grid_retained.rb +14 -14
- data/samples/processing_app/demos/performance/esfera.rb +27 -39
- data/samples/processing_app/demos/performance/text_rendering.rb +1 -1
- data/samples/processing_app/library/fastmath/clock.rb +44 -0
- data/samples/processing_app/library/pdf/complex_3D.rb +26 -24
- data/samples/processing_app/library/vecmath/{Rakefile → arcball/Rakefile} +6 -6
- data/samples/processing_app/library/vecmath/arcball/arcball_box.rb +23 -0
- data/samples/processing_app/library/vecmath/arcball/arcball_radius.rb +23 -0
- data/samples/processing_app/library/vecmath/arcball/arcball_shape.rb +29 -0
- data/samples/processing_app/library/vecmath/{README.txt → vec2d/README.txt} +0 -0
- data/samples/processing_app/library/vecmath/vec2d/Rakefile +30 -0
- data/samples/processing_app/library/vecmath/{acceleration_with_vectors.rb → vec2d/acceleration_with_vectors.rb} +4 -5
- data/samples/processing_app/library/vecmath/{bouncing_ball.rb → vec2d/bouncing_ball.rb} +9 -15
- data/samples/processing_app/library/vecmath/{circle_collision.rb → vec2d/circle_collision.rb} +46 -51
- data/samples/processing_app/library/vecmath/{data → vec2d/data}/java_args.txt +0 -0
- data/samples/processing_app/library/vecmath/{data → vec2d/data}/sprite.png +0 -0
- data/samples/processing_app/library/vecmath/{data → vec2d/data}/texture.png +0 -0
- data/samples/processing_app/library/vecmath/{flocking.rb → vec2d/flocking.rb} +3 -6
- data/samples/processing_app/library/vecmath/{library → vec2d/library}/flock/flock.rb +47 -67
- data/samples/processing_app/library/vecmath/{library → vec2d/library}/particle/particle_system.rb +5 -5
- data/samples/processing_app/library/vecmath/vec2d/library/tile/tile.rb +85 -0
- data/samples/processing_app/library/vecmath/{morph.rb → vec2d/morph.rb} +17 -16
- data/samples/processing_app/library/vecmath/{multiple_particle_systems.rb → vec2d/multiple_particle_systems.rb} +11 -28
- data/samples/processing_app/library/vecmath/{particle_system_pshape.rb → vec2d/particle_system_pshape.rb} +4 -6
- data/samples/processing_app/library/vecmath/vec2d/penrose.rb +71 -0
- data/samples/processing_app/library/vecmath/{reflection1.rb → vec2d/reflection1.rb} +6 -6
- data/samples/processing_app/library/vecmath/{seeking_neural.rb → vec2d/seeking_neural.rb} +12 -16
- data/samples/processing_app/library/vecmath/{simple_particle_system.rb → vec2d/simple_particle_system.rb} +8 -12
- data/samples/processing_app/library/vecmath/{smoke_particle_system.rb → vec2d/smoke_particle_system.rb} +8 -13
- data/samples/processing_app/library/vecmath/{vector_math.rb → vec2d/vector_math.rb} +0 -0
- data/samples/processing_app/library/vecmath/{library/wiggler/wiggler.rb → vec2d/wiggle_pshape.rb} +28 -4
- data/samples/processing_app/library/vecmath/vec3d/Rakefile +30 -0
- data/samples/processing_app/library/vecmath/vec3d/drawolver.rb +86 -0
- data/samples/processing_app/library/vecmath/vec3d/frame_of_reference.rb +103 -0
- data/samples/processing_app/library/vecmath/{hilbert_fractal.rb → vec3d/hilbert_fractal.rb} +5 -33
- data/samples/processing_app/library/vecmath/vec3d/library/geometry/geometry.rb +3 -0
- data/samples/processing_app/library/vecmath/vec3d/library/geometry/lib/cylinder.rb +44 -0
- data/samples/processing_app/library/vecmath/vec3d/library/geometry/lib/mat4.rb +28 -0
- data/samples/processing_app/library/vecmath/vec3d/library/geometry/lib/plane.rb +60 -0
- data/samples/processing_app/library/vecmath/{library → vec3d/library}/hilbert/hilbert.rb +14 -17
- data/samples/processing_app/library/vecmath/{retained_menger.rb → vec3d/retained_menger.rb} +20 -55
- data/samples/processing_app/topics/advanced_data/Rakefile +6 -6
- data/samples/processing_app/topics/advanced_data/counting_words.rb +7 -7
- data/samples/processing_app/topics/advanced_data/data/data.xml +0 -15
- data/samples/processing_app/topics/advanced_data/data/struct_data.yml +5 -0
- data/samples/processing_app/topics/advanced_data/library/bubble/bubble.rb +8 -8
- data/samples/processing_app/topics/advanced_data/load_save_XML.rb +41 -42
- data/samples/processing_app/topics/advanced_data/load_save_json.rb +11 -11
- data/samples/processing_app/topics/advanced_data/load_save_struct_yaml.rb +22 -23
- data/samples/processing_app/topics/advanced_data/load_save_table.rb +12 -12
- data/samples/processing_app/topics/advanced_data/load_save_yaml.rb +10 -12
- data/samples/processing_app/topics/advanced_data/regex.rb +5 -6
- data/samples/processing_app/topics/advanced_data/threads.rb +27 -27
- data/samples/processing_app/topics/advanced_data/threads_two.rb +3 -2
- data/samples/processing_app/topics/advanced_data/word_frequency.rb +18 -16
- data/samples/processing_app/topics/advanced_data/yahoo_weather.rb +6 -5
- data/samples/processing_app/topics/animation/animated_sprite.rb +9 -7
- data/samples/processing_app/topics/animation/sequential.rb +19 -19
- data/samples/processing_app/topics/cellular_automata/library/ca/ca.rb +1 -1
- data/samples/processing_app/topics/cellular_automata/wolfram.rb +1 -1
- data/samples/processing_app/topics/create_shapes/begin_end_contour.rb +1 -1
- data/samples/processing_app/topics/create_shapes/library/wiggler/wiggler.rb +4 -4
- data/samples/processing_app/topics/create_shapes/particle_system_pshape.rb +2 -2
- data/samples/processing_app/topics/create_shapes/path_pshape.rb +1 -1
- data/samples/processing_app/topics/create_shapes/polygon_pshape_oo3.rb +1 -1
- data/samples/processing_app/topics/create_shapes/polygon_shape.rb +3 -3
- data/samples/processing_app/topics/file_io/load_file1.rb +1 -1
- data/samples/processing_app/topics/file_io/save_frames.rb +5 -5
- data/samples/processing_app/topics/file_io/save_one_image.rb +2 -2
- data/samples/processing_app/topics/file_io/tile_images.rb +1 -1
- data/samples/processing_app/topics/gui/scrollbar.rb +3 -3
- data/samples/processing_app/topics/image_processing/blending.rb +13 -13
- data/samples/processing_app/topics/image_processing/blur.rb +1 -1
- data/samples/processing_app/topics/image_processing/brightness.rb +1 -1
- data/samples/processing_app/topics/image_processing/convolution.rb +1 -1
- data/samples/processing_app/topics/image_processing/edge_detection.rb +4 -4
- data/samples/processing_app/topics/image_processing/explode.rb +1 -1
- data/samples/processing_app/topics/image_processing/extrusion.rb +1 -1
- data/samples/processing_app/topics/image_processing/histogram.rb +1 -1
- data/samples/processing_app/topics/image_processing/linear_image.rb +1 -1
- data/samples/processing_app/topics/image_processing/pixel_array.rb +1 -1
- data/samples/processing_app/topics/image_processing/zoom.rb +2 -2
- data/samples/processing_app/topics/lsystems/Rakefile +6 -6
- data/samples/processing_app/topics/lsystems/chequer.rb +4 -10
- data/samples/processing_app/topics/lsystems/csplant.rb +25 -25
- data/samples/processing_app/topics/lsystems/cstest.rb +9 -4
- data/samples/processing_app/topics/lsystems/david_tour.rb +14 -16
- data/samples/processing_app/topics/lsystems/koch.rb +8 -18
- data/samples/processing_app/topics/lsystems/library/cs_grammar/cs_grammar.rb +18 -24
- data/samples/processing_app/topics/lsystems/library/grammar/grammar.rb +7 -9
- data/samples/processing_app/topics/lsystems/library/koch/koch_fractal.rb +75 -94
- data/samples/processing_app/topics/lsystems/library/stochastic_grammar/stochastic_grammar.rb +11 -13
- data/samples/processing_app/topics/lsystems/mpeano.rb +29 -32
- data/samples/processing_app/topics/lsystems/peano.rb +19 -21
- data/samples/processing_app/topics/lsystems/penrose.rb +31 -37
- data/samples/processing_app/topics/lsystems/penrose_snowflake.rb +10 -15
- data/samples/processing_app/topics/lsystems/pentagonal.rb +20 -23
- data/samples/processing_app/topics/lsystems/snake_kolam.rb +13 -13
- data/samples/processing_app/topics/lsystems/stochastic_test.rb +25 -28
- data/samples/processing_app/topics/lsystems/three_d_tree.rb +25 -24
- data/samples/processing_app/topics/motion/bouncy_bubbles.rb +17 -17
- data/samples/processing_app/topics/motion/cubes_in_cube.rb +1 -3
- data/samples/processing_app/topics/motion/library/cube/cube.rb +2 -2
- data/samples/processing_app/topics/motion/reflection2.rb +1 -1
- data/samples/processing_app/topics/shaders/blur_filter.rb +3 -3
- data/samples/processing_app/topics/shaders/bw_shader.rb +3 -3
- data/samples/processing_app/topics/shaders/conway.rb +5 -5
- data/samples/processing_app/topics/shaders/deform.rb +5 -5
- data/samples/processing_app/topics/shaders/edge_detect.rb +3 -5
- data/samples/processing_app/topics/shaders/glossy_fish_eye.rb +15 -21
- data/samples/processing_app/topics/shaders/glsl_heightmap_noise.rb +21 -19
- data/samples/processing_app/topics/shaders/image_mask.rb +6 -6
- data/samples/processing_app/topics/shaders/landscape.rb +4 -4
- data/samples/processing_app/topics/shaders/monjori.rb +15 -15
- data/samples/processing_app/topics/shaders/nebula.rb +3 -3
- data/samples/processing_app/topics/shaders/sep_blur.rb +15 -15
- data/samples/processing_app/topics/shaders/toon_shading.rb +2 -2
- data/samples/processing_app/topics/simulate/chain.rb +16 -14
- data/samples/processing_app/topics/simulate/smoke_particle_system.rb +3 -3
- data/samples/processing_app/topics/vectors/acceleration_with_vectors.rb +3 -2
- data/samples/processing_app/topics/vectors/bouncing_ball.rb +1 -0
- data/samples/processing_app/topics/vectors/vector_math.rb +2 -1
- data/vendors/Rakefile +15 -3
- metadata +99 -86
- data/.gitignore +0 -13
- data/.travis.yml +0 -6
- data/.yardopts +0 -5
- data/CHANGELOG +0 -316
- data/CONTRIBUTING.md +0 -35
- data/Gemfile +0 -6
- data/LICENSE.md +0 -39
- data/README.md +0 -119
- data/Rakefile +0 -37
- data/bin/install_jruby_complete +0 -13
- data/lib/ruby-processing/exporters/exporters.rb +0 -7
- data/library/vecmath/lib/arcball.rb +0 -64
- data/library/vecmath/lib/quaternion.rb +0 -62
- data/library/vecmath/lib/vec.rb +0 -232
- data/ruby-processing.gemspec +0 -54
- data/samples/processing_app/library/pdf/.gitignore +0 -1
- data/samples/processing_app/library/vecmath/retained_test.rb +0 -65
- data/samples/processing_app/library/vecmath/retained_test2.rb +0 -65
- data/samples/processing_app/library/vecmath/wiggle_pshape.rb +0 -22
- data/test/README.md +0 -6
- data/test/basic.rb +0 -14
- data/test/draw_ex.rb +0 -12
- data/test/graphics.rb +0 -7
- data/test/p2d.rb +0 -14
- data/test/p3d.rb +0 -14
- data/test/rp5_test.rb +0 -86
- data/test/setup_ex.rb +0 -12
data/samples/external_library/java_processing/pbox2d/library/particle_system/particle_system.rb
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
module PS
|
|
2
|
+
include_package 'org.jbox2d.collision.shapes'
|
|
3
|
+
include_package 'org.jbox2d.common'
|
|
4
|
+
include_package 'org.jbox2d.dynamics'
|
|
5
|
+
java_import 'pbox2d.PBox2D'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Box2D Particle System
|
|
9
|
+
# <http://www.shiffman.net/teaching/nature>
|
|
10
|
+
# Spring 2010
|
|
11
|
+
|
|
12
|
+
# A class to describe a group of Particles
|
|
13
|
+
# An ArrayList is used to manage the list of Particles
|
|
14
|
+
|
|
15
|
+
class ParticleSystem
|
|
16
|
+
|
|
17
|
+
attr_reader :particles, :x, :y
|
|
18
|
+
|
|
19
|
+
def initialize(bd, num, x, y)
|
|
20
|
+
@particles = [] # Initialize the ArrayList
|
|
21
|
+
@x, @y = x, y # Store the origin point
|
|
22
|
+
num.times do
|
|
23
|
+
particles << PS::Particle.new(bd, x, y)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def run
|
|
28
|
+
# Display all the particles
|
|
29
|
+
particles.each do |p|
|
|
30
|
+
p.display
|
|
31
|
+
end
|
|
32
|
+
# Particles that leave the screen, we delete them
|
|
33
|
+
# (note they have to be deleted from both the box2d world and our list
|
|
34
|
+
|
|
35
|
+
particles.each_with_index do |p, i|
|
|
36
|
+
if (p.done)
|
|
37
|
+
particles.delete_at(i)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def add_particles(bd, n)
|
|
43
|
+
n.times do
|
|
44
|
+
particles << PS::Particle.new(bd, x, y)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# A method to test if the particle system still has particles
|
|
49
|
+
def dead
|
|
50
|
+
particles.empty?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# The Nature of Code
|
|
56
|
+
# <http://www.shiffman.net/teaching/nature>
|
|
57
|
+
# Spring 2012
|
|
58
|
+
# PBox2D example
|
|
59
|
+
|
|
60
|
+
# A Particle
|
|
61
|
+
|
|
62
|
+
class Particle
|
|
63
|
+
TRAIL_SIZE = 6
|
|
64
|
+
# We need to keep track of a Body
|
|
65
|
+
|
|
66
|
+
attr_reader :trail, :body, :box2d
|
|
67
|
+
|
|
68
|
+
# Constructor
|
|
69
|
+
def initialize(b2d, x, y)
|
|
70
|
+
@box2d = b2d
|
|
71
|
+
@trail = Array.new(TRAIL_SIZE, [x, y])
|
|
72
|
+
|
|
73
|
+
# Add the box to the box2d world
|
|
74
|
+
# Here's a little trick, let's make a tiny tiny radius
|
|
75
|
+
# This way we have collisions, but they don't overwhelm the system
|
|
76
|
+
make_body(PS::Vec2.new(x,y), 0.2)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# This function removes the particle from the box2d world
|
|
80
|
+
def kill_body
|
|
81
|
+
box2d.destroy_body(body)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Is the particle ready for deletion?
|
|
85
|
+
def done
|
|
86
|
+
# Let's find the screen position of the particle
|
|
87
|
+
pos = box2d.get_body_pixel_coord(body)
|
|
88
|
+
# Is it off the bottom of the screen?
|
|
89
|
+
if (pos.y > $app.height + 20)
|
|
90
|
+
kill_body
|
|
91
|
+
return true
|
|
92
|
+
end
|
|
93
|
+
return false
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Drawing the box
|
|
97
|
+
def display
|
|
98
|
+
# We look at each body and get its screen position
|
|
99
|
+
pos = box2d.get_body_pixel_coord(body)
|
|
100
|
+
|
|
101
|
+
# Keep track of a history of screen positions in an array
|
|
102
|
+
(TRAIL_SIZE - 1).times do |i|
|
|
103
|
+
trail[i] = trail[i + 1]
|
|
104
|
+
end
|
|
105
|
+
trail[TRAIL_SIZE - 1] = [pos.x, pos.y]
|
|
106
|
+
|
|
107
|
+
# Draw particle as a trail
|
|
108
|
+
begin_shape
|
|
109
|
+
noFill
|
|
110
|
+
stroke_weight(2)
|
|
111
|
+
stroke(0,150)
|
|
112
|
+
trail.each do |v|
|
|
113
|
+
vertex(v[0], v[1])
|
|
114
|
+
end
|
|
115
|
+
end_shape
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# This function adds the rectangle to the box2d world
|
|
119
|
+
def make_body(center, r)
|
|
120
|
+
# Define and create the body
|
|
121
|
+
bd = PS::BodyDef.new
|
|
122
|
+
bd.type = PS::BodyType::DYNAMIC
|
|
123
|
+
|
|
124
|
+
bd.position.set(box2d.coord_pixels_to_world(center))
|
|
125
|
+
@body = box2d.create_body(bd)
|
|
126
|
+
|
|
127
|
+
# Give it some initial random velocity
|
|
128
|
+
body.set_linear_velocity(PS::Vec2.new(rand(-1 .. 1), rand(-1 .. 1)))
|
|
129
|
+
|
|
130
|
+
# Make the body's shape a circle
|
|
131
|
+
cs = PS::CircleShape.new
|
|
132
|
+
cs.m_radius = box2d.scalar_pixels_to_world(r)
|
|
133
|
+
|
|
134
|
+
fd = PS::FixtureDef.new
|
|
135
|
+
fd.shape = cs
|
|
136
|
+
|
|
137
|
+
fd.density = 1
|
|
138
|
+
fd.friction = 0 # Slippery when wet!
|
|
139
|
+
fd.restitution = 0.5
|
|
140
|
+
|
|
141
|
+
# We could use this if we want to turn collisions off
|
|
142
|
+
#cd.filter.groupIndex = -10
|
|
143
|
+
|
|
144
|
+
# Attach fixture to body
|
|
145
|
+
body.create_fixture(fd)
|
|
146
|
+
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
end
|
|
150
|
+
# The Nature of Code
|
|
151
|
+
# <http://www.shiffman.net/teaching/nature>
|
|
152
|
+
# Spring 2012
|
|
153
|
+
# PBox2D example
|
|
154
|
+
|
|
155
|
+
# A fixed boundary class (now incorporates angle)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class Boundary
|
|
160
|
+
|
|
161
|
+
attr_reader :box2d, :b, :x, :y, :w, :h #, :a
|
|
162
|
+
|
|
163
|
+
def initialize(b2d, x, y, w, h, a)
|
|
164
|
+
@box2d = b2d
|
|
165
|
+
@x = x
|
|
166
|
+
@y = y
|
|
167
|
+
@w = w
|
|
168
|
+
@h = h
|
|
169
|
+
|
|
170
|
+
# Define the polygon
|
|
171
|
+
sd = PS::PolygonShape.new
|
|
172
|
+
|
|
173
|
+
# Figure out the box2d coordinates
|
|
174
|
+
box2dW = box2d.scalar_pixels_to_world(w/2)
|
|
175
|
+
box2dH = box2d.scalar_pixels_to_world(h/2)
|
|
176
|
+
# We're just a box
|
|
177
|
+
sd.set_as_box(box2dW, box2dH)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
# Create the body
|
|
181
|
+
bd = PS::BodyDef.new
|
|
182
|
+
bd.type = PS::BodyType::STATIC
|
|
183
|
+
bd.angle = a
|
|
184
|
+
bd.position.set(box2d.coord_pixels_to_world(x,y))
|
|
185
|
+
@b = box2d.create_body(bd)
|
|
186
|
+
|
|
187
|
+
# Attached the shape to the body using a Fixture
|
|
188
|
+
b.create_fixture(sd,1)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Draw the boundary, it doesn't move so we don't have to ask the Body for location
|
|
192
|
+
def display
|
|
193
|
+
fill(0)
|
|
194
|
+
stroke(0)
|
|
195
|
+
stroke_weight(1)
|
|
196
|
+
rect_mode(CENTER)
|
|
197
|
+
a = b.get_angle
|
|
198
|
+
push_matrix
|
|
199
|
+
translate(x,y)
|
|
200
|
+
rotate(-a)
|
|
201
|
+
rect(0,0,w,h)
|
|
202
|
+
pop_matrix
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# The Nature of Code
|
|
2
|
+
# <http:#www.shiffman.net/teaching/nature>
|
|
3
|
+
# Spring 2010
|
|
4
|
+
# PBox2D example
|
|
5
|
+
|
|
6
|
+
# An uneven surface boundary
|
|
7
|
+
module SB
|
|
8
|
+
|
|
9
|
+
include_package 'org.jbox2d.collision.shapes'
|
|
10
|
+
include_package 'org.jbox2d.common'
|
|
11
|
+
include_package 'org.jbox2d.dynamics'
|
|
12
|
+
java_import 'pbox2d.PBox2D'
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Surface
|
|
17
|
+
# We'll keep track of all of the surface points
|
|
18
|
+
attr_reader :surface, :body, :box2d, :y, :width, :height
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def initialize b2d
|
|
22
|
+
@box2d = b2d
|
|
23
|
+
@surface = []
|
|
24
|
+
@width, @height = $app.width, $app.height
|
|
25
|
+
# This is what box2d uses to put the surface in its world
|
|
26
|
+
chain = SB::ChainShape.new
|
|
27
|
+
|
|
28
|
+
# Perlin noise argument
|
|
29
|
+
xoff = 0.0
|
|
30
|
+
|
|
31
|
+
# This has to go backwards so that the objects bounce off the top of the surface
|
|
32
|
+
# This "edgechain" will only work in one direction!
|
|
33
|
+
(width + 10).step(-10, -5) do |x|
|
|
34
|
+
# Doing some stuff with perlin noise to calculate a surface that points down on one side
|
|
35
|
+
# and up on the other
|
|
36
|
+
|
|
37
|
+
if (x > width/2)
|
|
38
|
+
@y = 100 + (width - x)*1.1 + map(noise(xoff),0,1,-80,80)
|
|
39
|
+
else
|
|
40
|
+
@y = 100 + x*1.1 + map(noise(xoff),0,1,-80,80)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Store the vertex in screen coordinates
|
|
44
|
+
surface << SB::Vec2.new(x, y)
|
|
45
|
+
|
|
46
|
+
# Move through perlin noise
|
|
47
|
+
xoff += 0.1
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Build an array of vertices in Box2D coordinates
|
|
52
|
+
# from the ArrayList we made
|
|
53
|
+
vertices = []
|
|
54
|
+
surface.each do |surf|
|
|
55
|
+
vertices << box2d.coord_pixels_to_world(surf)
|
|
56
|
+
end
|
|
57
|
+
# Create the chain!
|
|
58
|
+
chain.createChain(vertices, vertices.length)
|
|
59
|
+
# The edge chain is now attached to a body via a fixture
|
|
60
|
+
bd = SB::BodyDef.new
|
|
61
|
+
bd.position.set(0.0, 0.0)
|
|
62
|
+
@body = box2d.createBody(bd)
|
|
63
|
+
# Shortcut, we could define a fixture if we
|
|
64
|
+
# want to specify frictions, restitution, etc.
|
|
65
|
+
body.createFixture(chain, 1)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# A simple function to just draw the edge chain as a series of vertex points
|
|
69
|
+
def display
|
|
70
|
+
stroke_weight(2)
|
|
71
|
+
stroke(0)
|
|
72
|
+
fill(135, 206, 250)
|
|
73
|
+
beginShape
|
|
74
|
+
vertex(width, 0) # extra vertices so we can fill sky
|
|
75
|
+
surface.each do |v|
|
|
76
|
+
vertex(v[0], v[1]) # the mountain range
|
|
77
|
+
end
|
|
78
|
+
vertex(0, 0) # extra vertices so we can fill sky
|
|
79
|
+
endShape
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
class Particle
|
|
84
|
+
# We need to keep track of a Body
|
|
85
|
+
|
|
86
|
+
attr_reader :body, :box2d, :x, :y, :r
|
|
87
|
+
|
|
88
|
+
# Constructor
|
|
89
|
+
def initialize(b2d, x, y, r)
|
|
90
|
+
@box2d, @x, @y, @r = b2d, x, y, r
|
|
91
|
+
# This function puts the particle in the Box2d world
|
|
92
|
+
make_body(x, y, r)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# This function removes the particle from the box2d world
|
|
96
|
+
def kill_body
|
|
97
|
+
box2d.destroy_body(body)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Is the particle ready for deletion?
|
|
101
|
+
def done
|
|
102
|
+
pos = box2d.get_body_pixel_coord(body)
|
|
103
|
+
# Is it off the bottom of the screen?
|
|
104
|
+
if (pos[1] > $app.height + r * 2)
|
|
105
|
+
kill_body
|
|
106
|
+
return true
|
|
107
|
+
end
|
|
108
|
+
return false
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def display
|
|
112
|
+
# We look at each body and get its screen position
|
|
113
|
+
pos = box2d.get_body_pixel_coord(body)
|
|
114
|
+
# Get its angle of rotation
|
|
115
|
+
a = body.get_angle
|
|
116
|
+
push_matrix
|
|
117
|
+
translate(pos[0], pos[1])
|
|
118
|
+
rotate(-a)
|
|
119
|
+
fill(175)
|
|
120
|
+
stroke(0)
|
|
121
|
+
stroke_weight(1)
|
|
122
|
+
ellipse(0,0,r*2,r*2)
|
|
123
|
+
# Let's add a line so we can see the rotation
|
|
124
|
+
line(0,0,r,0)
|
|
125
|
+
pop_matrix
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# This function adds the rectangle to the box2d world
|
|
129
|
+
def make_body(x, y, r)
|
|
130
|
+
# Define and create the body
|
|
131
|
+
bd = SB::BodyDef.new
|
|
132
|
+
bd.position = box2d.coord_pixels_to_world(x,y)
|
|
133
|
+
bd.type = SB::BodyType::DYNAMIC
|
|
134
|
+
@body = box2d.world.create_body(bd)
|
|
135
|
+
# Make the body's shape a circle
|
|
136
|
+
cs = SB::CircleShape.new
|
|
137
|
+
cs.m_radius = box2d.scalar_pixels_to_world(r)
|
|
138
|
+
fd = SB::FixtureDef.new
|
|
139
|
+
fd.shape = cs
|
|
140
|
+
# Parameters that affect physics
|
|
141
|
+
fd.density = 1
|
|
142
|
+
fd.friction = 0.01
|
|
143
|
+
fd.restitution = 0.3
|
|
144
|
+
# Attach fixture to body
|
|
145
|
+
body.create_fixture(fd)
|
|
146
|
+
# Give it a random initial velocity (and angular velocity)
|
|
147
|
+
body.set_linear_velocity(SB::Vec2.new(rand(-10 .. 10), rand(5 .. 10)))
|
|
148
|
+
body.set_angular_velocity(rand(-10 .. 10))
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# The Nature of Code
|
|
2
|
+
# <http:#www.shiffman.net/teaching/nature>
|
|
3
|
+
# Spring 2011
|
|
4
|
+
# PBox2D example
|
|
5
|
+
|
|
6
|
+
# Box2D particle system example
|
|
7
|
+
|
|
8
|
+
load_library :pbox2d
|
|
9
|
+
load_library :particle_system
|
|
10
|
+
|
|
11
|
+
# module PS is a wrapper for java imports, and Boundary and Particle classes
|
|
12
|
+
include PS
|
|
13
|
+
|
|
14
|
+
attr_reader :box2d, :boundaries, :systems
|
|
15
|
+
|
|
16
|
+
def setup
|
|
17
|
+
size(400,300)
|
|
18
|
+
smooth
|
|
19
|
+
# Initialize box2d physics and create the world
|
|
20
|
+
@box2d = PBox2D.new(self)
|
|
21
|
+
box2d.create_world
|
|
22
|
+
# We are setting a custom gravity
|
|
23
|
+
box2d.set_gravity(0, -20)
|
|
24
|
+
# Create ArrayLists
|
|
25
|
+
@systems = []
|
|
26
|
+
@boundaries = []
|
|
27
|
+
# Add a bunch of fixed boundaries
|
|
28
|
+
boundaries << Boundary.new(box2d, 50, 100, 300, 5, -0.3)
|
|
29
|
+
boundaries << Boundary.new(box2d, 250, 175, 300, 5, 0.5)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def draw
|
|
33
|
+
background(255)
|
|
34
|
+
# We must always step through time!
|
|
35
|
+
box2d.step
|
|
36
|
+
# Run all the particle systems
|
|
37
|
+
if systems.size > 0
|
|
38
|
+
systems.each do |system|
|
|
39
|
+
system.run
|
|
40
|
+
system.add_particles(box2d, rand(0 .. 2))
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
# Display all the boundaries
|
|
44
|
+
boundaries.each do |wall|
|
|
45
|
+
wall.display
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def mouse_pressed
|
|
51
|
+
# Add a new Particle System whenever the mouse is clicked
|
|
52
|
+
systems << ParticleSystem.new(box2d, 0, mouse_x, mouse_y)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# The Nature of Code
|
|
2
|
+
# <http://www.shiffman.net/teaching/nature>
|
|
3
|
+
# Spring 2011
|
|
4
|
+
# PBox2D example
|
|
5
|
+
|
|
6
|
+
# Basic example of falling rectangles
|
|
7
|
+
load_library :pbox2d
|
|
8
|
+
load_library :custom_shape
|
|
9
|
+
|
|
10
|
+
# module B2D is a wrapper for java imports, and Boundary and CustomShape classes
|
|
11
|
+
include B2D
|
|
12
|
+
|
|
13
|
+
attr_reader :box2d, :boundaries, :polygons
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
size(640,360)
|
|
17
|
+
smooth
|
|
18
|
+
# Initialize box2d physics and create the world
|
|
19
|
+
@box2d = PBox2D.new(self)
|
|
20
|
+
box2d.create_world
|
|
21
|
+
# We are setting a custom gravity
|
|
22
|
+
box2d.set_gravity(0, -20)
|
|
23
|
+
# Create Arrays
|
|
24
|
+
@polygons = []
|
|
25
|
+
@boundaries = []
|
|
26
|
+
# Add a bunch of fixed boundaries
|
|
27
|
+
boundaries << Boundary.new(box2d, width / 4, height - 5, width/2 - 50, 10, 0)
|
|
28
|
+
boundaries << Boundary.new(box2d, 3*width / 4, height - 50, width/2 - 50, 10, 0)
|
|
29
|
+
boundaries << Boundary.new(box2d, width - 5,height / 2, 10, height, 0)
|
|
30
|
+
boundaries << Boundary.new(box2d, 5, height / 2, 10, height, 0)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def draw
|
|
34
|
+
background(255)
|
|
35
|
+
# We must always step through time!
|
|
36
|
+
box2d.step
|
|
37
|
+
# Display all the boundaries
|
|
38
|
+
boundaries.each do |wall|
|
|
39
|
+
wall.display
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Display all the polygons
|
|
43
|
+
polygons.each do |cs|
|
|
44
|
+
cs.display
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# polygons that leave the screen, we delete them
|
|
48
|
+
# (note they have to be deleted from both the box2d world and our list
|
|
49
|
+
polygons.each_with_index do |polygon, i|
|
|
50
|
+
if polygon.done
|
|
51
|
+
polygons.delete_at(i)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def mouse_pressed
|
|
57
|
+
polygons << CustomShape.new(box2d, mouse_x, mouse_y)
|
|
58
|
+
end
|