propane 0.3.0.pre-java → 0.4.0.pre-java
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/.github/CONTRIBUTING.md +33 -0
 - data/.github/ISSUE_TEMPLATE.md +27 -0
 - data/CHANGELOG.md +5 -0
 - data/Gemfile +1 -3
 - data/README.md +7 -8
 - data/Rakefile +1 -0
 - data/examples/regular/arcball_box.rb +1 -1
 - data/examples/regular/circle_collision.rb +118 -0
 - data/examples/regular/drawolver.rb +92 -0
 - data/examples/regular/empathy.rb +79 -0
 - data/examples/regular/fern.rb +56 -0
 - data/examples/regular/fractions.rb +31 -0
 - data/examples/regular/lib/rain_drops.rb +54 -0
 - data/examples/regular/raining.rb +59 -0
 - data/lib/propane/version.rb +1 -1
 - data/pom.rb +1 -1
 - data/pom.xml +1 -1
 - data/propane.gemspec +1 -0
 - metadata +13 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 8be45e7e7dceb0061a4af4af3044de8e277d0ace
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: d9477ff46ea8cac2ed39cf486d7a9556a9312aae
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: b5e216855d9d126045ae5d2ec0eb0962bd83861c58d1c1cbe740f56bcf43a192bdb6464bfcbfc811e340a7dcb47c304cf69db5e21fded92c094d5f06f0a789a0
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 4e514eb57e7fbf78bb861d4e156063fe2a85f39ab21f4a348b02da0e6e56edbe225c61792179de7c05b0c56d608b6bb702ef6947714d6a0225be89d4dab48263
         
     | 
| 
         @@ -0,0 +1,33 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ## Contributing
         
     | 
| 
      
 2 
     | 
    
         
            +
            In the spirit of [free software][free-sw], **everyone** is encouraged to help improve this project.
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            Here are some ways *you* can contribute:
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            * by reporting bugs
         
     | 
| 
      
 7 
     | 
    
         
            +
            * by suggesting/implementing new features
         
     | 
| 
      
 8 
     | 
    
         
            +
            * by writing or editing documentation ( _expert Windows users could help write install instructions_ )
         
     | 
| 
      
 9 
     | 
    
         
            +
            * by contributing examples ( _show your creativity, or translate someone elses masterpiece_ )
         
     | 
| 
      
 10 
     | 
    
         
            +
            * by refactoring examples to be more rubyfied
         
     | 
| 
      
 11 
     | 
    
         
            +
            * by closing [issues][]
         
     | 
| 
      
 12 
     | 
    
         
            +
            * by proselytizing Propane, we need more champions
         
     | 
| 
      
 13 
     | 
    
         
            +
            * by supporting [Processing.org][], nothing to do with us but we rely on them
         
     | 
| 
      
 14 
     | 
    
         
            +
            * by creating gems for pdf, video library etc see arcball gem as example
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            ## Submitting an Issue
         
     | 
| 
      
 17 
     | 
    
         
            +
            We use the [GitHub issue tracker][issues] to track bugs and features. Before
         
     | 
| 
      
 18 
     | 
    
         
            +
            submitting a bug report or feature request, check to make sure it hasn't
         
     | 
| 
      
 19 
     | 
    
         
            +
            already been submitted. When submitting a bug report, ideally include a [Gist][]
         
     | 
| 
      
 20 
     | 
    
         
            +
            that includes a stack trace and any details that may be necessary to reproduce
         
     | 
| 
      
 21 
     | 
    
         
            +
            the bug, including your gem version, Ruby version, and operating system.
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            ## Submitting a Pull Request
         
     | 
| 
      
 25 
     | 
    
         
            +
            1. [Fork the repository.][fork]
         
     | 
