<!DOCTYPE html>
<html>

  <head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  
  <meta name="keywords" content="art, JRubyArt, code, blog, ruby" />
  <title>PBox2D</title>
  <meta name="description" content="The PBox2D class is a simple wrapper to help integrate the JBox2D world with ruby implementations of processing (JRubyArt and propane). Use the [WorldBuilder...">

  <link rel="stylesheet" href="https://ruby-processing.github.io/JRubyArt/css/main.css"/>
  <link rel="canonical" href="http://localhost:4000/classes/pbox2d/">
  <link rel="alternate" type="application/rss+xml" title="PBox2D for JRubyArt" href="http://localhost:4000/feed.xml" />
</head>





  <body>

    <header class="site-header">

  <div class="wrapper">

    <a class="site-title" href="/">PBox2D for JRubyArt</a>

    <nav class="site-nav">
      <a href="#" class="menu-icon">
        <svg viewBox="0 0 18 15">
          <path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
          <path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
          <path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
        </svg>
      </a>

      <div class="trigger">
        
          
          <a class="page-link" href="/about/">About</a>
          
        
          
          <a class="page-link" href="/classes.html">Classes</a>
          
        
          
        
          
        
          
          <a class="page-link" href="/methods.html">Methods</a>
          
        
          
          <a class="page-link" href="/modules.html">Modules</a>
          
        
      </div>
    </nav>

  </div>

</header>


    <div class="page-content">
      <div class="wrapper">
        <div class="post">

  <header class="post-header">
    <h1 class="post-title">PBox2D</h1>
  </header>

  <article class="post-content">
    <p>The PBox2D class is a simple wrapper to help integrate the JBox2D world with ruby implementations of processing (<em>JRubyArt and propane</em>). Use the [WorldBuilder][world_builder] in your sketch setup to create an instance of this class.</p>

<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="c1"># Ruby version of java wrapper allows us to have more</span>
<span class="c1"># rubified interface, also needed for add_listener</span>
<span class="k">class</span> <span class="nc">Box2D</span> <span class="o">&lt;</span> <span class="no">Java</span><span class="o">::</span><span class="no">ProcessingBox2d</span><span class="o">::</span><span class="no">Box2DProcessing</span>
  <span class="n">field_accessor</span> <span class="ss">:world</span> <span class="c1"># allow access to protected variable</span>

  <span class="k">def</span> <span class="nf">init_options</span><span class="p">(</span><span class="n">args</span> <span class="o">=</span> <span class="p">{})</span>
    <span class="n">args</span> <span class="o">=</span> <span class="n">defaults</span><span class="p">.</span><span class="nf">merge</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
    <span class="n">set_options</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="ss">:scale</span><span class="p">],</span>
                <span class="n">args</span><span class="p">[</span><span class="ss">:gravity</span><span class="p">].</span><span class="nf">to_java</span><span class="p">(</span><span class="no">Java</span><span class="o">::</span><span class="n">float</span><span class="p">),</span>
                <span class="n">args</span><span class="p">[</span><span class="ss">:warm</span><span class="p">],</span>
                <span class="n">args</span><span class="p">[</span><span class="ss">:continuous</span><span class="p">]</span>
               <span class="p">)</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">step_options</span><span class="p">(</span><span class="n">args</span> <span class="o">=</span> <span class="p">{})</span>
    <span class="n">default_step</span><span class="p">.</span><span class="nf">merge</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
    <span class="n">set_step</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="ss">:time_step</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="ss">:velocity_iter</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="ss">:position_iter</span><span class="p">])</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">defaults</span>
    <span class="p">{</span> <span class="ss">scale: </span><span class="mi">10</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="ss">gravity: </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">10</span><span class="p">],</span> <span class="ss">warm: </span><span class="kp">true</span><span class="p">,</span> <span class="ss">continuous: </span><span class="kp">true</span> <span class="p">}</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">default_step</span>
    <span class="p">{</span> <span class="ss">time_step: </span><span class="mi">1</span><span class="o">.</span><span class="mi">0</span> <span class="o">/</span> <span class="mi">60</span><span class="p">,</span> <span class="ss">velocity_iter: </span><span class="mi">8</span><span class="p">,</span> <span class="ss">position_iter: </span><span class="mi">10</span> <span class="p">}</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">gravity</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
    <span class="n">change_gravity</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="nf">to_java</span><span class="p">(</span><span class="no">Java</span><span class="o">::</span><span class="n">float</span><span class="p">))</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">add_listener</span><span class="p">(</span><span class="n">listener</span><span class="p">)</span>
    <span class="c1"># in combination with field accessor we can access protected world</span>
    <span class="n">world</span><span class="p">.</span><span class="nf">setContactListener</span><span class="p">(</span><span class="n">listener</span><span class="p">)</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">version</span>
    <span class="nb">format</span><span class="p">(</span><span class="s1">'pbox2d version %s'</span><span class="p">,</span> <span class="no">Pbox2d</span><span class="o">::</span><span class="no">VERSION</span><span class="p">)</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre>
