import sys
import pygame
from pygame.locals import *
import ode

screen_width = 640;
screen_height = 480;

def coord(x,y):
	"convert world coords to screen (pixel) coords"
	return int(screen_width/2.+screen_width/4.*x), int(screen_height/1.5-screen_height/4.*y)

def coordx(x):
	return int(screen_width/2.+screen_width/4.*x)

def coordy(y):
	int(screen_height/1.5-screen_height/4.*y)

def buildObjects():
	world = ode.World()
	world.setGravity((0,-9.81,0))

	space = ode.Space()
	geoms = []
	floor = ode.GeomPlane(space, (0,1,0), -2)
	geoms.append(floor)

	mass1 = ode.Body(world)
	M = ode.Mass()
	M.setSphere(2500, 0.05)
	mass1.setMass(M)
	mass1.setPosition((1,2,0))

	mass2 = ode.Body(world)
	M = ode.Mass()
	M.setSphere(2500, 0.1)
	mass2.setMass(M)
	mass2.setPosition((2,2,0))
	mass2.shape = "sphere"
	mass2.spheresize = 0.1
	geom1 = ode.GeomSphere(space, mass2.spheresize)
	geom1.setBody(mass2)
	geoms.append(geom1)

	joint1 = ode.HingeJoint(world)
	joint1.attach(mass1, ode.environment)
	joint1.setAnchor((0,2,0))
	joint1.setAxis((0,0,1))

	joint2 = ode.HingeJoint(world)
	joint2.attach(mass1,mass2)
	joint2.setAnchor((1,2,0))
	joint2.setAxis((0,0,1))

	wall = ode.Body(world)
	M = ode.Mass()
	M.setBox(50,1,4,1)
	wall.setMass(M)
	wall.setPosition((-1,0,0))
	wall.shape = "box"
	wall.boxsize = (1,4,1)
	geom2 = ode.GeomBox(space,lengths=wall.boxsize)
	geom2.setBody(wall)
	geoms.append(geom2)
	# wall.setGravityMode(False)

	contactgroup = ode.JointGroup()

	return world, mass1, mass2, joint1, joint2, wall, space, contactgroup, geoms

def near_callback(args, geom1, geom2):
	contacts = ode.collide(geom1, geom2)

	world,contactgroup = args
	for c in contacts:
		c.setBounce(0.2)
		c.setMu(5000)
		j = ode.ContactJoint(world, contactgroup, c)
		j.attach(geom1.getBody(), geom2.getBody())

def simulate(world, mass1, mass2, wall, space, contactgroup, geoms):
	pygame.init()
	dsply = pygame.display.set_mode((screen_width,screen_height))
	clk = pygame.time.Clock()

	fps = 50
	dt = 1./fps
	loopFlag = True
	while loopFlag:
		events = pygame.event.get()
		for e in events:
			if e.type == QUIT:
				loopFlag = False

		#clear
		dsply.fill((255,255,255))
		x1,y1,z1 = mass1.getPosition()
		x2,y2,z2 = mass2.getPosition()
		x3,y3,z3 = wall.getPosition()

		bodyColor = (0,0,0)
		r = 20
		lw = 2
		pygame.draw.circle(dsply, bodyColor, coord(x1,y1), int(0.05*screen_width/4.), 0)
		pygame.draw.circle(dsply, bodyColor, coord(x2,y2), int(mass2.spheresize*screen_width/4.), 0)
		pygame.draw.line(dsply, bodyColor, coord(0,2), coord(x1,y1), lw)
		pygame.draw.line(dsply, bodyColor, coord(x1,y1), coord(x2,y2), lw)
		pygame.draw.line(dsply, bodyColor, coord(x3,y3-2), coord(x3,y3+2), int(1*screen_width/4.))
		# box = pygame.Rect(coordx(x3-1/2.),coordy(y3-4/2.),1*screen_width/4.,4*screen_height/4.)
		# pygame.draw.rect(dsply, bodyColor, box, 0)

		pygame.display.flip() #update display

		space.collide((world,contactgroup),near_callback)
		world.step(dt)
		clk.tick(fps)
		contactgroup.empty()

world, mass1, mass2, joint1, joint2, wall, space, contactgroup, geoms = buildObjects()
simulate(world, mass1, mass2, wall, space, contactgroup, geoms)

