Beispiel #1
0
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());
}
	void RemoveById (GLuint id)
	{
		Iterator iter (*this);
		for (iter.Begin(); iter; iter ++) {
			if (iter.GetNode()->GetInfo().m_textureID == id) {
				Remove (iter.GetNode());
				break;
			}
		}
	}
	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;
	}
	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;
	}
Beispiel #5
0
	void Erase(Iterator pos){
		Node* remNode = pos.GetNode();
		for(Iterator itr = begin(); itr != end(); ++itr){
			if(itr.GetNode()->mNext != remNode) continue;
			itr.GetNode()->mNext = remNode->mNext;
			--mCount;
			if(remNode == mLast)
				mLast = itr.GetNode();

			delete remNode;
			return;
		}
	}
	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;
			}
		}
	}
polynomial operator -(const polynomial &p1)
{
    polynomial negated;

    Iterator<polyterm> P = p1.Begin();

    while(P.GetNode() != NULL)
    {
        Node<polyterm> negTerm = -(*P.GetNode());
        negated.Append(negTerm.Copy());
        P.Next();
    }

    return negated;
}
polynomial& operator +(const polynomial &p1, const polynomial &p2)
{
    polynomial* p3 = new polynomial;

    *p3 = p1;

    Iterator<polyterm> P = p2.Begin();

    while(P.GetNode() != NULL)
    {
       *p3+=*P.GetNode();
       P.Next();
    }
    return *p3;
}
Beispiel #9
0
	T& operator[](const char* key){
		Iterator itr = find(key);
		Node* node = itr.GetNode();
		if(!node)
			itr = add(key, T());
		return (*itr);
	}
	~TextureCache ()
	{
		Iterator iter (*this);
		for (iter.Begin(); iter; iter ++) {
			glDeleteTextures(1, &iter.GetNode()->GetInfo().m_textureID);
		}
	}
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);
}
Beispiel #12
0
	Iterator Find(const char* key) const {
		if(!key) return Iterator(0);

		Hash hash = Hash::Generate(key);
		Node* node = 0;
		for(Iterator itr = Begin(); itr != End(); ++itr){
			if(itr.GetHash() != hash) continue;
			node = itr.GetNode();
			break;
		}
		return Iterator(node);
	}
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);
}
Beispiel #16
0
//}
ostream& operator <<(ostream& out,const polynomial& A)
{
    //cout << "AHEAD = " << *A.head;

    //node *walker = A.head;
    Iterator<polyterm> P = A.Begin();

    while(P.GetNext() != NULL)
    {

        if(P.GetNode()->GetData().Coef() == 0)
        {
            cout << "";
//            walker=walker->next;
            P.GetNext();
        }
        else
        {
            if(P.GetNext()->GetData().Coef() > 0)
            {
                out << P;
                cout << " + ";
                //walker = walker->next;
                P.Next();
            }
            else if(P.GetNext()->GetData().Coef()<0)
            {
                out << P;
                //walker = walker->next;
                P.Next();
            }
            else if(P.GetNext()->GetData().Coef()==0)
            {   out << P;
                out << " + ";
                //walker = walker->next;
                P.Next();
            }
        }

    }
    out << P;
    //P.Next();
    return out;
}
Beispiel #17
0
polynomial& polynomial::operator +=(const Node<polyterm> &a)
{
    //cout << "+= " << a << endl;

    Iterator<polyterm> P = this->Search(a.Copy());

    if(P.GetNode() != NULL)
    {
        Node<polyterm>* oldTerm = this->Remove(P);
        //cout << "oldTerm " << *oldTerm << endl;
        Node<polyterm> newTerm = *oldTerm + a;
       //cout << "newTerm " << newTerm << endl;
        this->InsertSorted(newTerm.Copy());
        //cout << "newPoly = " << *this << endl;
    }
    else
    {
        this->InsertSorted(a.Copy());
    }
    return *this;
}
Beispiel #18
0
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);
		}
	}
}