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++; } } }
void CapsuleMeshQuery::MotionCallback(int x, int y) { if(mValidHit) { Point Dir = ComputeWorldRay(x, y); mWorld.SetTrans(GetCameraPos() + Dir*mDist - mLocalHit); } }
void OBBMeshQuery::MotionCallback(int x, int y) { if(mValidHit) { Point Dir = ComputeWorldRay(x, y); mBox.mCenter = GetCameraPos() + Dir*mDist - mLocalHit; } }
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(); } } }
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; } } }