示例#1
0
void SwitchSystem::Process(float32 timeElapsed)
{
    TIME_PROFILE("SwitchSystem::Process");
    
	Set<Entity*>::iterator it;
	Set<Entity*>::const_iterator itEnd = updatableEntities.end();
	for(it = updatableEntities.begin(); it != itEnd; ++it)
	{
		Entity * entity = *it;
		SwitchComponent * sw = (SwitchComponent*)entity->GetComponent(Component::SWITCH_COMPONENT);

        if (sw->oldSwitchIndex != sw->newSwitchIndex)
		{
            SetSwitchHierarchy(entity, sw->newSwitchIndex);

			sw->oldSwitchIndex = sw->newSwitchIndex;
			
			ActionComponent* actionComponent = cast_if_equal<ActionComponent*>(entity->GetComponent(Component::ACTION_COMPONENT));
			if(NULL != actionComponent)
			{
				actionComponent->StartSwitch(sw->newSwitchIndex);
			}
		}
	}

	updatableEntities.clear();
}
示例#2
0
	void RecordAndReplay::PlaceRecordedEntity()
	{
		if (recordedStates.empty())
			return;

		// pop first
		Entity *nextRecorded = recordedStates.front();
		recordedStates.pop();

		// Find which entity in world to modify
		Entity *toModify = ENGINE->GetActiveWorld()->FindEntity(placedEntity);

		// set body to be the same as already placed body
		if (toModify)
		{
			Body *bodyP = dynamic_cast<Body*>(toModify->GetComponent(BODY));
			toModify->Clear();
			toModify->CopyComponents(nextRecorded);

			Body *bodyM = dynamic_cast<Body*>(toModify->GetComponent(BODY));
			if (bodyM && bodyP)
			{
				bodyM->body = bodyP->body;
			}

			ENGINE->GetActiveWorld()->SyncBodyWithEntity(toModify);

			// if this is the end of the recorded sequence, remove the replayed entity
			if (recordedStates.empty())
			{
				ENGINE->GetActiveWorld()->RemoveEntity(toModify);
			}
		}
	}
void SelectionSystem::Update()
{
    Entity* selectedUnit = FindSingleSelectedEntity(Component::UNIT);
    Entity* selectedTile = FindSingleSelectedEntity(Component::HOVER);

    // if selected units were found, draw the selection frames
    for (Entity* selectedEntity : { selectedUnit, selectedTile })
    {
        if (selectedEntity != nullptr)
        {
            SelectionComponent* sc = dynamic_cast<SelectionComponent*>(selectedEntity->GetComponent(Component::SELECTION));

            if (sc->state == SelectionComponent::NEW)
            {
                AddSelectionTexture(selectedEntity);
                engine->UpdateEntity(selectedEntity);

                sc->state = SelectionComponent::OLD;
            }
        }
    }

    // if there is both a selected unit and a selected tile, draw the path between them
    if (selectedUnit != NULL && selectedTile != NULL)
    {
        if (selectedUnit->GetComponent(Component::ANIMATION) != NULL)
        {
            // don't display the path while an animation is playing
            ClearCurrentPath();
        }
        else
        {
            Grid selectedPos = dynamic_cast<PositionComponent*>(selectedTile->GetComponent(Component::POSITION))->pos.ToGrid();

            if (selectedPos != lastHoveredPos)
            {
                CreateCurrentPath(selectedUnit, selectedTile);
                lastHoveredPos = selectedPos;
                AddSelectionTexture(selectedTile);
            }
        }
    }
    else
    {
        ClearCurrentPath();

        if (selectedTile != NULL)
        {
            AddSelectionTexture(selectedTile);
        }
    }
}
void AISystem::SelectTarget(Vector2 pos)
{
    Entity* selectedTile = engine->GetEntityStream()->EntityWithTags({ Component::SELECTION, Component::HOVER });
    PositionComponent* tpc = dynamic_cast<PositionComponent*>(selectedTile->GetComponent(Component::POSITION));
    tpc->pos = pos;
    engine->UpdateEntity(selectedTile);
}
示例#5
0
   void MapSystem::OnSpawnEntity(const Message& msg)
   {
      const SpawnEntityMessage& m = static_cast<const SpawnEntityMessage&>(msg);
      Entity* entity;
      GetEntityManager().CreateEntity(entity);

      std::string spawnerName = m.GetSpawnerName();

      bool success = Spawn(spawnerName, *entity);
      if(!success)
      {
         LOG_ERROR("Could not spawn entity: spawner not found: " + spawnerName);
         return;
      }

      MapComponent* comp;
      if(!entity->GetComponent(comp))
      {
         entity->CreateComponent(comp);
      }
      comp->SetUniqueId(m.GetUniqueId());
      comp->SetEntityName(m.GetEntityName());

      EntitySpawnedMessage smsg;
      smsg.SetSpawnerName(spawnerName);
      smsg.SetAboutEntityId(entity->GetId());
      GetEntityManager().EmitMessage(smsg);

      if(m.GetAddToScene())
      {
         GetEntityManager().AddToScene(entity->GetId());
      }
   }
