void RttManager::CReflectionListener::postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt) { Hydrax *mHydrax = mRttManager->mHydrax; mHydrax->getMesh()->getEntity()->setVisible(true); if (mCameraPlaneDiff != 0) { mRttManager->mPlanes[RTT_REFLECTION]->getParentNode()->translate(0, mCameraPlaneDiff, 0); } if (mHydrax->_isCurrentFrameUnderwater()) { mRttManager->mPlanes[RTT_REFLECTION]->getParentNode()->translate(0, mHydrax->getPlanesError(), 0); } else { mRttManager->mPlanes[RTT_REFLECTION]->getParentNode()->translate(0, -mHydrax->getPlanesError(), 0); } mHydrax->getCamera()->disableReflection(); mHydrax->getCamera()->disableCustomNearClipPlane(); if (mHydrax->isComponent(HYDRAX_COMPONENT_UNDERWATER)) { if (mHydrax->_isCurrentFrameUnderwater()) { mRttManager->mPlanes[RTT_REFLECTION]->normal = -mRttManager->mPlanes[RTT_REFLECTION]->normal; } } mCReflectionQueueListener.mActive = false; }
void RttManager::CReflectionListener::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt) { Hydrax *mHydrax = mRttManager->mHydrax; mCReflectionQueueListener.mActive = true; mHydrax->getMesh()->getEntity()->setVisible(false); if (mHydrax->_isCurrentFrameUnderwater()) { mRttManager->mPlanes[RTT_REFLECTION]->getParentNode()->translate(0,-mHydrax->getPlanesError(),0); } else { mRttManager->mPlanes[RTT_REFLECTION]->getParentNode()->translate(0,+mHydrax->getPlanesError(),0); } bool IsInUnderwaterError = false; // Underwater if ( mHydrax->_isCurrentFrameUnderwater() && (mHydrax->getCamera()->getDerivedPosition().y > mRttManager->mPlanes[RTT_REFLECTION]->getParentNode()->getPosition().y)) { mCameraPlaneDiff = 0; IsInUnderwaterError = true; } // Overwater else if ((!mHydrax->_isCurrentFrameUnderwater()) && (mHydrax->getCamera()->getDerivedPosition().y < mRttManager->mPlanes[RTT_REFLECTION]->getParentNode()->getPosition().y)) { mCameraPlaneDiff = mRttManager->mPlanes[RTT_REFLECTION]->getParentNode()->getPosition().y-mHydrax->getCamera()->getDerivedPosition().y+mRttManager->mReflectionDisplacementError; mRttManager->mPlanes[RTT_REFLECTION]->getParentNode()->translate(0,-mCameraPlaneDiff,0); } else { mCameraPlaneDiff = 0; } if (mHydrax->isComponent(HYDRAX_COMPONENT_UNDERWATER)) { if (mHydrax->_isCurrentFrameUnderwater()) { mRttManager->mPlanes[RTT_REFLECTION]->normal = -mRttManager->mPlanes[RTT_REFLECTION]->normal; } } mHydrax->getCamera()->enableReflection(mRttManager->mPlanes[RTT_REFLECTION]); if (IsInUnderwaterError) { mCReflectionQueueListener.mActive = false; } else { mHydrax->getCamera()->enableCustomNearClipPlane(mRttManager->mPlanes[RTT_REFLECTION]); } }