| 
      
 26 
     | 
    
         
            +
            2. [Submit a pull request.][pr]
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            [free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
         
     | 
| 
      
 29 
     | 
    
         
            +
            [issues]: https://github.com/monkstone/Propane/issues
         
     | 
| 
      
 30 
     | 
    
         
            +
            [gist]: https://gist.github.com/
         
     | 
| 
      
 31 
     | 
    
         
            +
            [fork]: http://help.github.com/fork-a-repo/
         
     | 
| 
      
 32 
     | 
    
         
            +
            [pr]: http://help.github.com/send-pull-requests/
         
     | 
| 
      
 33 
     | 
    
         
            +
            [processing.org]: http://processing.org/foundation/
         
     | 
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            <!--
         
     | 
| 
      
 2 
     | 
    
         
            +
            This is a simple template for filing Propane issues.
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            Please help us help you by providing the information below.
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            Text inside XML comment tags will not be shown in your report.
         
     | 
| 
      
 7 
     | 
    
         
            +
            -->
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            ### Environment
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            Ensure that you are using the recommended versions of jruby (`jruby -v`) and java (`java -version`) 
         
     | 
| 
      
 12 
     | 
    
         
            +
            Provide Propane version that you are using (`propane --version`)
         
     | 
| 
      
 13 
     | 
    
         
            +
            Provide your operating system and platform (e.g. `uname -a`, and/or `java -version` output if relevant)
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            ### Expected Behavior
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            Describe your expectation of how Propane sketch should behave.
         
     | 
| 
      
 18 
     | 
    
         
            +
            Provide a `problematic` Propane sketch or a link to an example repository.
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            ### Actual Behavior
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            Describe or show the actual behavior.
         
     | 
| 
      
 23 
     | 
    
         
            +
            Provide text or screen capture showing the behavior.
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            ### Other
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            eg installation issue (just use this header and explain the problem as best you can)
         
     | 
    
        data/CHANGELOG.md
    ADDED
    
    | 
         @@ -0,0 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
             
     | 
| 
      
 2 
     | 
    
         
            +
            **v0.4.0.pre** Inclusion of jogl-all.jar should fix 3D if install fails try getting rid of previous versions of gem (especially if you had done local installs, foxed me first) 3D still only for linux64 and macosx, any Windows developers are welocme to extens to windows (should be easy).
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            **v0.3.0.pre** First pre-release of propane.gem turns out 3D was not working because of missing jar in gem (3D was only going to work on macosx and linux64 OS anyways.
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,6 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Propane
         
     | 
| 
      
 2 
     | 
    
         
            +
            [](https://badge.fury.io/rb/propane)
         
     | 
| 
       2 
3 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            A  
     | 
| 
      
 4 
     | 
    
         
            +
            A slim layer to communicate with Processing from JRuby, features a polyglot maven build, this started out as a non serious project by Phillip Cunningam called ribiprocessing.  It has now morphed into an experimental project for ruby-processing so we can now "Cook with Gas". We have created a configuration free version of ruby processing, albeit tied to processing-2.2.1, where we get processing core from maven central (and opengl currently testing on linux64/mac). These jars are small enough to include in the gem distribution, and hence we should not require configuration. This has created a mainly scriptable version, ie files get run direct from jruby.  However (as with ruby-processing/JRubyArt) certain sketches need to call jruby via jruby-complete, for this we have created an executable `propane` that can also be used to install `jruby-complete` as well as run sketches (maybe export?, possibly watch).
         
     | 
| 
      
 5 
     | 
    
         
            +
            ## Requirements
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            - jdk7+
         
     | 
| 
      
 8 
     | 
    
         
            +
            - jruby-9.0.5.0+
         
     | 
| 
      
 9 
     | 
    
         
            +
            - mvn-3.3.1+ (development only)
         
     | 
| 
       4 
10 
     | 
    
         | 
| 
       5 
11 
     | 
    
         
             
            ## Building and testing
         
     | 
| 
       6 
12 
     | 
    
         | 
| 
         @@ -60,10 +66,3 @@ To run sketches using the installed jruby-complete 
     | 
|
| 
       60 
66 
     | 
    
         
             
            propane --run my_sketch.rb          # or
         
     | 
| 
       61 
67 
     | 
    
         
             
            jruby -S propane --run my_sketch.rb # belt and braces version
         
     | 
| 
       62 
68 
     | 
    
         
             
            ```
         
     | 
| 
       63 
     | 
    
         
            -
            ## Contributing
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
            1. Fork it
         
     | 
| 
       66 
     | 
    
         
            -
            2. Create your feature branch (`git checkout -b my-new-feature`)
         
     | 
| 
       67 
     | 
    
         
            -
            3. Commit your changes (`git commit -am 'Add some feature'`)
         
     | 
| 
       68 
     | 
    
         
            -
            4. Push to the branch (`git push origin my-new-feature`)
         
     | 
| 
       69 
     | 
    
         
            -
            5. Create new Pull Request
         
     | 
    
        data/Rakefile
    CHANGED
    
    
| 
         @@ -7,7 +7,7 @@ require 'arcball' 
     | 
|
| 
       7 
7 
     | 
    
         
             
            # to constrain rotation axis.
         
     | 
| 
       8 
8 
     | 
    
         
             
            ############################
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 10 
     | 
    
         
            +
            require 'propane' # temporary local
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
            # Include processing opengl classes that we'd like to use:
         
     | 
| 
       13 
13 
     | 
    
         
             
            %w(PGL PGraphics3D PGraphicsOpenGL PShapeOpenGL Texture).each do |klass|
         
     | 
| 
         @@ -0,0 +1,118 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'propane'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            # Based on http://processing.org/learning/topics/circlecollision.html
         
     | 
| 
      
 5 
     | 
    
         
            +
            class CircleCollision < Propane::App  
         
     | 
| 
      
 6 
     | 
    
         
            +
              attr_reader :balls
         
     | 
| 
      
 7 
     | 
    
         
            +
              
         
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                size 640, 360
         
     | 
| 
      
 10 
     | 
    
         
            +
                @balls = [Ball.new(100, 40, 20), Ball.new(200, 100, 80)]
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
              
         
     | 
| 
      
 13 
     | 
    
         
            +
              def draw
         
     | 
| 
      
 14 
     | 
    
         
            +
                background(51)
         
     | 
| 
      
 15 
     | 
    
         
            +
                balls.each do |b|
         
     | 
| 
      
 16 
     | 
    
         
            +
                  b.update
         
     | 
| 
      
 17 
     | 
    
         
            +
                  b.display
         
     | 
| 
      
 18 
     | 
    
         
            +
                  b.check_boundary width, height
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
                balls[0].check_collision(balls[1])
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            # The Ball class knows how to behave, their is a case for a separate boundary class
         
     | 
| 
      
 25 
     | 
    
         
            +
            class Ball
         
     | 
| 
      
 26 
     | 
    
         
            +
              include Propane::Proxy, Math
         
     | 
| 
      
 27 
     | 
    
         
            +
              attr_accessor :position, :r, :m, :velocity
         
     | 
| 
      
 28 
     | 
    
         
            +
              
         
     | 
| 
      
 29 
     | 
    
         
            +
              def initialize(x = 0.0, y = 0.0, r = 0.0)
         
     | 
| 
      
 30 
     | 
    
         
            +
                @position = Vec2D.new(x, y)
         
     | 
| 
      
 31 
     | 
    
         
            +
                @r = r
         
     | 
| 
      
 32 
     | 
    
         
            +
                @m = r * 0.1
         
     | 
| 
      
 33 
     | 
    
         
            +
                @velocity = Vec2D.new(rand(-3.0..3), rand(-3.0..3))
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
              
         
     | 
| 
      
 36 
     | 
    
         
            +
              def update
         
     | 
| 
      
 37 
     | 
    
         
            +
                @position += velocity
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
              
         
     | 
| 
      
 40 
     | 
    
         
            +
              def check_boundary(width, height)
         
     | 
| 
      
 41 
     | 
    
         
            +
                unless (r..width - r).include?(position.x)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  (position.x > width - r) ? position.x = width - r : position.x = r
         
     | 
| 
      
 43 
     | 
    
         
            +
                  velocity.x *= -1
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
                return if (r..height - r).include?(position.y)
         
     | 
| 
      
 46 
     | 
    
         
            +
                (position.y > height - r) ? position.y = height - r : position.y = r
         
     | 
| 
      
 47 
     | 
    
         
            +
                velocity.y *= -1
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
              
         
     | 
| 
      
 50 
     | 
    
         
            +
              def check_collision(other_ball)
         
     | 
| 
      
 51 
     | 
    
         
            +
                # get distances between the balls components
         
     | 
| 
      
 52 
     | 
    
         
            +
                difference = other_ball.position - position
         
     | 
| 
      
 53 
     | 
    
         
            +
                # calculate magnitude of the vector separating the balls
         
     | 
| 
      
 54 
     | 
    
         
            +
                return unless difference.mag < (r + other_ball.r)
         
     | 
| 
      
 55 
     | 
    
         
            +
                # get angle of difference
         
     | 
| 
      
 56 
     | 
    
         
            +
                theta  = difference.heading
         
     | 
| 
      
 57 
     | 
    
         
            +
                # precalculate trig values
         
     | 
| 
      
 58 
     | 
    
         
            +
                sine = sin(theta)
         
     | 
| 
      
 59 
     | 
    
         
            +
                cosine = cos(theta)
         
     | 
| 
      
 60 
     | 
    
         
            +
                # ball_array will hold rotated ball positions. You just
         
     | 
| 
      
 61 
     | 
    
         
            +
                # need to worry about ball_array[1] position
         
     | 
| 
      
 62 
     | 
    
         
            +
                ball_array = [Ball.new, Ball.new]
         
     | 
| 
      
 63 
     | 
    
         
            +
                # other_ball's position is relative to ball's
         
     | 
| 
      
 64 
     | 
    
         
            +
                # so you can use the vector between them (difference) as the
         
     | 
| 
      
 65 
     | 
    
         
            +
                # reference point in the rotation expressions.
         
     | 
| 
      
 66 
     | 
    
         
            +
                # ball_array[0].x and ball_array[0].y will initialize
         
     | 
| 
      
 67 
     | 
    
         
            +
                # automatically to 0.0, which is what you want
         
     | 
| 
      
 68 
     | 
    
         
            +
                # since other_ball will rotate around ball
         
     | 
| 
      
 69 
     | 
    
         
            +
                ball_array[1].position.x  = cosine * difference.x + sine * difference.y
         
     | 
| 
      
 70 
     | 
    
         
            +
                ball_array[1].position.y  = cosine * difference.y - sine * difference.x
         
     | 
| 
      
 71 
     | 
    
         
            +
                # rotate Temporary velocities
         
     | 
| 
      
 72 
     | 
    
         
            +
                velocity_array = [Vec2D.new, Vec2D.new]
         
     | 
| 
      
 73 
     | 
    
         
            +
                velocity_array[0].x  = cosine * velocity.x + sine * velocity.y
         
     | 
| 
      
 74 
     | 
    
         
            +
                velocity_array[0].y  = cosine * velocity.y - sine * velocity.x
         
     | 
| 
      
 75 
     | 
    
         
            +
                velocity_array[1].x  = cosine * other_ball.velocity.x + sine * other_ball.velocity.y
         
     | 
| 
      
 76 
     | 
    
         
            +
                velocity_array[1].y  = cosine * other_ball.velocity.y - sine * other_ball.velocity.x
         
     | 
| 
      
 77 
     | 
    
         
            +
                # Now that velocities are rotated, you can use 1D
         
     | 
| 
      
 78 
     | 
    
         
            +
                # conservation of momentum equations to calculate
         
     | 
| 
      
 79 
     | 
    
         
            +
                # the final velocity along the x-axis.
         
     | 
| 
      
 80 
     | 
    
         
            +
                final_velocities = [Vec2D.new, Vec2D.new]
         
     | 
| 
      
 81 
     | 
    
         
            +
                # final rotated velocity for ball
         
     | 
| 
      
 82 
     | 
    
         
            +
                final_velocities[0].x = ((m - other_ball.m) * velocity_array[0].x + 2 * other_ball.m * velocity_array[1].x) / (m + other_ball.m)
         
     | 
| 
      
 83 
     | 
    
         
            +
                final_velocities[0].y = velocity_array[0].y
         
     | 
| 
      
 84 
     | 
    
         
            +
                # final rotated velocity for ball
         
     | 
| 
      
 85 
     | 
    
         
            +
                final_velocities[1].x = ((other_ball.m - m) * velocity_array[1].x + 2 * m * velocity_array[0].x) / (m + other_ball.m)
         
     | 
| 
      
 86 
     | 
    
         
            +
                final_velocities[1].y = velocity_array[1].y
         
     | 
| 
      
 87 
     | 
    
         
            +
                # HACK: to avoid clumping
         
     | 
| 
      
 88 
     | 
    
         
            +
                # ball_array[0].position.x += final_velocities[0].x
         
     | 
| 
      
 89 
     | 
    
         
            +
                # ball_array[1].position.x += final_velocities[1].x
         
     | 
| 
      
 90 
     | 
    
         
            +
                # Rotate ball positions and velocities back
         
     | 
| 
      
 91 
     | 
    
         
            +
                # Reverse signs in trig expressions to rotate
         
     | 
| 
      
 92 
     | 
    
         
            +
                # in the opposite direction
         
     | 
| 
      
 93 
     | 
    
         
            +
                # rotate balls
         
     | 
| 
      
 94 
     | 
    
         
            +
                final_positions = [Vec2D.new, Vec2D.new]
         
     | 
| 
      
 95 
     | 
    
         
            +
                final_positions[0].x = cosine * ball_array[0].position.x - sine * ball_array[0].position.y
         
     | 
| 
      
 96 
     | 
    
         
            +
                final_positions[0].y = cosine * ball_array[0].position.y + sine * ball_array[0].position.x
         
     | 
| 
      
 97 
     | 
    
         
            +
                final_positions[1].x = cosine * ball_array[1].position.x - sine * ball_array[1].position.y
         
     | 
| 
      
 98 
     | 
    
         
            +
                final_positions[1].y = cosine * ball_array[1].position.y + sine * ball_array[1].position.x
         
     | 
| 
      
 99 
     | 
    
         
            +
                # update balls to screen position
         
     | 
| 
      
 100 
     | 
    
         
            +
                other_ball.position = position + final_positions[1]
         
     | 
| 
      
 101 
     | 
    
         
            +
                @position += final_positions[0]
         
     | 
| 
      
 102 
     | 
    
         
            +
                # update velocities
         
     | 
| 
      
 103 
     | 
    
         
            +
                velocity.x = cosine * final_velocities[0].x - sine * final_velocities[0].y
         
     | 
| 
      
 104 
     | 
    
         
            +
                velocity.y = cosine * final_velocities[0].y + sine * final_velocities[0].x
         
     | 
| 
      
 105 
     | 
    
         
            +
                other_ball.velocity.x = cosine * final_velocities[1].x - sine * final_velocities[1].y
         
     | 
| 
      
 106 
     | 
    
         
            +
                other_ball.velocity.y = cosine * final_velocities[1].y + sine * final_velocities[1].x
         
     | 
| 
      
 107 
     | 
    
         
            +
              end
         
     | 
| 
      
 108 
     | 
    
         
            +
              
         
     | 
| 
      
 109 
     | 
    
         
            +
              def display
         
     | 
| 
      
 110 
     | 
    
         
            +
                no_stroke
         
     | 
| 
      
 111 
     | 
    
         
            +
                fill(204)
         
     | 
| 
      
 112 
     | 
    
         
            +
                ellipse(position.x, position.y, r * 2, r * 2)
         
     | 
| 
      
 113 
     | 
    
         
            +
              end
         
     | 
| 
      
 114 
     | 
    
         
            +
            end
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
            CircleCollision.new title: 'Circle Collision'
         
     | 
| 
         @@ -0,0 +1,92 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'propane'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # Example to show how to use the VecMath library.
         
     | 
| 
      
 4 
     | 
    
         
            +
            # ruby replacement for PVector. Also features
         
     | 
| 
      
 5 
     | 
    
         
            +
            # the use each_cons, possibly a rare use for this
         
     | 
| 
      
 6 
     | 
    
         
            +
            # ruby Enumerable method?
         
     | 
| 
      
 7 
     | 
    
         
            +
            # 2010-03-22 - fjenett (last revised by monkstone 2016-03-26)
         
     | 
| 
      
 8 
     | 
    
         
            +
            # now uses 'zip' and 'each', in place of a custom Array object
         
     | 
| 
      
 9 
     | 
    
         
            +
            # with a 'one_of_each' method
         
     | 
| 
      
 10 
     | 
    
         
            +
            # Drawolver: draw 2D & revolve 3D
         
     | 
| 
      
 11 
     | 
    
         
            +
            class Drawolver < Propane::App
         
     | 
| 
      
 12 
     | 
    
         
            +
              attr_reader :drawing_mode, :points, :rot_x, :rot_y, :vertices
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 15 
     | 
    
         
            +
                size 1024, 768, P3D
         
     | 
| 
      
 16 
     | 
    
         
            +
                frame_rate 30
         
     | 
| 
      
 17 
     | 
    
         
            +
                reset_scene
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              def draw
         
     | 
| 
      
 21 
     | 
    
         
            +
                background 0
         
     | 
| 
      
 22 
     | 
    
         
            +
                unless drawing_mode
         
     | 
| 
      
 23 
     | 
    
         
            +
                  translate(width / 2, height / 2)
         
     | 
| 
      
 24 
     | 
    
         
            +
                  rotate_x rot_x
         
     | 
| 
      
 25 
     | 
    
         
            +
                  rotate_y rot_y
         
     | 
| 
      
 26 
     | 
    
         
            +
                  @rot_x += 0.01
         
     | 
| 
      
 27 
     | 
    
         
            +
                  @rot_y += 0.02
         
     | 
| 
      
 28 
     | 
    
         
            +
                  translate(-width / 2, -height / 2)
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
                no_fill
         
     | 
| 
      
 31 
     | 
    
         
            +
                stroke 255
         
     | 
| 
      
 32 
     | 
    
         
            +
                points.each_cons(2) { |ps, pe| line ps.x, ps.y, pe.x, pe.y }
         
     | 
| 
      
 33 
     | 
    
         
            +
                return if drawing_mode
         
     | 
| 
      
 34 
     | 
    
         
            +
                stroke 125
         
     | 
| 
      
 35 
     | 
    
         
            +
                fill 120
         
     | 
| 
      
 36 
     | 
    
         
            +
                lights
         
     | 
| 
      
 37 
     | 
    
         
            +
                ambient_light 120, 120, 120
         
     | 
| 
      
 38 
     | 
    
         
            +
                vertices.each_cons(2) do |r1, r2|
         
     | 
| 
      
 39 
     | 
    
         
            +
                  begin_shape(TRIANGLE_STRIP)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  r1.zip(r2).each do |v1, v2|
         
     | 
| 
      
 41 
     | 
    
         
            +
                    vertex v1.x, v1.y, v1.z
         
     | 
| 
      
 42 
     | 
    
         
            +
                    vertex v2.x, v2.y, v2.z
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
                  end_shape
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              def reset_scene
         
     | 
| 
      
 49 
     | 
    
         
            +
                @drawing_mode = true
         
     | 
| 
      
 50 
     | 
    
         
            +
                @points = []
         
     | 
| 
      
 51 
     | 
    
         
            +
                @rot_x = 0.0
         
     | 
| 
      
 52 
     | 
    
         
            +
                @rot_y = 0.0
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
              def mouse_pressed
         
     | 
| 
      
 56 
     | 
    
         
            +
                reset_scene
         
     | 
| 
      
 57 
     | 
    
         
            +
                points << Vec3D.new(mouse_x, mouse_y)
         
     | 
| 
      
 58 
     | 
    
         
            +
              end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              def mouse_dragged
         
     | 
| 
      
 61 
     | 
    
         
            +
                points << Vec3D.new(mouse_x, mouse_y)
         
     | 
| 
      
 62 
     | 
    
         
            +
              end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
              def mouse_released
         
     | 
| 
      
 65 
     | 
    
         
            +
                points << Vec3D.new(mouse_x, mouse_y)
         
     | 
| 
      
 66 
     | 
    
         
            +
                recalculate_shape
         
     | 
| 
      
 67 
     | 
    
         
            +
              end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
              def recalculate_shape
         
     | 
| 
      
 70 
     | 
    
         
            +
                @vertices = []
         
     | 
| 
      
 71 
     | 
    
         
            +
                points.each_cons(2) do |ps, _pe|
         
     | 
| 
      
 72 
     | 
    
         
            +
                  b = points.last - points.first
         
     | 
| 
      
 73 
     | 
    
         
            +
                  # len = b.mag
         
     | 
| 
      
 74 
     | 
    
         
            +
                  b.normalize!
         
     | 
| 
      
 75 
     | 
    
         
            +
                  a = ps - points.first
         
     | 
| 
      
 76 
     | 
    
         
            +
                  dot = a.dot b
         
     | 
| 
      
 77 
     | 
    
         
            +
                  b *= dot
         
     | 
| 
      
 78 
     | 
    
         
            +
                  normal = points.first + b
         
     | 
| 
      
 79 
     | 
    
         
            +
                  c = ps - normal
         
     | 
| 
      
 80 
     | 
    
         
            +
                  # nlen = c.mag
         
     | 
| 
      
 81 
     | 
    
         
            +
                  vertices << []
         
     | 
| 
      
 82 
     | 
    
         
            +
                  (0..TAU).step(PI / 15) do |ang|
         
     | 
| 
      
 83 
     | 
    
         
            +
                    e = normal + c * cos(ang)
         
     | 
| 
      
 84 
     | 
    
         
            +
                    e.z = c.mag * sin(ang)
         
     | 
| 
      
 85 
     | 
    
         
            +
                    vertices.last << e
         
     | 
| 
      
 86 
     | 
    
         
            +
                  end
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
                @drawing_mode = false
         
     | 
| 
      
 89 
     | 
    
         
            +
              end
         
     | 
| 
      
 90 
     | 
    
         
            +
            end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
            Drawolver.new title: 'Drawolver'
         
     | 
| 
         @@ -0,0 +1,79 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Empathy
         
     | 
| 
      
 2 
     | 
    
         
            +
            # original by Kyle McDonald
         
     | 
| 
      
 3 
     | 
    
         
            +
            # http://www.openprocessing.org/visuals/?visualID=1182
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            # This sketch takes advantage of multiple processors by running calculations
         
     | 
| 
      
 6 
     | 
    
         
            +
            # in a separate thread.
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'propane'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            CELL_COUNT      = 5_000
         
     | 
| 
      
 10 
     | 
    
         
            +
            SLOW_DOWN       = 0.97
         
     | 
| 
      
 11 
     | 
    
         
            +
            ROTATION        = 0.004
         
     | 
| 
      
 12 
     | 
    
         
            +
            LINE_LENGTH     = 37
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            class Empathy < Propane::App
         
     | 
| 
      
 15 
     | 
    
         
            +
              
         
     | 
| 
      
 16 
     | 
    
         
            +
              attr_reader :cells
         
     | 
| 
      
 17 
     | 
    
         
            +
              
         
     | 
| 
      
 18 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 19 
     | 
    
         
            +
                size(500, 500)
         
     | 
| 
      
 20 
     | 
    
         
            +
                stroke(0, 0, 0, 25)
         
     | 
| 
      
 21 
     | 
    
         
            +
                @cells = create_cells(CELL_COUNT)
         
     | 
| 
      
 22 
     | 
    
         
            +
                start_cell_updates
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
              
         
     | 
| 
      
 25 
     | 
    
         
            +
              def create_cells(n)
         
     | 
| 
      
 26 
     | 
    
         
            +
                (0..n).map do |i|
         
     | 
| 
      
 27 
     | 
    
         
            +
                  a = i + rand(PI / 9.0)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  r = ((i / n.to_f) * (width / 2) * (((n - i) / n.to_f) * 3.3)) + rand(6.0)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  Cell.new((r * cos(a) + width / 2).to_i, (r * sin(a) + height / 2).to_i)
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
              
         
     | 
| 
      
 33 
     | 
    
         
            +
              def start_cell_updates
         
     | 
| 
      
 34 
     | 
    
         
            +
                Thread.new { Kernel.loop { cells.each(&:update) } }
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
              
         
     | 
| 
      
 37 
     | 
    
         
            +
              def draw
         
     | 
| 
      
 38 
     | 
    
         
            +
                background 255
         
     | 
| 
      
 39 
     | 
    
         
            +
                cells.each(&:draw_line) if started?
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
              
         
     | 
| 
      
 42 
     | 
    
         
            +
              def started?
         
     | 
| 
      
 43 
     | 
    
         
            +
                pmouse_x != 0 || pmouse_y != 0
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
              
         
     | 
| 
      
 46 
     | 
    
         
            +
              def mouse_pressed
         
     | 
| 
      
 47 
     | 
    
         
            +
                cells.each(&:reset)
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
            end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            ##
         
     | 
| 
      
 52 
     | 
    
         
            +
            # The cell responds to mouse movement
         
     | 
| 
      
 53 
     | 
    
         
            +
            ##
         
     | 
| 
      
 54 
     | 
    
         
            +
            class Cell
         
     | 
| 
      
 55 
     | 
    
         
            +
              include Propane::Proxy, Math
         
     | 
| 
      
 56 
     | 
    
         
            +
              attr_reader :x, :y, :spin, :angle
         
     | 
| 
      
 57 
     | 
    
         
            +
              def initialize(x, y)
         
     | 
| 
      
 58 
     | 
    
         
            +
                @x, @y  = x, y
         
     | 
| 
      
 59 
     | 
    
         
            +
                reset
         
     | 
| 
      
 60 
     | 
    
         
            +
              end
         
     | 
| 
      
 61 
     | 
    
         
            +
              
         
     | 
| 
      
 62 
     | 
    
         
            +
              def reset
         
     | 
| 
      
 63 
     | 
    
         
            +
                @spin, @angle = 0, 0
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
      
 65 
     | 
    
         
            +
              
         
     | 
| 
      
 66 
     | 
    
         
            +
              def update
         
     | 
| 
      
 67 
     | 
    
         
            +
                det = ((pmouse_x - x) * (mouse_y - y) - (mouse_x - x) * (pmouse_y - y))
         
     | 
| 
      
 68 
     | 
    
         
            +
                @spin += ROTATION * det.to_f / dist(x, y, mouse_x, mouse_y)
         
     | 
| 
      
 69 
     | 
    
         
            +
                @spin *= SLOW_DOWN
         
     | 
| 
      
 70 
     | 
    
         
            +
                @angle += spin
         
     | 
| 
      
 71 
     | 
    
         
            +
              end
         
     | 
| 
      
 72 
     | 
    
         
            +
              
         
     | 
| 
      
 73 
     | 
    
         
            +
              def draw_line
         
     | 
| 
      
 74 
     | 
    
         
            +
                d = LINE_LENGTH * spin + 0.001
         
     | 
| 
      
 75 
     | 
    
         
            +
                line(x, y, x + d * cos(angle), y + d * sin(angle))
         
     | 
| 
      
 76 
     | 
    
         
            +
              end
         
     | 
| 
      
 77 
     | 
    
         
            +
            end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
            Empathy.new(title: 'Empathy')
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'propane'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class Fern < Propane::App
         
     | 
| 
      
 4 
     | 
    
         
            +
              # The Fern Fractal
         
     | 
| 
      
 5 
     | 
    
         
            +
            # by Luis Correia
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            attr_reader :bnds
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            def setup
         
     | 
| 
      
 10 
     | 
    
         
            +
              size 500, 500
         
     | 
| 
      
 11 
     | 
    
         
            +
              @bnds = Boundary.new(0, width)
         
     | 
| 
      
 12 
     | 
    
         
            +
              no_loop
         
     | 
| 
      
 13 
     | 
    
         
            +
              puts 'Be patient. This takes about 10 seconds to render.'
         
     | 
| 
      
 14 
     | 
    
         
            +
            end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            def draw
         
     | 
| 
      
 17 
     | 
    
         
            +
              background 0
         
     | 
| 
      
 18 
     | 
    
         
            +
              load_pixels
         
     | 
| 
      
 19 
     | 
    
         
            +
              x0, y0 = 0.0, 0.0
         
     | 
| 
      
 20 
     | 
    
         
            +
              x, y, r = 0.0, 0.0, 0.0
         
     | 
| 
      
 21 
     | 
    
         
            +
              i, j = 0, 0
         
     | 
| 
      
 22 
     | 
    
         
            +
              max_iterations = 200_000
         
     | 
| 
      
 23 
     | 
    
         
            +
              max_iterations.times do
         
     | 
| 
      
 24 
     | 
    
         
            +
                r = rand(0..100.0)
         
     | 
| 
      
 25 
     | 
    
         
            +
                if r <= 1
         
     | 
| 
      
 26 
     | 
    
         
            +
                  x = 0.0
         
     | 
| 
      
 27 
     | 
    
         
            +
                  y = 0.16 * y0
         
     | 
| 
      
 28 
     | 
    
         
            +
                elsif r <= 7
         
     | 
| 
      
 29 
     | 
    
         
            +
                  x = 0.2 * x0 - 0.26 * y0
         
     | 
| 
      
 30 
     | 
    
         
            +
                  y = 0.23 * x0 + 0.22 * y0
         
     | 
| 
      
 31 
     | 
    
         
            +
                elsif r <= 14
         
     | 
| 
      
 32 
     | 
    
         
            +
                  x = -0.15 * x0 + 0.28 * y0
         
     | 
| 
      
 33 
     | 
    
         
            +
                  y = 0.26 * x0 + 0.24 * y0
         
     | 
| 
      
 34 
     | 
    
         
            +
                else
         
     | 
| 
      
 35 
     | 
    
         
            +
                  x = 0.85 * x0 + 0.04 * y0
         
     | 
| 
      
 36 
     | 
    
         
            +
                  y = -0.004 * x0 + 0.85 * y0 + 1.6
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
                i = height - (y * 45).to_i
         
     | 
| 
      
 39 
     | 
    
         
            +
                j = width / 2 + (x * 45).to_i
         
     | 
| 
      
 40 
     | 
    
         
            +
                pixels[i * height + j] += 2_560 if bnds.include?(i) && bnds.include?(j)
         
     | 
| 
      
 41 
     | 
    
         
            +
                x0, y0 = x, y
         
     | 
| 
      
 42 
     | 
    
         
            +
              end
         
     | 
| 
      
 43 
     | 
    
         
            +
              update_pixels
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
      
 45 
     | 
    
         
            +
            end
         
     | 
| 
      
 46 
     | 
    
         
            +
            # Abstract bnds checking to this
         
     | 
| 
      
 47 
     | 
    
         
            +
            # lightweight class
         
     | 
| 
      
 48 
     | 
    
         
            +
            #
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            Boundary = Struct.new(:lower, :upper) do
         
     | 
| 
      
 51 
     | 
    
         
            +
              def include?(x)
         
     | 
| 
      
 52 
     | 
    
         
            +
                (lower...upper).cover? x
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
            end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            Fern.new title: 'Fern'
         
     | 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # fractions.rb, by Martin Prout
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'propane'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            class Fractions < Propane::App
         
     | 
| 
      
 5 
     | 
    
         
            +
              attr_reader :f, :add, :subtract, :multiply
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 8 
     | 
    
         
            +
                size 640, 250
         
     | 
| 
      
 9 
     | 
    
         
            +
                @f = createFont('Arial', 24, true)
         
     | 
| 
      
 10 
     | 
    
         
            +
                third = 1 / 3r     # since ruby 2.1.0 (and jruby-9.0.0.0)
         
     | 
| 
      
 11 
     | 
    
         
            +
                quarter = 1 / 4r
         
     | 
| 
      
 12 
     | 
    
         
            +
                format_add = '%s + %s = %s'
         
     | 
| 
      
 13 
     | 
    
         
            +
                format_sub = format_add.gsub('+', '-')
         
     | 
| 
      
 14 
     | 
    
         
            +
                format_mult = format_add.gsub('+', '*')
         
     | 
| 
      
 15 
     | 
    
         
            +
                @add = format(format_add, third, quarter, third + quarter)
         
     | 
| 
      
 16 
     | 
    
         
            +
                @subtract = format(format_sub, third, quarter, third - quarter)
         
     | 
| 
      
 17 
     | 
    
         
            +
                @multiply = format(format_mult, third, quarter, third * quarter)
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              def draw
         
     | 
| 
      
 21 
     | 
    
         
            +
                background 10
         
     | 
| 
      
 22 
     | 
    
         
            +
                text_font(f, 24)
         
     | 
| 
      
 23 
     | 
    
         
            +
                fill(220)
         
     | 
| 
      
 24 
     | 
    
         
            +
                text('Math Blackboard Propane', 80, 50)
         
     | 
| 
      
 25 
     | 
    
         
            +
                text(add, 110, 100)
         
     | 
| 
      
 26 
     | 
    
         
            +
                text(subtract, 110, 150)
         
     | 
| 
      
 27 
     | 
    
         
            +
                text(multiply, 110, 200)
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            Fractions.new(title: 'Fraction Sums')
         
     | 
| 
         @@ -0,0 +1,54 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'forwardable'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Runnable
         
     | 
| 
      
 4 
     | 
    
         
            +
              def run
         
     | 
| 
      
 5 
     | 
    
         
            +
                reject!(&:dead?)
         
     | 
| 
      
 6 
     | 
    
         
            +
                each(&:display)
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            class RainDrops
         
     | 
| 
      
 11 
     | 
    
         
            +
              include Enumerable, Runnable
         
     | 
| 
      
 12 
     | 
    
         
            +
              extend Forwardable
         
     | 
| 
      
 13 
     | 
    
         
            +
              
         
     | 
| 
      
 14 
     | 
    
         
            +
              def_delegators(:@drops, :<<, :each, :reject!,  :size)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              attr_reader :drops, :width, :height #, :weight
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              def initialize(width, height)
         
     | 
| 
      
 19 
     | 
    
         
            +
                @drops = []
         
     | 
| 
      
 20 
     | 
    
         
            +
                @width = width
         
     | 
| 
      
 21 
     | 
    
         
            +
                @height = height
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
              
         
     | 
| 
      
 24 
     | 
    
         
            +
              def fill_up(weight)
         
     | 
| 
      
 25 
     | 
    
         
            +
                # @weight = weight
         
     | 
| 
      
 26 
     | 
    
         
            +
                drops << Drop.new(rand(width), rand(height / 2) - height / 2, weight) 
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            class Drop
         
     | 
| 
      
 31 
     | 
    
         
            +
              include Propane::Proxy
         
     | 
| 
      
 32 
     | 
    
         
            +
              attr_reader :weight, :x, :y
         
     | 
| 
      
 33 
     | 
    
         
            +
              
         
     | 
| 
      
 34 
     | 
    
         
            +
              def initialize(x, y, weight = nil)
         
     | 
| 
      
 35 
     | 
    
         
            +
                @weight = weight || 10
         
     | 
| 
      
 36 
     | 
    
         
            +
                @x, @y = x, y
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
              
         
     | 
| 
      
 39 
     | 
    
         
            +
              def render
         
     | 
| 
      
 40 
     | 
    
         
            +
                fill(100, 100, 200)
         
     | 
| 
      
 41 
     | 
    
         
            +
                no_stroke
         
     | 
| 
      
 42 
     | 
    
         
            +
                bezier(x, y,  x - (weight / 2), y + weight, x + (weight / 2), y + weight, x, y)
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
              
         
     | 
| 
      
 45 
     | 
    
         
            +
              def dead?
         
     | 
| 
      
 46 
     | 
    
         
            +
                @y > height
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
              
         
     | 
| 
      
 49 
     | 
    
         
            +
              def display
         
     | 
| 
      
 50 
     | 
    
         
            +
                @y = y + weight
         
     | 
| 
      
 51 
     | 
    
         
            +
                @x = x - rand(-3..3)
         
     | 
| 
      
 52 
     | 
    
         
            +
                render
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,59 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'propane'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require_relative 'lib/rain_drops'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            class Raining < Propane::App
         
     | 
| 
      
 5 
     | 
    
         
            +
              # raining after Rain1 by Thomas R. 'TomK32' Koll
         
     | 
| 
      
 6 
     | 
    
         
            +
              #
         
     | 
| 
      
 7 
     | 
    
         
            +
              # draws raindrops as bezier shapes and moves them downwards
         
     | 
| 
      
 8 
     | 
    
         
            +
              #
         
     | 
| 
      
 9 
     | 
    
         
            +
              # available key commands:
         
     | 
| 
      
 10 
     | 
    
         
            +
              #  + make raindrops heavier/bigger
         
     | 
| 
      
 11 
     | 
    
         
            +
              #  - make raindrops smaller
         
     | 
| 
      
 12 
     | 
    
         
            +
              #  a more raindrops
         
     | 
| 
      
 13 
     | 
    
         
            +
              #  s less raindrops
         
     | 
| 
      
 14 
     | 
    
         
            +
              #  <SPACE>
         
     | 
| 
      
 15 
     | 
    
         
            +
              #
         
     | 
| 
      
 16 
     | 
    
         
            +
              # License: Same as processing
         
     | 
| 
      
 17 
     | 
    
         
            +
              #
         
     | 
| 
      
 18 
     | 
    
         
            +
              
         
     | 
| 
      
 19 
     | 
    
         
            +
              attr_reader :drops, :weight, :drops_size, :paused
         
     | 
| 
      
 20 
     | 
    
         
            +
              
         
     | 
| 
      
 21 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 22 
     | 
    
         
            +
                size 640, 480
         
     | 
| 
      
 23 
     | 
    
         
            +
                frame_rate 30  
         
     | 
| 
      
 24 
     | 
    
         
            +
                @drops_size = 20
         
     | 
| 
      
 25 
     | 
    
         
            +
                @weight = 20
         
     | 
| 
      
 26 
     | 
    
         
            +
                @drops = RainDrops.new width, height
         
     | 
| 
      
 27 
     | 
    
         
            +
                @paused = false
         
     | 
| 
      
 28 
     | 
    
         
            +
                font = create_font('Georgia', 15)
         
     | 
| 
      
 29 
     | 
    
         
            +
                text_font(font)
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
              
         
     | 
| 
      
 32 
     | 
    
         
            +
              def draw
         
     | 
| 
      
 33 
     | 
    
         
            +
                return if paused
         
     | 
| 
      
 34 
     | 
    
         
            +
                # we fill up with new drops randomly
         
     | 
| 
      
 35 
     | 
    
         
            +
                drops.fill_up(weight) while rand(drops_size / 3) < (drops_size - drops.size)
         
     | 
| 
      
 36 
     | 
    
         
            +
                # the less drops the darker it is
         
     | 
| 
      
 37 
     | 
    
         
            +
                background 127 + 127 * (drops.size / drops_size.to_f)
         
     | 
| 
      
 38 
     | 
    
         
            +
                drops.run
         
     | 
| 
      
 39 
     | 
    
         
            +
                form = '%d of %d drops with a size of %d'
         
     | 
| 
      
 40 
     | 
    
         
            +
                text(format(form, drops.size, drops_size, weight), 10, 20)
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
              
         
     | 
| 
      
 43 
     | 
    
         
            +
              def key_pressed
         
     | 
| 
      
 44 
     | 
    
         
            +
                case key
         
     | 
| 
      
 45 
     | 
    
         
            +
                when '+'
         
     | 
| 
      
 46 
     | 
    
         
            +
                  @weight += 5
         
     | 
| 
      
 47 
     | 
    
         
            +
                when '-'
         
     | 
| 
      
 48 
     | 
    
         
            +
                  @weight -= 5 if weight > 10
         
     | 
| 
      
 49 
     | 
    
         
            +
                when 'a'
         
     | 
| 
      
 50 
     | 
    
         
            +
                  @drops_size += 5
         
     | 
| 
      
 51 
     | 
    
         
            +
                when 's'
         
     | 
| 
      
 52 
     | 
    
         
            +
                  @drops_size -= 5 if drops_size > 5
         
     | 
| 
      
 53 
     | 
    
         
            +
                when ' '
         
     | 
| 
      
 54 
     | 
    
         
            +
                  @paused = !paused
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            Raining.new title: 'Raining'
         
     | 
    
        data/lib/propane/version.rb
    CHANGED
    
    
    
        data/pom.rb
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'fileutils'
         
     | 
| 
       2 
2 
     | 
    
         
             
            project 'rp5extras', 'https://github.com/monkstone/propane' do
         
     | 
| 
       3 
3 
     | 
    
         
             
              model_version '4.0.0'
         
     | 
| 
       4 
     | 
    
         
            -
              id 'propane:rp5extras', '0. 
     | 
| 
      
 4 
     | 
    
         
            +
              id 'propane:rp5extras', '0.4.0.pre'
         
     | 
| 
       5 
5 
     | 
    
         
             
              packaging 'jar'
         
     | 
| 
       6 
6 
     | 
    
         
             
              description 'rp5extras for propane'
         
     | 
| 
       7 
7 
     | 
    
         
             
              organization 'ruby-processing', 'https://ruby-processing.github.io'
         
     | 
    
        data/pom.xml
    CHANGED
    
    | 
         @@ -11,7 +11,7 @@ DO NOT MODIFIY - GENERATED CODE 
     | 
|
| 
       11 
11 
     | 
    
         
             
              <modelVersion>4.0.0</modelVersion>
         
     | 
| 
       12 
12 
     | 
    
         
             
              <groupId>propane</groupId>
         
     | 
| 
       13 
13 
     | 
    
         
             
              <artifactId>rp5extras</artifactId>
         
     | 
| 
       14 
     | 
    
         
            -
              <version>0. 
     | 
| 
      
 14 
     | 
    
         
            +
              <version>0.4.0.pre</version>
         
     | 
| 
       15 
15 
     | 
    
         
             
              <name>rp5extras</name>
         
     | 
| 
       16 
16 
     | 
    
         
             
              <description>rp5extras for propane</description>
         
     | 
| 
       17 
17 
     | 
    
         
             
              <url>https://github.com/monkstone/propane</url>
         
     | 
    
        data/propane.gemspec
    CHANGED
    
    | 
         @@ -16,6 +16,7 @@ Gem::Specification.new do |gem| 
     | 
|
| 
       16 
16 
     | 
    
         
             
              gem.files << 'lib/rpextras.jar'
         
     | 
| 
       17 
17 
     | 
    
         
             
              gem.files << 'lib/core-2.2.1.jar'
         
     | 
| 
       18 
18 
     | 
    
         
             
              gem.files << 'lib/gluegen-rt-2.1.5-01.jar'
         
     | 
| 
      
 19 
     | 
    
         
            +
              gem.files << 'lib/jogl-all-2.1.5-01.jar'
         
     | 
| 
       19 
20 
     | 
    
         
             
              gem.files << 'lib/gluegen-rt-2.1.5-01-natives-linux-amd64.jar'
         
     | 
| 
       20 
21 
     | 
    
         
             
              gem.files << 'lib/gluegen-rt-2.1.5-01-natives-macosx-universal.jar'
         
     | 
| 
       21 
22 
     | 
    
         
             
              gem.files << 'lib/jogl-all-2.1.5-01-natives-linux-amd64.jar'
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: propane
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.4.0.pre
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: java
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - filib
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2016-03- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2016-03-26 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: arcball
         
     | 
| 
         @@ -33,10 +33,13 @@ executables: 
     | 
|
| 
       33 
33 
     | 
    
         
             
            extensions: []
         
     | 
| 
       34 
34 
     | 
    
         
             
            extra_rdoc_files: []
         
     | 
| 
       35 
35 
     | 
    
         
             
            files:
         
     | 
| 
      
 36 
     | 
    
         
            +
            - ".github/CONTRIBUTING.md"
         
     | 
| 
      
 37 
     | 
    
         
            +
            - ".github/ISSUE_TEMPLATE.md"
         
     | 
| 
       36 
38 
     | 
    
         
             
            - ".gitignore"
         
     | 
| 
       37 
39 
     | 
    
         
             
            - ".mvn/extensions.xml"
         
     | 
| 
       38 
40 
     | 
    
         
             
            - ".mvn/wrapper/maven-wrapper.properties"
         
     | 
| 
       39 
41 
     | 
    
         
             
            - ".travis.yml"
         
     | 
| 
      
 42 
     | 
    
         
            +
            - CHANGELOG.md
         
     | 
| 
       40 
43 
     | 
    
         
             
            - Gemfile
         
     | 
| 
       41 
44 
     | 
    
         
             
            - LICENSE.txt
         
     | 
| 
       42 
45 
     | 
    
         
             
            - README.md
         
     | 
| 
         @@ -53,18 +56,25 @@ files: 
     | 
|
| 
       53 
56 
     | 
    
         
             
            - examples/complete/kinetic_type.rb
         
     | 
| 
       54 
57 
     | 
    
         
             
            - examples/regular/Rakefile
         
     | 
| 
       55 
58 
     | 
    
         
             
            - examples/regular/arcball_box.rb
         
     | 
| 
      
 59 
     | 
    
         
            +
            - examples/regular/circle_collision.rb
         
     | 
| 
       56 
60 
     | 
    
         
             
            - examples/regular/creating_colors.rb
         
     | 
| 
      
 61 
     | 
    
         
            +
            - examples/regular/drawolver.rb
         
     | 
| 
       57 
62 
     | 
    
         
             
            - examples/regular/elegant_ball.rb
         
     | 
| 
      
 63 
     | 
    
         
            +
            - examples/regular/empathy.rb
         
     | 
| 
      
 64 
     | 
    
         
            +
            - examples/regular/fern.rb
         
     | 
| 
       58 
65 
     | 
    
         
             
            - examples/regular/flight_patterns.rb
         
     | 
| 
      
 66 
     | 
    
         
            +
            - examples/regular/fractions.rb
         
     | 
| 
       59 
67 
     | 
    
         
             
            - examples/regular/grey_circles.rb
         
     | 
| 
       60 
68 
     | 
    
         
             
            - examples/regular/jwishy.rb
         
     | 
| 
       61 
69 
     | 
    
         
             
            - examples/regular/letters.rb
         
     | 
| 
       62 
70 
     | 
    
         
             
            - examples/regular/lib/boundary.rb
         
     | 
| 
       63 
71 
     | 
    
         
             
            - examples/regular/lib/particle.rb
         
     | 
| 
       64 
72 
     | 
    
         
             
            - examples/regular/lib/particle_system.rb
         
     | 
| 
      
 73 
     | 
    
         
            +
            - examples/regular/lib/rain_drops.rb
         
     | 
| 
       65 
74 
     | 
    
         
             
            - examples/regular/liquidy.rb
         
     | 
| 
       66 
75 
     | 
    
         
             
            - examples/regular/mouse_button_demo.rb
         
     | 
| 
       67 
76 
     | 
    
         
             
            - examples/regular/polyhedrons.rb
         
     | 
| 
      
 77 
     | 
    
         
            +
            - examples/regular/raining.rb
         
     | 
| 
       68 
78 
     | 
    
         
             
            - examples/regular/ribbon_doodle.rb
         
     | 
| 
       69 
79 
     | 
    
         
             
            - examples/regular/vector_math.rb
         
     | 
| 
       70 
80 
     | 
    
         
             
            - examples/regular/words.rb
         
     | 
| 
         @@ -76,6 +86,7 @@ files: 
     | 
|
| 
       76 
86 
     | 
    
         
             
            - lib/gluegen-rt-2.1.5-01.jar
         
     | 
| 
       77 
87 
     | 
    
         
             
            - lib/jogl-all-2.1.5-01-natives-linux-amd64.jar
         
     | 
| 
       78 
88 
     | 
    
         
             
            - lib/jogl-all-2.1.5-01-natives-macosx-universal.jar
         
     | 
| 
      
 89 
     | 
    
         
            +
            - lib/jogl-all-2.1.5-01.jar
         
     | 
| 
       79 
90 
     | 
    
         
             
            - lib/propane.rb
         
     | 
| 
       80 
91 
     | 
    
         
             
            - lib/propane/app.rb
         
     | 
| 
       81 
92 
     | 
    
         
             
            - lib/propane/helper_methods.rb
         
     |