示例#6
0
Entity * EditorScene::FindSelected(Entity * curr, btCollisionObject * coll)
{
	Entity * node = curr;
// LIGHT
//	if (node == 0)
//		node = dynamic_cast<LightNode *> (curr);
    
	if (node == 0)
		node = dynamic_cast<UserNode *> (curr);
	
	BulletComponent * bulletComponent = (BulletComponent*)node->GetComponent(Component::BULLET_COMPONENT);
	if (bulletComponent && bulletComponent->GetBulletObject())
	{
		BulletObject * bulletObject = (BulletObject*)bulletComponent->GetBulletObject();
		if (bulletObject->GetCollisionObject() == coll)
			return curr;
	}
    
	int size = curr->GetChildrenCount();
	for (int i = 0; i < size; i++)
	{
		Entity * result = FindSelected(curr->GetChild(i), coll);
		if (result)
			return result;
	}
	return 0;
}
void CreateHealthPickup(Entity *e, SpawnEntityMessage *msg)
{
  const int hitboxSize = 43;
  Entity *spawner = msg->Spawner();

  LocationComponent *spawnerLocation = static_cast<LocationComponent *>(spawner->GetComponent(ComponentType::LOCATION));
 
  double x = spawnerLocation->GetX();
  double y = spawnerLocation->GetY();

  e->AddComponent(ComponentType::LOCATION, std::unique_ptr<Component>(new LocationComponent(x, y)));
  e->AddComponent(ComponentType::VELOCITY, std::unique_ptr<Component>(new VelocityComponent(0, 0)));
  e->AddComponent(ComponentType::PHYSICS, std::unique_ptr<Component>(new PhysicsComponent));
  
  std::unique_ptr<GraphicsComponent> graphics(new GraphicsComponent());
  
  graphics->AddFrame(0, 400000);

  std::unique_ptr<CollisionComponent> collision(new CollisionComponent);
  collision->AddHitbox(0, 0, hitboxSize, hitboxSize, HitboxType::TRIGGER);
  

  e->AddComponent(ComponentType::COLLISION, std::move(collision));
  e->AddComponent(ComponentType::GRAPHICS, std::move(graphics));

  VMState healCollider = Compiler::Compile("data/scripts/HealColliderScript.txt");
  RegisterNativeBindings(healCollider);
  e->AddVmScript(std::move(healCollider));
}
示例#8
0
	Entity* SkyboxSystem::AddSkybox()
	{
		Entity* result = skyboxEntity;
		
		if(NULL == skyboxEntity)
		{
			SkyboxRenderObject* skyboxRenderObject = new SkyboxRenderObject();
			
			AABBox3 box = AABBox3(Vector3(-0.5f, -0.5f, -0.5f), Vector3(0.5f, 0.5f, 0.5f));
			skyboxRenderObject->Initialize(box); //first time initialization
			
			RenderComponent* renderComponent = new RenderComponent();
			renderComponent->SetRenderObject(skyboxRenderObject);
			
			
			result = new Entity();
			result->SetName("Skybox");

			result->RemoveComponent(Component::RENDER_COMPONENT);
			result->AddComponent(renderComponent);
			renderComponent->Release();

			GetScene()->AddNode(result);
			
			Matrix4 * worldTransformPointer = ((TransformComponent*)result->GetComponent(Component::TRANSFORM_COMPONENT))->GetWorldTransformPtr();
			skyboxRenderObject->SetWorldTransformPtr(worldTransformPointer);
			result->GetScene()->renderSystem->MarkForUpdate(skyboxRenderObject);
			SafeRelease(skyboxRenderObject);
			
			DVASSERT(skyboxEntity);
			result->Release();
		}
		
		return result;
	}
示例#9
0
文件: EC_Mesh.cpp 项目: katik/naali
void EC_Mesh::AutoSetPlaceable()
{
    Entity* entity = ParentEntity();
    if (entity)
    {
        ComponentPtr placeable = entity->GetComponent(EC_Placeable::TypeNameStatic());
        if (placeable)
            SetPlaceable(placeable);
    }
}
void MouseSystem::DeselectCurrentUnit()
{
    Entity* selectedUnit = engine->GetEntityStream()->EntityWithTags({ Component::SELECTION, Component::UNIT });

    if (selectedUnit != nullptr)
    {
        SelectionComponent* sc = dynamic_cast<SelectionComponent*>(selectedUnit->GetComponent(Component::SELECTION));
        sc->state = SelectionComponent::TO_DELETE;
    }
}
示例#11
0
inline Landscape* Test::GetLandscape()
{
	SettingsManager* settings = SettingsManager::Instance();
	Entity* landscapeNode = GetScene()->FindByName(settings->GetLandscapeNodeName());
	Landscape* landscape = NULL;
	if (landscapeNode)
	{
		RenderComponent* renderComponent = cast_if_equal<RenderComponent*>(landscapeNode->GetComponent(Component::RENDER_COMPONENT));
		if (renderComponent)
		{
			landscape = dynamic_cast<Landscape*>(renderComponent->GetRenderObject());
		}
	}

	return landscape;
}
示例#12
0
   virtual void Init()
   {
      if(mInit)
      {
         return;
      }
      mInit = true;

      assert(mEntity != NULL);

      dtEntityOSG::StaticMeshComponent* smc;
      if(!mEntity->GetComponent(smc))
      {
         LOG_ERROR("Error setting up wheel component: Please add mesh component first");
         return;
      }
     
      PropertyArray props = mWheels.ArrayValue();
      for(PropertyArray::iterator i = props.begin(); i != props.end(); ++i)
      {
         Property* prop = *i;
         assert(prop->GetDataType() == DataType::GROUP);
         PropertyGroup pg = prop->GroupValue();
         assert(pg.find(SID("NodeName")) != pg.end());
         assert(pg.find(SID("Radius")) != pg.end());
         std::string nodeName = pg[SID("NodeName")]->StringValue();
         
         float radius = pg[SID("Radius")]->FloatValue();
         
         osg::ref_ptr<FindNamedNodeVisitor> v = new FindNamedNodeVisitor(nodeName);
         smc->GetNode()->accept(*v);
         osgSim::DOFTransform* trans = dynamic_cast<osgSim::DOFTransform*>(v->getNode());

         if(trans != NULL)
         {
            mDOFs.push_back(std::make_pair(trans, radius));
         }
      }
      SetSpeed(mSpeed.FloatValue());
   
   
   }
