Пример #1
0
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));
	}
}
Пример #2
0
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);
}
Пример #3
0
	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);
	}
Пример #4
0
__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++;
	}
}
Пример #5
0
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);
    }
}
Пример #6
0
 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;
 }
Пример #7
0
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);
    }
}
Пример #8
0
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);
    }
}
Пример #10
0
void Space::segmentQuery(cpVect start,cpVect end,cpLayers layers,cpGroup group,SpaceSegmentQueryFunc func)
{
		cpSpaceSegmentQuery(space,start,end,layers,group,*SpaceSegmentQuery,&func);
}
Пример #11
0
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);
}