I found a workaround : QGeometryRenderer* clonedGeometryRenderer = new QGeometryRenderer();
QGeometry* clonedMeshGeometry = new QGeometry(clonedGeometryRenderer); foreach (QAttribute* attribute, geometryRenderer->geometry()->attributes()) { attribute->buffer()->setParent(clonedMeshGeometry); attribute->setParent(clonedMeshGeometry); clonedMeshGeometry->addAttribute(attribute); } clonedGeometryRenderer->setGeometry(clonedMeshGeometry); subEntity->addComponent(clonedGeometryRenderer); I have to call setParent on buffers and attributes, that will have more than one parent, but it works, they can be shared in this way. Need I open a bug, because it doesn't seems natural and reusing directly a component will be much better. 2016-09-30 15:34 GMT+02:00 Xavier Bigand <flamaros.xav...@gmail.com>: > I took a look to the addComponent implementation and it seems normal that > my code doesn't work because a component is intended to be attached once. > So I don't understand the meaning of the shareable flag. > > I'll try to share the geometry instead. > > 2016-09-30 15:20 GMT+02:00 Xavier Bigand <flamaros.xav...@gmail.com>: > >> I am trying to share my QGeometryRenderer between many Entities, but the >> addComponent doesn't have any effect. >> >> When I load our models from files, I save the root entity node in a map, >> and after I clone the node tree when a previously model is in the map. >> I have no issue with the material component that is in the cloned tree, >> but the geometryRenderer isn't printed by my trace method (material and >> geometryRenderer components are at the same level on sub-entities). >> >> I set the shareable flag to true on the geometryRenderer. >> >> PS : for the material component I don't assign the same ptr to the cloned >> model, because I don't want to share the material all attributs. My >> material class have is own clone method to copy only the shareable >> attributs (maps, specular,...). >> >> >> Here is my cloning method : >> >> void Model::cloneModel(Qt3DCore::QEntity* source, Qt3DCore::QEntity& >> destination) >> >> { >> >> QNodeVector sourceEntities = source->childNodes(); >> >> >> foreach (QNode* node, sourceEntities) >> >> { >> >> QEntity* sourceSubEntity = dynamic_cast<QEntity*>(node); >> >> QEntity* subEntity = new QEntity(&destination); >> >> >> H3D_ASSERT(sourceSubEntity != nullptr); >> >> >> subEntity->setObjectName(sourceSubEntity->objectName()); >> >> >> QComponentVector sourceComponents = >> sourceSubEntity->components(); >> >> >> foreach (QComponent* component, sourceComponents) >> >> { >> >> QGeometryRenderer* geometryRenderer = >> dynamic_cast<QGeometryRenderer*>(component); >> >> LightingMaterial* material = >> dynamic_cast<LightingMaterial*>(component); >> >> >> if (geometryRenderer) >> >> { >> >> subEntity->addComponent(geometryRenderer); >> >> LOG_INFO("geometryRenderer %s %s", >> qPrintable(component->metaObject()->className()), >> qPrintable(component->objectName())); >> >> } >> >> else if (material) >> >> { >> >> LightingMaterial* clonedMaterial = new >> LightingMaterial(); >> >> >> clonedMaterial->clone(*material); >> >> subEntity->addComponent(clonedMaterial); >> >> } >> >> else if (dynamic_cast<QPhongMaterial*>(component)) // TODO >> to remove >> >> { >> >> } >> >> else if (dynamic_cast<QPhongAlphaMaterial*>(component)) // >> TODO to remove >> >> { >> >> } >> >> else >> >> { >> >> H3D_ASSERT_MSG(false, "Unsupported component type %s", >> qPrintable(component->metaObject()->className())); >> >> } >> >> } >> >> } >> >> } >> >> >> I have this issue with Qt 5.7 and 5.8 build from the git branch. >> >> -- >> Xavier >> > > > > -- > Xavier > -- Xavier
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest