void FrustumCullingApp::update() { mFrustumPlaneCached = false; mAngle -= ( mAngle - mAngleDest ) * 0.1f; mEye -= ( mEye - mEyeDest ) * 0.2f; mEyeNormal = Vec3f( sin( mAngle ), 0.0f, cos( mAngle ) ); mCenter = mEye + mEyeNormal * 50.0f; mCam.setPerspective( 25.0f, getWindowAspectRatio(), 100.0f, 350.0f ); mCam.lookAt( mEye, mCenter, mUp ); calcNearAndFarClipCoordinates( mCam ); if( mIsWatchingCam ){ mREye.lerpEq( mDecay, Vec3f( mEye.x + cos( mCounter * 0.003f ) * 300.0f, 100.0f, mEye.y + sin( mCounter * 0.003f ) * 300.0f ) ); mRCenter.lerpEq( mDecay, Vec3f( mEye + mEyeNormal * 250.0f ) ); mFov -= ( mFov - 60.0f ) * mDecay; mNear -= ( mNear - 10.0f ) * mDecay; mFar -= ( mFar - 1500.0f ) * mDecay; } else { mREye.lerpEq( mDecay, mEye ); mRCenter.lerpEq( mDecay, mCenter ); mFov -= ( mFov - mCam.getFov() ) * mDecay; mNear -= ( mNear - mCam.getNearClip() ) * mDecay; mFar -= ( mFar - mCam.getFarClip() ) * mDecay; } mRenderCam.setPerspective( mFov, getWindowAspectRatio(), 10.0f, 1500.0f ); mRenderCam.lookAt( mREye, mRCenter, mUp ); gl::setMatrices( mRenderCam ); mCounter += 1.0f; }
void MemExploreApp::draw() { mTexture = gl::Texture(mDataPointer, GL_RGBA, mVolumeDim * mTilesDim, mVolumeDim * mTilesDim); mTexture.setWrap(GL_REPEAT, GL_REPEAT); mTexture.setMinFilter(GL_NEAREST); mTexture.setMagFilter(GL_NEAREST); float frustum[6]; mCamera.getFrustum(&frustum[0], &frustum[1], &frustum[2], &frustum[3], &frustum[4], &frustum[5]); mFbo.bindFramebuffer(); gl::setMatricesWindow(mFbo.getSize(), false); mProgram.bind(); mProgram.uniform("uTexture", 0); mProgram.uniform("uVolumeDim", mVolumeDim); mProgram.uniform("uTilesDim", mTilesDim); mProgram.uniform("uTime", (float)getElapsedSeconds()); mProgram.uniform("uEyePoint", mCamera.getEyePoint()); mProgram.uniform("uXAxis", mCamera.getOrientation() * Vec3f::xAxis()); mProgram.uniform("uYAxis", mCamera.getOrientation() * Vec3f::yAxis()); mProgram.uniform("uViewDistance", mCamera.getAspectRatio() / abs(frustum[2] - frustum[0]) * mCamera.getNearClip()); mProgram.uniform("uNegViewDir", -mCamera.getViewDirection().normalized()); mProgram.uniform("uAspectRatio", mCamera.getAspectRatio()); mTexture.enableAndBind(); gl::drawSolidRect(mFbo.getBounds()); mTexture.unbind(); mProgram.unbind(); mFbo.unbindFramebuffer(); gl::setMatricesWindow(getWindowSize()); gl::draw(mFbo.getTexture(), getWindowBounds()); }