void BatchNode::addChild(Node *child, int zOrder, int tag) { Node::addChild(child, zOrder, tag); Armature *armature = dynamic_cast<Armature *>(child); if (armature != nullptr) { armature->setBatchNode(this); const Dictionary *dict = armature->getBoneDic(); DictElement *element = nullptr; CCDICT_FOREACH(dict, element) { Bone *bone = static_cast<Bone*>(element->getObject()); Array *displayList = bone->getDisplayManager()->getDecorativeDisplayList(); for(auto object : *displayList) { DecorativeDisplay *display = static_cast<DecorativeDisplay*>(object); if (Skin *skin = dynamic_cast<Skin*>(display->getDisplay())) { skin->setTextureAtlas(getTexureAtlasWithTexture(skin->getTexture())); } } }
void DisplayManager::addDisplay(Node *display, int index) { DecorativeDisplay *decoDisplay = NULL; if(index >= 0 && (unsigned int)index < _decoDisplayList->count()) { decoDisplay = (DecorativeDisplay *)_decoDisplayList->getObjectAtIndex(index); } else { decoDisplay = DecorativeDisplay::create(); _decoDisplayList->addObject(decoDisplay); } DisplayData *displayData = NULL; if (Skin *skin = dynamic_cast<Skin *>(display)) { skin->setBone(_bone); displayData = SpriteDisplayData::create(); DisplayFactory::initSpriteDisplay(_bone, decoDisplay, skin->getDisplayName().c_str(), skin); if (SpriteDisplayData *spriteDisplayData = (SpriteDisplayData *)decoDisplay->getDisplayData()) { skin->setSkinData(spriteDisplayData->skinData); } else { BaseData baseData; skin->setSkinData(baseData); } } else if (dynamic_cast<ParticleSystemQuad *>(display)) { displayData = ParticleDisplayData::create(); } else if(Armature *armature = dynamic_cast<Armature *>(display)) { displayData = ArmatureDisplayData::create(); armature->setParentBone(_bone); } else { displayData = DisplayData::create(); } decoDisplay->setDisplay(display); decoDisplay->setDisplayData(displayData); //! if changed display index is current display index, then change current display to the new display if(index == _displayIndex) { _displayIndex = -1; changeDisplayByIndex(index, false); } }
DecorativeDisplay *DecorativeDisplay::create() { DecorativeDisplay *pDisplay = new DecorativeDisplay(); if (pDisplay && pDisplay->init()){ pDisplay->autorelease(); return pDisplay; } CC_SAFE_DELETE(pDisplay); return NULL; }
void DisplayFactory::updateDisplay(Bone *bone, float dt, bool dirty) { Node *display = bone->getDisplayRenderNode(); CS_RETURN_IF(!display); switch(bone->getDisplayRenderNodeType()) { case CS_DISPLAY_SPRITE: if (dirty) { static_cast<Skin*>(display)->updateArmatureTransform(); } break; case CS_DISPLAY_PARTICLE: updateParticleDisplay(bone, display, dt); break; case CS_DISPLAY_ARMATURE: updateArmatureDisplay(bone, display, dt); break; default: { Mat4 transform = bone->getNodeToArmatureTransform(); display->setAdditionalTransform(&transform); } break; } #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT || ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX if (dirty) { DecorativeDisplay *decoDisplay = bone->getDisplayManager()->getCurrentDecorativeDisplay(); ColliderDetector *detector = decoDisplay->getColliderDetector(); if (detector) { do { #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT CC_BREAK_IF(!detector->getBody()); #endif Mat4 displayTransform = display->getNodeToParentTransform(); Vec2 anchorPoint = display->getAnchorPointInPoints(); anchorPoint = PointApplyTransform(anchorPoint, displayTransform); displayTransform.m[12] = anchorPoint.x; displayTransform.m[13] = anchorPoint.y; Mat4 t = TransformConcat( bone->getArmature()->getNodeToParentTransform(),displayTransform); detector->updateTransform(t); } while (0); } } #endif }
DecorativeDisplay *DecorativeDisplay::create() { DecorativeDisplay *pDisplay = new (std::nothrow) DecorativeDisplay(); if (pDisplay && pDisplay->init()) { pDisplay->autorelease(); return pDisplay; } CC_SAFE_DELETE(pDisplay); return nullptr; }
void Bone::setColliderFilter(ColliderFilter *filter) { auto array = _displayManager->getDecorativeDisplayList(); for(auto& object : array) { DecorativeDisplay *decoDisplay = static_cast<DecorativeDisplay *>(object); if (ColliderDetector *detector = decoDisplay->getColliderDetector()) { detector->setColliderFilter(filter); } } }
void DisplayManager::initDisplayList(BoneData *boneData) { _decoDisplayList.clear(); CS_RETURN_IF(!boneData); for(auto& object : boneData->displayDataList) { DisplayData *displayData = static_cast<DisplayData *>(object); DecorativeDisplay *decoDisplay = DecorativeDisplay::create(); decoDisplay->setDisplayData(displayData); DisplayFactory::createDisplay(_bone, decoDisplay); _decoDisplayList.pushBack(decoDisplay); } }
void DisplayManager::initDisplayList(BoneData *boneData) { CC_SAFE_DELETE(_decoDisplayList); _decoDisplayList = Array::create(); _decoDisplayList->retain(); CS_RETURN_IF(!boneData); Object *object = NULL; Array *displayDataList = &boneData->displayDataList; CCARRAY_FOREACH(displayDataList, object) { DisplayData *displayData = (DisplayData *)object; DecorativeDisplay *decoDisplay = DecorativeDisplay::create(); decoDisplay->setDisplayData(displayData); DisplayFactory::createDisplay(_bone, decoDisplay); _decoDisplayList->addObject(decoDisplay); }
DecorativeDisplay *DisplayManager::getDecorativeDisplayByIndex( int index) { if ( index < 0 || index >= (int)_decoDisplayList.size() ) { return nullptr; } DecorativeDisplay *decoDisplay = (DecorativeDisplay *)_decoDisplayList.at(index); if ( !decoDisplay ) { DisplayData *displayData = _bone->getBoneData()->getDisplayData(_displayIndex); if ( displayData ) { decoDisplay = DecorativeDisplay::create(); decoDisplay->retain(); decoDisplay->setDisplayData(displayData); DisplayFactory::createDisplay(_bone, decoDisplay); _decoDisplayList[index] = decoDisplay; } } return decoDisplay; }
void DisplayManager::addDisplay(DisplayData *displayData, int index) { DecorativeDisplay *decoDisplay = nullptr; if( (index >= 0) && (index < (int)_decoDisplayList.size()) ) { decoDisplay = (DecorativeDisplay *)getDecorativeDisplayByIndex(index); } else { decoDisplay = DecorativeDisplay::create(); decoDisplay->retain(); _decoDisplayList.push_back(decoDisplay); } DisplayFactory::addDisplay(_bone, decoDisplay, displayData); //! if changed display index is current display index, then change current display to the new display if(index == _displayIndex) { _displayIndex = -1; changeDisplayWithIndex(index, false); } }
void DisplayManager::addDisplay(Node *display, int index) { DecorativeDisplay *decoDisplay = nullptr; if( (index >= 0) && (index < _decoDisplayList.size()) ) { decoDisplay = _decoDisplayList.at(index); } else { decoDisplay = DecorativeDisplay::create(); _decoDisplayList.pushBack(decoDisplay); } DisplayData *displayData = nullptr; if (Skin *skin = dynamic_cast<Skin *>(display)) { skin->setBone(_bone); displayData = SpriteDisplayData::create(); DisplayFactory::initSpriteDisplay(_bone, decoDisplay, skin->getDisplayName().c_str(), skin); if (SpriteDisplayData *spriteDisplayData = (SpriteDisplayData *)decoDisplay->getDisplayData()) { skin->setSkinData(spriteDisplayData->skinData); ((SpriteDisplayData *)displayData)->skinData = spriteDisplayData->skinData; } else { bool find = false; for (long i = _decoDisplayList.size()-2; i>=0; i--) { DecorativeDisplay *dd = _decoDisplayList.at(i); SpriteDisplayData *sdd = static_cast<SpriteDisplayData*>(dd->getDisplayData()); if (sdd) { find = true; skin->setSkinData(sdd->skinData); static_cast<SpriteDisplayData*>(displayData)->skinData = sdd->skinData; break; } } if (!find) { BaseData baseData; skin->setSkinData(baseData); } } } else if (dynamic_cast<ParticleSystemQuad *>(display)) { displayData = ParticleDisplayData::create(); display->removeFromParent(); display->cleanup(); Armature *armature = _bone->getArmature(); if (armature) { display->setParent(armature); } } else if(Armature *armature = dynamic_cast<Armature *>(display)) { displayData = ArmatureDisplayData::create(); displayData->displayName = armature->getName(); armature->setParentBone(_bone); } else { displayData = DisplayData::create(); } decoDisplay->setDisplay(display); decoDisplay->setDisplayData(displayData); //! if changed display index is current display index, then change current display to the new display if(index == _displayIndex) { _displayIndex = -1; changeDisplayWithIndex(index, false); } }