void UpdateLightInfo( CCopyEntity& entity ) { if( entity.Lighting() ) { if( entity.sState & CESTATE_LIGHT_INFORMATION_INVALID ) { // need to update light information - find lights that reaches to this entity entity.ClearLights(); entity.GetStage()->GetEntitySet()->UpdateLights( &entity ); entity.sState &= ~CESTATE_LIGHT_INFORMATION_INVALID; } } }
void EntityManager::InitEntity( boost::shared_ptr<CCopyEntity> pNewCopyEntPtr, CCopyEntity *pParent, BaseEntity *pBaseEntity, CActorDesc* pPhysActorDesc ) { CCopyEntity* pNewCopyEnt = pNewCopyEntPtr.get(); // Mark the entity as in use pNewCopyEnt->inuse = true; pNewCopyEnt->m_pSelf = pNewCopyEntPtr; pNewCopyEnt->pBaseEntity = pBaseEntity; BaseEntity& rBaseEntity = (*pBaseEntity); pNewCopyEnt->m_pStage = m_pStage; // set id and increment the counter pNewCopyEnt->m_ID = m_EntityIDConter++; // z-sort is disabled by default initialization // Entities that have translucent polygons have to turn on their copy entities' // 'BETYPE_USE_ZSORT' in InitCopyEntity() if( pNewCopyEnt->m_TypeID == CCopyEntityTypeID::ALPHA_ENTITY ) { // For alpha entity, always use the z-sorting pNewCopyEnt->RaiseEntityFlags( BETYPE_USE_ZSORT ); } else { // Otherwise, disable z-sorting by default pNewCopyEnt->ClearEntityFlags( BETYPE_USE_ZSORT ); } // set the glare type if( rBaseEntity.m_EntityFlag & BETYPE_GLARESOURCE ) { pNewCopyEnt->RaiseEntityFlags( BETYPE_GLARESOURCE ); } else if( rBaseEntity.m_EntityFlag & BETYPE_GLAREHINDER ) { pNewCopyEnt->RaiseEntityFlags( BETYPE_GLAREHINDER ); } // update world aabb pNewCopyEnt->world_aabb.TransformCoord( pNewCopyEnt->local_aabb, pNewCopyEnt->GetWorldPosition() ); // link the new copy-entity to the top of 'm_pEntityInUse' if( m_pEntityInUse ) pNewCopyEnt->SetNext( m_pEntityInUse ); else pNewCopyEnt->SetNextToNull(); // first entity in the link list m_pEntityInUse = pNewCopyEntPtr; // set the created time of the entity pNewCopyEnt->m_CreatedTime = m_pStage->GetElapsedTime(); // set parent entity pNewCopyEnt->m_pParent = pParent; if( pNewCopyEnt->m_pParent ) { // 'pNewCopyEnt' is being created as a child of another copy entity pNewCopyEnt->m_pParent->AddChild( pNewCopyEnt->m_pSelf ); // establish link from the parent to this entity } // LOG_PRINT( "linking a copy entity of " + rBaseEntity.GetNameString() + " to the tree" ); // link the new copy-entity to the entity-tree Link( pNewCopyEnt ); // update light information if( pNewCopyEnt->Lighting() ) { pNewCopyEnt->ClearLights(); // UpdateLightInfo( pNewCopyEnt ); pNewCopyEnt->sState |= CESTATE_LIGHT_INFORMATION_INVALID; } // create object for physics simulation if( pNewCopyEnt->GetEntityFlags() & BETYPE_RIGIDBODY ) { CActor *pPhysActor = NULL; if( pPhysActorDesc ) { pPhysActorDesc->WorldPose = pNewCopyEnt->GetWorldPose();// * pNewCopyEnt->GetActorLocalPose(); pPhysActorDesc->BodyDesc.LinearVelocity = pNewCopyEnt->Velocity(); // each entity has its own actor desc pPhysActor = m_pStage->GetPhysicsScene()->CreateActor( *pPhysActorDesc ); } else if( pBaseEntity->GetPhysicsActorDesc().IsValid() ) { // actor desc is defined by entity attributes CActorDesc actor_desc = pBaseEntity->GetPhysicsActorDesc(); actor_desc.WorldPose = pNewCopyEnt->GetWorldPose(); actor_desc.BodyDesc.LinearVelocity = pNewCopyEnt->Velocity(); // pNewCopyEnt->pPhysicsActor = m_pStage->GetPhysicsScene()->CreateActor( actor_desc ); pPhysActor = m_pStage->GetPhysicsScene()->CreateActor( actor_desc ); } if( pPhysActor ) { pNewCopyEnt->m_vecpPhysicsActor.resize( 1 ); pNewCopyEnt->m_vecpPhysicsActor[0] = pPhysActor; pPhysActor->m_pFrameworkData = pNewCopyEnt; } } // When all the basic properties are copied, InitCopyEntity() is called to // do additional initialization specific to each base entity. rBaseEntity.InitCopyEntity( pNewCopyEnt ); }