void BulletTestApp::update() { mFrameRate = getAverageFps(); // Update light mLight->update( mCamera ); // // Set box rotation // float rotation = math<float>::sin( ( float )getElapsedSeconds() * 0.3333f ) * 0.35f ; // mGroundTransform.setRotation( btQuaternion( 0.25f, 0.0f, 1.0f + rotation * 0.1f, rotation ) ); // mGroundTransform.setOrigin( btVector3( 0.0f, -60.0f, 0.0f ) ); // // // Apply rotation to box // btRigidBody* body = bullet::toBulletRigidBody( mGround ); // body->getMotionState()->setWorldTransform( mGroundTransform ); // body->setWorldTransform( mGroundTransform ); // Update dynamics world mWorld->update( mFrameRate ); // Remove out of bounds objects for( bullet::Iter object = mWorld->begin(); object != mWorld->end(); ) { if ( object != mWorld->begin() && object->getPosition().y < -800.0f ) { object = mWorld->erase( object ); } else { ++object; } } checkPoint(); }
void BulletTestApp::checkPoint() { uint32_t i = 0; for( bullet::Iter object = mWorld->begin(); object != mWorld->end(); ++object, i++ ) { if( i <= 3 ) continue; if( object->getUserData()) continue; // check vertical position if( object->getPosition().y >= mRing->getPosition().y - 1 && object->getPosition().y <= mRing->getPosition().y + 1 ) { // check horizontal position if( object->getPosition().x >= mRing->getPosition().x - 8 && object->getPosition().x <= mRing->getPosition().x + 8 && object->getPosition().z <= mRing->getPosition().z + 8 && object->getPosition().z >= mRing->getPosition().z - 8 ) { mPoint++; object->setUserData( 1 ); } } } }
void BulletTestApp::draw() { gl::enableDepthRead(); gl::enableDepthWrite(); gl::setViewport( getWindowBounds() ); gl::clear( ColorAf::black() ); gl::setMatrices( mCamera ); gl::pushMatrices(); gl::rotate( Vec3f( -45.0f, 0.0f, 0.0f ) ); uint32_t i = 0; for ( bullet::Iter iter = mWorld->begin(); iter != mWorld->end(); ++iter, ++i ) { gl::pushMatrices(); glMultMatrixf( iter->getTransformMatrix() ); bindTexture( i ); switch ( iter->getPrimitiveType() ) { case CollisionObject::PRIMITIVE_BOX: gl::draw( mCube ); break; case CollisionObject::PRIMITIVE_CONE: gl::draw( mCone ); break; case CollisionObject::PRIMITIVE_CYLINDER: gl::draw( mCylinder ); break; case CollisionObject::PRIMITIVE_SPHERE: gl::draw( mSphere ); break; default: if ( iter->isMeshBody() ) { gl::draw( bullet::calcTriMesh( iter ) ); } break; } unbindTexture( i ); gl::popMatrices(); } gl::popMatrices(); mParams.draw(); }
void BulletTestApp::draw() { gl::setViewport( getWindowBounds() ); gl::clear( ColorAf::black() ); gl::setMatrices( mCamera ); gl::pushMatrices(); gl::rotate( Vec3f( -45.0f, 0.0f, 0.0f ) ); uint32_t i = 0; for ( bullet::Iter object = mWorld->begin(); object != mWorld->end(); ++object, i++ ) { gl::pushMatrices(); glMultMatrixf( object->getTransformMatrix() ); bindTexture( i ); gl::draw( object->getVboMesh() ); unbindTexture( i ); gl::popMatrices(); } gl::popMatrices(); mParams.draw(); }
void BulletTestApp::draw() { gl::setViewport( getWindowBounds() ); gl::clear( ColorAf::black() ); gl::setMatrices( mCamera ); gl::pushMatrices(); gl::rotate( Vec3f( (float)mViewX, (float)mViewY, (float)mViewZ ) ); uint32_t i = 0; for( bullet::Iter object = mWorld->begin(); object != mWorld->end(); ++object, i++ ) { TextureType type = TT_GROUND; if( i == 0 ) type = TT_GROUND; else if( i == 1 ) type = TT_BACKBOARD; else if( i == 2 || i == 3 ) type = TT_RING; else type = TT_BASKETBALL; gl::pushMatrices(); glMultMatrixf( object->getTransformMatrix() ); bindTexture( type ); gl::draw( object->getVboMesh() ); unbindTexture( type ); gl::popMatrices(); } // draw the same torus // gl::translate( Vec3f( 0.0f, 13.0f, 0.0f )); // gl::rotate( Quatf( 0.0f, 0.0f, 1.14f, 1.0f )); // gl::drawTorus( 20, 3, 200, 200 ); gl::popMatrices(); mParams.draw(); }
void BulletTestApp::update() { // Run next test if ( mTest != mTestPrev ) { mTestPrev = mTest; initTest(); } mFrameRate = getAverageFps(); // Update light mLight->update( mCamera ); if ( mTest < 3 ) { // Set box rotation float rotation = math<float>::sin( ( float )getElapsedSeconds() * 0.3333f ) * 0.35f ; mGroundTransform.setRotation( btQuaternion( 0.25f, 0.0f, 1.0f + rotation * 0.1f, rotation ) ); mGroundTransform.setOrigin( btVector3( 0.0f, -60.0f, 0.0f ) ); // Apply rotation to box btRigidBody* body = bullet::toBulletRigidBody( mGround ); body->getMotionState()->setWorldTransform( mGroundTransform ); body->setWorldTransform( mGroundTransform ); } else if ( mTest == 6 ) { // Read data Channel32f& input = mTerrain->getData(); // Get image dimensions int32_t height = input.getHeight(); int32_t width = input.getWidth(); // Create output channel Channel32f output = Channel32f( width, height ); // Move pixel value over by one for ( int32_t y = 0; y < height; y++ ) { for ( int32_t x = 0; x < width; x++ ) { float value = input.getValue( Vec2i( x, y ) ); Vec2i position( ( x + 1 ) % width, ( y + 1 ) % height ); output.setValue( position, value ); } } // Copy new data back to original input.copyFrom( output, output.getBounds() ); // Shift texture coordinates to match positions vector<Vec2f>& texCoords = mTerrain->getTexCoords(); Vec2f delta( 1.0f / (float)width, 1.0f / (float)height ); for ( vector<Vec2f>::iterator uv = texCoords.begin(); uv != texCoords.end(); ++uv ) { *uv -= delta; } // Update terrain VBO mTerrain->updateVbo(); } else if ( mTest == 7 ) { bool init = !mSurface; if ( mCapture.isCapturing() && mCapture.checkNewFrame() ) { mSurface = mCapture.getSurface(); ip::flipVertical( &mSurface ); if ( init ) { mTerrain = new DynamicTerrain( Channel32f( 160, 160 ), -1.0f, 1.0f, Vec3f( 2.0f, 70.0f, 2.0f ), 0.0f ); mWorld->pushBack( mTerrain ); btRigidBody* terrain = ( btRigidBody* )mTerrain->getBulletBody(); terrain->setAngularFactor( 0.6f ); terrain->setFriction( 0.6f ); } else { mTerrain->getData().copyFrom( Channel32f( mSurface ), Area( 0, 0, 160, 160 ) ); mTerrain->updateVbo(); } } } // Update dynamics world mWorld->update( mFrameRate ); /*if ( mGround ) { Iter iter = mWorld->find( mGround ); OutputDebugStringA( toString( iter->getPosition().x ).c_str() ); OutputDebugStringA( "\n" ); }*/ // Remove out of bounbds objects for ( bullet::Iter object = mWorld->begin(); object != mWorld->end(); ) { if ( object != mWorld->begin() && object->getPosition().y < -800.0f ) { object = mWorld->erase( object ); } else { ++object; } } // Remove objects when count is too high uint32_t max = mTest >= 4 ? MAX_OBJECTS_TERRAIN : MAX_OBJECTS; if ( mWorld->getNumObjects() > max + 1 ) { for ( uint32_t i = 1; i < mWorld->getNumObjects() - MAX_OBJECTS_TERRAIN; i++ ) { mWorld->erase( mWorld->begin() + 1 ); } } }