Beispiel #1
0
bool gkMouseSensor::query(void)
{
	if (m_type == MOUSE_NILL)
		return false;


	gkMouse* mse = gkWindowSystem::getSingleton().getMouse();
	switch (m_type)
	{
	case MOUSE_LEFT:
		return mse->isButtonDown(gkMouse::Left);
	case MOUSE_MIDDLE:
		return mse->isButtonDown(gkMouse::Middle);
	case MOUSE_RIGHT:
		return mse->isButtonDown(gkMouse::Right);
	case MOUSE_MOTION:
		return mse->moved;
	case MOUSE_WHEEL_UP:
		return mse->wheelDelta > 0;
	case MOUSE_WHEEL_DOWN:
		return mse->wheelDelta < 0;
	case MOUSE_MOUSE_OVER:
	case MOUSE_MOUSE_OVER_ANY:
		// use Ogre viewport to ray query
		if (m_last && !mse->moved)
			return m_last;
		m_last = rayTest();
		return m_last;
	}
	return false;
}
Beispiel #2
0
 bool PhysicEngine::isAnyActorStandingOn (const std::string& objectName)
 {
     for (PhysicActorContainer::iterator it = mActorMap.begin(); it != mActorMap.end(); ++it)
     {
         if (!it->second->getOnGround())
             continue;
         Ogre::Vector3 pos = it->second->getPosition();
         btVector3 from (pos.x, pos.y, pos.z);
         btVector3 to = from - btVector3(0,0,5);
         std::pair<std::string, float> result = rayTest(from, to);
         if (result.first == objectName)
             return true;
     }
     return false;
 }
