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]; }
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 ); } }
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 ); } }
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; } } } }
/*---------------------------------- 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] ); } }