// written in the D programming language

module samples.ChipmunkDemo;

import dchip.all;

import drawSpace;

import core.stdc.stdlib;

alias cpSpace *function() demoInitFunc;
alias void function(int ticks) demoUpdateFunc;
alias void function()demoDestroyFunc;

struct chipmunkDemo {
    string name;

    const drawSpaceOptions *drawOptions;

    demoInitFunc	initFunc;
    demoUpdateFunc	updateFunc;
    demoDestroyFunc destroyFunc;
}

void
ChipmunkDemoFreeSpaceChildren(cpSpace *space)
{
    cpArray *components = space.sleepingComponents;
    while(components.num) cpBodyActivate(cast(cpBody *)components.arr[0]);

    cpSpatialIndexEach(space.staticShapes, &shapeFreeWrap, null);
    cpSpatialIndexEach(space.activeShapes, &shapeFreeWrap, null);

    cpArrayFreeEach(space.bodies, &cpBodyFreeVoid);
    cpArrayFreeEach(space.constraints, &cpConstraintFreeWrap);
}

// special hack for OSX
version(Posix) import std.random:uniform;

static cpFloat
frand()
{
version(Posix){
    return std.random.uniform(0.0f,1.0f);
}else{
    return cast(cpFloat)rand()/cast(cpFloat)RAND_MAX;
}
}

enum GRABABLE_MASK_BIT = (1<<31);
enum NOT_GRABABLE_MASK = (~GRABABLE_MASK_BIT);