Changeset 6299 in orxonox.OLD for trunk/src/lib/graphics/render2D/element_2d.cc
- Timestamp:
- Dec 26, 2005, 4:41:09 AM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/graphics/render2D/element_2d.cc
r6295 r6299 30 30 31 31 using namespace std; 32 33 /**34 * standard constructor35 */36 Element2D::Element2D()37 {38 this->init();39 this->setParent2D(NullElement2D::getInstance());40 }41 32 42 33 /** … … 47 38 * itself. Otherwise it would result in an endless Loop. 48 39 */ 49 Element2D::Element2D (Element2D* parent, E2D_LAYER layer) 50 { 51 this->init(); 40 Element2D::Element2D (Element2D* parent, E2D_LAYER layer, short nodeFlags) 41 { 42 this->setClassID(CL_ELEMENT_2D, "Element2D"); 43 44 this->setVisibility(true); 45 this->activate2D(); 46 this->setAlignment(E2D_ALIGN_NONE); 47 this->bindNode = NULL; 48 49 this->parentMode = nodeFlags; 50 this->parent = NULL; 51 this->absDirection = 0.0; 52 this->relDirection = 0.0; 53 this->bRelCoorChanged = true; 54 this->bRelDirChanged = true; 55 this->toCoordinate = NULL; 56 this->toDirection = NULL; 57 this->setSize2D(1, 1); 58 59 52 60 this->layer = layer; 53 // check Parenting, and if ok parent the stuff 54 if (this->parent != NULL) 55 this->setParent2D(parent); 56 else if (NullElement2D::isInstanciated()) 57 this->setParent2D(NullElement2D::getInstance()); 58 } 61 if (parent != NULL) 62 parent->addChild2D(this); 63 } 64 65 66 /** 67 * @brief the mighty NullElement 68 * TopMost Node of them all. 69 */ 70 Element2D* Element2D::nullElement = NULL; 71 59 72 60 73 /** … … 74 87 Element2D::~Element2D () 75 88 { 76 // remove the Node, delete it's children. 77 while (this->children.size() > 0) 78 { 79 Element2D* child = this->children.front(); 80 this->children.pop_front(); 81 delete child; 82 } 89 // remove the Element2D, delete it's children (if required). 90 std::list<Element2D*>::iterator tmp = this->children.begin(); 91 std::list<Element2D*>::iterator deleteNode; 92 while(!this->children.empty()) 93 while (tmp != this->children.end()) 94 { 95 deleteNode = tmp; 96 tmp++; 97 // printf("TEST::%s(%s) %s\n", (*deleteNode)->getName(), (*deleteNode)->getClassName(), this->getName()); 98 if ((this->parentMode & E2D_PROHIBIT_CHILD_DELETE) || 99 ((*deleteNode)->parentMode & E2D_PROHIBIT_DELETE_WITH_PARENT)) 100 { 101 if (this == Element2D::nullElement && (*deleteNode)->parentMode & E2D_REPARENT_TO_NULL) 102 delete (*deleteNode); 103 else 104 (*deleteNode)->reparent2D(); 105 } 106 else 107 delete (*deleteNode); 108 } 109 83 110 if (this->parent != NULL) 84 111 { 85 this->parent->eraseChild (this);112 this->parent->eraseChild2D(this); 86 113 this->parent = NULL; 87 114 } … … 92 119 if (this->toDirection != NULL) 93 120 delete this->toDirection; 94 } 95 96 97 /** 98 * @brief initializes a Element2D 99 */ 100 void Element2D::init() 101 { 102 this->setClassID(CL_ELEMENT_2D, "Element2D"); 103 104 this->setVisibility(true); 105 this->setActiveness(true); 106 this->setAlignment(E2D_ALIGN_NONE); 107 this->layer = E2D_DEFAULT_LAYER; 108 this->bindNode = NULL; 109 110 this->setParentMode2D(E2D_PARENT_ALL); 111 this->parent = NULL; 112 this->absDirection = 0.0; 113 this->relDirection = 0.0; 114 this->bRelCoorChanged = true; 115 this->bRelDirChanged = true; 116 this->toCoordinate = NULL; 117 this->toDirection = NULL; 118 this->setSize2D(1,1); 119 } 121 122 if (this == Element2D::nullElement) 123 Element2D::nullElement = NULL; 124 } 125 120 126 121 127 /** … … 161 167 LOAD_PARAM_START_CYCLE(root, element); 162 168 { 163 LoadParam_CYCLE(element, " parent", this, Element2D, addChild2D)169 LoadParam_CYCLE(element, "child", this, Element2D, addChild2D) 164 170 .describe("adds a new Child to the current Node."); 165 171 } … … 213 219 214 220 /** 215 * sets a node, this 2D-Element should be shown upon221 * @brief sets a node, this 2D-Element should be shown upon 216 222 * @param bindNode the name of the Node (should be existing) 217 223 */ … … 511 517 { 512 518 PRINTF(5)("Element2D::addChild() - reparenting node: removing it and adding it again\n"); 513 child->parent->eraseChild(child); 514 } 515 child->parent = this; 516 if (likely(this != NULL)) 517 { 518 // ELEMENT SORTING TO LAYERS // 519 unsigned int childCount = this->children.size(); 520 521 list<Element2D*>::iterator elem; 522 for (elem = this->children.begin(); elem != this->children.end(); elem++) 523 { 524 if ((*elem)->layer < child->layer) 525 { 526 this->children.insert(elem, child); 527 break; 528 } 529 } 530 531 if (childCount == this->children.size()) 532 this->children.push_back(child); 533 //////////////////////////////// 534 if (unlikely(this->layer > child->getLayer())) 535 { 536 PRINTF(2)("Layer '%s' of Child(%s) lower than parents(%s) layer '%s'. updating...\n", 537 Element2D::layer2DToChar(child->getLayer()),child->getName(), this->getName(), Element2D::layer2DToChar(this->layer)); 538 child->setLayer(this->layer); 539 } 540 } 541 child->parentCoorChanged(); 519 child->parent->eraseChild2D(child); 520 } 521 if (this->checkIntegrity(child)) 522 { 523 child->parent = this; 524 if (likely(this != NULL)) 525 { 526 // ELEMENT SORTING TO LAYERS // 527 unsigned int childCount = this->children.size(); 528 529 list<Element2D*>::iterator elem; 530 for (elem = this->children.begin(); elem != this->children.end(); elem++) 531 { 532 if ((*elem)->layer < child->layer) 533 { 534 this->children.insert(elem, child); 535 break; 536 } 537 } 538 if (childCount == this->children.size()) 539 this->children.push_back(child); 540 //////////////////////////////// 541 if (unlikely(this->layer > child->getLayer())) 542 { 543 PRINTF(2)("Layer '%s' of Child(%s) lower than parents(%s) layer '%s'. updating...\n", 544 Element2D::layer2DToChar(child->getLayer()),child->getName(), this->getName(), Element2D::layer2DToChar(this->layer)); 545 child->setLayer(this->layer); 546 } 547 } 548 else 549 { 550 PRINTF(1)("Tried to reparent2D to own child '%s::%s' to '%s::%s'.\n", 551 this->getClassName(), this->getName(), child->getClassName(), child->getName()); 552 child->parent = NULL; 553 } 554 } 555 child->parentCoorChanged2D(); 542 556 } 543 557 … … 566 580 567 581 /** 582 * !! PRIVATE FUNCTION 583 * @brief reparents an Element2D (happens on Parents Node delete or remove and Flags are set.) 584 */ 585 void Element2D::reparent2D() 586 { 587 if (this->parentMode & E2D_REPARENT_TO_NULL) 588 this->setParent2D((Element2D*)NULL); 589 else if (this->parentMode & E2D_REPARENT_TO_PARENTS_PARENT && this->parent != NULL) 590 this->setParent2D(this->parent->getParent2D()); 591 else 592 this->setParent2D(Element2D::getNullElement()); 593 } 594 595 596 /** 597 * @param child the child to be erased from this Nodes List 598 */ 599 void Element2D::eraseChild2D(Element2D* child) 600 { 601 assert (this != NULL && child != NULL); 602 std::list<Element2D*>::iterator childIT = std::find(this->children.begin(), this->children.end(), child); 603 this->children.erase(childIT); 604 } 605 606 607 608 /** 568 609 * remove this Element from the tree and adds all children to NullElement2D 569 610 * … … 572 613 void Element2D::remove2D() 573 614 { 574 list<Element2D*>::iterator child; 575 for (child = this->children.begin(); child != this->children.end(); child++) 576 NullElement2D::getInstance()->addChild2D(*child); 577 578 this->children.clear(); 579 615 list<Element2D*>::iterator child = this->children.begin(); 616 list<Element2D*>::iterator reparenter; 617 while (child != this->children.end()) 618 { 619 reparenter = child; 620 child++; 621 if (this->parentMode & E2D_REPARENT_CHILDREN_ON_REMOVE || 622 (*reparenter)->parentMode & E2D_REPARENT_ON_PARENTS_REMOVE) 623 { 624 printf("TEST----------------%s ---- %s\n", this->getClassName(), (*reparenter)->getClassName()); 625 (*reparenter)->reparent2D(); 626 printf("REPARENTED TO: %s::%s\n",(*reparenter)->getParent2D()->getClassName(),(*reparenter)->getParent2D()->getName()); 627 } 628 } 580 629 if (this->parent != NULL) 581 630 { 582 this->parent->eraseChild (this);631 this->parent->eraseChild2D(this); 583 632 this->parent = NULL; 584 633 } 585 634 } 586 635 587 /**588 * sets the parent of this Element2D589 * @param parent the Parent to set590 */591 void Element2D::setParent2D (Element2D* parent)592 {593 parent->addChild2D(this);594 }595 636 596 637 /** … … 603 644 if (parentNode != NULL) 604 645 parentNode->addChild2D(this); 605 646 else 647 PRINTF(2)("Not Found Element2D's (%s::%s) new Parent by Name: %s\n", 648 this->getClassName(), this->getName(), parentName); 606 649 } 607 650 … … 634 677 parentNode->addChild2D(this); 635 678 636 if (this->parentMode & PNODE_ROTATE_MOVEMENT) //! @todo implement this.679 if (this->parentMode & E2D_PARENT_ROTATE_MOVEMENT) //! @todo implement this. 637 680 ;//this->setRelCoor(this->parent->getAbsDir().inverse().apply(tmpV - this->parent->getAbsCoor())); 638 681 else … … 656 699 } 657 700 658 /** @param child the child to be erased from this Nodes List */ 659 void Element2D::eraseChild(Element2D* child) 660 { 661 assert (this != NULL && child != NULL); 662 std::list<Element2D*>::iterator childIT = std::find(this->children.begin(), this->children.end(), child); 663 this->children.erase(childIT); 664 } 701 /** 702 * @param parentMode sets the parentingMode of this Node 703 */ 704 void Element2D::setParentMode2D(E2D_PARENT_MODE parentMode) 705 { 706 this->parentMode &= (0xfff0 | parentMode); 707 } 708 665 709 666 710 /** … … 672 716 this->setParentMode2D(Element2D::charToParentingMode2D(parentingMode)); 673 717 } 718 719 720 /** 721 * @returns the NullElement (and if needed (most probably) creates it) 722 */ 723 Element2D* Element2D::createNullElement() 724 { 725 if (likely(Element2D::nullElement == NULL)) 726 { 727 Element2D::nullElement = new Element2D(NULL, E2D_LAYER_BELOW_ALL, E2D_PARENT_MODE_DEFAULT | E2D_REPARENT_TO_NULL); 728 Element2D::nullElement->setName("NullElement"); 729 } 730 return Element2D::nullElement; 731 } 732 733 734 /** 735 * !! PRIVATE FUNCTION 736 * @brief checks the upward integrity (e.g if Element2D is somewhere up the Node tree.) 737 * @param checkParent the Parent to check. 738 * @returns true if the integrity-check succeeds, false otherwise. 739 * 740 * If there is a second occurence of checkParent before NULL, then a loop could get 741 * into the Tree, and we do not want this. 742 */ 743 bool Element2D::checkIntegrity(const Element2D* checkParent) const 744 { 745 const Element2D* parent = this; 746 while ( (parent = parent->getParent2D()) != NULL) 747 if (unlikely(parent == checkParent)) 748 return false; 749 return true; 750 } 751 674 752 675 753 /** … … 796 874 797 875 // UPDATE CHILDREN 798 if( this->children.size() > 0)876 if(!this->children.empty() || this->parentMode & E2D_UPDATE_CHILDREN_IF_INACTIVE) 799 877 { 800 878 list<Element2D*>::iterator child; … … 803 881 /* if this node has changed, make sure, that all children are updated also */ 804 882 if( likely(this->bRelCoorChanged)) 805 (*child)->parentCoorChanged 883 (*child)->parentCoorChanged2D(); 806 884 if( likely(this->bRelDirChanged)) 807 (*child)->parentDirChanged 885 (*child)->parentDirChanged2D(); 808 886 809 887 (*child)->update2D(dt); … … 816 894 this->bRelDirChanged = false; 817 895 } 896 818 897 819 898 /** … … 865 944 void Element2D::tick2D(float dt) 866 945 { 867 if (this-> active)946 if (this->bActive) 868 947 this->tick(dt); 869 948 if (this->children.size() > 0) … … 881 960 void Element2D::draw2D(short layer) const 882 961 { 883 if (this-> visible)962 if (this->bVisible) 884 963 this->draw(); 885 964 if (this->children.size() > 0) … … 930 1009 { 931 1010 // drawing the Dependency graph 932 if (this != NullElement2D::getInstance())1011 if (this != Element2D::getNullElement()) 933 1012 { 934 1013 glBegin(GL_LINES); … … 1039 1118 return (E2D_DEFAULT_LAYER); 1040 1119 } 1041 1042 1043 1044 1045 ///////////////////1046 // NullElement2D //1047 ///////////////////1048 NullElement2D* NullElement2D::singletonRef = 0;1049 1050 /**1051 * @brief creates the one and only NullElement2D1052 */1053 NullElement2D::NullElement2D () : Element2D(NULL, E2D_LAYER_BELOW_ALL)1054 {1055 this->setClassID(CL_NULL_ELEMENT_2D, "NullElement2D");1056 this->setName("NullElement2D");1057 1058 this->setParentMode2D(E2D_PARENT_ALL);1059 NullElement2D::singletonRef = this;1060 }1061 1062 1063 /**1064 * standard deconstructor1065 */1066 NullElement2D::~NullElement2D ()1067 {1068 NullElement2D::singletonRef = NULL;1069 }
Note: See TracChangeset
for help on using the changeset viewer.