示例#13
0
	/**
	 * Move all recorded entity positions to be relative to mouse click and
	 * relative to position of first entity in recording sequence.
	 *
	 * @param mouseX, mouseY Mouse coordinates
	 */
	void RecordAndReplay::MoveRecordedPositionsRelativeTo(int mouseX, int mouseY)
	{
		int firstX, firstY;
		Entity *next;
		for (int i = 0; i < static_cast<int>(recordedStates.size()); i++)
		{
			next = recordedStates.front();
			recordedStates.pop();
			Position *nextPos = dynamic_cast<Position*>(next->GetComponent(POSITION));

			if (i == 0)
			{
				// Save original position of first entity in recording sequence
				firstX = nextPos->x;
				firstY = nextPos->y;
			}

			nextPos->x = mouseX + (nextPos->x - firstX);
			nextPos->y = mouseY + (nextPos->y - firstY);

			// put item back in queue
			recordedStates.push(next);
		}
	}
void SpritePackerHelper::ReloadParticleSprites(SceneData* sceneData)
{
	List<Entity*> particleEffects;
	sceneData->GetAllParticleEffects(particleEffects);

	for (auto it = particleEffects.begin(); it != particleEffects.end(); ++it)
	{
		Entity* curNode = (*it);
	    ParticleEffectComponent * effectComponent = cast_if_equal<ParticleEffectComponent*>(curNode->GetComponent(Component::PARTICLE_EFFECT_COMPONENT));
		
		if (!effectComponent)
		{
			continue;
		}

		effectComponent->Stop();

		// All the children of this Scene Node must have Emitter components.
		int32 emittersCount = curNode->GetChildrenCount();
		for (int32 i = 0; i < emittersCount; i ++)
		{
			Entity* childNode = curNode->GetChild(i);
			ParticleEmitter * emitter = GetEmitter(childNode);

			if (!emitter)
			{
				continue;
			}
			
			emitter->ReloadLayerSprites();
		}

		effectComponent->Start();
	}
}
Graphics::Sprite SelectionSystem::GetSelectionSpriteForEntity(Entity* entity)
{
    // entity is unit
    if (entity->GetComponent(Component::UNIT) != NULL)
    {
        return Graphics::SPRITE_SELECT_HIGHLIGHT;
    }
    // entity is hover texture
    else
    {
        Entity* selectedUnit = engine->GetEntityStream()->EntityWithTags({ Component::SELECTION, Component::UNIT });

        // if there is no currently selected unit
        if (selectedUnit == nullptr)
        {
            return Graphics::SPRITE_SELECT;
        }
        // if there is a selected unit
        else
        {
            Context::GameState gameState = engine->GetContext()->GetGameState();
            World* world = engine->GetContext()->GetWorld();
            Entity* unitOnTile = FindUnitOnTile(entity);

            // if there is a unit on the hovered tile
            if (unitOnTile != nullptr)
            {
                UnitComponent* uc = dynamic_cast<UnitComponent*>(unitOnTile->GetComponent(Component::UNIT));

                // if the unit is an enemy
                if ((gameState == Context::PL_PLAY && uc->player == Entity::AI)
                    || (gameState == Context::AI_PLAY && uc->player == Entity::HUMAN)
                    )
                {
                    // if the unit is within range
                    if (world->IsEnemyInRange(selectedUnit, unitOnTile))
                    {
                        return Graphics::SPRITE_CROSSHAIR;
                    }
                    else
                    {
                        return Graphics::SPRITE_SELECT;
                    }
                }
                // if the unit is an ally
                else
                {
                    return Graphics::SPRITE_SELECT;
                }
            }
            // if the hovered tile is terrain
            else
            {
                // if the tile is unreachable for the selectedunit
                if (currentPath.size() == 0)
                {
                    return Graphics::SPRITE_CROSS_GREY;
                }
                // if it is reachable
                else
                {
					UnitComponent* uc = dynamic_cast<UnitComponent*>(selectedUnit->GetComponent(Component::UNIT));

					if (uc && static_cast<int>(currentPath.size()) <= uc->ap) 
                    {
                        // no feet underneath SPRITE_DESTINATION
						engine->RemoveEntity(*currentPath.rbegin());
						currentPath.pop_back();
						return Graphics::SPRITE_DESTINATION;
					}
					else {
						return Graphics::SPRITE_SELECT;
					}
                }
            }
        }
    }
}
Entity* ParticlesEditorSceneModelHelper::PreprocessSceneNode(Entity* rawNode)
{
    // There is one and only preprocessing case - if the "raw" node is "orphaned" Particles Emitter
    // (without the ParticlesEffectNode parent), we'll create the new Particles Effect node and
    // move the raw Emitter node to it.
	ParticleEmitter * emitter = GetEmitter(rawNode);
    if (!emitter)
    {
        return rawNode;
    }

	//ParticleEmitterNode* emitterNode = static_cast<ParticleEmitterNode*>(rawNode);
	//emitterNode->SetEmitter(emitterComponent->GetParticleEmitter());
    Entity* curParentNode = rawNode->GetParent();
    ParticleEffectComponent * effectComponent = cast_if_equal<ParticleEffectComponent*>(curParentNode->GetComponent(Component::PARTICLE_EFFECT_COMPONENT));
    // If the Emitter Node has parent, but its parent is not ParticleEffectNode, we need to
    // "adopt" this node by creating ParticleEffect node and attaching.
    if (curParentNode && (effectComponent == NULL))
    {
		Entity* newParentNodeParticleEffect = CreateParticleEffectNode();
		curParentNode->AddNode(newParentNodeParticleEffect);

        // Add the emitter node to the new Effect (this will also remove it from the scene).
        newParentNodeParticleEffect->AddNode(rawNode);

        // Register the Particle Editor structure for the new node.
        EffectParticleEditorNode* effectEditorNode =
        ParticlesEditorController::Instance()->RegisterParticleEffectNode(newParentNodeParticleEffect);
        EmitterParticleEditorNode* emitterEditorNode = new EmitterParticleEditorNode(newParentNodeParticleEffect,
            rawNode, QString::fromStdString(rawNode->GetName()));
        effectEditorNode->AddNode(emitterEditorNode);

        return newParentNodeParticleEffect;
    }
    
    // No preprocessing needed.
    return rawNode;
}
示例#17
0
void SpritePackerHelper::EnumerateSpritesForReloading(SceneData* sceneData, Map<String, Sprite *> &sprites)
{
    List<Entity*> particleEffects;
	sceneData->GetAllParticleEffects(particleEffects);
    
	for (auto it = particleEffects.begin(); it != particleEffects.end(); ++it)
	{
		Entity* curNode = (*it);
	    ParticleEffectComponent * effectComponent = cast_if_equal<ParticleEffectComponent*>(curNode->GetComponent(Component::PARTICLE_EFFECT_COMPONENT));
		
		if (!effectComponent)
		{
			continue;
		}
        
		bool isStopped = effectComponent->IsStopped();
		if (!isStopped)
		{
			effectComponent->Stop();
		}
        
		// All the children of this Scene Node must have Emitter components.
		int32 emittersCount = curNode->GetChildrenCount();
		for (int32 i = 0; i < emittersCount; i ++)
		{
			Entity* childNode = curNode->GetChild(i);
			ParticleEmitter * emitter = GetEmitter(childNode);
			
			EnumerateSpritesForParticleEmitter(emitter, sprites);
		}
        
		if (!isStopped)
		{
			effectComponent->Start();
		}
	}
}
示例#18
0
void SpritePackerHelper::EnumerateSpritesForReloading(SceneData* sceneData, Map<String, Sprite *> &sprites)
{
    List<Entity*> particleEffects;
	sceneData->GetAllParticleEffects(particleEffects);
    
	for (auto it = particleEffects.begin(); it != particleEffects.end(); ++it)
	{
		Entity* curNode = (*it);
	    ParticleEffectComponent * effectComponent = cast_if_equal<ParticleEffectComponent*>(curNode->GetComponent(Component::PARTICLE_EFFECT_COMPONENT));
		
		if (!effectComponent)
		{
			continue;
		}
        
		effectComponent->Stop();
        
		// All the children of this Scene Node must have Emitter components.
		int32 emittersCount = curNode->GetChildrenCount();
		for (int32 i = 0; i < emittersCount; i ++)
		{
			Entity* childNode = curNode->GetChild(i);
			ParticleEmitter * emitter = GetEmitter(childNode);
            
			if (!emitter)
			{
				continue;
			}
			
            Vector<ParticleLayer*> & layers = emitter->GetLayers();
            int32 layersCount = layers.size();
            for (int il = 0; il < layersCount; ++il)
            {
                Sprite *sprite = layers[il]->GetSprite();
                sprites[sprite->GetRelativePathname()] = sprite;
            }
		}
        
		effectComponent->Start();
	}
}
示例#19
0
void CreateBullet(Entity *e, SpawnEntityMessage *msg)
{
  const int bulletHitboxSize = 15;
  Entity *spawner = msg->Spawner();

  LocationComponent *spawnerLocation = static_cast<LocationComponent *>(spawner->GetComponent(ComponentType::LOCATION));
  FactionComponent *spawnerFaction = static_cast<FactionComponent *>(spawner->GetComponent(ComponentType::FACTION));
  SDL_assert(spawnerLocation != nullptr);

  Faction bulletFaction = Faction::NONE;
  if (spawnerFaction != nullptr)
  {
    bulletFaction = spawnerFaction->GetFaction();
  }

  
  double x = spawnerLocation->GetX();
  double y = spawnerLocation->GetY();
  double speed = 10.0;
  double xVel = 0;
  double yVel = 0;
  
  Direction direction = spawnerLocation->GetFiringDirection();

  switch (direction)
  {
    case Direction::RIGHT:
       x += bulletHitboxSize;
       xVel = speed;
      break;
    case Direction::LEFT:
      x -= bulletHitboxSize;
      xVel = -speed;
      break;
    case Direction::UP:
      y -= bulletHitboxSize;
      yVel = -speed;
      break;
    case Direction::DOWN:
      y += bulletHitboxSize;
      yVel = speed;
      break;
  default:
    break;
  }
  
  std::unique_ptr<LocationComponent> location(new LocationComponent());
  location->SetLocation(x, y);
  location->SetDirection(direction);

  std::unique_ptr<GraphicsComponent> graphics(new GraphicsComponent());
  graphics->AddFrame(0, 200007);

  std::unique_ptr<CollisionComponent> collision(new CollisionComponent);
  collision->AddHitbox(8, 8, bulletHitboxSize, bulletHitboxSize, HitboxType::TRIGGER);
  std::unique_ptr<VelocityComponent> velocity(new VelocityComponent(0, 0));
    
  velocity->SetVelocity(xVel, yVel);

  std::unique_ptr<FactionComponent> faction(new FactionComponent(bulletFaction));
  std::unique_ptr<SoundComponent> sound(new SoundComponent());
  sound->AddSoundEffect(SoundEffectType::DEATH, SOUND_GUN_HIT);

  e->AddComponent(ComponentType::SOUND, std::move(sound));
  e->AddComponent(ComponentType::COLLISION, std::move(collision));
  e->AddComponent(ComponentType::GRAPHICS, std::move(graphics));
  e->AddComponent(ComponentType::LOCATION, std::move(location));
  e->AddComponent(ComponentType::VELOCITY, std::move(velocity));
  e->AddComponent(ComponentType::FACTION, std::move(faction));  

  VMState damageColliderScript = Compiler::Compile("data/scripts/DamageColliderScript.txt");
  RegisterNativeBindings(damageColliderScript);
  e->AddVmScript(std::move(damageColliderScript));

  VMState bulletScript = Compiler::Compile("data/scripts/BulletScript.txt");
  RegisterNativeBindings(bulletScript);
  e->AddVmScript(std::move(bulletScript));
}
void MouseSystem::Update()
{
    World* world = engine->GetContext()->GetWorld();

    //Grids made as boundaries for the level
    Grid upperLeft(0, 0);
    Grid bottomRight(world->GetHeight(), world->GetWidth());

    if (engine->GetContext()->GetGameState() == Context::PL_PLAY)
    {
        //Hover event
        if (al->IsMouseEvent()) {

            ALLEGRO_EVENT ev = al->GetCurrentEvent();
            Vector2 vector2(ev.mouse.x, ev.mouse.y);
            Grid grid = Graphics::Instance().FromPx(vector2);

            if (grid < bottomRight && grid >= upperLeft) {

                //Update the old position of the selectionTile.
                Entity* selectedTile = engine->GetEntityStream()->EntityWithTags({ Component::SELECTION, Component::HOVER });
                PositionComponent* pc = dynamic_cast<PositionComponent*>(selectedTile->GetComponent(Component::POSITION));
                pc->pos = Graphics::Instance().ToPx(grid);
                engine->UpdateEntity(selectedTile);
            }
        }

        //Click Event
        else if (al->IsMouseClickEvent())
        {
            // left click
            if (al->GetCurrentEvent().mouse.button == 1) {

                ALLEGRO_EVENT ev = al->GetCurrentEvent();
                Vector2 vector2(ev.mouse.x, ev.mouse.y);
                Grid grid = Graphics::Instance().FromPx(vector2);

                if (grid < bottomRight && grid >= upperLeft)
                {
                    //Select a tile by getting it from the matrix in world and checking the entitystream to know if there's a unit on the tile.
                    Entity* tile = world->getEntity(grid.row, grid.col);
                    std::set<Entity*> entities = engine->GetEntityStream()->WithTag(Component::UNIT);
                    for (Entity* ent : entities) {
                        PositionComponent* position = dynamic_cast<PositionComponent*>(ent->GetComponent(Component::POSITION));
                        if (grid == Graphics::Instance().FromPx(position->pos)) {
                            tile = ent;
                        }
                    }

                    //There was a unit selected.
                    Entity* currentUnit = engine->GetEntityStream()->EntityWithTags({ Component::SELECTION, Component::UNIT });
                    if (currentUnit != NULL) {

                        //Attack
                        if (tile->GetComponent(Component::UNIT) != NULL &&
                            ((UnitComponent*)tile->GetComponent(Component::UNIT))->player == Entity::Player::AI) {
                            Attack(currentUnit, vector2, tile);
                        }
                        else if (tile->GetComponent(Component::UNIT) != NULL &&
                            ((UnitComponent*)tile->GetComponent(Component::UNIT))->player == Entity::Player::HUMAN &&
                            ((UnitComponent*)tile->GetComponent(Component::UNIT))->type != Entity::UnitType::HQ &&
                            ((UnitComponent*)tile->GetComponent(Component::UNIT))->ap>0) {
                            SelectUnit(tile);
                        }
                        //Move the unit.
                        else if (tile->GetComponent(Component::UNIT) == NULL) {
                            //Calculate path to selected tile
                            std::vector<Grid> path = engine->GetContext()->GetPathfinder()->FindPath(currentUnit, tile);
                            Move(currentUnit, vector2, path);
                        }
                    }

                    //There was no unit selected.
                    else
                    {
                        //Select the unit if its a unit. The unit should not be a HQ.
                        if (tile->GetComponent(Component::UNIT) != NULL
                            && ((UnitComponent*)tile->GetComponent(Component::UNIT))->player == Entity::Player::HUMAN
                            && ((UnitComponent*)tile->GetComponent(Component::UNIT))->type != Entity::UnitType::HQ
                            && ((UnitComponent*)tile->GetComponent(Component::UNIT))->ap > 0
                            )
                        {
                            SelectUnit(tile);
                        }
                    }
                }
            }
            // right click
            else if (al->GetCurrentEvent().mouse.button == 2)
            {
                DeselectCurrentUnit();
            }
        }
    }
}
示例#21
0
bool GameProcess::VOnMouseButtonUp( const int iButtonIndex, const Vector3& vPosition )
{
    Vector3 vResolution( IRenderer::Get()->VGetScreenWidth(), IRenderer::Get()->VGetScreenHeight(), 1.0f );
    
    Vector3 vRayPos, vRayDir;
    Matrix::Unproject( vPosition, vResolution, m_pCamera->GetProjection(), m_pCamera->GetView(), vRayPos, vRayDir );
    
    float fDistance = 0.0f;

    if ( iButtonIndex == 0 )
    {
        if ( m_pHeightMapEntity->VPick( vRayPos, vRayDir, &fDistance ) )
        {
            if ( fDistance < 0.0f )
                fDistance = -fDistance;
            
            Transform& transform = m_pMrBitey->GetTransform();

			if ( InputManager::Get()->GetKeyState( KEY_T ) == HELD_KEYSTATE )
			{
				transform.SetPosition( vRayPos + vRayDir * fDistance + Vector3::UP );
			}
			else
			{
				Vector4 vTarget = vRayPos + vRayDir * fDistance + Vector3( 0.0f, 1.0f, 0.0f );
				m_pSteering->SetTargetPosition( vTarget );
			}            
            
            return false;
        }
    }
    
    else if ( iButtonIndex == 1 )
    {
        SceneNode* pSceneNode = SceneManager::Get()->VPickAndReturnClosest( vRayPos, vRayDir, &fDistance );
        if ( pSceneNode )
        {
            Entity* pEntity = pSceneNode->VGetEntity();
            if ( pEntity )
            {
                if ( pEntity != m_pHeightMapEntity->GetOwner() )
                {
                    Transform& matTransform = m_pMrBitey->GetTransform();
					Vector4 vPosition( pEntity->GetTransform().GetPosition() - Vector4( Vector4( 0.0f, 0.0f, -20.0f ) ) );                    
                    m_pHeightMapEntity->GetHeight( vPosition.x, vPosition.z, vPosition.y );
                    matTransform.SetPosition( vPosition );

					InteractableComponent* pInteractable = (InteractableComponent*)pEntity->GetComponent( InteractableComponent::g_hID );
					if ( pInteractable )
					{
						pInteractable->VOnInteract( m_pMrBitey );
					}

                    Combat::InitiateCombat( m_pCamera, m_pMrBitey, pEntity );
                }
                
                else
                {
                    Matrix matTransform;
                    matTransform.BuildScale( Vector4::ONE * 2.0f );
                    vRayDir.Normalize();
                    matTransform.SetPosition( vRayPos + vRayDir * fDistance + Vector4( 0.0f, 1.0f, 0.0f ) );
                    
                    Entity* pEntity = Game::CreateEntity( matTransform );
                    MeshComponent* pMeshComponent = new MeshComponent();
                    pEntity->AddComponent( pMeshComponent );
                    Mesh* pMesh = Mesh::CreateBox();
                    pMeshComponent->SetMesh( pMesh );
                    pMesh->Release();
                    pMeshComponent->Start();
                    pMeshComponent->Release();

					TalkerComponent* pTalker = new TalkerComponent( "Dialogue.xml" );
					pEntity->AddComponent( pTalker );
					pTalker->Start();
					pTalker->Release();
                    
                    StateMachineComponent* pStateMachine = new StateMachineComponent();
                    pEntity->AddComponent( pStateMachine );
                    //pStateMachine->Start();
                    pStateMachine->Release();
                    
                    Character* pCharacter = new Character();
                    XmlResource* pResource = AssetManager::Get().GetAsset<XmlResource>( "CombatAbilities.xml" );
                    if ( pResource )
                    {
                        auto pElement = pResource->GetRoot()->FirstChildElement();
                        
                        while ( pElement )
                        {
                            CombatAbility ability;
                            ability.VFromXML( pElement );
                            pCharacter->AddAbility( ability );
                            
                            pElement = pElement->NextSiblingElement( "Ability" );
                        }
                    }
                    
                    pEntity->AddComponent( pCharacter );
                    pCharacter->Release();
                    
                    /*ParticleEmitter* pSystem = new ParticleEmitter();
                    pEntity->AddComponent( pSystem );
                    pSystem->Start();
                    pSystem->SetTexture( "explosion.png" );
                    
                    EmitterProcessor* pPositionProcessor = new SphericalSpawnPositionProcessor( 0.5f );
                    pSystem->AddProcessor( pPositionProcessor );
                    pPositionProcessor->Release();
                    
                    pPositionProcessor = new SpawnPositionProcessor( Vector3( 0.0f, 2.0f, 0.0f ) );
                    pSystem->AddProcessor( pPositionProcessor );
                    pPositionProcessor->Release();
                    
                    //pPositionProcessor = new VelocityOverAgeProcessor( new CurveModifier( Vector3( 0.0f, 2.0f, 0.0f ) * 5.0f, Vector3( 1.0f, 2.0f, 1.0f ) * 5.0f, Vector3( -1.0f, 2.0f, -1.0f ) * 5.0f, Vector3( 1.0f, 2.0f, 1.0f ) * 5.0f ) );
                    pPositionProcessor = new VelocityOverAgeProcessor( new ConstantEmitterModifier( Vector3::UP * 5.0f ) );
                    pSystem->AddProcessor( pPositionProcessor );
                    pPositionProcessor->Release();
                    
                    pPositionProcessor = new RadialVelocityProcessor( Vector3( 1.0f, 1.0f, 1.0f ) * 20.0f );
                    pSystem->AddProcessor( pPositionProcessor );
                    pPositionProcessor->Release();
                    
                    pPositionProcessor = new ColorOverAgeProcessor( new CurveModifier( Vector3::ZERO, Vector3( 1.0f, 0.0f, 0.0f ), Vector3( 0.0f, 1.0f, 0.0f ), Vector3( 0.0f, 0.0f, 1.0f ) ) );
                    pSystem->AddProcessor( pPositionProcessor );
                    pPositionProcessor->Release();
                    
                    pSystem->Release();*/
                }
            }
        }
    }
    
    return false;
}
示例#22
0
文件: EC_Mesh.cpp 项目: katik/naali
bool EC_Mesh::SetMesh(QString meshResourceName, bool clone)
{
    if (!ViewEnabled())
        return false;
    
    OgreWorldPtr world = world_.lock();

    std::string mesh_name = meshResourceName.trimmed().toStdString();

    RemoveMesh();

    // If placeable is not set yet, set it manually by searching it from the parent entity
    if (!placeable_)
    {
        Entity* entity = ParentEntity();
        if (entity)
        {
            ComponentPtr placeable = entity->GetComponent(EC_Placeable::TypeNameStatic());
            if (placeable)
                placeable_ = placeable;
        }
    }
    
    Ogre::SceneManager* sceneMgr = world->OgreSceneManager();
    
    Ogre::Mesh* mesh = PrepareMesh(mesh_name, clone);
    if (!mesh)
        return false;
    
    try
    {
        entity_ = sceneMgr->createEntity(world->GetUniqueObjectName("EC_Mesh_entity"), mesh->getName());
        if (!entity_)
        {
            LogError("EC_Mesh::SetMesh: Could not set mesh " + mesh_name);
            return false;
        }
        
        entity_->setRenderingDistance(drawDistance.Get());
        entity_->setCastShadows(castShadows.Get());
        entity_->setUserAny(Ogre::Any(static_cast<IComponent *>(this)));
        // Set UserAny also on subentities
        for(uint i = 0; i < entity_->getNumSubEntities(); ++i)
            entity_->getSubEntity(i)->setUserAny(entity_->getUserAny());

        if (entity_->hasSkeleton())
        {
            Ogre::SkeletonInstance* skel = entity_->getSkeleton();
            // Enable cumulative mode on skeletal animations
            if (skel)
                skel->setBlendMode(Ogre::ANIMBLEND_CUMULATIVE);
        }
        
        // Make sure adjustment node is uptodate
        Transform newTransform = nodeTransformation.Get();
        adjustment_node_->setPosition(newTransform.pos);
        adjustment_node_->setOrientation(newTransform.Orientation());
        
        // Prevent Ogre exception from zero scale
        adjustment_node_->setScale(Max(newTransform.scale, float3::FromScalar(0.0000001f)));
            
        // Force a re-apply of all materials to this new mesh.
        ApplyMaterial();
    }
    catch(Ogre::Exception& e)
    {
        LogError("EC_Mesh::SetMesh: Could not set mesh " + mesh_name + ": " + std::string(e.what()));
        return false;
    }
    
    AttachEntity();
    emit MeshChanged();
    
    return true;
}
void DebugRenderSystem::Process()
{
    uint32 size = entities.size();
	for(uint32 i = 0; i < size; ++i)
	{
        Entity * entity = entities[i];
        
        DebugRenderComponent * debugRenderComponent = cast_if_equal<DebugRenderComponent*>(entity->GetComponent(Component::DEBUG_RENDER_COMPONENT));
        TransformComponent * transformComponent = cast_if_equal<TransformComponent*>(entity->GetComponent(Component::TRANSFORM_COMPONENT));
        //RenderComponent * renderComponent = cast_if_equal<RenderComponent*>(entity->GetComponent(Component::RENDER_COMPONENT));
        
        Matrix4 worldTransform = /*(*transformComponent->GetWorldTransform()) * */camera->GetMatrix();
        RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, camera->GetMatrix());

        AABBox3 debugBoundigBox = entity->GetWTMaximumBoundingBoxSlow();
        uint32 debugFlags = debugRenderComponent->GetDebugFlags();

		// Camera debug draw
		if(debugFlags & DebugRenderComponent::DEBUG_DRAW_CAMERA)
		{
			CameraComponent * entityCameraComp = (CameraComponent *) entity->GetComponent(Component::CAMERA_COMPONENT);

			if(NULL != entityCameraComp)
			{
				Camera* entityCamera = entityCameraComp->GetCamera();
				if(NULL != entityCamera && camera != entityCamera)
				{
					Color camColor(0.0f, 1.0f, 0.0f, 1.0f);
					Vector3 camPos = entityCamera->GetPosition();
					//Vector3 camDirect = entityCamera->GetDirection();
					AABBox3 camBox(camPos, 2.5f);

					// If this is clip camera - show it as red camera
					if (entityCamera == entity->GetScene()->GetClipCamera()) camColor = Color(1.0f, 0.0f, 0.0f, 1.0f);

					RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
					RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE);
					RenderManager::Instance()->SetColor(camColor);

					RenderHelper::Instance()->DrawBox(camBox, 2.5f);

					RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
					RenderManager::Instance()->ResetColor();

					debugBoundigBox = camBox;
				}
			}
		}

		// UserNode debug draw
		if(debugFlags & DebugRenderComponent::DEBUG_DRAW_USERNODE)
		{
			if(NULL != entity->GetComponent(Component::USER_COMPONENT))
			{
				Color dcColor(0.0f, 0.0f, 1.0f, 1.0f);
				AABBox3 dcBox(Vector3(), 1.0f);

				Matrix4 prevMatrix = RenderManager::Instance()->GetMatrix(RenderManager::MATRIX_MODELVIEW);
				Matrix4 finalMatrix = transformComponent->GetWorldTransform() * prevMatrix;
				RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, finalMatrix);

				RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
				RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE | RenderState::STATE_DEPTH_TEST);

				RenderManager::Instance()->SetColor(1.f, 1.f, 0, 1.0f);
				RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(1.f, 0, 0));
				RenderManager::Instance()->SetColor(1.f, 0, 1.f, 1.0f);
				RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(0, 1.f, 0));
				RenderManager::Instance()->SetColor(0, 1.f, 1.f, 1.0f);
				RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(0, 0, 1.f));

				RenderManager::Instance()->SetColor(dcColor);
				RenderHelper::Instance()->DrawBox(dcBox);

				RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
				RenderManager::Instance()->ResetColor();
				RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, prevMatrix);

				dcBox.GetTransformedBox(transformComponent->GetWorldTransform(), debugBoundigBox);
			}
		}

		// LightNode debug draw
		if (debugFlags & DebugRenderComponent::DEBUG_DRAW_LIGHT_NODE)
		{
			LightComponent *lightComp = (LightComponent *) entity->GetComponent(Component::LIGHT_COMPONENT);

			if(NULL != lightComp)
			{
				Light* light = lightComp->GetLightObject();

				if(NULL != light)
				{
					Vector3 lPosition = light->GetPosition();

					RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
					RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE);
					RenderManager::Instance()->SetColor(1.0f, 1.0f, 0.0f, 1.0f);

					switch (light->GetType())
					{
					case Light::TYPE_DIRECTIONAL:
						{
							Vector3 lDirection = light->GetDirection();

							RenderHelper::Instance()->DrawArrow(lPosition, lPosition + lDirection * 10, 2.5f);
							RenderHelper::Instance()->DrawBox(AABBox3(lPosition, 0.5f), 1.5f);

							debugBoundigBox = AABBox3(lPosition, 2.5f);
						}
						break;
					default:
						{
							AABBox3 lightBox(lPosition, 2.5f);
							RenderHelper::Instance()->DrawBox(lightBox, 2.5f);

							debugBoundigBox = lightBox;
						}
						break;
					}

					RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
					RenderManager::Instance()->ResetColor();
				}
			}
		}
        
        if ((debugFlags & DebugRenderComponent::DEBUG_DRAW_AABOX_CORNERS))
        {            
            RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
            RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE | RenderState::STATE_DEPTH_TEST);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
            RenderHelper::Instance()->DrawCornerBox(debugBoundigBox, 1.5f);
            RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
            //		RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, prevMatrix);
        }
        
        if (debugFlags & DebugRenderComponent::DEBUG_DRAW_RED_AABBOX)
        {
            RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
            RenderManager::Instance()->SetState(RenderState::STATE_COLORMASK_ALL | RenderState::STATE_DEPTH_WRITE);
            RenderManager::Instance()->SetColor(1.0f, 0.0f, 0.0f, 1.0f);
            RenderHelper::Instance()->DrawBox(debugBoundigBox, 1.5f);
            RenderManager::Instance()->SetState(RenderState::DEFAULT_3D_STATE);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
        }
        

        // UserNode Draw
