static void update(cpSpace *space, double dt) { cpSpaceStep(space, dt); static cpBool lastClickState = cpFalse; static cpVect sliceStart = {0.0, 0.0}; // Annoying state tracking code that you wouldn't need // in a real event driven system. if(ChipmunkDemoRightClick != lastClickState){ if(ChipmunkDemoRightClick){ // MouseDown sliceStart = ChipmunkDemoMouse; } else { // MouseUp struct SliceContext context = {sliceStart, ChipmunkDemoMouse, space}; cpSpaceSegmentQuery(space, sliceStart, ChipmunkDemoMouse, GRABABLE_MASK_BIT, CP_NO_GROUP, (cpSpaceSegmentQueryFunc)SliceQuery, &context); } lastClickState = ChipmunkDemoRightClick; } if(ChipmunkDemoRightClick){ ChipmunkDebugDrawSegment(sliceStart, ChipmunkDemoMouse, RGBAColor(1, 0, 0, 1)); } }
inline void space_segment_query(cpSpace *space, cpVect start, cpVect end, cpLayers layers, cpGroup group, void *f) { cpSpaceSegmentQuery(space, start, end, layers, group, segmentQuery, f); }
void Space::segmentQuery(Vect a, Vect b, Layers layers, Group group, SegmentQueryFunc func) const { SegmentQueryData data = { this, func }; cpShapeFilter filter{static_cast<cpGroup>(group), static_cast<cpBitmask>(layers), static_cast<cpBitmask>(layers)}; cpSpaceSegmentQuery(space, a, b, 0, filter, segmentQueryFunc, &data); }
__declspec( dllexport ) void segmentquery( const void * _in, int in_size, void * _out, int out_sz ) { int index = 0; int memindex = 4; resetSegmentQueryData(); cpSpaceSegmentQuery(&mSpace,PEEKVECT(INPUT_MEMBLOCK,0),PEEKVECT(INPUT_MEMBLOCK,8),PEEKINT(INPUT_MEMBLOCK,16),PEEKINT(INPUT_MEMBLOCK,20),segmentQueryFunc,0); POKEINT(OUTPUT_MEMBLOCK,0,mSegmentQueryIterator); while (index != mSegmentQueryIterator) { POKEINT(OUTPUT_MEMBLOCK,memindex,((Variable*)(mSegmentQueries[index].shape->data))->mCBPtr); POKEFLOAT(OUTPUT_MEMBLOCK,memindex+4,mSegmentQueries[index].t); POKEVECT(OUTPUT_MEMBLOCK,memindex+8,mSegmentQueries[index].n); memindex+=16; index++; } }
void PhysicsWorld::rayCast(PhysicsRayCastCallbackFunc func, const Point& point1, const Point& point2, void* data) { CCASSERT(func != nullptr, "func shouldn't be nullptr"); if (func != nullptr) { RayCastCallbackInfo info = { this, func, point1, point2, data }; PhysicsWorldCallback::continues = true; cpSpaceSegmentQuery(this->_info->getSpace(), PhysicsHelper::point2cpv(point1), PhysicsHelper::point2cpv(point2), CP_ALL_LAYERS, CP_NO_GROUP, (cpSpaceSegmentQueryFunc)PhysicsWorldCallback::rayCastCallbackFunc, &info); } }
CEmbodiedEntity* CDynamics2DEngine::CheckIntersectionWithRay(Real& f_t_on_ray, const CRay3& c_ray) const { /* Query all hits along the ray */ SDynamics2DSegmentHitData sHitData(c_ray); cpSpaceSegmentQuery( m_ptSpace, cpv(c_ray.GetStart().GetX(), c_ray.GetStart().GetY()), cpv(c_ray.GetEnd().GetX() , c_ray.GetEnd().GetY() ), CP_ALL_LAYERS, CP_NO_GROUP, Dynamics2DSegmentQueryFunc, &sHitData); /* Check whether we have a hit */ if(sHitData.Body != NULL) { f_t_on_ray = sHitData.T; } return sHitData.Body; }
void PhysicsWorld::rayCast(PhysicsRayCastCallbackFunc func, const Vec2& point1, const Vec2& point2, void* data) { CCASSERT(func != nullptr, "func shouldn't be nullptr"); if (func != nullptr) { if (!_delayAddBodies.empty() || !_delayRemoveBodies.empty()) { updateBodies(); } RayCastCallbackInfo info = { this, func, point1, point2, data }; PhysicsWorldCallback::continues = true; cpSpaceSegmentQuery(_cpSpace, PhysicsHelper::point2cpv(point1), PhysicsHelper::point2cpv(point2), 0.0f, CP_SHAPE_FILTER_ALL, (cpSpaceSegmentQueryFunc)PhysicsWorldCallback::rayCastCallbackFunc, &info); } }
bool Slice::ProcessTouch( uint32 id, cpVect pos, TouchState state, bool rightClick /*= false*/ ) { if (rightClick) { if (state == ChipmunkDemo::TOUCH_START) { if (touchId < 0) { touchId = id; lastTouchPoint = pos; sliceStart = pos; return true; } } else if (state == ChipmunkDemo::TOUCH_MOVE) { if (touchId == (int)id) { lastTouchPoint = pos; return true; } } else /* if (state == ChipmunkDemo::TOUCH_END) */ { if (touchId == (int)id) { struct SliceContext context = {sliceStart, pos, space}; cpSpaceSegmentQuery(space, sliceStart, pos, 0.0, GRAB_FILTER, (cpSpaceSegmentQueryFunc)SliceQuery, &context); lastTouchPoint = pos; touchId = -1; return true; } } } return ChipmunkDemo::ProcessTouch(id, pos, state, rightClick); }
void PhysicsWorld::rayCast(PhysicsRayCastCallbackFunc func, const Vec2& point1, const Vec2& point2, void* data) { CCASSERT(func != nullptr, "func shouldn't be nullptr"); if (func != nullptr) { if (!_delayAddBodies.empty() || !_delayRemoveBodies.empty()) { _scene->updatePhysicsBodyTransform(_scene->getNodeToParentTransform(), 0, 1.0f, 1.0f); updateBodies(); } RayCastCallbackInfo info = { this, func, point1, point2, data }; PhysicsWorldCallback::continues = true; cpSpaceSegmentQuery(_cpSpace, PhysicsHelper::point2cpv(point1), PhysicsHelper::point2cpv(point2), CP_ALL_LAYERS, CP_NO_GROUP, (cpSpaceSegmentQueryFunc)PhysicsWorldCallback::rayCastCallbackFunc, &info); } }
void Space::segmentQuery(cpVect start,cpVect end,cpLayers layers,cpGroup group,SpaceSegmentQueryFunc func) { cpSpaceSegmentQuery(space,start,end,layers,group,*SpaceSegmentQuery,&func); }
void Space::segmentQuery(const cp::Vect& start,const cp::Vect& end,cpLayers layers,cpGroup group,cpSpaceSegmentQueryFunc func,void *data) { cpSpaceSegmentQuery(space,start,end,layers,group,func,data); }