示例#1
0
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 );
            }
        }
    }
}
示例#2
0
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();
}
示例#3
0
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();
}
示例#4
0
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();
}
示例#5
0
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();
}
示例#6
0
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 );
		}
	}

}