00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00042 #include "../include/IPSA/SoPrefixNode.h"
00043 #include "../include/IPSA/SoPhysics.h"
00044 #include "../include/IPSA/SoJoint.h"
00045 #include "../include/IPSA/SoCollisionShape.h"
00046
00047 #include <Inventor/nodes/SoSeparator.h>
00048
00049 SO_NODE_SOURCE(SoPrefixNode);
00050
00051
00054 void SoPrefixNode::initClass()
00055 {
00056 SO_NODE_INIT_CLASS(SoPrefixNode, SoSeparator, "Separator");
00057 }
00058
00059
00062 SoPrefixNode::SoPrefixNode()
00063 {
00064 SO_NODE_CONSTRUCTOR(SoPrefixNode);
00065 isBuiltIn = TRUE;
00066
00067 SO_NODE_ADD_FIELD(prefix, (""));
00068
00069 }
00070
00071
00075 SoNode* SoPrefixNode::copy(SbBool copyConnections) const
00076 {
00077
00078
00079 SoPrefixNode *newSoPrefixNode = (SoPrefixNode *) SoNode::copy(copyConnections);
00080 return newSoPrefixNode;
00081 }
00082
00083
00086 SoPrefixNode::~SoPrefixNode()
00087 {
00088 }
00089
00090
00096 void SoPrefixNode::updatePrefixes()
00097 {
00098 SoSeparator* graph = new SoSeparator;
00099 for (int i = 0; i < this->getChildren()->getLength(); i++) {
00100 graph->addChild(this->getChild(i));
00101 }
00102
00103 if (NULL == this && NULL == graph)
00104 return;
00105 SoCallbackAction updatePrefixes;
00106 updatePrefixes.addPostCallback(SoPhysics::getClassTypeId(), SoPrefixNode::UpdatePrefixesCB, this);
00107 updatePrefixes.addPostCallback(SoJoint::getClassTypeId(), SoPrefixNode::UpdateJointsCB, this);
00108 updatePrefixes.addPostCallback(SoCollisionShape::getClassTypeId(), SoPrefixNode::UpdatePrefixesCB, this);
00109 updatePrefixes.apply(graph);
00110 }
00111
00112
00120 SoCallbackAction::Response SoPrefixNode::UpdatePrefixesCB(void* userdata, SoCallbackAction*, const SoNode* node)
00121 {
00122 SoPrefixNode* prefixNode = static_cast<SoPrefixNode*> (userdata);
00123 SoNode* currentNode = dynamic_cast<SoNode*> (const_cast<SoNode*> (node));
00124 if (NULL != currentNode && NULL != prefixNode)
00125 {
00126 SbString nodeName(currentNode->getName());
00127 int prefixIndex = nodeName.find(prefixNode->prefix.getValue());
00128 if (-1 != prefixIndex || 0 == prefixIndex)
00129 return SoCallbackAction::CONTINUE;
00130 currentNode->setName(SoPrefixNode::PrependPrefixToString(prefixNode->prefix.getValue(), nodeName));
00131 }
00132 return SoCallbackAction::CONTINUE;
00133 }
00134
00135
00144 SoCallbackAction::Response SoPrefixNode::UpdateJointsCB(void* userdata, SoCallbackAction*, const SoNode* node)
00145 {
00146 SoPrefixNode::UpdatePrefixesCB(userdata, NULL, node);
00147 SoPrefixNode* prefixNode = static_cast<SoPrefixNode*> (userdata);
00148 SoJoint* joint = static_cast<SoJoint*> (const_cast<SoNode*> (node));
00149 if (NULL != joint && NULL != prefixNode)
00150 {
00151 if (0 != joint->Bodyname1.getValue().getLength())
00152 joint->Bodyname1.setValue(SoPrefixNode::PrependPrefixToString(prefixNode->prefix.getValue(), joint->Bodyname1.getValue().getString()));
00153 if (0 != joint->Bodyname2.getValue().getLength())
00154 joint->Bodyname2.setValue(SoPrefixNode::PrependPrefixToString(prefixNode->prefix.getValue(), joint->Bodyname2.getValue().getString()));
00155 }
00156 return SoCallbackAction::CONTINUE;
00157 }
00158
00159
00166 SbString SoPrefixNode::PrependPrefixToString(const SbString& aPrefix, const SbString& oldString)
00167 {
00168 SbString prefixedString;
00169 prefixedString.sprintf("%s%s", aPrefix.getString(), oldString.getString());
00170 return prefixedString;
00171 }
00172