bool RendGroup::hasCenter() const { ObjectPtr pObj = getClientObj(); Object::RendIter iter = pObj->beginRend(); Object::RendIter eiter = pObj->endRend(); for (;iter!=eiter;++iter) { RendererPtr pRend = iter->second; if (!pRend->getGroupName().equals(getName())) continue; if (pRend->hasCenter()) { return true; } } // none of the renderers in this group has valid center return false; }
qlib::Vector4D RendGroup::getCenter() const { // Calc COM of renderers in this group Vector4D resvec; int nsum = 0; ObjectPtr pObj = getClientObj(); Object::RendIter iter = pObj->beginRend(); Object::RendIter eiter = pObj->endRend(); for (;iter!=eiter;++iter) { RendererPtr pRend = iter->second; if (!pRend->getGroupName().equals(getName())) continue; if (pRend->hasCenter()) { resvec += pRend->getCenter(); ++nsum; } } if (nsum>0) return resvec.divide(nsum); else return qlib::Vector4D(); }
void LWViewerManager::convToLWScene(qsys::ScenePtr pScene, qsys::ScenePtr pNewScene) { #ifndef QM_BUILD_LW qsys::AutoStyleCtxt(pScene->getUID()); Scene::ObjIter iter = pScene->beginObj(); Scene::ObjIter eiter = pScene->endObj(); std::deque<ObjectPtr> newobjs; LString objname, rendname; for (; iter!=eiter; ++iter) { ObjectPtr pObj = iter->second; LWObjPtr pNewObj(new LWObject); objname = pObj->getName(); pNewObj->setName(objname); pNewObj->setDefaultPropFlag("name", false); if (!pObj->isVisible()) { pNewObj->setVisible(false); pNewObj->setDefaultPropFlag("visible", false); } pNewObj->startBuild(); Object::RendIter riter = pObj->beginRend(); Object::RendIter reiter = pObj->endRend(); for (; riter!=reiter; ++riter) { RendererPtr pRend = riter->second; // ignore selection renderer if (qlib::LChar::equals(pRend->getTypeName(), "*selection")) continue; LWRendPtr pNewRend = pNewObj->createRenderer("lwrend"); // set name rendname = pRend->getName(); if (rendname.isEmpty()) rendname = LString("(") + pRend->getTypeName() + LString(")"); pNewRend->setName(rendname); pNewRend->setDefaultPropFlag("name", false); if (!pRend->isVisible()) { pNewRend->setVisible(false); pNewRend->setDefaultPropFlag("visible", false); } // Set Data ID of LWRend pNewRend->setDataID(pNewRend->getUID()); pNewRend->setDefaultPropFlag("data_id", false); LWRendDisplayContext *pdc = MB_NEW LWRendDisplayContext(); pdc->init(pNewRend.get(), pNewObj.get()); pdc->setAlpha(pRend->getDefaultAlpha()); pdc->startRender(); pdc->startSection(objname+":"+rendname); pRend->display(pdc); pRend->displayLabels(pdc); pdc->endSection(); pdc->endRender(); // make hittest data if (pRend->isHitTestSupported()) { pdc->startHit(pRend->getUID()); pRend->displayHit(pdc); pdc->endHit(); } delete pdc; } pNewObj->endBuild(); newobjs.push_back(pNewObj); } BOOST_FOREACH (ObjectPtr pElem, newobjs) { pNewScene->addObject(pElem); }