示例#1
0
sf::Texture& TextureFactory::put(std::string path, bool isPathNormalized)
{
    TPROFILE("[Texture] Loading '%s'", path.c_str());

    // Normalize if needed
    if (!isPathNormalized) {
        path = std::string("Resources/").append(path);
    }

    // Texture is loaded by reference using the [] operator.
    // The texture object does not get destroyed either (scope).
    m_cache[path] = sf::Texture();
    m_cache[path].loadFromFile(path);

    return m_cache[path];
}
示例#2
0
void CPlayButton::onMouse( bool beIn )
{
	TPROFILE("PlayButton");
	if ( beIn )
	{
		if ( m_playInfo.type == PT_NULL )
			return;

		//TToolTipUI&  tooltip = TToolTipUI::getHelpTip();
		//tooltip.clearString();
		//onSetHelpTip( tooltip );
		//tooltip.show( true );
	}
	else
	{
		//TToolTipUI&  tooltip = TToolTipUI::getHelpTip();
		//tooltip.show( false );
	}
}
示例#3
0
void TShadowManager::render()
{
	if ( ! gShadowShow )
		return ;

	if ( !m_player )
		return;

	TPROFILE("Shadow Render");

	static int frame = 0;

	++frame;
	frame = frame % 15;
	if ( frame == 0 )
		refreshTerrainTri();

	callback.num = 0;
	//m_playerShadow->m_objVec.clear();
	//m_playerShadow->fillActorObject( m_player->getFlyActor() );
	TEntityManager::instance().findEntityInSphere( 
		m_player->getPosition() , gShadowMaxRadius , &callback );

	for ( int i = callback.num ; i < shadowVec.size() ; ++i )
	{
		shadowVec[i]->setActor( NULL );
	}

	FnTerrain terrain;
	terrain.Object( curLevel->getFlyTerrain().Object() );

	m_playerShadow->render( terrain );

	for ( int i = 0 ; i < callback.num ; ++i )
	{
		shadowVec[i]->render( terrain );
	}
}
示例#4
0
void TPhySystem::processCollision( TPhyBody& body )
{
	btManifoldArray   manifoldArray;
	btBroadphasePairArray& pairArray = body.getOverlappingPairCache()->getOverlappingPairArray();
	int numPairs = pairArray.size();

	for (int i=0;i<numPairs;i++)
	{
		manifoldArray.clear();

		const btBroadphasePair& pair = pairArray[i];

		if ( pair.m_pProxy0->m_clientObject == &body &&
			 pair.m_pProxy0->getUid() < pair.m_pProxy1->getUid() )
		{
			PhyRigidBody* rigidbody = (PhyRigidBody*) pair.m_pProxy1->m_clientObject;
			if ( TPhyBody::upcast( rigidbody ) != NULL )
				continue;
		}


		btBroadphasePair* collisionPair ;
		{
			TPROFILE("findPair");
			//unless we manually perform collision detection on this pair, the contacts are in the dynamics world paircache:
			collisionPair = getDynamicsWorld()->getPairCache()->findPair(pair.m_pProxy0,pair.m_pProxy1);
		}

		if (!collisionPair)
			continue;

		{
			TPROFILE("getAllContactManifolds");
			if (collisionPair->m_algorithm)
				collisionPair->m_algorithm->getAllContactManifolds(manifoldArray);

		}


		TPROFILE("manifoldArray");

		for (int j=0;j<manifoldArray.size();j++)
		{
			btPersistentManifold* manifold = manifoldArray[j];

			int numContacts = 0;

			Vec3D avgPtA(0,0,0);
			Vec3D avgPtB(0,0,0);
			Vec3D avgNormalOnB(0,0,0);
			Float avgDepth = 0;

			btCollisionObject* objA = static_cast<btCollisionObject*>( manifold->getBody0() );
			btCollisionObject* objB = static_cast<btCollisionObject*>( manifold->getBody1() );

			TPhyEntity* entityA = static_cast< TPhyEntity* >( objA->getUserPointer() );
			TPhyEntity* entityB = static_cast< TPhyEntity* >( objB->getUserPointer() );

			bool haveTerrain = ( entityA == NULL || entityB == NULL );

			for (int p=0;p<manifold->getNumContacts();p++ )
			{
				const btManifoldPoint& pt = manifold->getContactPoint(p);
				if ( pt.getDistance() < 0.0f )
				{
					++numContacts;

					if ( haveTerrain )
						break;

					avgPtA  += pt.getPositionWorldOnA();
					avgPtB  += pt.getPositionWorldOnB();
					avgNormalOnB += pt.m_normalWorldOnB;
					avgDepth -= pt.getDistance();

					break;
					/// work here
				}
			}

			if ( numContacts > 0 )
			{
				if ( haveTerrain )
				{
					if ( entityA )
						entityA->OnCollisionTerrain();
					if ( entityB )
						entityB->OnCollisionTerrain();
				}
				else
				{
					avgPtA /= numContacts;
					avgPtB /= numContacts;
					avgDepth /= numContacts;
					avgNormalOnB.normalize();

					entityA->OnCollision( entityB , avgDepth , avgPtA , avgPtB ,  avgNormalOnB );
					entityB->OnCollision( entityA , avgDepth , avgPtB , avgPtA , -avgNormalOnB );
				}

				break;
			}
		}
	}
}
示例#5
0
/*----------------------------------
  display the shadow on the terrain
  C.Wang 0522, 2006
 -----------------------------------*/
