void FKFSDynamics::move(VrmlNodeVehicle *vehicle) { osg::Matrix bodyTrans; osg::Matrix cameraTrans; for (int i = 0; i < appNumObjects; i++) { bodyTrans = getBodyTransform(i); vehicle->setVRMLVehicleBody(i, bodyTrans); } cameraTrans = getCameraTransform(); vehicle->setVRMLVehicleCamera(cameraTrans); carTrans = getCarTransform(); vehicle->setVRMLVehicle(carTrans); }
SceneRenderState::SceneRenderState( SceneManager* sceneManager, ScenePassType passType, const SceneCameraState& view, RenderPassManager* renderPass /* = NULL */, bool usePostEffects /* = true */ ) : mSceneManager( sceneManager ), mCullingState( sceneManager, view ), mRenderPass( renderPass ? renderPass : sceneManager->getDefaultRenderPass() ), mScenePassType( passType ), mRenderNonLightmappedMeshes( true ), mRenderLightmappedMeshes( true ), mUsePostEffects( usePostEffects ), mDisableAdvancedLightingBins( false ), mRenderArea( view.getFrustum().getBounds() ), mAmbientLightColor( sceneManager->getAmbientLightColor() ), mSceneRenderStyle( SRS_Standard ), mRenderField( 0 ) { // Setup the default parameters for the screen metrics methods. mDiffuseCameraTransform = view.getViewWorldMatrix(); // The vector eye is the camera vector with its // length normalized to 1 / zFar. getCameraTransform().getColumn( 1, &mVectorEye ); mVectorEye.normalize( 1.0f / getFarPlane() ); // TODO: What about ortho modes? Is near plane ok // or do i need to remove it... maybe ortho has a near // plane of 1 and it just works out? const Frustum& frustum = view.getFrustum(); const RectI& viewport = view.getViewport(); mWorldToScreenScale.set( ( frustum.getNearDist() * viewport.extent.x ) / ( frustum.getNearRight() - frustum.getNearLeft() ), ( frustum.getNearDist() * viewport.extent.y ) / ( frustum.getNearTop() - frustum.getNearBottom() ) ); // Assign shared matrix data to the render pass. mRenderPass->assignSharedXform( RenderPassManager::View, view.getWorldViewMatrix() ); mRenderPass->assignSharedXform( RenderPassManager::Projection, view.getProjectionMatrix() ); }
bool EditTSCtrl::processCameraQuery(CameraQuery * query) { if(mDisplayType == DisplayTypePerspective) { query->ortho = false; } else { query->ortho = true; } if (getCameraTransform(&query->cameraMatrix)) { query->farPlane = gClientSceneGraph->getVisibleDistance() * smVisibleDistanceScale; query->nearPlane = gClientSceneGraph->getNearClip(); query->fov = mDegToRad(smCamFOV); if(query->ortho) { MatrixF camRot(true); const F32 camBuffer = 1.0f; Point3F camPos = query->cameraMatrix.getPosition(); F32 isocamplanedist = 0.0f; if(mDisplayType == DisplayTypeIsometric) { const RectI& vp = GFX->getViewport(); isocamplanedist = 0.25 * vp.extent.y * mSin(mIsoCamAngle); } // Calculate the scene bounds Box3F sceneBounds; computeSceneBounds(sceneBounds); if(!sceneBounds.isValidBox()) { sceneBounds.maxExtents = camPos + smMinSceneBounds; sceneBounds.minExtents = camPos - smMinSceneBounds; } else { query->farPlane = getMax(smMinSceneBounds.x * 2.0f, (sceneBounds.maxExtents - sceneBounds.minExtents).len() + camBuffer * 2.0f + isocamplanedist); } mRawCamPos = camPos; camPos += mOrthoCamTrans; switch(mDisplayType) { case DisplayTypeTop: camRot.setColumn(0, Point3F(1.0, 0.0, 0.0)); camRot.setColumn(1, Point3F(0.0, 0.0, -1.0)); camRot.setColumn(2, Point3F(0.0, 1.0, 0.0)); camPos.z = getMax(camPos.z + smMinSceneBounds.z, sceneBounds.maxExtents.z + camBuffer); break; case DisplayTypeBottom: camRot.setColumn(0, Point3F(1.0, 0.0, 0.0)); camRot.setColumn(1, Point3F(0.0, 0.0, 1.0)); camRot.setColumn(2, Point3F(0.0, -1.0, 0.0)); camPos.z = getMin(camPos.z - smMinSceneBounds.z, sceneBounds.minExtents.z - camBuffer); break; case DisplayTypeFront: camRot.setColumn(0, Point3F(-1.0, 0.0, 0.0)); camRot.setColumn(1, Point3F( 0.0, -1.0, 0.0)); camRot.setColumn(2, Point3F( 0.0, 0.0, 1.0)); camPos.y = getMax(camPos.y + smMinSceneBounds.y, sceneBounds.maxExtents.y + camBuffer); break; case DisplayTypeBack: camRot.setColumn(0, Point3F(1.0, 0.0, 0.0)); camRot.setColumn(1, Point3F(0.0, 1.0, 0.0)); camRot.setColumn(2, Point3F(0.0, 0.0, 1.0)); camPos.y = getMin(camPos.y - smMinSceneBounds.y, sceneBounds.minExtents.y - camBuffer); break; case DisplayTypeLeft: camRot.setColumn(0, Point3F( 0.0, -1.0, 0.0)); camRot.setColumn(1, Point3F( 1.0, 0.0, 0.0)); camRot.setColumn(2, Point3F( 0.0, 0.0, 1.0)); camPos.x = getMin(camPos.x - smMinSceneBounds.x, sceneBounds.minExtents.x - camBuffer); break; case DisplayTypeRight: camRot.setColumn(0, Point3F( 0.0, 1.0, 0.0)); camRot.setColumn(1, Point3F(-1.0, 0.0, 0.0)); camRot.setColumn(2, Point3F( 0.0, 0.0, 1.0)); camPos.x = getMax(camPos.x + smMinSceneBounds.x, sceneBounds.maxExtents.x + camBuffer); break; case DisplayTypeIsometric: camPos.z = sceneBounds.maxExtents.z + camBuffer + isocamplanedist; MatrixF angle(EulerF(mIsoCamAngle, 0, 0)); MatrixF rot(mIsoCamRot); camRot.mul(rot, angle); break; } query->cameraMatrix = camRot; query->cameraMatrix.setPosition(camPos); query->fov = mOrthoFOV; } smCamMatrix = query->cameraMatrix; smCamMatrix.getColumn(3,&smCamPos); smCamOrtho = query->ortho; smCamNearPlane = query->nearPlane; return true; } return false; }