bool Object::destroyRenderer(qlib::uid_t uid) { // get renderer ptr/check consistency rendtab_t::iterator i = m_rendtab.find(uid); if (i==m_rendtab.end()) return false; RendererPtr pRend = i->second; ScenePtr pScene = getScene(); if (pScene.isnull() || pRend.isnull()) { LOG_DPRINTLN("Object::destroyRenderer> fatal error pScene or pRend is NULL!"); return false; } // detach renderer from the view-related resources (DL, VBO, etc) pRend->unloading(); // Detach the parent scene from the renderer event source pRend->removeListener(pScene.get()); // Fire the SCE_REND_REMOVING Event, before removing the renderer { MB_DPRINTLN("Object> Firing SCE_REND_REMOVING event..."); SceneEvent ev; ev.setType(SceneEvent::SCE_REND_REMOVING); ev.setSource(getSceneID()); ev.setTarget(pRend->getUID()); pScene->fireSceneEvent(ev); } // remove the rend from the scene's cache list pScene->removeRendCache(pRend); // 2012/9/30 // Detach the rend from obj HERE is very important!! // (This call remove the rend from object's event listener list. // Otherwise, deleted ptr will remain in the listener list, and thus cause crash!!) qlib::uid_t objid = pRend->detachObj(); // MB_ASSERT(objid==this->m_uid); // 2012/9/30 // Setting scene ID to null will cause removing pRend from the scene's listener list // (Without this, deleted ptr will remain in scene's listener list, after clearing the UNDO data!!) pRend->setSceneID(qlib::invalid_uid); // Remove from the renderer table m_rendtab.erase(i); // Record undo/redo info UndoManager *pUM = pScene->getUndoMgr(); if (pUM->isOK()) { ObjLoadEditInfo *pPEI = MB_NEW ObjLoadEditInfo; pPEI->setupRendDestroy(getUID(), pRend); pUM->addEditInfo(pPEI); } return true; }
void RealPropAnim::onPropInit(AnimMgr *pMgr, qlib::uid_t tgt_uid) { RendererPtr pTgtRend = qsys::SceneManager::getRendererS(tgt_uid); if (pTgtRend.isnull()) { LOG_DPRINTLN("RealPropAnim.onPropInit> Unknown tgt uid %d", int(tgt_uid)); return; } qlib::LVariant var(m_startValue); pTgtRend->setProperty(getPropName(), var); }
void ShowHideAnim::onPropInit(AnimMgr *pMgr, qlib::uid_t tgt_uid) { RendererPtr pTgtRend = qsys::SceneManager::getRendererS(tgt_uid); if (pTgtRend.isnull()) { LOG_DPRINTLN("ShowHideAnim.onPropInit> Unknown tgt uid %d", int(tgt_uid)); return; } if (m_bHide) { setVisible(pTgtRend, true); if (m_bFade) pTgtRend->setPropReal("alpha", m_dTgtAlpha); } else { MB_DPRINTLN("ShowHideAnim.onPropInit> SetVisible FALSE!!!"); setVisible(pTgtRend, false); if (m_bFade) pTgtRend->setPropReal("alpha", 0.0); } }
void Object::dump() const { ScenePtr rscn = getScene(); MB_DPRINT("Object: %s", toString().c_str()); MB_DPRINT(": {"); RendIter iter = beginRend(); for (; iter!=endRend(); ++iter) { RendererPtr rrend = iter->second; if (!rrend.isnull()) { MB_DPRINT("rend %p/%d (nref=%d): ", rrend.get(), rrend->getUID(), rrend.use_count()); //rrend->dump(); } else { MB_DPRINTLN("(invalid rend %d)", iter->first); } } MB_DPRINTLN("}"); }