Beispiel #3
0
bool gkMouseSensor::query(void)
{
	if (m_type == MOUSE_NILL)
		return false;

	gkMouse* mse = gkWindowSystem::getSingleton().getMouse();
	switch (m_type)
	{
	case MOUSE_LEFT:
		return mse->isButtonDown(gkMouse::Left);
	case MOUSE_MIDDLE:
		return mse->isButtonDown(gkMouse::Middle);
	case MOUSE_RIGHT:
		return mse->isButtonDown(gkMouse::Right);
	case MOUSE_MOTION:
		return mse->moved;
	case MOUSE_WHEEL_UP:
		return mse->wheelDelta > 0;
	case MOUSE_WHEEL_DOWN:
		return mse->wheelDelta < 0;
	case MOUSE_MOUSE_OVER:
	case MOUSE_MOUSE_OVER_ANY:

#if GK_PLATFORM == GK_PLATFORM_ANDROID || GK_PLATFORM == GK_PLATFORM_APPLE_IOS
	// the ray-cast make on a mobile device only sense when the device is touched.
	// this should work as long as the mouse-touch is mapped to left-click
	if (!mse->isButtonDown(gkMouse::Left))
		return false;
#endif
		// use Ogre viewport to ray query. Since moveable objects might move under the
		// mouse the raytest have to be done every tick.
		m_lastResult = rayTest();
		return m_lastResult;
	}
	return false;
}
bool DynamicsWorld::castRay(
	const btVector3 & origin,
	const btVector3 & direction,
	const btScalar length,
	const btCollisionObject * caster,
	COLLISION_CONTACT & contact) const
{
	btVector3 p = origin + direction * length;
	btVector3 n = -direction;
	btScalar d = length;
	int patch_id = -1;
	const BEZIER * b = 0;
	const TRACKSURFACE * s = TRACKSURFACE::None();
	btCollisionObject * c = 0;

	MyRayResultCallback ray(origin, p, caster);
	rayTest(origin, p, ray);

	// track geometry collision
	bool geometryHit = ray.hasHit();
	if (geometryHit)
	{
		p = ray.m_hitPointWorld;
		n = ray.m_hitNormalWorld;
		d = ray.m_closestHitFraction * length;
		c = ray.m_collisionObject;
		if (c->isStaticObject())
		{
			TRACKSURFACE* tsc = static_cast<TRACKSURFACE*>(c->getUserPointer());
			const std::vector<TRACKSURFACE> & surfaces = track->GetSurfaces();
			if (tsc >= &surfaces[0] && tsc <= &surfaces[surfaces.size()-1])
			{
				s = tsc;
			}
#ifndef EXTBULLET
			else if (c->getCollisionShape()->isCompound())
			{
				TRACKSURFACE* tss = static_cast<TRACKSURFACE*>(ray.m_shape->getUserPointer());
				if (tss >= &surfaces[0] && tss <= &surfaces[surfaces.size()-1])
				{
					s = tss;
				}
			}
#endif
			//std::cerr << "static object without surface" << std::endl;
		}

		// track bezierpatch collision
		if (track)
		{
			MATHVECTOR<float, 3> bezierspace_raystart(origin[1], origin[2], origin[0]);
			MATHVECTOR<float, 3> bezierspace_dir(direction[1], direction[2], direction[0]);
			MATHVECTOR<float, 3> colpoint;
			MATHVECTOR<float, 3> colnormal;
			patch_id = contact.GetPatchId();

			if (track->CastRay(bezierspace_raystart, bezierspace_dir, length,
				patch_id, colpoint, b, colnormal))
			{
				p = btVector3(colpoint[2], colpoint[0], colpoint[1]);
				n = btVector3(colnormal[2], colnormal[0], colnormal[1]);
				d = (colpoint - bezierspace_raystart).Magnitude();
			}
		}

		contact = COLLISION_CONTACT(p, n, d, patch_id, b, s, c);
		return true;
	}

	// should only happen on vehicle rollover
	contact = COLLISION_CONTACT(p, n, d, patch_id, b, s, c);
	return false;
}
Beispiel #5
0
bool DynamicsWorld::castRay(
	const btVector3 & origin,
	const btVector3 & direction,
	const btScalar length,
	const btCollisionObject * caster,
	CollisionContact & contact) const
{
	btVector3 p = origin + direction * length;
	btVector3 n = -direction;
	btScalar d = length;
	int patch_id = -1;
	const Bezier * b = 0;
	const TrackSurface * s = TrackSurface::None();
	const btCollisionObject * c = 0;

	MyRayResultCallback ray(origin, p, caster);
	rayTest(origin, p, ray);

	// track geometry collision
	if (ray.hasHit())
	{
		p = ray.m_hitPointWorld;
		n = ray.m_hitNormalWorld;
		d = ray.m_closestHitFraction * length;
		c = ray.m_collisionObject;
		if (c->isStaticObject())
		{
			TrackSurface * ts = static_cast<TrackSurface*>(c->getUserPointer());
			if (c->getCollisionShape()->isCompound())
				ts = static_cast<TrackSurface*>(ray.m_shape->getUserPointer());

			// verify surface pointer
			if (track)
			{
				const std::vector<TrackSurface> & surfaces = track->GetSurfaces();
				if (ts < &surfaces[0] || ts > &surfaces[surfaces.size() - 1])
					ts = NULL;
				assert(ts);
			}

			if (ts)
				s = ts;
		}

		// track bezierpatch collision
		if (track)
		{
			Vec3 org = ToMathVector<float>(origin);
			Vec3 dir = ToMathVector<float>(direction);
			Vec3 colpoint;
			Vec3 colnormal;
			patch_id = contact.GetPatchId();
			if (track->CastRay(org, dir, length, patch_id, colpoint, b, colnormal))
			{
				p = ToBulletVector(colpoint);
				n = ToBulletVector(colnormal);
				d = (colpoint - org).Magnitude();
			}
		}

		contact = CollisionContact(p, n, d, patch_id, b, s, c);
		return true;
	}

	// should only happen on vehicle rollover
	contact = CollisionContact(p, n, d, patch_id, b, s, c);
	return false;
}