⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rubyscenegraph.cpp

📁 3D仿真组实物机器人环境下的机器人模型的设计工具。可以查看和修改现有模型的详细参数
💻 CPP
📖 第 1 页 / 共 3 页
字号:
          {            cerr << "TRubySceneGraph::ParseMain: Unterminated define statement" << endl;            return false;          }          strDefine += ')';          i++;          if( !parseDefinition( strDefine ) )          {            cerr << "TRubySceneGraph::ParseMain: Exited due to fatal error in define statements" << endl;            return false;          }        }        ///-------------------------------------- 1: Till here 1---------------------------------------------------------        str += buff[i];      }    }  }  while( !file.eof() );  /// -------------------------------------------2: take out eval statements --------------------------------------  while( (index = str.find( "(eval", 0, 5 ) ) != str.npos )  {    pran = 1;    i = index;    strEval = "(";    while( pran > 0 && i < str.size() )    {      i++;      if( str[i] == ')' )        pran--;      else if( str[i] == '(' )        pran++;      strEval += str[i];    }    i++;   /// Because the last check, does not increment i    str.erase( str.begin() + index, str.begin() + i );    i = 0;    TGenericData data = evaluate( strEval, i );    if( data.getAsString() == "NaN" )    {      cerr << "TRubySceneGraph::ParseMain: Evaluation failed, exiting..." << endl;      return false;    }    str.insert( index, data.getAsString() );  }  /// ----------------------------------------3: take out variables ------------------------------------  while( (index = str.find( "$", 0, 1 ) ) != str.npos )  {    pran = 1;    i = index;    Parse::getToken( str, i, strVar );    str.erase( str.begin() + index, str.begin() + i );    i = 0;        PGenericData data = getParam( strVar );    if( data == NULL )      cerr << "TRubySceneGraph::ParseMain: Variable replace failed, loading continus, but may result in failure..." << endl;    else      str.insert( index, data->getAsString() );  }  /// ------------------------------------------4: Loading finished ------------------------------------------  /** ---------------------------------------  WOOOOOOO HOOOOOOOOOO !----------------------------------------- **/  clearDatas();  clearScene();  index = 0;  i = index;  if( !loadSceneBasicInfo( str, i ) )    return false;  str.erase( str.begin() + index, str.begin() + i );  /// --------------> Now parse the transform nodes  if( !Parse::gotoFirstParsableModule( str, index ) || str[index] == ')' )  {    cerr << "TRubySceneGraph::ParseMain: ??? What is it? ')' in begining!'" << endl;    return false;  }  if( str[index] != '(' )  {    cerr << "TRubySceneGraph::ParseMain: This is not the begining of information" << endl;    return false;  }  ++index;  pran = 1;  i = index;  string strToken;  Parse::gotoFirstParsableModule( str, i );  while( i < str.size() && str[i] != ')' )  {    if( str.compare( i, 1, "(" ) != 0 )    {      cerr << "TSceneNode::parseAndLoad: Unknown token parsed" << endl;      break;    }    pran++;    strToken = "(";    while( pran > 1 && i < str.size() ) /// 1: because of the node itself has a pranthesis    {      i++;      if( str[i] == ')' )        pran--;      else if( str[i] == '(' )        pran++;      strToken += str[i];    }    i++; /// Because the last thing added was not moved forward    if( strToken.compare( 0, 13, "(nd Transform" ) == 0 ||        strToken.compare( 0, 15, "(nd AgentAspect" ) == 0 ||        strToken.compare( 0, 13, "(nd CCylinder" ) == 0 ||        strToken.compare( 0, 7, "(nd Box" ) == 0 ||        strToken.compare( 0, 9, "(nd Space") == 0 )    {      TSceneNode * node = new TSceneNode;      if( !node->parseAndLoad( strToken, NULL, m_Nodes, m_Joints ) )        delete node;    }    else      cerr << "TRubySceneGraph::ParseMain: Unknown sub_token was token: '" << strToken << "'" << endl;    Parse::gotoFirstParsableModule( str, i );  }  return true;}/** * This method removes joints that are in the given list from the inside * list of joints * @param joints Joints to remove from scene */void TRubySceneGraph::removeJointsFromList( TJointList & joints ){  for( unsigned i = 0; i < joints.size(); i++ )    for( unsigned j = 0; j < m_Joints.size(); j++ )      if( m_Joints[j] == joints[i] )      {        if( OpenGLEngine )          OpenGLEngine->removeObject(m_Joints[j]);        delete m_Joints[j];        m_Joints.erase( m_Joints.begin() + j );        break;      }}/*! This method removes a node from the scene based on a message recieved    \param index Identifier of node    \return bool Indicating removal was successfull */bool TRubySceneGraph::cmdRemoveNode( unsigned index ){  if( index >= 0 && index < m_Nodes.size() )  {    if( OpenGLEngine != NULL )      OpenGLEngine->removeObject( m_Nodes[index] );    TJointList joints;    m_Nodes[index]->queryJoints( joints );    removeJointsFromList( joints );    if( m_Nodes[index]->getParrent() != NULL )      m_Nodes[index]->getParrent()->removeChild( m_Nodes, m_Nodes[index] );    else    {      m_Nodes[index]->clearChildren( m_Nodes );      delete m_Nodes[index];      m_Nodes.erase( m_Nodes.begin() + index );    }    return true;  }  cerr << "TRubySceneGraph::removeNodeFromName: Couldn't remove node '" << index << "'. Index out of bounds" << endl;  return false;}/*! This method adds a node (body component) from a recieved message    \param msg Message to add the node from    \return bool Indicating a node was added successfully */bool TRubySceneGraph::cmdAddNode( TMessage msg ){  if( msg.m_Shape == SHAPE_ILLEGAL )  {    cerr << "TRubySceneGraph::cmdAddNode: attempted to add a node with an illegal shape" << endl;    return false;  }  TSceneNode * node = new TSceneNode;  node->setNodeName( "Transform" );  node->setName( msg.m_Name.c_str() );  node->setPosition( msg.m_Position );  node->setShape( (TShape)msg.m_Shape );  node->setMaterial( msg.m_Material );  if( msg.m_Shape == SHAPE_SPHERE )    node->setRadius( msg.m_Size.getX() );  else  {    node->setLength( msg.m_Size.getX() );    node->setWidth( msg.m_Size.getY() );    node->setHeight( msg.m_Size.getZ() );  }    unsigned pindex;  if( getNodeWithID( msg.m_ParrentIndex, &pindex ) )    node->setParrent( m_Nodes[pindex] );  else if( msg.m_ParrentIndex != -1 )  {    cerr << "TRubySceneGraph::cmdAddNode: attempted to set parrent node illegal: '"         << msg.m_ParrentIndex << "'" << endl;    delete node;    return false;  }  m_Nodes.push_back( node );  if( OpenGLEngine != NULL && node->getParrent() == NULL )    OpenGLEngine->addObject( node );  return true;}/*! This message edits the properties of a node from the recieved message    \param msg message to use fro update    \param index Index of the node change its attributes    \return bool Indicating update was successfull */bool TRubySceneGraph::cmdEditNode( TMessage msg, unsigned index ){  if( msg.m_Command != CMD_NODE_RENAME && m_Nodes[index]->getNodeName() == NODE_SPACE )  {    cerr << "TRubySceneGraph::cmdEditNode: A space node is being requested to change" << endl;    return false;  }  if( msg.m_Command == CMD_NODE_RESIZE )  {    if( m_Nodes[ index ]->getShape() == SHAPE_SPHERE )      m_Nodes[ index ]->setRadius( msg.m_Size.getX() );    else    {      m_Nodes[ index ]->setLength( msg.m_Size.getX() );      m_Nodes[ index ]->setWidth ( msg.m_Size.getY() );      m_Nodes[ index ]->setHeight( msg.m_Size.getZ() );    }  }  else if( msg.m_Command == CMD_NODE_POSITION )    m_Nodes[ index ]->setPosition( msg.m_Position );  else if( msg.m_Command == CMD_NODE_RENAME )  {    for( unsigned j = 0; j < m_Nodes.size(); j++ )      if( m_Nodes[j]->getName() == msg.m_Name )      {        cerr << "TRubySceneGraph::cmdEditNode: Scene update failed due to name conflict" << endl;        return false;      }    m_Nodes[ index ]->setName( msg.m_Name );  }  else if( msg.m_Command == CMD_NODE_REMATERIAL )  {    m_Nodes[ index ]->setMaterial( msg.m_Material );  }  else if( msg.m_Command == CMD_NODE_REPARRENT )  {    OpenGLEngine->removeObject(m_Nodes[index]);    if( msg.m_Name == m_Nodes[index]->getName() )    {      cerr << "TRubySceneGraph::cmdEditNode: Can not reparent node to itself'" << msg.m_Name << "'" << endl;      return false;    }    TSceneNode * par = NULL;    for( unsigned k = 0; k < m_Nodes.size(); k++ )      if( m_Nodes[k]->getName() == msg.m_Name )        par = m_Nodes[k];    if( par == NULL && msg.m_Name != "" )    {      cerr << "TRubySceneGraph::cmdEditNode: Could not find parrent '" << msg.m_Name << "'" << endl;      return false;    }    m_Nodes[ index ]->setParrent( par );  }  else if( msg.m_Command == CMD_NODE_RESHAPE )    m_Nodes[ index ]->setShape( (TShape)msg.m_Shape );  else if( msg.m_Command == CMD_NODE_MASS )    m_Nodes[ index ]->setMass( (TShape)msg.m_Mass );  else  {    cerr << "TRubySceneGraph::cmdEditNode: Scene update failed due to uncomprehendable command" << endl;    return false;  }  return true;}/*! This method remopves a joint from the recieved message    Joint index passed to this proceudre should be in: [0..max-1]    \param index Number of the joint    \return bool Indicating wheather joint was deleted */bool TRubySceneGraph::cmdRemoveJoint( unsigned index ){  if( index < 0 || index >= m_Joints.size() )  {    cerr << "TRubySceneGraph::cmdRemoveJoint: Joint specified with index '"         << index << "' is not found" << endl;    return false;  }  for( unsigned i = 0; i < m_Nodes.size(); i++ )    m_Nodes[i]->removeJoint( m_Joints[index] );  if( OpenGLEngine != NULL )    OpenGLEngine->removeObject( m_Joints[index] );  m_Joints.erase( m_Joints.begin() + index );  return true;}/*! This method adds a joint from the recieved message    \param msg Message recieved to build a joint from    \return bool Indicating wheather joint added */bool TRubySceneGraph::cmdAddJoint( TMessage msg ){  if( msg.m_Shape == JOINT_ILLEGAL )  {    cerr << "TRubySceneGraph::cmdAddJoint: attempted to add a joint with an illegal type" << endl;    return false;  }  bool found = true;  int num = -1;  while(found)  {    num++;    found = false;    for( unsigned i = 0; i < m_Joints.size(); i++ )      if( m_Joints[i]->getNumber() == num )      {        found = true;        break;      }  }  TSceneJoint * joint = new TSceneJoint;  joint->setNumber( num );  joint->setAnchor( msg.m_Position );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -