[Interest] [Qt3D] QGeometryRenderer can't be shared
Xavier Bigand
flamaros.xavier at gmail.com
Fri Sep 30 16:18:35 CEST 2016
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.xavier at 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.xavier at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160930/5e93ffc5/attachment.html>
More information about the Interest
mailing list