1
votes

I have been looking all over the internet for any guide, even an example for the cpSpaceBBQuery function for Chipmunk Physics. I have read and re-read the documentation provided by the authors themselves with no luck.

Here is the documentation on everything Chipmunk: http://chipmunk-physics.net/release/ChipmunkLatest-Docs/

From my understanding, you must call the function cpSpaceBBQuery somewhere in your code, setting a bounding box as reference and a function to be called when a shape is found. When I do set these 2 elements, my function never gets called. I try adding a sprite as the data parameter with no luck either. What am I missing?

An example to go with this would be great.

Thanks for your time!

1

1 Answers

1
votes

no expert on this, but I just found the following for you, hope it helps.

http://cutecoder.org/programming/wrapping-style-callbacks-blocks/

http://code.google.com/p/chipmunk-physics/source/browse/wiki/Queries.wiki?r=408

==Bounding Box Queries==

{{{
typedef void (*cpSpaceBBQueryFunc)(cpShape *shape, void *data);
void cpSpaceBBQuery(cpSpace *space, cpBB bb, cpLayers layers, cpGroup group, cpSpaceBBQueryFunc func, void *data);
}}}
 Query `space` over the area of `bb` filtering out matches using the given `layers` and `group`. `func` is called for each shape found along with the `data` argument passed to `cpSpaceBBQuery()`. The bounding box of all shapes passed to the callback overlap the given bounding box, but the shapes themselves might not overlap the box. This function is meant to be an efficient way to find objects in an area, but not a detailed intersection test.

==Examples==

This is the mouse button handler function from the demo app. On mouse down, it finds the shape under the mouse if there is one and adds a joint to it so that you can drag it around.
{{{
static void
click(int button, int state, int x, int y)
{
        if(button == GLUT_LEFT_BUTTON){
                if(state == GLUT_DOWN){
                        cpVect point = mouseToSpace(x, y);

                        cpShape *shape = cpSpacePointQueryFirst(space, point, GRABABLE_MASK_BIT, 0);
                        if(shape){
                                cpBody *body = shape->body;
                                mouseJoint = cpPivotJointNew2(mouseBody, body, cpvzero, cpBodyWorld2Local(body, point));
                                mouseJoint->maxForce = 50000.0f;
                                mouseJoint->biasCoef = 0.15f;
                                cpSpaceAddConstraint(space, mouseJoint);
                        }
                } else if(mouseJoint){
                        cpSpaceRemoveConstraint(space, mouseJoint);
                        cpConstraintFree(mouseJoint);
                        mouseJoint = NULL;
                }
        }
}
}}}

Shoot a laser through a space, find the first shape it hits. We want to draw particles where the laser beam enters and exits the shape.
{{{
cpSegmentQueryInfo info;
if(cpSpaceSegmentQueryFirst(space, a, b, -1, 0, &info)){
        cpSegmentQueryInfo info2;
        cpShapeSegmentQuery(info.shape, b, a, &info2);

        cpVect enterPoint = cpSegmentQueryHitPoint(a, b, info);
        cpVect exitPoint = cpSegmentQueryHitPoint(b, a, info2);
}
}}}