</div>

<p>The java class</p>
<div class="language-java highlighter-rouge"><pre class="highlight"><code>
<span class="kn">package</span> <span class="n">processing</span><span class="o">.</span><span class="na">box2d</span><span class="o">;</span>

<span class="kn">import</span> <span class="nn">org.jbox2d.common.Transform</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.jbox2d.common.Vec2</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.jbox2d.dynamics.Body</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.jbox2d.dynamics.BodyDef</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.jbox2d.dynamics.World</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.jbox2d.dynamics.joints.Joint</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.jbox2d.dynamics.joints.JointDef</span><span class="o">;</span>

<span class="kn">import</span> <span class="nn">processing.core.PApplet</span><span class="o">;</span>

<span class="cm">/**
 * Loosely based on Box2D-for-processing by Dan Shiffman
 *
 * @author Martin Prout
 */</span>
<span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Box2DProcessing</span> <span class="o">{</span>

    <span class="kd">private</span> <span class="kd">final</span> <span class="n">PApplet</span> <span class="n">parent</span><span class="o">;</span>
    <span class="kd">private</span> <span class="n">Options</span> <span class="n">options</span><span class="o">;</span>
    <span class="kd">private</span> <span class="n">Step</span> <span class="n">stepO</span><span class="o">;</span>
    <span class="kd">private</span> <span class="kd">final</span> <span class="kt">float</span> <span class="n">height</span><span class="o">;</span>
    <span class="kd">private</span> <span class="kd">final</span> <span class="kt">float</span> <span class="n">width</span><span class="o">;</span>
    <span class="cm">/**
     * The Box2D world (we might need public access for our ContactListener)
     */</span>
    <span class="kd">protected</span> <span class="n">World</span> <span class="n">world</span><span class="o">;</span>

    <span class="cm">/**
     * Scale between processing sketch and physics world
     */</span>
    <span class="kd">private</span> <span class="kt">float</span> <span class="n">scaleFactor</span><span class="o">;</span><span class="c1">// = 10.0f;</span>

    <span class="cm">/**
     * Adjust for processing.org unfathomable choice of y-axis direction
     */</span>
    <span class="kd">private</span> <span class="kd">final</span> <span class="kt">float</span> <span class="n">yFlip</span><span class="o">;</span><span class="c1">// = -1.0f; //flip y coordinate</span>

    <span class="cm">/**
     * Controls access to processing pre loop (via reflection)
     */</span>
    <span class="kd">private</span> <span class="kt">boolean</span> <span class="n">isActive</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>

    <span class="kd">private</span> <span class="n">Body</span> <span class="n">groundBody</span><span class="o">;</span>

    <span class="cm">/**
     *
     * @param p PApplet
     */</span>
    <span class="kd">public</span> <span class="nf">Box2DProcessing</span><span class="o">(</span><span class="n">PApplet</span> <span class="n">p</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">parent</span> <span class="o">=</span> <span class="n">p</span><span class="o">;</span>
        <span class="n">height</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="na">height</span><span class="o">;</span>
        <span class="n">width</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="na">width</span><span class="o">;</span>
        <span class="n">yFlip</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
        <span class="n">setActive</span><span class="o">(</span><span class="kc">true</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Abstract method implement on ruby side
     *
     * @param listener Custom Listener, Sketch?
     */</span>
    <span class="kd">public</span> <span class="kd">abstract</span> <span class="kt">void</span> <span class="nf">addListener</span><span class="o">(</span><span class="n">org</span><span class="o">.</span><span class="na">jbox2d</span><span class="o">.</span><span class="na">callbacks</span><span class="o">.</span><span class="na">ContactListener</span> <span class="n">listener</span><span class="o">);</span>

    <span class="cm">/**
     *
     * @param scale float
     * @param gravity float[]
     * @param warmStart boolean
     * @param continuous boolean
     */</span>
    <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">setOptions</span><span class="o">(</span><span class="kt">float</span> <span class="n">scale</span><span class="o">,</span> <span class="kt">float</span><span class="o">[]</span> <span class="n">gravity</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">warmStart</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">continuous</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">options</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Options</span><span class="o">(</span><span class="n">scale</span><span class="o">,</span> <span class="n">gravity</span><span class="o">,</span> <span class="n">warmStart</span><span class="o">,</span> <span class="n">continuous</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     *
     * @param timeStep float
     * @param velocity int
     * @param position int
     */</span>
    <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">setStep</span><span class="o">(</span><span class="kt">float</span> <span class="n">timeStep</span><span class="o">,</span> <span class="kt">int</span> <span class="n">velocity</span><span class="o">,</span> <span class="kt">int</span> <span class="n">position</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">stepO</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Step</span><span class="o">(</span><span class="n">timeStep</span><span class="o">,</span> <span class="n">velocity</span><span class="o">,</span> <span class="n">position</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     * This is the all important physics "step" function Says to move ahead one
     * unit in time Default
     */</span>
    <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">step</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">stepO</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
            <span class="n">stepO</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Step</span><span class="o">();</span>
        <span class="o">}</span>
        <span class="n">world</span><span class="o">.</span><span class="na">step</span><span class="o">(</span><span class="n">stepO</span><span class="o">.</span><span class="na">timeStep</span><span class="o">,</span> <span class="n">stepO</span><span class="o">.</span><span class="na">velIters</span><span class="o">,</span> <span class="n">stepO</span><span class="o">.</span><span class="na">posIters</span><span class="o">);</span>
        <span class="n">world</span><span class="o">.</span><span class="na">clearForces</span><span class="o">();</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Create a world
     */</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">createWorld</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">options</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
            <span class="n">options</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Options</span><span class="o">();</span>
        <span class="o">}</span>
        <span class="n">Vec2</span> <span class="n">gravity</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Vec2</span><span class="o">(</span><span class="n">options</span><span class="o">.</span><span class="na">gravity</span><span class="o">[</span><span class="mi">0</span><span class="o">],</span> <span class="n">options</span><span class="o">.</span><span class="na">gravity</span><span class="o">[</span><span class="mi">1</span><span class="o">]);</span>
        <span class="n">scaleFactor</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="na">scaleFactor</span><span class="o">;</span>
        <span class="n">world</span> <span class="o">=</span> <span class="k">new</span> <span class="n">World</span><span class="o">(</span><span class="n">gravity</span><span class="o">);</span>
        <span class="n">world</span><span class="o">.</span><span class="na">setWarmStarting</span><span class="o">(</span><span class="n">options</span><span class="o">.</span><span class="na">warm</span><span class="o">);</span>
        <span class="n">world</span><span class="o">.</span><span class="na">setContinuousPhysics</span><span class="o">(</span><span class="n">options</span><span class="o">.</span><span class="na">continuous</span><span class="o">);</span>
        <span class="n">BodyDef</span> <span class="n">bodyDef</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BodyDef</span><span class="o">();</span>
        <span class="n">groundBody</span> <span class="o">=</span> <span class="n">world</span><span class="o">.</span><span class="na">createBody</span><span class="o">(</span><span class="n">bodyDef</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     *
     * @return Body
     */</span>
    <span class="kd">public</span> <span class="n">Body</span> <span class="nf">groundBody</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">groundBody</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Set the gravity (this can change in real-time)
     *
     * @param gravity float[]
     */</span>
    <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">changeGravity</span><span class="o">(</span><span class="kt">float</span><span class="o">[]</span> <span class="n">gravity</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">world</span><span class="o">.</span><span class="na">setGravity</span><span class="o">(</span><span class="k">new</span> <span class="n">Vec2</span><span class="o">(</span><span class="n">gravity</span><span class="o">[</span><span class="mi">0</span><span class="o">],</span> <span class="n">gravity</span><span class="o">[</span><span class="mi">1</span><span class="o">]));</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Box2d has its own coordinate system and we have to move back and forth
     * between them to convert from Box2d world to processing pixel space
     *
     * @param world Vec2
     * @return Vec2
     */</span>
    <span class="kd">public</span> <span class="n">Vec2</span> <span class="nf">worldToProcessing</span><span class="o">(</span><span class="n">Vec2</span> <span class="n">world</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="nf">worldToProcessing</span><span class="o">(</span><span class="n">world</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">world</span><span class="o">.</span><span class="na">y</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Box2d has its own coordinate system and we have to move back and forth
     * between them to convert from Box2d world to processing pixel space
     * Note reverse Y mapping (processing poxy coord system again)
     * @param worldX float
     * @param worldY float
     * @return Vec2
     */</span>
    <span class="kd">public</span> <span class="n">Vec2</span> <span class="nf">worldToProcessing</span><span class="o">(</span><span class="kt">float</span> <span class="n">worldX</span><span class="o">,</span> <span class="kt">float</span> <span class="n">worldY</span><span class="o">)</span> <span class="o">{</span>
        <span class="kt">float</span> <span class="n">pixelX</span> <span class="o">=</span> <span class="n">map</span><span class="o">(</span><span class="n">worldX</span><span class="o">,</span> <span class="mi">0</span><span class="n">f</span><span class="o">,</span> <span class="mi">1</span><span class="n">f</span><span class="o">,</span> <span class="n">parent</span><span class="o">.</span><span class="na">width</span> <span class="o">/</span> <span class="mi">2</span><span class="o">,</span> <span class="n">parent</span><span class="o">.</span><span class="na">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">scaleFactor</span><span class="o">);</span>
        <span class="kt">float</span> <span class="n">pixelY</span> <span class="o">=</span> <span class="n">map</span><span class="o">(</span><span class="n">worldY</span><span class="o">,</span> <span class="mi">1</span><span class="n">f</span><span class="o">,</span> <span class="mi">0</span><span class="n">f</span><span class="o">,</span> <span class="n">parent</span><span class="o">.</span><span class="na">height</span> <span class="o">/</span> <span class="mi">2</span><span class="o">,</span> <span class="n">parent</span><span class="o">.</span><span class="na">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">scaleFactor</span><span class="o">);</span>
        <span class="k">return</span> <span class="k">new</span> <span class="nf">Vec2</span><span class="o">(</span><span class="n">pixelX</span><span class="o">,</span> <span class="n">pixelY</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     * convert Coordinate from pixel space to box2d world
     *
     * @param screen Vec2
     * @return Vec2
     */</span>
    <span class="kd">public</span> <span class="n">Vec2</span> <span class="nf">processingToWorld</span><span class="o">(</span><span class="n">Vec2</span> <span class="n">screen</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="nf">processingToWorld</span><span class="o">(</span><span class="n">screen</span><span class="o">.</span><span class="na">x</span><span class="o">,</span> <span class="n">screen</span><span class="o">.</span><span class="na">y</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Note reverse Y mapping (processing poxy coord system again)
     * @param pixelX float
     * @param pixelY float
     * @return Vec2
     */</span>
    <span class="kd">public</span> <span class="n">Vec2</span> <span class="nf">processingToWorld</span><span class="o">(</span><span class="kt">float</span> <span class="n">pixelX</span><span class="o">,</span> <span class="kt">float</span> <span class="n">pixelY</span><span class="o">)</span> <span class="o">{</span>
        <span class="kt">float</span> <span class="n">worldX</span> <span class="o">=</span> <span class="n">map</span><span class="o">(</span><span class="n">pixelX</span><span class="o">,</span> <span class="n">parent</span><span class="o">.</span><span class="na">width</span> <span class="o">/</span> <span class="mi">2</span><span class="o">,</span> <span class="n">parent</span><span class="o">.</span><span class="na">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">scaleFactor</span><span class="o">,</span> <span class="mi">0</span><span class="n">f</span><span class="o">,</span> <span class="mi">1</span><span class="n">f</span><span class="o">);</span>
        <span class="kt">float</span> <span class="n">worldY</span> <span class="o">=</span> <span class="n">map</span><span class="o">(</span><span class="n">pixelY</span><span class="o">,</span> <span class="n">parent</span><span class="o">.</span><span class="na">height</span> <span class="o">/</span> <span class="mi">2</span><span class="o">,</span> <span class="n">parent</span><span class="o">.</span><span class="na">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">scaleFactor</span><span class="o">,</span> <span class="mi">1</span><span class="n">f</span><span class="o">,</span> <span class="mi">0</span><span class="n">f</span><span class="o">);</span>
        <span class="k">return</span> <span class="k">new</span> <span class="nf">Vec2</span><span class="o">(</span><span class="n">worldX</span><span class="o">,</span> <span class="n">worldY</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Scale from processing to world
     *
     * @param val float
     * @return float
     */</span>
    <span class="kd">public</span> <span class="kt">float</span> <span class="nf">scaleToWorld</span><span class="o">(</span><span class="kt">float</span> <span class="n">val</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">val</span> <span class="o">/</span> <span class="n">scaleFactor</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Scale from world to processing
     *
     * @param val float
     * @return float
     */</span>
    <span class="kd">public</span> <span class="kt">float</span> <span class="nf">scaleToProcessing</span><span class="o">(</span><span class="kt">float</span> <span class="n">val</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">val</span> <span class="o">*</span> <span class="n">scaleFactor</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Vector scale between two worlds
     *
     * @param v Vec2
     * @return Vec2
     */</span>
    <span class="kd">public</span> <span class="n">Vec2</span> <span class="nf">vectorToWorld</span><span class="o">(</span><span class="n">Vec2</span> <span class="n">v</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">Vec2</span> <span class="n">u</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Vec2</span><span class="o">(</span><span class="n">v</span><span class="o">.</span><span class="na">x</span> <span class="o">/</span> <span class="n">scaleFactor</span><span class="o">,</span> <span class="n">v</span><span class="o">.</span><span class="na">y</span> <span class="o">/</span> <span class="n">scaleFactor</span><span class="o">);</span>
        <span class="n">u</span><span class="o">.</span><span class="na">y</span> <span class="o">*=</span> <span class="n">yFlip</span><span class="o">;</span>
        <span class="k">return</span> <span class="n">u</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Translate from world coords to processing as a Vec2
     *
     * @param x float
     * @param y float
     * @return Vec
     */</span>
    <span class="kd">public</span> <span class="n">Vec2</span> <span class="nf">vectorToWorld</span><span class="o">(</span><span class="kt">float</span> <span class="n">x</span><span class="o">,</span> <span class="kt">float</span> <span class="n">y</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">Vec2</span> <span class="n">u</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Vec2</span><span class="o">(</span><span class="n">x</span> <span class="o">/</span> <span class="n">scaleFactor</span><span class="o">,</span> <span class="n">y</span> <span class="o">/</span> <span class="n">scaleFactor</span><span class="o">);</span>
        <span class="n">u</span><span class="o">.</span><span class="na">y</span> <span class="o">*=</span> <span class="n">yFlip</span><span class="o">;</span>
        <span class="k">return</span> <span class="n">u</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Translate from world to processing as a Vec2
     *
     * @param v Vec
     * @return Vec
     */</span>
    <span class="kd">public</span> <span class="n">Vec2</span> <span class="nf">vectorToProcessing</span><span class="o">(</span><span class="n">Vec2</span> <span class="n">v</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">Vec2</span> <span class="n">u</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Vec2</span><span class="o">(</span><span class="n">v</span><span class="o">.</span><span class="na">x</span> <span class="o">*</span> <span class="n">scaleFactor</span><span class="o">,</span> <span class="n">v</span><span class="o">.</span><span class="na">y</span> <span class="o">*</span> <span class="n">scaleFactor</span><span class="o">);</span>
        <span class="n">u</span><span class="o">.</span><span class="na">y</span> <span class="o">*=</span> <span class="n">yFlip</span><span class="o">;</span>
        <span class="k">return</span> <span class="n">u</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="cm">/**
     * A common task we have to do a lot
     *
     * @param bd BodyDef
     * @return Body
     */</span>
    <span class="kd">public</span> <span class="n">Body</span> <span class="nf">createBody</span><span class="o">(</span><span class="n">BodyDef</span> <span class="n">bd</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">world</span><span class="o">.</span><span class="na">createBody</span><span class="o">(</span><span class="n">bd</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     * A common task we have to do a lot
     *
     * @param jd JointDef
     * @return World
     */</span>
    <span class="kd">public</span> <span class="n">Joint</span> <span class="nf">createJoint</span><span class="o">(</span><span class="n">JointDef</span> <span class="n">jd</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">world</span><span class="o">.</span><span class="na">createJoint</span><span class="o">(</span><span class="n">jd</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     *
     * @param b Body
     * @return body coord as Vec2
     */</span>
    <span class="kd">public</span> <span class="n">Vec2</span> <span class="nf">bodyCoord</span><span class="o">(</span><span class="n">Body</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">Transform</span> <span class="n">xf</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="na">getTransform</span><span class="o">();</span>
        <span class="k">return</span> <span class="nf">worldToProcessing</span><span class="o">(</span><span class="n">xf</span><span class="o">.</span><span class="na">p</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     *
     * @param b Body
     */</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">destroyBody</span><span class="o">(</span><span class="n">Body</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">world</span><span class="o">.</span><span class="na">destroyBody</span><span class="o">(</span><span class="n">b</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Access the processing pre loop by java reflection
     */</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">pre</span><span class="o">()</span> <span class="o">{</span>
        <span class="n">step</span><span class="o">();</span>
    <span class="o">}</span>

    <span class="cm">/**
     * Recommended inclusion in a processing library
     */</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">dispose</span><span class="o">()</span> <span class="o">{</span>
        <span class="n">setActive</span><span class="o">(</span><span class="kc">false</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="cm">/**
     *
     * @return height float
     */</span>
    <span class="kd">public</span> <span class="kt">float</span> <span class="nf">height</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">height</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="cm">/**
     *
     * @return width float
     */</span>
    <span class="kd">public</span> <span class="kt">float</span> <span class="nf">width</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">width</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">private</span> <span class="kt">float</span> <span class="nf">map</span><span class="o">(</span><span class="kt">float</span> <span class="n">val</span><span class="o">,</span> <span class="kt">float</span> <span class="n">startIn</span><span class="o">,</span> <span class="kt">float</span> <span class="n">endIn</span><span class="o">,</span> <span class="kt">float</span> <span class="n">startOut</span><span class="o">,</span> <span class="kt">float</span> <span class="n">endOut</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">startOut</span> <span class="o">+</span> <span class="o">(</span><span class="n">endOut</span> <span class="o">-</span> <span class="n">startOut</span><span class="o">)</span> <span class="o">*</span> <span class="o">((</span><span class="n">val</span> <span class="o">-</span> <span class="n">startIn</span><span class="o">)</span> <span class="o">/</span> <span class="o">(</span><span class="n">endIn</span> <span class="o">-</span> <span class="n">startIn</span><span class="o">));</span>
    <span class="o">}</span>

    <span class="kd">private</span> <span class="kt">void</span> <span class="nf">setActive</span><span class="o">(</span><span class="kt">boolean</span> <span class="n">active</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">active</span> <span class="o">!=</span> <span class="n">isActive</span><span class="o">)</span> <span class="o">{</span>
            <span class="n">isActive</span> <span class="o">=</span> <span class="n">active</span><span class="o">;</span>
            <span class="k">if</span> <span class="o">(</span><span class="n">active</span><span class="o">)</span> <span class="o">{</span>
                <span class="n">parent</span><span class="o">.</span><span class="na">registerMethod</span><span class="o">(</span><span class="s">"dispose"</span><span class="o">,</span> <span class="k">this</span><span class="o">);</span>
                <span class="n">parent</span><span class="o">.</span><span class="na">registerMethod</span><span class="o">(</span><span class="s">"pre"</span><span class="o">,</span> <span class="k">this</span><span class="o">);</span>
            <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
                <span class="n">parent</span><span class="o">.</span><span class="na">unregisterMethod</span><span class="o">(</span><span class="s">"pre"</span><span class="o">,</span> <span class="k">this</span><span class="o">);</span>
            <span class="o">}</span>
        <span class="o">}</span>
    <span class="o">}</span>
<span class="o">}</span>

</code></pre>
</div>

  </article>

</div>

      </div>
    </div>

    <footer class="site-footer">

  <div class="wrapper">

    <h2 class="footer-heading">PBox2D for JRubyArt</h2>

    <div class="footer-col-wrapper">
      <div class="footer-col  footer-col-1">
        <ul class="contact-list">
          <li>PBox2D for JRubyArt</li>
          <li><a href="mailto:mamba2928@yahoo.co.uk">mamba2928@yahoo.co.uk</a></li>
        </ul>
      </div>

      <div class="footer-col  footer-col-2">
        <ul class="social-media-list">
          
          <li>
            <a href="https://github.com/monkstone">
              <span class="icon  icon--github">
                <svg viewBox="0 0 16 16">
                  <path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
                </svg>
              </span>

              <span class="username">monkstone</span>
            </a>
          </li>
          

          
          <li>
            <a href="https://twitter.com/monkstoneT">
              <span class="icon  icon--twitter">
                <svg viewBox="0 0 16 16">
                  <path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
                  c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
                </svg>
              </span>

              <span class="username">monkstoneT</span>
            </a>
          </li>
          
        </ul>
      </div>

      <div class="footer-col  footer-col-3">
        <p class="text">PBox2D is a ruby wrapper for JBox2D, so you can use the physics engine with JRubyArt or propane (NB: original ruby-processing is no longer supported).
</p>
      </div>
    </div>

  </div>

</footer>


  </body>

</html>