void FaceOff::draw() { gl::clear(ColorA::black(), false); if (!mCapture.isReady()) return; gl::setMatricesWindow(getWindowSize()); gl::enableAlphaBlending(); float camAspect = CAM_W / (float)CAM_H; float winAspect = getWindowAspectRatio(); float adaptiveCamW = 0; float adaptiveCamH = 0; if (camAspect > winAspect) { adaptiveCamW = APP_W; adaptiveCamH = APP_W / camAspect; } else { adaptiveCamH = APP_H; adaptiveCamW = APP_H * camAspect; } Area srcArea = { 0, 0, CAM_W, CAM_H }; Rectf dstRect = { APP_W * 0.5f - adaptiveCamW * 0.5f, APP_H * 0.5f - adaptiveCamH * 0.5f, APP_W * 0.5f + adaptiveCamW * 0.5f, APP_H * 0.5f + adaptiveCamH * 0.5f }; if (!mOnlineTracker) { gl::draw(mCapture.texture, srcArea, dstRect); return; } gl::Texture2dRef fullscreenTex; if (VFX_VISIBLE && mHasNewRenderedFace) { fullscreenTex = mClone.getResultTexture(); } else if (VFX_VISIBLE && MOVIE_MODE) { fullscreenTex = mRenderedOfflineFaceFbo->getColorTexture(); } else { fullscreenTex = mCapture.texture; } gl::draw(fullscreenTex, srcArea, dstRect); if (OFFLINE_VISIBLE) { gl::draw(mOfflineFaceTex); } FPS = getAverageFps(); gl::disableAlphaBlending(); if (WIREFRAME_MODE && (MOVIE_MODE || mHasNewRenderedFace)) { gl::enableWireframe(); gl::ScopedModelMatrix modelMatrix; gl::ScopedColor color(ColorA(0, 1.0f, 0, 1.0f)); gl::translate(dstRect.x1, dstRect.y1); gl::scale(adaptiveCamW / CAM_W, adaptiveCamH / CAM_H); gl::draw(mFaceMesh); if (OFFLINE_VISIBLE) { gl::draw(mOfflineTracker->getImageMesh()); } gl::disableWireframe(); } updateGui(); }