📄 soccerbase.cpp
字号:
/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- this file is part of rcssserver3D Fri May 9 2003 Copyright (C) 2002,2003 Koblenz University Copyright (C) 2003 RoboCup Soccer Server 3D Maintenance Group $Id: soccerbase.cpp,v 1.21 2007/06/17 10:48:49 jboedeck Exp $ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "soccerbase.h"#include <oxygen/physicsserver/body.h>#include <oxygen/physicsserver/spherecollider.h>#include <oxygen/agentaspect/perceptor.h>#include <oxygen/agentaspect/agentaspect.h>#include <oxygen/sceneserver/sceneserver.h>#include <oxygen/sceneserver/scene.h>#include <oxygen/sceneserver/transform.h>#include <oxygen/controlaspect/controlaspect.h>#include <oxygen/gamecontrolserver/gamecontrolserver.h>#include <soccer/gamestateaspect/gamestateaspect.h>#include <soccer/soccerruleaspect/soccerruleaspect.h>#include <soccer/agentstate/agentstate.h>#include <soccer/ball/ball.h>#include <oxygen/physicsserver/space.h>#include <zeitgeist/leaf.h>using namespace boost;using namespace zeitgeist;using namespace oxygen;using namespace std;using namespace salt;boolSoccerBase::GetSceneServer(const Leaf& base, shared_ptr<SceneServer>& scene_server){ scene_server = shared_static_cast<SceneServer> (base.GetCore()->Get("/sys/server/scene")); if (scene_server.get() == 0) { base.GetLog()->Error() << "Error: (SoccerBase: " << base.GetName() << ") scene server not found.\n"; return false; } return true;}boolSoccerBase::GetTransformParent(const Leaf& base, shared_ptr<Transform>& transform_parent){ transform_parent = shared_dynamic_cast<Transform> ((base.FindParentSupportingClass<Transform>()).lock()); if (transform_parent.get() == 0) { base.GetLog()->Error() << "Error: (SoccerBase: " << base.GetName() << ") parent node is not derived from TransformNode\n"; return false; } return true;}boolSoccerBase::GetAgentState(const shared_ptr<Transform> transform, shared_ptr<AgentState>& agent_state){ agent_state = shared_dynamic_cast<AgentState>(transform->GetChild("AgentState", true)); if (agent_state.get() == 0) { return false; } return true;}boolSoccerBase::GetAgentBody(const shared_ptr<Transform> transform, shared_ptr<Body>& agent_body){ agent_body = transform->FindChildSupportingClass<Body>(true); if (agent_body.get() == 0) { transform->GetLog()->Error() << "(SoccerBase) ERROR: " << transform->GetName() << " node has no Body child\n"; return false; } return true;}boolSoccerBase::GetAgentBody(const Leaf& base, TTeamIndex idx, int unum, shared_ptr<Body>& agent_body){ shared_ptr<AgentState> agentState; shared_ptr<Transform> parent; // get matching AgentState if (!GetAgentState(base, idx, unum, agentState)) return false; // get AgentAspect if (!GetTransformParent(*agentState, parent)) return false; // call GetAgentBody with matching AgentAspect return GetAgentBody(parent, agent_body);}boolSoccerBase::GetAgentState(const Leaf& base, shared_ptr<AgentState>& agent_state){ shared_ptr<Transform> parent; if (! GetTransformParent(base,parent)) { return false; } return GetAgentState(parent,agent_state);}boolSoccerBase::GetAgentState(const Leaf& base, TTeamIndex idx, int unum, shared_ptr<AgentState>& agentState){ static TAgentStateMap mAgentStateMapLeft; static TAgentStateMap mAgentStateMapRight; if (idx == TI_NONE) return false; // do we have a cached reference? if ( idx == TI_LEFT && !mAgentStateMapLeft.empty() ) { TAgentStateMap::iterator iter = mAgentStateMapLeft.find(unum); if (iter != mAgentStateMapLeft.end()) { // is the pointer to the parent (AgentAspect) still valid // (maybe the agent disconnected)? if (!(iter->second)->GetParent().lock().get()) { base.GetLog()->Error() << "(SoccerBase) WARNING: " << "AgentState has invalid parent! " << "The agent probably disconnected, removing from map." << "\n"; mAgentStateMapLeft.erase(iter); } else { agentState = (*iter).second; return true; } } } else if ( idx == TI_RIGHT && !mAgentStateMapRight.empty() ) { TAgentStateMap::iterator iter = mAgentStateMapRight.find(unum); if (iter != mAgentStateMapRight.end()) { // is the pointer to the parent (AgentAspect) still valid // (maybe the agent disconnected)? if ((iter->second)->GetParent().lock().get() == 0) { base.GetLog()->Error() << "(SoccerBase) WARNING: " << "AgentState has invalid parent! " << "The agent probably disconnected, removing from map." << "\n"; mAgentStateMapRight.erase(iter); } else { agentState = (*iter).second; return true; } } } // we have to get all agent states for this team TAgentStateList agentStates; GetAgentStates(base, agentStates, idx); for (TAgentStateList::iterator iter = agentStates.begin(); iter != agentStates.end(); ++iter) { if ((*iter)->GetUniformNumber() == unum) { agentState = *iter; if (idx == TI_LEFT) { mAgentStateMapLeft[unum] = agentState; } else { mAgentStateMapRight[unum] = agentState; } return true; } } return false;}boolSoccerBase::GetAgentStates(const zeitgeist::Leaf& base, TAgentStateList& agentStates, TTeamIndex idx){ static shared_ptr<GameControlServer> gameCtrl; if (gameCtrl.get() == 0) { GetGameControlServer(base, gameCtrl); if (gameCtrl.get() == 0) { base.GetLog()->Error() << "(SoccerBase) ERROR: can't get " << "GameControlServer\n"; return false; } } GameControlServer::TAgentAspectList aspectList; gameCtrl->GetAgentAspectList(aspectList); GameControlServer::TAgentAspectList::iterator iter; shared_ptr<AgentState> agentState; for ( iter = aspectList.begin(); iter != aspectList.end(); ++iter ) { agentState = shared_dynamic_cast<AgentState>((*iter)->GetChild("AgentState", true)); if ( agentState.get() != 0 && ( agentState->GetTeamIndex() == idx || idx == TI_NONE ) ) { agentStates.push_back(agentState); } } return true;}boolSoccerBase::GetGameState(const Leaf& base, shared_ptr<GameStateAspect>& game_state){ game_state = shared_dynamic_cast<GameStateAspect> (base.GetCore()->Get("/sys/server/gamecontrol/GameStateAspect")); if (game_state.get() == 0) { base.GetLog()->Error() << "Error: (SoccerBase: " << base.GetName() << ") found no GameStateAspect\n"; return false; } return true;}boolSoccerBase::GetSoccerRuleAspect(const Leaf& base, shared_ptr<SoccerRuleAspect> & soccer_rule_aspect){ soccer_rule_aspect = shared_dynamic_cast<SoccerRuleAspect> (base.GetCore()->Get("/sys/server/gamecontrol/SoccerRuleAspect")); if (soccer_rule_aspect.get() == 0) { base.GetLog()->Error() << "Error: (SoccerBase: " << base.GetName() << " found no SoccerRuleAspect\n"; return false; } return true;}boolSoccerBase::GetGameControlServer(const Leaf& base, shared_ptr<GameControlServer> & game_control_server){ static shared_ptr<GameControlServer> gameControlServer; if (gameControlServer.get() == 0) { gameControlServer = shared_dynamic_cast<GameControlServer> (base.GetCore()->Get("/sys/server/gamecontrol")); if (gameControlServer.get() == 0) { base.GetLog()->Error() << "Error: (SoccerBase: " << base.GetName() << " found no GameControlServer\n"; return false; } } game_control_server = gameControlServer; return true;}boolSoccerBase::GetActiveScene(const Leaf& base, shared_ptr<Scene>& active_scene){ static shared_ptr<SceneServer> sceneServer; if (sceneServer.get() == 0) { if (! GetSceneServer(base,sceneServer)) { base.GetLog()->Error() << "(SoccerBase) ERROR: " << base.GetName() << ", could not get SceneServer\n"; return false; } } active_scene = sceneServer->GetActiveScene(); if (active_scene.get() == 0) { base.GetLog()->Error() << "ERROR: (SoccerBase: " << base.GetName() << ", SceneServer reports no active scene\n"; return false; } return true;}boolSoccerBase::GetBody(const Leaf& base, shared_ptr<Body>& body){ shared_ptr<Transform> parent; if (! GetTransformParent(base,parent))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -