dSceneGraph::dSceneGraph(const dSceneGraph& me) :dTree<dGraphNode, unsigned>(), m_lru (0) { // add all nodes from me, Iterator iter (me); for (iter.Begin(); iter; iter ++) { dGraphNode& srcNode = iter.GetNode()->GetInfo(); AddNode (srcNode.m_nodeInfo, NULL); } //now connect all edges for (iter.Begin(); iter; iter ++) { dGraphNode& srcNode = iter.GetNode()->GetInfo(); dGraphNode& myNode = Find(srcNode.m_nodeInfo->GetUniqueID())->GetInfo(); for (dGraphNode::dLink::dListNode* srcEdge = srcNode.m_children.GetFirst(); srcEdge; srcEdge = srcEdge->GetNext()) { dGraphNode& srcLinkNode = srcEdge->GetInfo()->GetInfo(); dTreeNode* myLinkNode = Find(srcLinkNode.m_nodeInfo->GetUniqueID()); //myNode.m_children.Append(srcEdge->GetInfo()); myNode.m_children.Append(myLinkNode); } for (dGraphNode::dLink::dListNode* srcEdge = srcNode.m_parents.GetFirst(); srcEdge; srcEdge = srcEdge->GetNext()) { dGraphNode& srcLinkNode = srcEdge->GetInfo()->GetInfo(); dTreeNode* myLinkNode = Find(srcLinkNode.m_nodeInfo->GetUniqueID()); //myNode.m_parents.Append(srcEdge->GetInfo()); myNode.m_parents.Append(myLinkNode); } } m_rootNode = Find(me.GetRootNode()->GetInfo().GetNode()->GetUniqueID()); }
~TextureCache () { Iterator iter (*this); for (iter.Begin(); iter; iter ++) { glDeleteTextures(1, &iter.GetNode()->GetInfo().m_textureID); } }
const char* FindById (GLuint id) const { Iterator iter (*this); for (iter.Begin(); iter; iter ++) { if (iter.GetNode()->GetInfo().m_textureID == id) { return iter.GetNode()->GetInfo().m_textureName; } } return NULL; }
void RemoveById (GLuint id) { Iterator iter (*this); for (iter.Begin(); iter; iter ++) { if (iter.GetNode()->GetInfo().m_textureID == id) { Remove (iter.GetNode()); break; } } }
dTreeNode* FindById (GLuint id) const { Iterator iter (*this); for (iter.Begin(); iter; iter ++) { if (iter.GetNode()->GetInfo().m_textureID == id) { //return iter.GetNode()->GetInfo().m_textureName.GetStr(); return iter.GetNode(); } } return NULL; }
void dgDeadJoints::DestroyJoints(dgWorld& world) { dgSpinLock (&m_lock); Iterator iter (*this); for (iter.Begin(); iter; iter++) { dgTreeNode* const node = iter.GetNode(); dgConstraint* const joint = node->GetInfo(); world.DestroyConstraint (joint); } RemoveAll (); dgSpinUnlock(&m_lock); }
void NewtonDeadJoints::DestroyJoints(Newton& world) { Iterator iter (*this); for (iter.Begin(); iter; ) { dgTreeNode* const node = iter.GetNode(); iter ++; dgConstraint* const joint = node->GetInfo(); if (joint) { Remove (node); world.DestroyConstraint (joint); } } }
void NewtonDeadBodies::DestroyBodies(Newton& world) { Iterator iter (*this); for (iter.Begin(); iter; ) { dgTreeNode* const node = iter.GetNode(); iter ++; dgBody* const body = node->GetInfo(); if (body) { Remove (node); world.DestroyBody(body); } } }
void dgDeadBodies::DestroyBodies(dgWorld& world) { dgSpinLock (&m_lock); Iterator iter (*this); for (iter.Begin(); iter; iter++) { dgTreeNode* const node = iter.GetNode(); dgBody* const body = node->GetInfo(); world.DestroyBody(body); } RemoveAll (); dgSpinUnlock(&m_lock); }
void dSceneGraph::Cleanup() { Iterator iter (*this); for (iter.Begin(); iter; iter ++) { dGraphNode& info = (*iter); info.m_parents.RemoveAll(); info.m_children.RemoveAll(); info.m_nodeInfo->Release(); info.m_nodeInfo = NULL; } RemoveAll(); m_rootNode = NULL; }
void RemoveById (GLuint id) { Iterator iter (*this); for (iter.Begin(); iter; iter ++) { TextureEntry& entry = iter.GetNode()->GetInfo(); if (entry.m_textureID == id) { if (entry.GetRef() == 1) { glDeleteTextures(1, &id); Remove (iter.GetNode()); } break; } } }
void dSceneGraph::Serialize (TiXmlElement* rootNode) const { // save scenes nodes TiXmlElement* nodes = new TiXmlElement ("nodes"); rootNode->LinkEndChild(nodes); dTree<int, dTreeNode*> enumerator; int index = 0; Iterator iter (*this); for (iter.Begin(); iter; iter ++) { dTreeNode* node = iter.GetNode(); //dNodeInfo* info = node->GetInfo().GetNode(); enumerator.Insert (index, node); index ++; } nodes->SetAttribute("count", index); int indexList[D_GRAPH_MAX_STACK_DEPTH]; char text[D_GRAPH_MAX_STACK_DEPTH * 32]; for (iter.Begin(); iter; iter ++) { dTreeNode* node = iter.GetNode(); // TiXmlElement* infoNode = node->GetInfo().GetNode()->Serialize(nodes); dNodeInfo* info = node->GetInfo().GetNode(); TiXmlElement* infoNode = new TiXmlElement (info->GetClassName()); nodes->LinkEndChild(infoNode); info->Serialize (infoNode); _ASSERTE (infoNode); int nodeCount = 0; for (dGraphNode::dLink::dListNode* edgeNode = node->GetInfo().m_parents.GetFirst(); edgeNode; edgeNode = edgeNode->GetNext()) { dTree<int, dTreeNode*>::dTreeNode* edge = enumerator.Find (edgeNode->GetInfo()); _ASSERTE (edge); // if (edge) { indexList[nodeCount] = edge->GetInfo(); nodeCount ++; _ASSERTE (nodeCount < (sizeof (indexList) / sizeof (indexList[0]))); // } } if (nodeCount) { dIntArrayToString (indexList, nodeCount, text, sizeof (text)); TiXmlElement* parent = new TiXmlElement ("parentNodes"); parent->SetAttribute("count", nodeCount); parent->SetAttribute("indices", text); infoNode->LinkEndChild(parent); } nodeCount = 0; for (dGraphNode::dLink::dListNode* edgeNode = node->GetInfo().m_children.GetFirst(); edgeNode; edgeNode = edgeNode->GetNext()) { dTree<int, dTreeNode*>::dTreeNode* edge = enumerator.Find (edgeNode->GetInfo()); _ASSERTE (edge); // if (edge) { indexList[nodeCount] = edge->GetInfo(); nodeCount ++; _ASSERTE (nodeCount < (sizeof (indexList) / sizeof (indexList[0]))); // } } if (nodeCount) { dIntArrayToString (indexList, nodeCount, text, sizeof (text)); TiXmlElement* parent = new TiXmlElement ("childrenNodes"); parent->SetAttribute("count", nodeCount); parent->SetAttribute("indices", text); infoNode->LinkEndChild(parent); } } }