void FuCShadowModify::Display()
{
	TPROFILE("Shadow Display");

	if ( m_fyActor.Object() == FAILED_ID ) 
		return;

	FnObject model;
	model.Object(mSeed);
	if (!model.GetVisibility()) 
		return;

	WORLDid wID;
	FnTriangle tT;
	FnScene scene;
	FnTerrain terrain;
	int vLen , texLen = 2, tri[3];
	float M[16], *G, vLC[3];
	
	// get all neighboring triangles
	//nList = terrain.GetAllVertexNeighborTriangles(iOne, list, 64);
	//if (nList <= 0) return;

	// get the matrix to character's base coordinate
	m_lightCam.SetWorldPosition( m_actorPos );
	G = m_lightCam.GetMatrix(TRUE);
	FyInverseM16(G, M);

	tT.Object( m_terrain.Object() , 0);
	scene.Object(mHost);
	wID = scene.GetWorld();

	// reset all rendering states
	FyResetRenderStates(wID);
	FySetD3DRenderState(wID, D3DRS_LIGHTING, FALSE);
	FySetD3DRenderState(wID, D3DRS_FOGENABLE, FALSE);
	FySetD3DRenderState(wID, D3DRS_ZWRITEENABLE, FALSE);

	// set current material
	FySetCurrentMaterial(wID, mRenderTarget, FALSE, 1.0f);

	FySetD3DRenderState(wID, D3DRS_ALPHABLENDENABLE, TRUE);
	FySetD3DRenderState(wID, D3DRS_ALPHATESTENABLE, FALSE);
	FySetD3DRenderState(wID, D3DRS_SRCBLEND, D3DBLEND_ZERO);
	FySetD3DRenderState(wID, D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR);

	LPDIRECT3DDEVICE9 dev = FyGetD3DDevice(wID);
	float pos[16];


	FuLitedVertex v[3];

	// display these triangles
	vLen = 6;

	v[0].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
	v[1].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
	v[2].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);

	int nTri = m_triIDVec.size();
	for ( int i = 0; i < nTri ; i++) 
	{
		// get the triangle vertices
		tT.GetTopology( m_triIDVec[i] , tri);

		for ( int j = 0; j < 3; ++j ) 
		{
			tT.GetVertex(tri[2-j], pos);
			v[j].pos[0] = pos[0];
			v[j].pos[1] = pos[1];
			v[j].pos[2] = pos[2] + mShadowHeightOffset;

			// calculate the texture coordinate
			FUTransformVertexWithM16_Simple(vLC, v[j].pos, M);
			CalculateShadowUV(vLC, v[j].uv);
		}

		FyDrawTriangles(wID, XYZ_DIFFUSE, 3 , 1 , &texLen, (float *) &v[0] );

	}

}