📄 rubyscenegraph.cpp
字号:
{ 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 + -