Ejemplo n.º 1
0
void CameraManager::GenerateRays(PintRaycastData* rays, udword nb_rays, float max_dist)
{
	GLint viewPort[4];
	GLdouble modelMatrix[16];
	GLdouble projMatrix[16];
	glGetIntegerv(GL_VIEWPORT, viewPort);
	glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
	glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);

	const float fScreenWidth = float(gScreenWidth)/float(nb_rays);
	const float fScreenHeight = float(gScreenHeight)/float(nb_rays);
	const Point Origin = GetCameraPos();

	udword Offset=0;
	for(udword j=0;j<nb_rays;j++)
	{
		const udword yi = udword(fScreenHeight*float(j));
		for(udword i=0;i<nb_rays;i++)
		{
			const udword xi = udword(fScreenWidth*float(i));
			rays[Offset].mOrigin = Origin;
			rays[Offset].mDir = ComputeWorldRay(viewPort, modelMatrix, projMatrix, xi, yi);
			rays[Offset].mMaxDist = max_dist;
			Offset++;
		}
	}
}
Ejemplo n.º 2
0
void CapsuleMeshQuery::MotionCallback(int x, int y)
{
    if(mValidHit)
    {
        Point Dir = ComputeWorldRay(x, y);
        mWorld.SetTrans(GetCameraPos() + Dir*mDist - mLocalHit);
    }
}
Ejemplo n.º 3
0
void OBBMeshQuery::MotionCallback(int x, int y)
{
	if(mValidHit)
	{
		Point Dir = ComputeWorldRay(x, y);
		mBox.mCenter = GetCameraPos() + Dir*mDist - mLocalHit;
	}
}
Ejemplo n.º 4
0
void CapsuleMeshQuery::MouseCallback(int button, int state, int x, int y)
{
    mValidHit = false;
    if(!button && !state)
    {
        Point Dir = ComputeWorldRay(x, y);

        float s[2];
        if(RayCapsuleOverlap(GetCameraPos(), Dir, mCapsule, s))
        {
            mValidHit = true;
            mDist = s[0];
            Point hit = GetCameraPos() + Dir * mDist;
            mLocalHit = hit - (Point)mWorld.GetTrans();
        }
    }
}
Ejemplo n.º 5
0
void OBBMeshQuery::MouseCallback(int button, int state, int x, int y)
{
	mValidHit = false;
	if(!button && !state)
	{
		Point Dir = ComputeWorldRay(x, y);

		float d;
		Point hit;
		if(RayOBB(GetCameraPos(), Dir, mBox, d, hit))
		{
			mValidHit = true;
			mDist = d;
			mLocalHit = hit - mBox.mCenter;
		}
	}
}