diff trunk/tests/ChipmunkDemos/samples/Tumble.d @ 16:af2f61a96318

ported chipmunk demos
author Extrawurst
date Sat, 04 Dec 2010 02:02:29 +0100
parents
children 4604c914f2ab
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/tests/ChipmunkDemos/samples/Tumble.d	Sat Dec 04 02:02:29 2010 +0100
@@ -0,0 +1,117 @@
+
+// written in the D programming language
+
+module samples.Tumble;
+
+import chipmunkd.chipmunk;
+
+import samples.ChipmunkDemo;
+
+static cpSpace *space;
+static cpBody *staticBody;
+
+static void
+update(int ticks)
+{
+	enum int steps = 3;
+	enum cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
+	
+	for(int i=0; i<steps; i++){
+		cpSpaceStep(space, dt);
+		
+		// Manually update the position of the static shape so that
+		// the box rotates.
+		cpBodyUpdatePosition(staticBody, dt);
+		
+		// Because the box was added as a static shape and we moved it
+		// we need to manually rehash the static spatial hash.
+		cpSpaceRehashStatic(space);
+	}
+}
+
+static cpSpace *
+init()
+{
+	staticBody = cpBodyNew(INFINITY, INFINITY);
+	
+	cpResetShapeIdCounter();
+	
+	space = cpSpaceNew();
+	cpSpaceResizeActiveHash(space, 40.0f, 999);
+	cpSpaceResizeStaticHash(space, 40.0f, 99);
+	space.gravity = cpv(0, -600);
+	
+	cpBody *_body;
+	cpShape *shape;
+	
+	// Vertexes for the bricks
+	int num = 4;
+	cpVect verts[] = [
+		cpv(-30,-15),
+		cpv(-30, 15),
+		cpv( 30, 15),
+		cpv( 30,-15),
+	];
+	
+	// Set up the static box.
+	cpVect a = cpv(-200, -200);
+	cpVect b = cpv(-200,  200);
+	cpVect c = cpv( 200,  200);
+	cpVect d = cpv( 200, -200);
+	
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, a, b, 0.0f));
+	shape.e = 1.0f; shape.u = 1.0f;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, b, c, 0.0f));
+	shape.e = 1.0f; shape.u = 1.0f;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, c, d, 0.0f));
+	shape.e = 1.0f; shape.u = 1.0f;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, d, a, 0.0f));
+	shape.e = 1.0f; shape.u = 1.0f;
+	shape.layers = NOT_GRABABLE_MASK;
+	
+	// Give the box a little spin.
+	// Because staticBody is never added to the space, we will need to
+	// update it ourselves. (see above).
+	// NOTE: Normally you would want to add the segments as normal and not static shapes.
+	// I'm just doing it to demonstrate the cpSpaceRehashStatic() function.
+	staticBody.w = 0.4f;
+	
+	int foo;
+	// Add the bricks.
+	for(int i=0; i<3; i++){
+		for(int j=0; j<7; j++){
+			_body = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts.ptr, cpvzero)));
+			_body.p = cpv(i*60 - 150, j*30 - 150);
+	
+			//BUG: crazy fucking dmd codegen bug when optimizing (2.050)
+			foo = i+j;
+			
+			shape = cpSpaceAddShape(space, cpPolyShapeNew(_body, num, verts.ptr, cpvzero));
+			shape.e = 0.0f; shape.u = 0.7f;
+		}
+	}
+	
+	return space;
+}
+
+static void
+destroy()
+{
+	cpBodyFree(staticBody);
+	cpSpaceFreeChildren(space);
+	cpSpaceFree(space);
+}
+
+chipmunkDemo Tumble = {
+	"Tumble",
+	null,
+	&init,
+	&update,
+	&destroy,
+};