#if 0
       	
        if (debugFlags & DEBUG_DRAW_USERNODE)
        {
            Matrix4 prevMatrix = RenderManager::Instance()->GetMatrix(RenderManager::MATRIX_MODELVIEW);
            Matrix4 finalMatrix = worldTransform * prevMatrix;
            RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, finalMatrix);
            
            RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
            RenderManager::Instance()->SetState(RenderStateBlock::STATE_COLORMASK_ALL | RenderStateBlock::STATE_DEPTH_WRITE | RenderStateBlock::STATE_DEPTH_TEST);
            RenderManager::Instance()->SetColor(0, 0, 1.0f, 1.0f);
            RenderHelper::Instance()->DrawBox(drawBox);
            RenderManager::Instance()->SetColor(1.f, 1.f, 0, 1.0f);
            RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(1.f, 0, 0));
            RenderManager::Instance()->SetColor(1.f, 0, 1.f, 1.0f);
            RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(0, 1.f, 0));
            RenderManager::Instance()->SetColor(0, 1.f, 1.f, 1.0f);
            RenderHelper::Instance()->DrawLine(Vector3(0, 0, 0), Vector3(0, 0, 1.f));
            RenderManager::Instance()->SetState(RenderStateBlock::DEFAULT_3D_STATE);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
            RenderManager::Instance()->SetMatrix(RenderManager::MATRIX_MODELVIEW, prevMatrix);
        }
#endif
        
#if 0
        // ParticleEffectNode
        if (debugFlags != DEBUG_DRAW_NONE)
        {
            if (!(flags & SceneNode::NODE_VISIBLE))return;
            
            RenderManager::Instance()->SetRenderEffect(RenderManager::FLAT_COLOR);
            RenderManager::Instance()->SetState(RenderStateBlock::STATE_COLORMASK_ALL | RenderStateBlock::STATE_DEPTH_WRITE);
            
            Vector3 position = Vector3(0.0f, 0.0f, 0.0f) * GetWorldTransform();
            Matrix3 rotationPart(GetWorldTransform());
            Vector3 direction = Vector3(0.0f, 0.0f, 1.0f) * rotationPart;
            direction.Normalize();
            
            RenderManager::Instance()->SetColor(0.0f, 0.0f, 1.0f, 1.0f);
            
            RenderHelper::Instance()->DrawLine(position, position + direction * 10, 2.f);
            
            RenderManager::Instance()->SetState(RenderStateBlock::DEFAULT_3D_STATE);
            RenderManager::Instance()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
        }
#endif
        
    }
}