| 226 | |
| 227 | |
| 228 | void afxCamera::validateEyePoint(F32 pos, MatrixF *mat) |
| 229 | { |
| 230 | if (pos != 0) { |
| 231 | // Use the eye transform to orient the camera |
| 232 | Point3F dir; |
| 233 | mat->getColumn(1, &dir); |
| 234 | pos *= mMaxOrbitDist - mMinOrbitDist; |
| 235 | // Use the camera node's pos. |
| 236 | Point3F startPos; |
| 237 | Point3F endPos; |
| 238 | mObjToWorld.getColumn(3,&startPos); |
| 239 | |
| 240 | // Make sure we don't extend the camera into anything solid |
| 241 | if(mOrbitObject) |
| 242 | mOrbitObject->disableCollision(); |
| 243 | disableCollision(); |
| 244 | RayInfo collision; |
| 245 | |
| 246 | SceneContainer* pContainer = isServerObject() ? &gServerContainer : &gClientContainer; |
| 247 | if (!pContainer->castRay(startPos, startPos - dir * 2.5 * pos, afxCameraData::sCameraCollisionMask, &collision)) |
| 248 | endPos = startPos - dir * pos; |
| 249 | else |
| 250 | { |
| 251 | float dot = mDot(dir, collision.normal); |
| 252 | if(dot > 0.01) |
| 253 | { |
| 254 | float colDist = mDot(startPos - collision.point, dir) - (1 / dot) * CameraRadius; |
| 255 | if(colDist > pos) |
| 256 | colDist = pos; |
| 257 | if(colDist < 0) |
| 258 | colDist = 0; |
| 259 | endPos = startPos - dir * colDist; |
| 260 | } |
| 261 | else |
| 262 | endPos = startPos - dir * pos; |
| 263 | } |
| 264 | mat->setColumn(3,endPos); |
| 265 | enableCollision(); |
| 266 | if(mOrbitObject) |
| 267 | mOrbitObject->enableCollision(); |
| 268 | } |
| 269 | } |
| 270 | |
| 271 | //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// |
| 272 |
nothing calls this directly
no test coverage detected