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::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::mouseDown( MouseEvent event ) { Vec2f pos = Vec2f( event.getPos() ) / Vec2f( getWindowSize() ); pos.y = 1.0f - pos.y; Ray ray = mCamera.generateRay( pos.x, pos.y, getWindowAspectRatio() ); mDragging = mWorld->intersects( ray, mCamera.getFarClip(), &mDragConstraint ); if ( mDragging ) { mWorld->addConstraint( mDragConstraint, 0.0f, 0.01f ); } }
void BulletTestApp::mouseUp( MouseEvent event ) { if ( mDragging ) { mWorld->removeConstraint( mDragConstraint ); mDragConstraint.reset(); mDragging = false; } }
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 ); } } }
void BulletTestApp::initTest() { // Clean up last test if ( mWorld ) { mWorld->clear(); } // Used when generating terrain Channel32f heightField; // Create and add the wobbly box mGroundTransform.setIdentity(); switch ( mTest ) { case 0: mGround = bullet::createRigidBox( mWorld, Vec3f( 200.0f, 35.0f, 200.0f ), 0.0f ); bullet::createRigidSphere( mWorld, 50.0f, 64, 0.0f, Vec3f( 0.0f, -50.0f, 0.0f ) ); break; case 1: mGround = bullet::createRigidHull( mWorld, mConvex, Vec3f::one() * 50.0f, 0.0f ); break; case 2: mGround = bullet::createRigidMesh( mWorld, mConcave, Vec3f( 10.0f, 1.0f, 10.0f ), 0.0f, 0.0f ); break; case 3: mGround = bullet::createRigidBox( mWorld, Vec3f( 200.0f, 35.0f, 200.0f ), 0.0f ); break; case 4: mGround = bullet::createRigidBox( mWorld, Vec3f( 200.0f, 35.0f, 200.0f ), 0.0f ); break; case 5: heightField = Channel32f( loadImage( loadResource( RES_IMAGE_HEIGHTFIELD_SM ) ) ); mGround = bullet::createRigidTerrain( mWorld, heightField, -1.0f, 1.0f, Vec3f( 6.0f, 80.0f, 6.0f ), 0.0f ); break; case 6: // ADVANCED: To add a custom class, create a standard pointer to it and // pushBack it into your world. Be sure to delete this pointer when you no loinger need it heightField = Channel32f( loadImage( loadResource( RES_IMAGE_HEIGHTFIELD ) ) ); mTerrain = new DynamicTerrain( heightField, -1.0f, 1.0f, Vec3f( 2.0f, 50.0f, 2.0f ), 0.0f ); mWorld->pushBack( mTerrain ); break; case 7: // Start capture if ( !mCapture ) { mCapture = Capture( 320, 240 ); mCapture.start(); } break; } // Set friction for box if ( mTest < 5 ) { btRigidBody* boxBody = bullet::toBulletRigidBody( mGround ); boxBody->setFriction( 0.95f ); } }
void BulletTestApp::initTest() { // Clean up last test if ( mWorld ) { mWorld->clear(); mWorld->getInfo().m_sparsesdf.Reset(); } // Used when generating terrain Channel32f heightField; // Create and add the wobbly box btSoftBody* body = 0; btSoftBody::Material* material = 0; mGroundTransform.setIdentity(); switch ( mTest ) { case 0: mGround = bullet::createRigidBox( mWorld, Vec3f( 200.0f, 35.0f, 200.0f ), 0.0f ); bullet::createRigidSphere( mWorld, 50.0f, 0.0f, Vec3f( 0.0f, -50.0f, 0.0f ) ); break; case 1: mGround = bullet::createRigidHull( mWorld, mConvex, Vec3f::one() * 50.0f, 0.0f ); break; case 2: mGround = bullet::createRigidMesh( mWorld, mConcave, Vec3f( 10.0f, 1.0f, 10.0f ), 0.0f, 0.0f ); break; case 5: heightField = Channel32f( loadImage( loadResource( RES_IMAGE_HEIGHTFIELD_SM ) ) ); mGround = bullet::createRigidTerrain( mWorld, heightField, -1.0f, 1.0f, Vec3f( 6.0f, 80.0f, 6.0f ), 0.0f ); break; case 6: // ADVANCED: To add a custom class, create a standard pointer to it and // pushBack it into your world. Be sure to delete this pointer when you no longer need it. heightField = Channel32f( loadImage( loadResource( RES_IMAGE_HEIGHTFIELD ) ) ); mTerrain = new DynamicTerrain( heightField, -1.0f, 1.0f, Vec3f( 2.0f, 50.0f, 2.0f ), 0.0f ); mWorld->pushBack( mTerrain ); break; case 7: // Start capture if ( !mCapture ) { mCapture = Capture( 320, 240 ); mCapture.start(); } break; case 8: mWorld->getInfo().m_gravity = toBulletVector3( Vec3f( 0.0f, -0.5f, 0.0f ) ); mGround = bullet::createSoftCloth( mWorld, Vec2f::one() * 180.0f, Vec2i( 18, 20 ), SoftCloth::CLOTH_ATTACH_CORNER_ALL, Vec3f( 0.0f, 0.0f, 40.0f ), Quatf( 0.0f, 0.0f, 0.0f, 0.1f ) ); body = toBulletSoftBody( mGround ); body->m_materials[ 0 ]->m_kAST = 0.2f; body->m_materials[ 0 ]->m_kLST = 0.2f; body->m_materials[ 0 ]->m_kVST = 0.2f; body->m_cfg.kDF = 0.9f; body->m_cfg.kSRHR_CL = 1.0f; body->m_cfg.kSR_SPLT_CL = 0.0f; body->m_cfg.collisions = btSoftBody::fCollision::CL_SS + btSoftBody::fCollision::CL_RS; body->getCollisionShape()->setMargin( 0.0001f ); body->setTotalMass( 500.0f ); body->generateClusters( 0 ); material = body->appendMaterial(); material->m_kAST = 0.5f; material->m_kLST = 0.5f; material->m_kVST = 1.0f; body->generateBendingConstraints( 1, material ); break; case 9: heightField = Channel32f( loadImage( loadResource( RES_IMAGE_HEIGHTFIELD_SM ) ) ); mGround = bullet::createRigidTerrain( mWorld, heightField, -1.0f, 1.0f, Vec3f( 6.0f, 80.0f, 6.0f ), 0.0f ); break; default: mGround = bullet::createRigidBox( mWorld, Vec3f( 200.0f, 35.0f, 200.0f ), 0.0f ); break; } // Set friction for box if ( mTest < 5 ) { btRigidBody* boxBody = bullet::toBulletRigidBody( mGround ); boxBody->setFriction( 0.95f ); } }
void BulletTestApp::initTest() { // Clean up last test if ( mWorld ) { mWorld->clear(); } mGroundTransform.setIdentity(); // Create the ground { mGround = bullet::createRigidBox( mWorld, Vec3f( 357.0f, 1.0f, 600.0f ), 0.0f ); btRigidBody* boxBody = bullet::toBulletRigidBody( mGround ); boxBody->setFriction( 0.95f ); boxBody->setRestitution( .65f ); } // Create the backboard { mBackBaord = bullet::createRigidBox( mWorld, Vec3f( 110.0f, 70.0f, 1.0f ), 0.0f, Vec3f( 0.0f, 100.f, 250.f )); btRigidBody* boxBody = bullet::toBulletRigidBody( mBackBaord ); boxBody->setFriction( 0.95f ); boxBody->setRestitution( .65f ); } // { // mTest = bullet::createRigidCylinder( mWorld, Vec3f( 10.0f, 50.0f, 10.0f ), 16, 0.0f, Vec3f( 0.0f, 50.0f, 0.0f )); // btRigidBody* boxBody = bullet::toBulletRigidBody( mBackBaord ); // boxBody->setFriction( 0.95f ); // boxBody->setRestitution( .65f ); // } // Create the ring box { mBox = bullet::createRigidBox( mWorld, Vec3f( 5.f, 1.0f, 5.0f ), 0.0f, Vec3f( 0.0f, 75.0f, 247.5f )); btRigidBody* boxBody = bullet::toBulletRigidBody( mBox ); boxBody->setFriction( 0.95f ); boxBody->setRestitution( .65f ); } // Create the ring { mRing = bullet::createRigidTorus( mWorld, 0.5f, 10.f, 200, 0.0f, Vec3f( 0.0f, 75.0f, 234.0f ), Quatf( Vec3f::xAxis(), M_PI / 2. ) ); btRigidBody* boxBody = bullet::toBulletRigidBody( mRing ); boxBody->setFriction( 0.95f ); boxBody->setRestitution( .65f ); // mRing = bullet::createRigidMesh( mWorld, mTorus, Vec3f( 1.0f, 2.0f, 1.0f ), 0.0f, 0.0f, Vec3f( 0.0f, 50.0f, 0.0f )); // btRigidBody* boxBody = bullet::toBulletRigidBody( mRing ); // boxBody->setFriction( 0.95f ); // boxBody->setRestitution( .65f ); // float radiusIn = 0.5f; // float radiusOut = 8.0f; // float subdivisions = 36.f; // Vec3f forward( 0.0 , 0.0, 1.0 ); // Vec3f side ( radiusOut, 0.0, 0.0 ); // // float gap = sqrt( 2.0f * radiusOut * radiusOut - 2.0f * radiusIn * radiusIn * cos(( 2.0f * SIMD_PI ) / subdivisions )); // // btTransform t; // for( int x = 0; x < (int)subdivisions; x++ ) // { // float angle = ( x * 2.0f * SIMD_PI ) / subdivisions; // Vec3f position = side; // position.rotate( forward, angle ); // Quatf q( forward, angle ); // // mRing = bullet::createRigidCylinder( mWorld, Vec3f( radiusIn, 3* ( SIMD_PI / subdivisions ) + 0.5f * gap, radiusIn ), subdivisions, 0.0f, position, q ); // btRigidBody* boxBody = bullet::toBulletRigidBody( mRing ); // boxBody->setFriction( 0.95f ); // boxBody->setRestitution( .65f ); // } // mRing = bullet::createRigidCylinder( mWorld, Vec3f( 1, 1, 1 ), 16, 0.0f, Vec3f( 0, 10, 0 ), Quatf( Vec3f::xAxis(), M_PI / 2 )); } }