void GFXGLWindowTarget::makeActive() { if(mBackBufferFBO) { glBindFramebuffer( GL_FRAMEBUFFER, mBackBufferFBO); GFXGL->getOpenglCache()->setCacheBinded(GL_FRAMEBUFFER, mBackBufferFBO); } else { glGenFramebuffers(1, &mBackBufferFBO); _setupAttachments(); CHECK_FRAMEBUFFER_STATUS(); } }
bool PxCloth::_createClothPatch() { // Make sure we have a mesh. if ( !mClothMesh ) { _initClothMesh(); if ( !mClothMesh ) return false; } // Make sure we can change the world. mWorld->releaseWriteLock(); _releaseCloth(); NxClothDesc desc; desc.globalPose.setRowMajor44( getTransform() ); desc.thickness = mThickness; desc.density = mDensity; desc.bendingStiffness = mBendingStiffness; desc.dampingCoefficient = mDampingCoefficient; desc.friction = mFriction; // start jc // todo: expose this desc.sleepLinearVelocity = 0.0000001f; // end jc if ( mBendingEnabled ) desc.flags |= NX_CLF_BENDING; if ( mDampingEnabled ) desc.flags |= NX_CLF_DAMPING; if ( mTriangleCollisionEnabled ) desc.flags |= NX_CLF_TRIANGLE_COLLISION; if ( mSelfCollisionEnabled ) desc.flags |= NX_CLF_SELFCOLLISION; desc.clothMesh = mClothMesh; desc.meshData = mReceiveBuffers; if ( !desc.isValid() ) return false; mCloth = mScene->createCloth( desc ); mIsVBDirty = true; _updateStaticCloth(); _setupAttachments(); return true; }
bool GFXGLWindowTarget::present() { PRESERVE_FRAMEBUFFER(); const Point2I srcSize = mBackBufferColorTex.getWidthHeight(); const Point2I dstSize = getSize(); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_READ_FRAMEBUFFER, mBackBufferFBO); // OpenGL render upside down for make render more similar to DX. // Final screen are corrected here glBlitFramebuffer( 0, 0, srcSize.x, srcSize.y, 0, dstSize.y, dstSize.x, 0, // Y inverted GL_COLOR_BUFFER_BIT, GL_NEAREST); _WindowPresent(); if(srcSize != dstSize || mBackBufferDepthTex.getWidthHeight() != dstSize) _setupAttachments(); return true; }