
class Float 
	# Normal floating point infinity. For your convenience.
	INFINITY = 1.0/0.0
end

# Convenience method for CP::Vec2.new(x, y)
def vec2(x, y); end

# Chipmunk Game Dynamics. Provides fast, easy to use, robust physics.
module CP
  # The bias coefficient used for resolving penetrations. Setting 0.0 effectively disables
  # penetration resolution. Setting 1.0 will try to resolve the penetration in a single step.
  # (not recommended) The default is 0.1
  attr_accessor :bias_coef
    
  # The maximum allowed penetration distance. If an object penetrates by more than this
  # value, they will be pushed apart. Setting a non zero value helps to prevent
  # oscillating contacts. Defaults to 0.1, and can be any positive value.
  attr_accessor :collision_slop
    
  # Calculate the moment of inertia for a circle with the given mass,
  # inner and outer radii, and offset. _offset_ should be a CP::Vect.
  #
  # Various other formulas for moments of inertia can be found here: 
  # http://en.wikipedia.org/wiki/List_of_moments_of_inertia
  def moment_for_circle(m, r1, r2, offset); end
  
  # Calculate the moment of inertia for a polygon with the given mass,
  # vertexes, and offset. _verts_ should be an Array of CP::Vect with
  # a counterclockwise winding, _offset_ should be a CP::Vect.
  #
  # Various other formulas for moments of inertia can be found here: 
  # http://en.wikipedia.org/wiki/List_of_moments_of_inertia
  def moment_for_poly(m, verts, offset); end

  # Basic 2D vector class.
  class Vec2
    attr_accessor :x, :y
    
    # Given an angle in radians, it returns a unit length vector.
    def self.for_angle(a); end
    
    def initialize(x, y); end
    
    # Return the vector as an array.
    def to_a; end
    
    def to_s; end
    
    # Get the angle (in radians) the vector is pointing in.
    def to_angle; end

    # Vector negation.
    def -@; end

    # Vector addition.
    def +(vect); end

    # Vector subtraction.
    def -(vect); end

    # Scalar multiplication.
    def *(scalar); end

    # Scalar division.
    def /(scalar); end

    # Vector dot product.
    def dot(vect); end

    # 2D cross product analog.  Z component of the 3D cross product.
    def cross(vect); end

    # Length of the vector.
    def length(vect); end

    # Squared length of the vector. Faster to calculate than the length, and
    # may be used in comparisons.
    def lengthsq(vect); end

    # Normalize a vector.		
    def normalize; end
    
    # Normalize a vector in place.		
    def normalize!; end
    
    # Get the perpendicular vector.
    def perp; end
    
    # Vector projection of self onto vect.
    def project(vect); end
    
    # Rotate and scale self by vect using complex multiplication.
    def rotate(vect); end
    
    # Inverse of Vect#rotate.
    def unrotate(vect); end
    
    # Returns true if self and vect are within dist.
    def near?(vect, dist); end
  end
  
  # Basic 2D bounding box class.
  class BB
    # Left.
    attr_accessor :l

    # Bottom.
    attr_accessor :b

    # Right.
    attr_accessor :r

    # Top.
    attr_accessor :t
    
    # Left, bottom, right and top.
    def initialize(l, b, r, t); end
    
    # Test if the BBs intersect.
    def intersect?(other); end
    
    # Clamps vector _v_ to the nearest point inside bounding box _self_.
    def clamp_vect(v); end
    
    # Wraps vector _v_ to be inside bounding box _self_.
    def wrap_vect(v); end
    
    def to_s; end
  end
  
  # The Chipmunk rigid body class. A rigid body holds the physical properties of an object. 
  # (mass, position, rotation, velocity, etc.) It does not have a shape by itself. 
  # If youÕve done physics with particles before, rigid bodies differ mostly in that 
  # they are able to rotate.
  class Body
    # Mass. Replaces the now deprecated body.m.
    attr_accessor :mass
    
    # Moment of inertia. Replaces the now deprecated body.i.
    attr_accessor :moment
    
    # Position. Replaces the now deprecated body.p.
    attr_accessor :pos
    
    # Velocity. Replaces the now deprecated body.v.
    attr_accessor :vel
    
    # Force. Replaces the now deprecated body.f.
    attr_accessor :force
    
    # Angle. (in radians) Replaces the now deprecated body.a.
    attr_accessor :angle
    
    # Angular Velocity. (in radians/second) Replaces the now deprecated body.w.
    attr_accessor :ang_vel
    
    # Torque. Replaces the now deprecated body.t.
    attr_accessor :torque
    
    # Rotation expressed unit length vector.
    attr_reader :rot
    
    # Covnverts vector _v_ from body local coordinates to world space coordinates.
    def local2world(v); end
    
    # Covnvert vector _v_ from world space coordinates to body local coordinates.
    def world2local(v); end
    
    # Create a body with the given mass and moment of inertia.
    def initialize(m, i); end
    
    # Zero the accumulated forces and torques.
    def reset_forces; end
    
    # Accumulate a force as applied at the offset in world
    # coordinates.
    def apply_force(force, offset); end
    
    # Apply an impulse as applied at the offset in world coordinates.
    def apply_impulse(j, r); end
    
    # Integrate the velocity of the body for the given gravity,
    # damping and time step. (Uses Euler integration)
    def update_velocity(gravity, damping, dt); end

    # Integrate the position of the body for the given time
    # step. (Uses Euler integration)
    def update_position(dt); end
  end
  
  # Collision shapes module. By attaching shapes to bodies, you can define the a 
  # bodyÕs shape. You can attach many shapes to a single body to define a complex 
  # shape, or none if it doesnÕt require a shape.
  module Shape
    # The CP::Body the shape is connected to.
    attr_accessor :body
    
    # The collision type for the shape. The actual collision type used
    # is the object id of the object you pass as the collision type,
    # meaning you can use any Ruby object as an identifier. Symbols work well.
    attr_accessor :collision_type
    
    # Shapes in the same non-nil collision group do not create collisions.
    # Any object can be used as a collision identifier.
    attr_accessor :group
    
    # A 32bit bitmask to set which layers the shape should collide in.
    # Shapes only collide with other shapes that share a layer. Each layer
    # is represented by a bit, and the default layer is all of them.
    attr_accessor :layers
    
    # The elasticity of the shape. Using a value of 1.0 or higher is not 
    # recommended. The final elasticity value is the product of the two shapes.
    attr_accessor :e
    
    # The frictional coefficient of the shape. A value of 1.0 represents
    # an object that will not slide on a 45 degree angle. The final frictional
    # coefficient is the product of the two shapes.
    attr_accessor :u
    
    # The surface velocity is used by the friction calculations.
    # You can use this to make conveyour belts or characters that walk.
    # Interpreted in world space.
    attr_accessor :surface_v
    
    # Delegate object. Useful from within collision pair functions.
    # Meant as a convenience so that you don't need to subclass the
    # shape classes for trivial uses.
    attr_accessor :obj
    
    # Circle collision shape.
    class Circle
			include Shape
			
			# Create a circle collision shape attached to the given body at
			# the given offset with the given radius.
			def initialize(body, radius, offset); end
    end
    
    # Segment collision shape.
    class Segment
			include Shape
			
			# Create a segment collision shape attached to the given body
			# with endpoints _a_ and _b.
			def initialize(body, a, b); end
    end
    
    # Poly collision shape.
    class Poly
			include Shape
			
			# Create a poly collision shape attached to the given body at
			# the given offset with the given vertexes. _verts_ must be an
			# Array of CP::Vect with a counterclockwise winding.
			def initialize(body, verts, offset); end
    end
  end
  
  # Constraints module. Defined herein are numerous joints, gears, and other
  # constraints that act on pairs of bodies to constrain their motion.
  module Constraint
  
  # Read the first body used in the constraint
  attr_reader :body_a

  # Read the first body used in the constraint
  attr_reader :body_b
  
  # The maximum amount of force that can be applied to correct the bodies in the joint.
  # Defaults to infinity.
  attr_accessor :max_force
  
  # The percentage of deformation that is being corrected per tick. Defaults to 0.1
  attr_accessor :bias_coef
  
  # The rate at which the deformation is corrected per unit time. For example
  # a value of 100 will move the objects up to 100 units per unit time.
	# Defaults to infinity.
  attr_accessor :max_bias
    
    # A solid pin or rod connecting two rigid bodies.
    class PinJoint
			# Creates a joint between the given bodies with the given
			# anchors. Anchor points are in body relative coordinates, where
			# anchor1 is relative to body1, and anchor2 is relative to body2.
			# The joint length defaults to the distance between the
			# anchors at creation time.
			def initialize(body1, body2, anchor1, anchor2); end
			
			attr_accessor :anchr1
			attr_accessor :anchr2
			attr_accessor :dist
    end
    
    # Like a pin joint, but with a variable length.
    class SlideJoint
			# Creates a joint between the given bodies with the given
			# anchors and minimum and maximum anchor distances.
			def initialize(body1, body2, anchor1, anchor2, min, max); end

			attr_accessor :anchr1
			attr_accessor :anchr2
			attr_accessor :min
			attr_accessor :max
    end
    
    # The bodies pivot about a single point.
    class PivotJoint
			# Creates a pivot between the given bodies at the given anchor
			# point. _pivot_ should be in world coordinates.
			def initialize(body1, body2, pivot); end

			attr_accessor :anchr1
			attr_accessor :anchr2
    end
    
    # One body has a pivot that connects to a linear groove in the other.
    class GrooveJoint
    	# _grv_a_ and _grv_b_ define the groove on body1_ and _anchr2_
    	# defines the anchor on body2. All coordinates in body local coordinates.
    	def initialize(body1, body2, grv_a, grv_b, anchr2); end
    end
    
    # Like a torsion spring. http://en.wikipedia.org/wiki/Torsion_spring
    class DampedRotarySpring
    	
    	# Rest angle is the desired angular offset between body1 and body2
    	# calculated as body2.angle - body1.angle.
    	# Stiffness is similar to Young's modulus but uses torque instead of force
    	# Damping is described here: http://en.wikipedia.org/wiki/Damping
    	def initialize(body1, body2, restAngle, stiffness, damping); end
    	
			attr_accessor :rest_angle
			attr_accessor :stiffness
			attr_accessor :damping
    end
   
    # A normal spring. Seeks to be at a certain length.
    class DampedSpring
    	
    	# Rest length is the desired length of the spring.
    	# Stiffness is similar to Young's modulus but uses torque instead of force
    	# Damping is described here: http://en.wikipedia.org/wiki/Damping
    	def initialize(body1, body2, anchor1, anchor2, restLength, stiffness, damping); end
    	
			attr_accessor :anchr1
			attr_accessor :anchr2
			attr_accessor :restLength
			attr_accessor :stiffness
			attr_accessor :damping
    end
    
    # Defines direct relationships between rotation of two bodies. Has
    # many relationships beyond just simple gears, by adjusting the
    # default parameters.
    class GearJoint
			# Phase represents angular offset of the body2 from body1 when
			# body1 is at an angle of 0.
			# Ratio represents the gear ratio between the two.
			def initialize(body1, body2, phase, ratio); end

			attr_accessor :phase
			attr_accessor :ratio
    end
    
    # Limits the rotation of one body relative to another. Min and max
    # ranges can be less than zero or greater than 2*Pi, if you want
    # an object to rotate several times before hitting the angular limit
    class RotaryLimitJoint
			# The min and max rotation is specified in radians.
			def initialize(body1, body2, min, max); end

			attr_accessor :min
			attr_accessor :max
    end
    
    # Causes the bodies to rotate at a specified rate, relative to eachother.
    # This applies whatever torque needed to cause that rotation, so you'll 
    # likely limit it with max_force.
    class SimpleMotor
			# Create a motor with the specified rate in radians per unit time.
			def initialize(body1, body2, rate); end

			attr_accessor :rate
    end
  end
  
  # The Chipmunk space class. Spaces are the basic simulation unit in Chipmunk. 
  # You add bodies, shapes and joints to a space, and then update the space as a whole.
  class Space
    # The number of iterations to use when solving
    # constraints. (collisions and joints)
    attr_accessor :iterations
    
    # The amount of damping to apply to the system when updating.
    attr_accessor :damping
    
    # The amount of gravity in the system. Must be a CP::Vect.
    attr_accessor :gravity
    
    # Iterations used when solving for elasticity.
    attr_accessor :elastic_iterations
    
    def initialize; end
    
    # Add a block to be called when a collision between a shape with a
    # _collision_type_ of _type_a_ and a shape with a _collision_type_
    # of _type_b_ is found. Supplying no block or _&nil_ will reject
    # any collision between the two given collision types.
    def add_collision_func(type_a, type_b, &block); end
    
    # Remove a block added with _add_collision_func().
    def remove_collision_func(type_a, type_b); end

    # Set the default collision function to be used when no specifid
    # function is found. Normally this simply accepts all
    # collisions. Supplying no block or _&nil_ will reject collisions
    # by default. Keep in mind that the default func will handle a lot
    # of collisions, and you don't want 100,000 block calls a second!
    def set_default_collision_func(&block); end

    # Set the default collision function. This block will be called
    # whenever an unhandled collision pair is found. The default
    # behavior is to accept all collisions, passing no block or _&nil_
    # will reject all collisions by default.
    
    # Add the given shape to the space's active spatial hash. Shapes
    # attached to moving bodies should be added here as they will be
    # rehashed on every call to Space#step
    def add_shape(shape); end
    
    # Add the given shape to the space's static spatial hash. Static
    # shapes are only rehashed when Space#rehash_static is called, so
    # they should not move.
    def add_static_shape(shape); end
    
    # Add the given rigid body to the space.
    def add_body(body); end
    
    # Add the given constraint to the space.
    def add_constraint(constraint); end

    # Remove the given joint from the space's static spatial hash.
    def remove_shape(shape); end
    
    # Remove the given shape from the space's active spatial hash.
    def remove_static_shape(shape); end
    
    # Remove the given body from the space.
    def remove_body(body); end
   
    # Remove the given constraint from the space.
    def remove_constraint(constraint); end
    
    # Resize the static spatial hash.
    def resize_static_hash(dim, count); end
    
    # Resize the active spatial hash.
    def resize_active_hash(dim, count); end
    
    # Calls the block for every shape that contains the point.
    def shape_point_query(point); yield(shape); end
    
    # Calls the block for every static shape that contains the point.
    def static_shape_point_query(point); yield(shape); end
    
    # Rehash the static spatial hash.
    def rehash_static; end
    
    # Move the space forward by _dt_ seconds. Using a fixed size time
    # step is highly recommended for efficiency of the contact
    # persistence algorithm.
    def step(dt); end
  end
end

