From: <sgv...@us...> - 2010-06-01 13:05:11
|
Revision: 207 http://simspark.svn.sourceforge.net/simspark/?rev=207&view=rev Author: sgvandijk Date: 2010-06-01 13:04:58 +0000 (Tue, 01 Jun 2010) Log Message: ----------- - Merge agentselection branch -r206 into trunk Modified Paths: -------------- trunk/rcssserver3d/data/rsg/agent/nao/nao.rsg trunk/rcssserver3d/data/scripts/rcs-materials-textures.rb trunk/rcssserver3d/data/scripts/rcs-materials.rb trunk/rcssserver3d/plugin/soccer/agentstate/agentstate.cpp trunk/rcssserver3d/plugin/soccer/agentstate/agentstate.h trunk/rcssserver3d/plugin/soccer/soccerruleaspect/soccerruleaspect.cpp trunk/rcssserver3d/plugin/soccer/soccerruleaspect/soccerruleaspect.h trunk/rcssserver3d/plugin/soccer/trainercommandparser/trainercommandparser.cpp trunk/rcssserver3d/plugin/soccer/trainercommandparser/trainercommandparser.h trunk/rcssserver3d/plugin/soccermonitor/soccerinput.cpp trunk/rcssserver3d/plugin/soccermonitor/soccerinput.h trunk/rcssserver3d/plugin/soccermonitor/soccerrender.cpp trunk/rcssserver3d/plugin/soccermonitor/soccerrender.h trunk/rcssserver3d/rcssmonitor3d/soccerbindings.rb trunk/rcssserver3d/rcssmonitor3d/soccersim-monitor.rb trunk/spark/data/scripts/materials.rb trunk/spark/lib/kerosin/inputserver/input.h trunk/spark/lib/kerosin/inputserver/inputcontrol.cpp trunk/spark/lib/kerosin/inputserver/inputserver.cpp trunk/spark/lib/kerosin/renderserver/rendernode.cpp trunk/spark/lib/kerosin/renderserver/rendernode.h trunk/spark/lib/kerosin/renderserver/rendernode_c.cpp trunk/spark/lib/kerosin/renderserver/renderserver.cpp trunk/spark/lib/kerosin/sceneserver/singlematnode_c.cpp trunk/spark/lib/kerosin/sceneserver/staticmesh_c.cpp trunk/spark/lib/oxygen/simulationserver/simulationserver.cpp trunk/spark/plugin/inputsdl/keyboardsdl.cpp trunk/spark/plugin/inputsdl/mousesdl.cpp trunk/spark/plugin/sparkmonitor/sparkmonitor.cpp Property Changed: ---------------- trunk/ Property changes on: trunk ___________________________________________________________________ Modified: svn:mergeinfo - /branches/treehole:175 + /branches/agentselection:195-206 /branches/treehole:175 Modified: trunk/rcssserver3d/data/rsg/agent/nao/nao.rsg =================================================================== --- trunk/rcssserver3d/data/rsg/agent/nao/nao.rsg 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/data/rsg/agent/nao/nao.rsg 2010-06-01 13:04:58 UTC (rev 207) @@ -68,6 +68,15 @@ (setName AgentState) (nd GameStatePerceptor) (nd HearPerceptor) + (nd Transform + (nd Cylinder + (setName SelectionMarker) + (setParams 1.0 1.0) + (setScale 0.2 0.2 0.02) + (setMaterial matSelect) + (setTransparent) + ) + ) ) (nd GyroRatePerceptor (setName torso)) Modified: trunk/rcssserver3d/data/scripts/rcs-materials-textures.rb =================================================================== --- trunk/rcssserver3d/data/scripts/rcs-materials-textures.rb 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/data/scripts/rcs-materials-textures.rb 2010-06-01 13:04:58 UTC (rev 207) @@ -19,7 +19,6 @@ material.setDiffuse(1.0,0.64,0.4,1.0) material.setAmbient(0.2,0.01,0.0,1.0) - # grass # without lines Modified: trunk/rcssserver3d/data/scripts/rcs-materials.rb =================================================================== --- trunk/rcssserver3d/data/scripts/rcs-materials.rb 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/data/scripts/rcs-materials.rb 2010-06-01 13:04:58 UTC (rev 207) @@ -22,7 +22,6 @@ material.setDiffuse(0.1,0.6,0.1,1.0) material.setAmbient(0.1,0.3,0.1,1.0) - #---------------------------------------------------------------- # left team #---------------------------------------------------------------- Modified: trunk/rcssserver3d/plugin/soccer/agentstate/agentstate.cpp =================================================================== --- trunk/rcssserver3d/plugin/soccer/agentstate/agentstate.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccer/agentstate/agentstate.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -23,9 +23,11 @@ #include <soccertypes.h> #include <soccerbase/soccerbase.h> #include <gamestateaspect/gamestateaspect.h> +#include <kerosin/renderserver/rendernode.h> #include <sstream> using namespace oxygen; +using namespace kerosin; using namespace std; AgentState::AgentState() : ObjectState(), mTeamIndex(TI_NONE), @@ -33,7 +35,8 @@ mHearMax(2), mHearInc(1), mHearDecay(2), mHearMateCap(2), mHearOppCap(2), mIfSelfMsg(false), - mIfMateMsg(false), mIfOppMsg(false) + mIfMateMsg(false), mIfOppMsg(false), + mSelected(false) { // set mID and mUniformNumber into a joint state SetUniformNumber(0); @@ -211,6 +214,18 @@ } void +AgentState::UpdateHierarchyInternal() +{ + boost::shared_ptr<RenderNode> node = boost::shared_dynamic_cast<RenderNode>(GetChild("SelectionMarker", true)); + if (!node) + { + GetLog()->Error() << "ERROR: (AgentState::UpdateHierarchyInternal) could not find selection marker\n"; + return; + } + node->SetVisible(mSelected); +} + +void AgentState::OnUnlink() { ObjectState::OnUnlink(); @@ -226,3 +241,20 @@ game_state->ReturnUniform(GetTeamIndex(), GetUniformNumber()); } +bool +AgentState::IsSelected() const +{ + return mSelected; +} + +void +AgentState::Select(bool s) +{ + mSelected = s; +} + +void +AgentState::UnSelect() +{ + mSelected = false; +} Modified: trunk/rcssserver3d/plugin/soccer/agentstate/agentstate.h =================================================================== --- trunk/rcssserver3d/plugin/soccer/agentstate/agentstate.h 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccer/agentstate/agentstate.h 2010-06-01 13:04:58 UTC (rev 207) @@ -91,6 +91,10 @@ bool GetMessage(std::string& msg, float& direction, bool teamMate); bool GetSelfMessage(std::string& msg); + bool IsSelected() const; + void Select(bool s = true); + void UnSelect(); + protected: /** team index */ TTeamIndex mTeamIndex; @@ -134,7 +138,9 @@ /** is there any message from oponnent */ bool mIfOppMsg; + bool mSelected; protected: + virtual void UpdateHierarchyInternal(); virtual void OnUnlink(); }; Modified: trunk/rcssserver3d/plugin/soccer/soccerruleaspect/soccerruleaspect.cpp =================================================================== --- trunk/rcssserver3d/plugin/soccer/soccerruleaspect/soccerruleaspect.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccer/soccerruleaspect/soccerruleaspect.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -486,6 +486,48 @@ } void +SoccerRuleAspect::ClearSelectedPlayers() +{ + float min_dist = mFreeKickMoveDist; + std::list<boost::shared_ptr<AgentState> > agent_states; + if (! SoccerBase::GetAgentStates(*mBallState.get(), agent_states, TI_NONE)) + return; + + boost::shared_ptr<oxygen::Transform> agent_aspect; + std::list<boost::shared_ptr<AgentState> >::const_iterator i; + for (i = agent_states.begin(); i != agent_states.end(); ++i) + { + SoccerBase::GetTransformParent(**i, agent_aspect); + + // if agent is selected, move it away + Vector3f new_pos = agent_aspect->GetWorldTransform().Pos(); + + if ((*i)->IsSelected()) + { + float dist = salt::UniformRNG<>(min_dist, min_dist + 2.0)(); + + if ((*i)->GetTeamIndex() == TI_LEFT) + { + if (new_pos[0] - dist < -mFieldLength/2.0) + { + new_pos[1] = new_pos[1] < 0 ? new_pos[1] + dist : new_pos[1] - dist; + } else { + new_pos[0] = new_pos[0] - dist; + } + } else { + if (new_pos[0] + dist > mFieldLength/2.0) + { + new_pos[1] = new_pos[1] < 0 ? new_pos[1] + dist : new_pos[1] - dist; + } else { + new_pos[0] = new_pos[0] + dist; + } + } + SoccerBase::MoveAgent(agent_aspect, new_pos); + } + } +} + +void SoccerRuleAspect::DropBall() { DropBall(mBallBody->GetPosition()); @@ -1638,7 +1680,51 @@ } } -Vector2f SoccerRuleAspect::GetFieldSize() const +Vector2f +SoccerRuleAspect::GetFieldSize() const { return Vector2f(mFieldLength,mFieldWidth); } + +void +SoccerRuleAspect::ResetAgentSelection() +{ + std::list<boost::shared_ptr<AgentState> > agent_states; + if (SoccerBase::GetAgentStates(*mBallState.get(), agent_states, TI_NONE)) + { + + std::list<boost::shared_ptr<AgentState> >::const_iterator i; + for (i = agent_states.begin(); i != agent_states.end(); ++i) + (*i)->UnSelect(); + } +} + +void +SoccerRuleAspect::SelectNextAgent() +{ + std::list<boost::shared_ptr<AgentState> > agent_states; + bool selectNext = false; + if (SoccerBase::GetAgentStates(*mBallState.get(), agent_states, TI_NONE) && agent_states.size() > 0) + { + boost::shared_ptr<AgentState> first = agent_states.front(); + + std::list<boost::shared_ptr<AgentState> >::const_iterator i; + for (i = agent_states.begin(); i != agent_states.end(); ++i) + { + if ((*i)->IsSelected()) + { + (*i)->UnSelect(); + selectNext = true; + continue; + } + else if (selectNext) + { + (*i)->Select(); + return; + } + } + + // No agent selected, select first + first->Select(); + } +} Modified: trunk/rcssserver3d/plugin/soccer/soccerruleaspect/soccerruleaspect.h =================================================================== --- trunk/rcssserver3d/plugin/soccer/soccerruleaspect/soccerruleaspect.h 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccer/soccerruleaspect/soccerruleaspect.h 2010-06-01 13:04:58 UTC (rev 207) @@ -45,7 +45,7 @@ { public: typedef std::list<boost::shared_ptr<AgentState> > TAgentStateList; - + public: SoccerRuleAspect(); virtual ~SoccerRuleAspect(); @@ -139,6 +139,12 @@ salt::Vector2f GetFieldSize() const; + void ResetAgentSelection(); + + void SelectNextAgent(); + + void ClearSelectedPlayers(); + protected: /** rereads the current soccer script values */ virtual void UpdateCachedInternal(); @@ -233,7 +239,7 @@ * @param idx the team which kick off */ void ClearPlayersBeforeKickOff(TTeamIndex idx); - + protected: /** reference to the body node of the Ball */ boost::shared_ptr<oxygen::RigidBody> mBallBody; Modified: trunk/rcssserver3d/plugin/soccer/trainercommandparser/trainercommandparser.cpp =================================================================== --- trunk/rcssserver3d/plugin/soccer/trainercommandparser/trainercommandparser.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccer/trainercommandparser/trainercommandparser.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -29,10 +29,12 @@ #include <agentstate/agentstate.h> #include <soccertypes.h> #include <gamestateaspect/gamestateaspect.h> +#include <oxygen/agentaspect/agentaspect.h> #include "trainercommandparser.h" using namespace std; using namespace boost; +using namespace salt; using namespace zeitgeist; using namespace oxygen; @@ -45,7 +47,10 @@ mCommandMap["dropBall"] = CT_DROP_BALL; mCommandMap["kickOff"] = CT_KICK_OFF; mCommandMap["getAck"] = CT_ACK; - + mCommandMap["select"] = CT_SELECT; + mCommandMap["kill"] = CT_KILL; + mCommandMap["repos"] = CT_REPOS; + // setup team index map // Originally team sides were "L","R" and "N" // But this seems to be unused @@ -106,6 +111,15 @@ GetLog()->Error() << "ERROR: (TrainerCommnadParser) failed to create SexpParser\n"; return; } + + mGameControl = shared_dynamic_cast<GameControlServer> + (GetCore()->Get("/sys/server/gamecontrol")); + + if (mGameControl.get() == 0) + { + GetLog()->Error() << "ERROR: (TrainerCommandParser) Unable to get GameControlServer\n"; + } + } void TrainerCommandParser::OnUnlink() @@ -145,6 +159,8 @@ bool TrainerCommandParser::ParsePredicate(const oxygen::Predicate & predicate) { + cerr << "repos 1" << endl; + SoccerBase::GetGameState(*this,mGameState); SoccerBase::GetSoccerRuleAspect(*this,mSoccerRule); @@ -189,6 +205,15 @@ break; } + case CT_SELECT: + ParseSelectCommand(predicate); + break; + case CT_KILL: + ParseKillCommand(predicate); + break; + case CT_REPOS: + ParseReposCommand(predicate); + break; default: return false; } @@ -200,17 +225,17 @@ { Predicate::Iterator unumParam(predicate); int unum; + bool specified = true; // extract unum if (predicate.FindParameter(unumParam, "unum")) { if (! predicate.GetValue(unumParam, unum)) - { - GetLog()->Error() << "(TrainerCommandParser) ERROR: can't get unum\n"; - return; - } + specified = false; } - + else + specified = false; + string team; TTeamIndex idx; Predicate::Iterator teamParam(predicate); @@ -219,26 +244,29 @@ if (predicate.FindParameter(teamParam, "team")) { if (! predicate.GetValue(teamParam, team)) - { - GetLog()->Error() << "(TrainerCommandParser) ERROR: can't get team name\n"; - return; - } - - idx = mTeamIndexMap[team]; + specified = false; + else + idx = mTeamIndexMap[team]; } + else + specified = false; + if (!specified) + { + mSoccerRule->ClearSelectedPlayers(); + return; + } SoccerBase::TAgentStateList agentStates; - SoccerBase::GetAgentStates(*this, agentStates, idx); + SoccerBase::GetAgentStates(*this, agentStates, (specified ? idx : TI_NONE)); SoccerBase::TAgentStateList::iterator iter = agentStates.begin(); bool found = false; while (iter != agentStates.end() && !found) { - if ((*iter)->GetUniformNumber() == unum) - { - found = true; - } + if ((specified && (*iter)->GetUniformNumber() == unum && (*iter)->GetTeamIndex() == idx) || + (!specified && (*iter)->IsSelected())) + found = true; else ++iter; } @@ -250,7 +278,6 @@ } Predicate::Iterator posParam(predicate); - if (predicate.FindParameter(posParam, "pos")) { salt::Vector3f pos; @@ -477,3 +504,200 @@ } } +void TrainerCommandParser::ParseSelectCommand(const oxygen::Predicate & predicate) +{ + Predicate::Iterator unumParam(predicate); + int unum; + bool specified = true; + + shared_ptr<SoccerRuleAspect> soccerRuleAspect; + if (!SoccerBase::GetSoccerRuleAspect(*this, soccerRuleAspect)) + { + GetLog()->Error() << "(TrainerCommandParser) ERROR: can't get soccer rule aspect\n"; + return; + } + + // extract unum + if (predicate.FindParameter(unumParam, "unum")) + { + if (! predicate.GetValue(unumParam, unum)) + specified = false; + } + else + specified = false; + + if (specified && unum == -1) + { + soccerRuleAspect->ResetAgentSelection(); + return; + } + + string team; + TTeamIndex idx; + Predicate::Iterator teamParam(predicate); + + // extract side + if (predicate.FindParameter(teamParam, "team")) + { + if (! predicate.GetValue(teamParam, team)) + specified = false; + else + idx = mTeamIndexMap[team]; + } + else + specified = false; + + if (!specified) + { + soccerRuleAspect->SelectNextAgent(); + return; + } + + SoccerBase::TAgentStateList agentStates; + SoccerBase::GetAgentStates(*this, agentStates, idx); + SoccerBase::TAgentStateList::iterator iter = agentStates.begin(); + bool found = false; + + while (iter != agentStates.end() && !found) + { + if ((*iter)->GetUniformNumber() == unum) + { + found = true; + } + else + ++iter; + } + + if (!found) + { + GetLog()->Error() << "(TrainerCommandParser) ERROR: can't get correct AgentState\n"; + return; + } + + soccerRuleAspect->ResetAgentSelection(); + (*iter)->Select(); +} + +void TrainerCommandParser::ParseKillCommand(const oxygen::Predicate & predicate) +{ + Predicate::Iterator unumParam(predicate); + int unum; + bool specified = true; + + shared_ptr<SoccerRuleAspect> soccerRuleAspect; + if (!SoccerBase::GetSoccerRuleAspect(*this, soccerRuleAspect)) + { + GetLog()->Error() << "(TrainerCommandParser) ERROR: can't get soccer rule aspect\n"; + return; + } + + // extract unum + if (predicate.FindParameter(unumParam, "unum")) + { + if (! predicate.GetValue(unumParam, unum)) + specified = false; + } + else + specified = false; + + string team; + TTeamIndex idx; + Predicate::Iterator teamParam(predicate); + + // extract side + if (predicate.FindParameter(teamParam, "team")) + { + if (! predicate.GetValue(teamParam, team)) + specified = false; + else + idx = mTeamIndexMap[team]; + } + else + specified = false; + + GameControlServer::TAgentAspectList agentAspects; + mGameControl->GetAgentAspectList(agentAspects); + GameControlServer::TAgentAspectList::iterator aaiter; + for ( + aaiter = agentAspects.begin(); + aaiter != agentAspects.end(); + ++aaiter + ) + { + // search for the first agent of the left/right side + boost::shared_ptr<AgentState> agentState = + shared_dynamic_cast<AgentState>((*aaiter)->GetChild("AgentState", true)); + + if ((specified && agentState->GetUniformNumber() == unum && agentState->GetTeamIndex() == idx) || + (!specified && agentState->IsSelected())) + { + mGameControl->pushDisappearedAgent((*aaiter)->ID()); + break; + } + } +} + +void TrainerCommandParser::ParseReposCommand(const oxygen::Predicate & predicate) +{ + cerr << "repos 2" << endl; + + Predicate::Iterator unumParam(predicate); + int unum; + bool specified = true; + + shared_ptr<SoccerRuleAspect> soccerRuleAspect; + if (!SoccerBase::GetSoccerRuleAspect(*this, soccerRuleAspect)) + { + GetLog()->Error() << "(TrainerCommandParser) ERROR: can't get soccer rule aspect\n"; + return; + } + + // extract unum + if (predicate.FindParameter(unumParam, "unum")) + { + if (! predicate.GetValue(unumParam, unum)) + specified = false; + } + else + specified = false; + + string team; + TTeamIndex idx; + Predicate::Iterator teamParam(predicate); + + // extract side + if (predicate.FindParameter(teamParam, "team")) + { + if (! predicate.GetValue(teamParam, team)) + specified = false; + else + idx = mTeamIndexMap[team]; + } + else + specified = false; + + SoccerBase::TAgentStateList agentStates; + SoccerBase::GetAgentStates(*this, agentStates, TI_NONE); + SoccerBase::TAgentStateList::iterator iter = agentStates.begin(); + boost::shared_ptr<oxygen::Transform> agent_aspect; + for (;iter != agentStates.end(); ++iter) + { + if ((specified && (*iter)->GetUniformNumber() == unum && (*iter)->GetTeamIndex() == idx) || + (!specified && (*iter)->IsSelected())) + { + Vector3f ballPos(0,0,0); + boost::shared_ptr<RigidBody> ballBody; + + if (SoccerBase::GetBallBody(*this, ballBody)) + ballPos = ballBody->GetPosition(); + + SoccerBase::GetTransformParent(**iter, agent_aspect); + cerr << "repos 3" << endl; + Vector3f new_pos = mSoccerRule->RepositionOutsidePos(ballPos, (*iter)->GetUniformNumber(), (*iter)->GetTeamIndex()); + SoccerBase::MoveAgent(agent_aspect, new_pos); + + break; + } + } +} + Modified: trunk/rcssserver3d/plugin/soccer/trainercommandparser/trainercommandparser.h =================================================================== --- trunk/rcssserver3d/plugin/soccer/trainercommandparser/trainercommandparser.h 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccer/trainercommandparser/trainercommandparser.h 2010-06-01 13:04:58 UTC (rev 207) @@ -33,6 +33,11 @@ #include <soccertypes.h> #include <soccerruleaspect/soccerruleaspect.h> +namespace oxygen +{ + class GameControlServer; +} + class TrainerCommandParser : public oxygen::MonitorCmdParser { public: @@ -44,7 +49,10 @@ CT_PLAYMODE, CT_DROP_BALL, CT_KICK_OFF, - CT_ACK + CT_ACK, + CT_SELECT, + CT_KILL, + CT_REPOS }; typedef std::map<std::string, ECommandType> TCommandMap; @@ -100,7 +108,21 @@ predicate */ void ParseKickOffCommand(const oxygen::Predicate & predicate); + + /** parses and executes the select command contained in the given + predicate + */ + void ParseSelectCommand(const oxygen::Predicate & predicate); + /** parses and executes the kill command contained in the given + predicate + */ + void ParseKillCommand(const oxygen::Predicate & predicate); + + /** parses and executes the reposition command contained in the given + predicate + */ + void ParseReposCommand(const oxygen::Predicate & predicate); protected: TCommandMap mCommandMap; @@ -114,6 +136,8 @@ boost::shared_ptr<SoccerRuleAspect> mSoccerRule; //! the parser used to create the PredicateList boost::shared_ptr<oxygen::BaseParser> mSexpParser; + //! cached reference to the game control server + boost::shared_ptr<oxygen::GameControlServer> mGameControl; bool mGetAck; std::string mAckString; Modified: trunk/rcssserver3d/plugin/soccermonitor/soccerinput.cpp =================================================================== --- trunk/rcssserver3d/plugin/soccermonitor/soccerinput.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccermonitor/soccerinput.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -28,9 +28,11 @@ using namespace zeitgeist; using namespace oxygen; using namespace kerosin; +using namespace std; SoccerInput::SoccerInput() - : InputItem() + : InputItem(), + mCmdMode(CmdModeDefault) { } @@ -55,9 +57,25 @@ scriptServer->CreateVariable("Command.CameraRightCorner", CmdCameraRightCorner); scriptServer->CreateVariable("Command.CameraRightGoal", CmdCameraRightGoal); //JAN - scriptServer->CreateVariable("Command.FreeKickLeft", CmdFreeKickLeft); - scriptServer->CreateVariable("Command.FreeKickRight", CmdFreeKickRight); - + scriptServer->CreateVariable("Command.One", CmdOne); + scriptServer->CreateVariable("Command.Two", CmdTwo); + scriptServer->CreateVariable("Command.Three", CmdThree); + scriptServer->CreateVariable("Command.Four", CmdFour); + scriptServer->CreateVariable("Command.Five", CmdFive); + scriptServer->CreateVariable("Command.Six", CmdSix); + scriptServer->CreateVariable("Command.Seven", CmdSeven); + scriptServer->CreateVariable("Command.Eight", CmdEight); + scriptServer->CreateVariable("Command.Nine", CmdNine); + scriptServer->CreateVariable("Command.Zero", CmdZero); + scriptServer->CreateVariable("Command.Left", CmdLeft); + scriptServer->CreateVariable("Command.Right", CmdRight); + + scriptServer->CreateVariable("Command.PlayerSelectMode", CmdPlayerSelectMode); + scriptServer->CreateVariable("Command.SelectNextAgent", CmdSelectNextAgent); + scriptServer->CreateVariable("Command.ResetSelection", CmdResetSelection); + scriptServer->CreateVariable("Command.KillSelection", CmdKillSelection); + scriptServer->CreateVariable("Command.ReposSelection", CmdReposSelection); + mMonitorClient = shared_dynamic_cast<NetClient> (GetCore()->Get("/sys/server/simulation/SparkMonitorClient")); @@ -107,143 +125,213 @@ void SoccerInput::ProcessInput(const Input& input) { - // get list of registered SoccerMonitor objects - TLeafList soccerMonitorList; - mMonitorClient->ListChildrenSupportingClass<SoccerMonitor>(soccerMonitorList); - - if (soccerMonitorList.empty()) - { - GetLog()->Error() - << "ERROR: (SoccerInput) Unable to get SoccerMonitor\n"; - return; - } - - boost::shared_ptr<SoccerMonitor> soccerMonitor = - shared_static_cast<SoccerMonitor>(soccerMonitorList.front()); - switch (input.mId) { default: return; - case CmdKickOff: + case CmdPlayerSelectMode: if (input.GetKeyPress()) - { - SendCommand("(kickOff Left)"); - } + { + mCmdMode = CmdModePlayerSelect; + } break; - case CmdKickOffRight: + + case CmdSelectNextAgent: if (input.GetKeyPress()) { - SendCommand("(kickOff Right)"); + SendCommand("(select)"); } break; - - case CmdMoveAgent: + + case CmdResetSelection: if (input.GetKeyPress()) { - //SendCommand("(agent (team Left)(unum 1)(pos -2.0 1.0 3.5))"); + SendCommand("(select (unum -1))"); } break; - case CmdDropBall: + + case CmdKillSelection: if (input.GetKeyPress()) { - SendCommand("(dropBall)"); + SendCommand("(kill)"); } break; - case CmdShootBall: + + case CmdReposSelection: if (input.GetKeyPress()) { - //SendCommand("(ball (vel -4.0 0.0 2.0))"); + SendCommand("(repos)"); } break; - case CmdMoveBall: + + case CmdKickOff: if (input.GetKeyPress()) { - //SendCommand("(ball (pos -42.0 0.0 0.3))"); + SendCommand("(kickOff Left)"); } break; - case CmdCameraLeftGoal: + case CmdKickOffRight: if (input.GetKeyPress()) { - salt::Vector2f fieldSize = soccerMonitor->GetFieldSize(); - salt::Vector3f pos(-fieldSize.x()*0.8, 0.0, fieldSize.x()*0.4); - mCameraBody->SetPosition(pos); - mFPS->SetHAngleDeg(90); - mFPS->SetVAngleDeg(35); + SendCommand("(kickOff Right)"); } break; - case CmdCameraLeftCorner: + + case CmdMoveAgent: if (input.GetKeyPress()) { - salt::Vector2f fieldSize = soccerMonitor->GetFieldSize(); - salt::Vector3f pos(-fieldSize.x()*0.8, -fieldSize.y(), fieldSize.x()*0.4); - mCameraBody->SetPosition(pos); - mFPS->SetHAngleDeg(50); - mFPS->SetVAngleDeg(30); + SendCommand("(agent)"); } break; - case CmdCameraMiddleLeft: + case CmdDropBall: if (input.GetKeyPress()) { - salt::Vector2f fieldSize = soccerMonitor->GetFieldSize(); - salt::Vector3f pos(0, -fieldSize.y(), fieldSize.x()*0.4); - mCameraBody->SetPosition(pos); - mFPS->SetHAngleDeg(salt::gRadToDeg(-0.625)); - mFPS->SetVAngleDeg(40); + SendCommand("(dropBall)"); } break; - case CmdCameraMiddleRight: + case CmdShootBall: if (input.GetKeyPress()) { - salt::Vector2f fieldSize = soccerMonitor->GetFieldSize(); - salt::Vector3f pos(0, -fieldSize.y(), fieldSize.x()*0.4); - mCameraBody->SetPosition(pos); - mFPS->SetHAngleDeg(salt::gRadToDeg(0.625)); - mFPS->SetVAngleDeg(40); + //SendCommand("(ball (vel -4.0 0.0 2.0))"); } break; - case CmdCameraMiddle: + case CmdMoveBall: if (input.GetKeyPress()) { - salt::Vector2f fieldSize = soccerMonitor->GetFieldSize(); - salt::Vector3f pos(0, -fieldSize.y()*1.1, fieldSize.x()*0.6); - mCameraBody->SetPosition(pos); - mFPS->SetHAngleDeg(0); - mFPS->SetVAngleDeg(45); + //SendCommand("(ball (pos -42.0 0.0 0.3))"); } break; - case CmdCameraRightCorner: + + case CmdOne: + case CmdTwo: + case CmdThree: + case CmdFour: + case CmdFive: + case CmdSix: + case CmdSeven: + case CmdEight: + case CmdNine: + case CmdZero: if (input.GetKeyPress()) { - salt::Vector2f fieldSize = soccerMonitor->GetFieldSize(); - salt::Vector3f pos(fieldSize.x()*0.8, -fieldSize.y(), fieldSize.x()*0.4); - mCameraBody->SetPosition(pos); - mFPS->SetHAngleDeg(-50); - mFPS->SetVAngleDeg(30); + if (mCmdMode == CmdModeDefault) + SelectCamera(input.mId - CmdOne); + else + { + ostringstream u_ss; + u_ss << "(select (unum " << (input.mId - CmdOne + 1) << ") "; + if (mCmdMode == CmdModeLeftPlayerSelect) + { + u_ss << "(team Left))"; + SendCommand(u_ss.str()); + mCmdMode = CmdModeDefault; + } + else if (mCmdMode == CmdModeRightPlayerSelect) + { + u_ss << "(team Right))"; + SendCommand(u_ss.str()); + mCmdMode = CmdModeDefault; + } + } } break; - case CmdCameraRightGoal: + case CmdLeft: if (input.GetKeyPress()) { - salt::Vector2f fieldSize = soccerMonitor->GetFieldSize(); - salt::Vector3f pos(fieldSize.x()*0.8, 0.0, fieldSize.x()*0.4); - mCameraBody->SetPosition(pos); - mFPS->SetHAngleDeg(-90); - mFPS->SetVAngleDeg(35); + if (mCmdMode == CmdModeDefault) + SendCommand("(playMode free_kick_left)"); + else if (mCmdMode == CmdModePlayerSelect || mCmdMode == CmdModeRightPlayerSelect) + mCmdMode = CmdModeLeftPlayerSelect; } break; - case CmdFreeKickLeft: + case CmdRight: if (input.GetKeyPress()) { - SendCommand("(playMode free_kick_left)"); + if (mCmdMode == CmdModeDefault) + SendCommand("(playMode free_kick_right)"); + else if (mCmdMode == CmdModePlayerSelect || mCmdMode == CmdModeLeftPlayerSelect) + mCmdMode = CmdModeRightPlayerSelect; } break; - case CmdFreeKickRight: - if (input.GetKeyPress()) - { - SendCommand("(playMode free_kick_right)"); - } - break; }; } + +void SoccerInput::SelectCamera(int idx) +{ + // get list of registered SoccerMonitor objects + TLeafList soccerMonitorList; + mMonitorClient->ListChildrenSupportingClass<SoccerMonitor>(soccerMonitorList); + + if (soccerMonitorList.empty()) + { + GetLog()->Error() + << "ERROR: (SoccerInput) Unable to get SoccerMonitor\n"; + return; + } + + boost::shared_ptr<SoccerMonitor> soccerMonitor = + shared_static_cast<SoccerMonitor>(soccerMonitorList.front()); + + salt::Vector2f fieldSize = soccerMonitor->GetFieldSize(); + + switch (idx) + { + case 0: + { + salt::Vector3f pos(-fieldSize.x()*0.8, 0.0, fieldSize.x()*0.4); + mCameraBody->SetPosition(pos); + mFPS->SetHAngleDeg(90); + mFPS->SetVAngleDeg(35); + } + break; + case 1: + { + salt::Vector3f pos(-fieldSize.x()*0.8, -fieldSize.y(), fieldSize.x()*0.4); + mCameraBody->SetPosition(pos); + mFPS->SetHAngleDeg(50); + mFPS->SetVAngleDeg(30); + } + break; + case 2: + { + salt::Vector3f pos(0, -fieldSize.y(), fieldSize.x()*0.4); + mCameraBody->SetPosition(pos); + mFPS->SetHAngleDeg(salt::gRadToDeg(-0.625)); + mFPS->SetVAngleDeg(40); + } + break; + case 3: + { + salt::Vector3f pos(0, -fieldSize.y()*1.1, fieldSize.x()*0.6); + mCameraBody->SetPosition(pos); + mFPS->SetHAngleDeg(0); + mFPS->SetVAngleDeg(45); + } + break; + case 4: + { + salt::Vector3f pos(0, -fieldSize.y(), fieldSize.x()*0.4); + mCameraBody->SetPosition(pos); + mFPS->SetHAngleDeg(salt::gRadToDeg(0.625)); + mFPS->SetVAngleDeg(40); + } + break; + case 5: + { + salt::Vector3f pos(fieldSize.x()*0.8, -fieldSize.y(), fieldSize.x()*0.4); + mCameraBody->SetPosition(pos); + mFPS->SetHAngleDeg(-50); + mFPS->SetVAngleDeg(30); + } + break; + case 6: + { + salt::Vector3f pos(fieldSize.x()*0.8, 0.0, fieldSize.x()*0.4); + mCameraBody->SetPosition(pos); + mFPS->SetHAngleDeg(-90); + mFPS->SetVAngleDeg(35); + } + break; + } +} Modified: trunk/rcssserver3d/plugin/soccermonitor/soccerinput.h =================================================================== --- trunk/rcssserver3d/plugin/soccermonitor/soccerinput.h 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccermonitor/soccerinput.h 2010-06-01 13:04:58 UTC (rev 207) @@ -49,10 +49,37 @@ CmdCameraMiddle = CmdCameraMiddleRight + 1, CmdCameraRightCorner = CmdCameraMiddle + 1, CmdCameraRightGoal = CmdCameraRightCorner + 1, + + CmdOne = CmdCameraRightGoal + 1, + CmdTwo = CmdOne + 1, + CmdThree = CmdTwo + 1, + CmdFour = CmdThree + 1, + CmdFive = CmdFour + 1, + CmdSix = CmdFive + 1, + CmdSeven = CmdSix + 1, + CmdEight = CmdSeven + 1, + CmdNine = CmdEight + 1, + CmdZero = CmdNine + 1, + //JAN - CmdFreeKickLeft = CmdCameraRightGoal + 1, - CmdFreeKickRight = CmdFreeKickLeft + 1 + CmdLeft = CmdZero + 1, + CmdRight = CmdLeft + 1, + + CmdPlayerSelectMode = CmdRight + 1, + CmdSelectNextAgent = CmdPlayerSelectMode + 1, + CmdResetSelection = CmdSelectNextAgent + 1, + CmdKillSelection = CmdResetSelection + 1, + CmdReposSelection = CmdKillSelection + 1 }; + + enum ECmdMode + { + CmdModeDefault = 1, + CmdModePlayerSelect, + CmdModeLeftPlayerSelect, + CmdModeRightPlayerSelect, + CmdModeNone + }; public: SoccerInput(); @@ -71,9 +98,12 @@ /** reset SparkMonitorClient reference */ virtual void OnUnlink(); + ECmdMode GetCmdMode() const { return mCmdMode; } + protected: void SendCommand(const std::string& cmd); + void SelectCamera(int idx); protected: /** cached reference to the monitor client */ boost::shared_ptr<oxygen::NetClient> mMonitorClient; @@ -82,6 +112,8 @@ boost::shared_ptr<oxygen::RigidBody> mCameraBody; boost::shared_ptr<oxygen::FPSController> mFPS; + + ECmdMode mCmdMode; }; DECLARE_CLASS(SoccerInput); Modified: trunk/rcssserver3d/plugin/soccermonitor/soccerrender.cpp =================================================================== --- trunk/rcssserver3d/plugin/soccermonitor/soccerrender.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccermonitor/soccerrender.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -23,6 +23,7 @@ #include <sstream> #include "soccerrender.h" #include "soccermonitor.h" +#include "soccerinput.h" #include <zeitgeist/logserver/logserver.h> #include <kerosin/openglserver/openglserver.h> #include <kerosin/fontserver/fontserver.h> @@ -69,6 +70,13 @@ { GetLog()->Error() << "ERROR: (SoccerRender) Unable to get SoccerMonitor\n"; } + mInput = shared_static_cast<SoccerInput> + (GetCore()->Get("/sys/server/simulation/InputControl/SoccerInput")); + + if (mInput.get() == 0) + { + GetLog()->Error() << "ERROR: (SoccerRender) Unable to get SoccerInput\n"; + } } void SoccerRender::OnUnlink() @@ -90,7 +98,7 @@ return; } - stringstream ss_l, ss_c, ss_r; + stringstream ss_l, ss_c, ss_r, ss_m; ss_c.setf(ios_base::fixed,ios_base::floatfield); ss_c.precision(2); @@ -141,5 +149,8 @@ xPos = int((1024-(mFont->GetStringWidth(ss_c.str().c_str())))/2); mFont->DrawString(xPos, 0, ss_c.str().c_str()); + //ss_m << mInput->GetCmdMode(); + //mFont->DrawString(10, 30, ss_m.str().c_str()); + mFontServer->End(); } Modified: trunk/rcssserver3d/plugin/soccermonitor/soccerrender.h =================================================================== --- trunk/rcssserver3d/plugin/soccermonitor/soccerrender.h 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/plugin/soccermonitor/soccerrender.h 2010-06-01 13:04:58 UTC (rev 207) @@ -32,6 +32,7 @@ } class SoccerMonitor; +class SoccerInput; class SoccerRender : public kerosin::CustomRender { @@ -51,6 +52,7 @@ boost::shared_ptr<SoccerMonitor> mMonitor; boost::shared_ptr<kerosin::FontServer> mFontServer; boost::shared_ptr<kerosin::Font> mFont; + boost::shared_ptr<SoccerInput> mInput; }; DECLARE_CLASS(SoccerRender); Modified: trunk/rcssserver3d/rcssmonitor3d/soccerbindings.rb =================================================================== --- trunk/rcssserver3d/rcssmonitor3d/soccerbindings.rb 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/rcssmonitor3d/soccerbindings.rb 2010-06-01 13:04:58 UTC (rev 207) @@ -28,16 +28,33 @@ inputServer.bindCommand('j', Command.KickOffRight); inputServer.bindCommand('b', Command.DropBall); inputServer.bindCommand('m', Command.MoveAgent); - inputServer.bindCommand('n', Command.ShootBall); - inputServer.bindCommand('x', Command.MoveBall); - inputServer.bindCommand('1', Command.CameraLeftGoal); - inputServer.bindCommand('2', Command.CameraLeftCorner); - inputServer.bindCommand('3', Command.CameraMiddleLeft); - inputServer.bindCommand('4', Command.CameraMiddle); - inputServer.bindCommand('5', Command.CameraMiddleRight); - inputServer.bindCommand('6', Command.CameraRightCorner); - inputServer.bindCommand('7', Command.CameraRightGoal); - inputServer.bindCommand('l', Command.FreeKickLeft); - inputServer.bindCommand('r', Command.FreeKickRight); + #inputServer.bindCommand('n', Command.ShootBall); + #inputServer.bindCommand('x', Command.MoveBall); + + #inputServer.bindCommand('1', Command.CameraLeftGoal); + #inputServer.bindCommand('2', Command.CameraLeftCorner); + #inputServer.bindCommand('3', Command.CameraMiddleLeft); + #inputServer.bindCommand('4', Command.CameraMiddle); + #inputServer.bindCommand('5', Command.CameraMiddleRight); + #inputServer.bindCommand('6', Command.CameraRightCorner); + #inputServer.bindCommand('7', Command.CameraRightGoal); + inputServer.bindCommand('1', Command.One); + inputServer.bindCommand('2', Command.Two); + inputServer.bindCommand('3', Command.Three); + inputServer.bindCommand('4', Command.Four); + inputServer.bindCommand('5', Command.Five); + inputServer.bindCommand('6', Command.Six); + inputServer.bindCommand('7', Command.Seven); + inputServer.bindCommand('8', Command.Eight); + inputServer.bindCommand('9', Command.Nine); + inputServer.bindCommand('0', Command.Zero); + + inputServer.bindCommand('l', Command.Left); + inputServer.bindCommand('r', Command.Right); + inputServer.bindCommand('lctrl s', Command.PlayerSelectMode); + inputServer.bindCommand('n', Command.SelectNextAgent); + inputServer.bindCommand('e', Command.ResetSelection); + inputServer.bindCommand('x', Command.KillSelection); + inputServer.bindCommand('p', Command.ReposSelection); end end Modified: trunk/rcssserver3d/rcssmonitor3d/soccersim-monitor.rb =================================================================== --- trunk/rcssserver3d/rcssmonitor3d/soccersim-monitor.rb 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/rcssserver3d/rcssmonitor3d/soccersim-monitor.rb 2010-06-01 13:04:58 UTC (rev 207) @@ -13,10 +13,6 @@ # state sparkRegisterCustomMonitor 'SoccerMonitor' -# register the soccer render plugin to draw the game state on the -# screen -sparkRegisterCustomRender 'SoccerRender' - if ($logPlayerMode == true) # register the soccer input logplayer plugin for playback # specific keys @@ -29,3 +25,7 @@ # bind keys to soccer commands run "soccerbindings.rb" +# register the soccer render plugin to draw the game state on the +# screen +sparkRegisterCustomRender 'SoccerRender' + Modified: trunk/spark/data/scripts/materials.rb =================================================================== --- trunk/spark/data/scripts/materials.rb 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/data/scripts/materials.rb 2010-06-01 13:04:58 UTC (rev 207) @@ -14,6 +14,7 @@ material = sparkCreate('kerosin/MaterialSolid', $serverPath+'material/matRed'); material.setDiffuse(1.0,0.0,0.0,1.0) +material.setAmbient(1.0,0.0,0.0,1.0) material = sparkCreate('kerosin/MaterialSolid', $serverPath+'material/matRedGlow'); material.setDiffuse(1.0,0.0,0.0,1.0) @@ -33,6 +34,12 @@ material.setDiffuse(0.1,0.6,0.1,1.0) material.setAmbient(0.1,0.3,0.1,1.0) +# selection marker +material = sparkCreate('kerosin/MaterialSolid', $serverPath+'material/matSelect'); +material.setDiffuse(1.0,0.0,0.0,0.5) +material.setAmbient(1.0,0.0,0.0,0.5) +material.setSpecular(1.0,0.2,0.2,0.5); + # shades of grey material = sparkCreate('kerosin/MaterialSolid', $serverPath+'material/matWhite'); material.setDiffuse(1.0,1.0,1.0,1.0) Modified: trunk/spark/lib/kerosin/inputserver/input.h =================================================================== --- trunk/spark/lib/kerosin/inputserver/input.h 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/kerosin/inputserver/input.h 2010-06-01 13:04:58 UTC (rev 207) @@ -101,6 +101,7 @@ float f; } mData; + unsigned int mModState; public: // numbers Modified: trunk/spark/lib/kerosin/inputserver/inputcontrol.cpp =================================================================== --- trunk/spark/lib/kerosin/inputserver/inputcontrol.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/kerosin/inputserver/inputcontrol.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -217,10 +217,10 @@ ListChildrenSupportingClass<InputItem>(items); for ( - TLeafList::iterator iter = items.begin(); - iter != items.end(); - ++iter - ) + TLeafList::iterator iter = items.begin(); + iter != items.end(); + ++iter + ) { shared_static_cast<InputItem>(*iter) ->ProcessInput(input); Modified: trunk/spark/lib/kerosin/inputserver/inputserver.cpp =================================================================== --- trunk/spark/lib/kerosin/inputserver/inputserver.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/kerosin/inputserver/inputserver.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -288,6 +288,7 @@ // return Input::eUser input return true; } + // translate raw input to binding TBindMap::iterator bindListIter = mBindings.find(input.mCode); if (bindListIter == mBindings.end()) @@ -305,11 +306,13 @@ ++bindIter ) { + /* const Bind& bind = (*bindIter); //printf("Looking at: %d %d %d", (*bind).mCode, (*bind).cmd, (*bind).modifier); - if (bind.modifier == mModifierState) + if (bind.modifier == input.mModState) { + */ #if 0 if (input.mType == Input::eButton) { @@ -320,13 +323,13 @@ #else const Bind& bind = (*bindIter); - //printf("Looking at: %d %d %d", (*bind).mCode, (*bind).cmd, (*bind).modifier); if ( - (bind.modifier == 0 && mModifierState == 0) || - (bind.modifier & mModifierState) + (bind.modifier == 0 && input.mModState == 0) || + (bind.modifier & input.mModState) ) #endif { + input.mId = bind.cmd; return true; } @@ -335,7 +338,7 @@ input.mId = bind.cmd; return true; } - } + //} } input.mId = -1; @@ -404,6 +407,7 @@ { current = tokens.front(); tokens.pop_front(); + bind.modifier |= ParseModifier(current); } Modified: trunk/spark/lib/kerosin/renderserver/rendernode.cpp =================================================================== --- trunk/spark/lib/kerosin/renderserver/rendernode.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/kerosin/renderserver/rendernode.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -24,10 +24,13 @@ #include "rendernode.h" using namespace kerosin; +using namespace std; RenderNode::RenderNode() : BaseNode(), - mTransparent(false) + mTransparent(false), + mVisible(true), + mVisibleToggled(true) { } @@ -37,5 +40,19 @@ void RenderNode::SetTransparent() { - mTransparent = true; + mTransparent = true; } + +void RenderNode::SetVisible(bool visible) +{ + if (!mVisibleToggled && mVisible != visible) + mVisibleToggled = true; + mVisible = visible; +} + +bool RenderNode::VisibleToggled() +{ + bool tmp = mVisibleToggled; + mVisibleToggled = false; + return tmp; +} Modified: trunk/spark/lib/kerosin/renderserver/rendernode.h =================================================================== --- trunk/spark/lib/kerosin/renderserver/rendernode.h 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/kerosin/renderserver/rendernode.h 2010-06-01 13:04:58 UTC (rev 207) @@ -45,8 +45,15 @@ bool IsTransparent() { return mTransparent; } void SetTransparent(); + + void SetVisible(bool visible); + bool IsVisible() const { return mVisible; } + bool VisibleToggled(); + private: bool mTransparent; + bool mVisible; + bool mVisibleToggled; }; DECLARE_ABSTRACTCLASS(RenderNode); Modified: trunk/spark/lib/kerosin/renderserver/rendernode_c.cpp =================================================================== --- trunk/spark/lib/kerosin/renderserver/rendernode_c.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/kerosin/renderserver/rendernode_c.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -29,8 +29,26 @@ return true; } +FUNCTION(RenderNode,setVisible) +{ + int visible; + + if ( + (in.GetSize() != 1) || + (! in.GetValue(in.begin(), visible)) + ) + { + return false; + } + + + obj->SetVisible(visible); + return true; +} + void CLASS(RenderNode)::DefineClass() { DEFINE_BASECLASS(oxygen/BaseNode); DEFINE_FUNCTION(setTransparent); + DEFINE_FUNCTION(setVisible); } Modified: trunk/spark/lib/kerosin/renderserver/renderserver.cpp =================================================================== --- trunk/spark/lib/kerosin/renderserver/renderserver.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/kerosin/renderserver/renderserver.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -251,6 +251,10 @@ { boost::shared_ptr<RenderNode> renderNode = shared_dynamic_cast<RenderNode>(node); if (renderNode.get() != 0 && + !renderNode->IsVisible()) + return; + + if (renderNode.get() != 0 && ((pass == 0 && !renderNode->IsTransparent()) || (pass == 1 && renderNode->IsTransparent())) ) { Modified: trunk/spark/lib/kerosin/sceneserver/singlematnode_c.cpp =================================================================== --- trunk/spark/lib/kerosin/sceneserver/singlematnode_c.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/kerosin/sceneserver/singlematnode_c.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -40,10 +40,28 @@ return obj->SetMaterial(inName); } +FUNCTION(SingleMatNode,setVisible) +{ + int visible; + + if ( + (in.GetSize() != 1) || + (! in.GetValue(in.begin(), visible)) + ) + { + return false; + } + + + obj->SetVisible(visible); + return true; +} + void CLASS(SingleMatNode)::DefineClass() { DEFINE_BASECLASS(kerosin/StaticMesh); DEFINE_FUNCTION(setMaterial); + DEFINE_FUNCTION(setVisible); } Modified: trunk/spark/lib/kerosin/sceneserver/staticmesh_c.cpp =================================================================== --- trunk/spark/lib/kerosin/sceneserver/staticmesh_c.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/kerosin/sceneserver/staticmesh_c.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -144,15 +144,9 @@ return true; } -FUNCTION(RenderNode,setTransparent) -{ - obj->SetTransparent(); - return true; -} - void CLASS(StaticMesh)::DefineClass() { - DEFINE_BASECLASS(oxygen/BaseNode); + DEFINE_BASECLASS(kerosin/RenderNode); DEFINE_FUNCTION(load); DEFINE_FUNCTION(setScale); DEFINE_FUNCTION(setCastShadows) @@ -160,5 +154,4 @@ DEFINE_FUNCTION(setExternalMeshName) DEFINE_FUNCTION(setExternalMeshScale) DEFINE_FUNCTION(resetMaterials) - DEFINE_FUNCTION(setTransparent); } Modified: trunk/spark/lib/oxygen/simulationserver/simulationserver.cpp =================================================================== --- trunk/spark/lib/oxygen/simulationserver/simulationserver.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/lib/oxygen/simulationserver/simulationserver.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -237,6 +237,7 @@ mSimTime += mSumDeltaTime; mSumDeltaTime = 0; } + usleep(10000); } void SimulationServer::ControlEvent(EControlEvent event) Modified: trunk/spark/plugin/inputsdl/keyboardsdl.cpp =================================================================== --- trunk/spark/plugin/inputsdl/keyboardsdl.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/plugin/inputsdl/keyboardsdl.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -24,6 +24,7 @@ #include <zeitgeist/logserver/logserver.h> using namespace kerosin; +using namespace std; KeyboardSDL::KeyboardSDL() : InputDeviceSDL() @@ -213,8 +214,7 @@ return 1; } - unsigned int& modState = - mInputSystem->GetInputServer()->GetModifierState(); + unsigned int modState; modState = Input::eNone; @@ -238,6 +238,16 @@ modState |= Input::eRAlt; } + if (event->key.keysym.mod & KMOD_LCTRL) + { + modState |= Input::eLCtrl; + } + + if (event->key.keysym.mod & KMOD_RCTRL) + { + modState |= Input::eRCtrl; + } + if (event->key.keysym.sym == 0) { return 1; @@ -254,6 +264,7 @@ Input input(Input::eButton, sym); input.mData.l = (event->type == SDL_KEYDOWN); + input.mModState = modState; mInputSystem->AddInputInternal(input); return 0; Modified: trunk/spark/plugin/inputsdl/mousesdl.cpp =================================================================== --- trunk/spark/plugin/inputsdl/mousesdl.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/plugin/inputsdl/mousesdl.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -69,6 +69,7 @@ } input.mData.l = (event->type == SDL_MOUSEBUTTONDOWN); + input.mModState = 0; mInputSystem->AddInputInternal(input); return 0; } Modified: trunk/spark/plugin/sparkmonitor/sparkmonitor.cpp =================================================================== --- trunk/spark/plugin/sparkmonitor/sparkmonitor.cpp 2010-06-01 11:03:37 UTC (rev 206) +++ trunk/spark/plugin/sparkmonitor/sparkmonitor.cpp 2010-06-01 13:04:58 UTC (rev 207) @@ -233,11 +233,6 @@ void SparkMonitor::DescribeMesh(stringstream& ss, boost::shared_ptr<StaticMesh> mesh) { - if (! mFullState) - { - return DescribeBaseNode(ss); - } - boost::shared_ptr<SingleMatNode> singleMat = shared_dynamic_cast<SingleMatNode>(mesh); @@ -249,6 +244,15 @@ ss << "(nd StaticMesh"; } + if (mFullState || mesh->VisibleToggled()) + if (mesh->IsVisible()) + ss << " (setVisible 1)"; + else + ss << " (setVisible 0)"; + + if (! mFullState) + return; + if (mesh->IsTransparent()) { ss << " (setTransparent)"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |