void GLC_StructOccurence::doCreateOccurrenceFromInstance(GLuint shaderId) { // Update the number of occurences if (m_pStructInstance->hasStructOccurence()) { GLC_StructOccurence* pFirstOccurence= m_pStructInstance->firstOccurenceHandle(); m_pNumberOfOccurence= pFirstOccurence->m_pNumberOfOccurence; ++(*m_pNumberOfOccurence); QList<GLC_StructOccurence*> childs= pFirstOccurence->m_Childs; const int size= childs.size(); for (int i= 0; i < size; ++i) { GLC_StructOccurence* pChild= childs.at(i)->clone(m_pWorldHandle, true); addChild(pChild); } } else { m_pNumberOfOccurence= new int(1); } // Inform the world Handle if (NULL != m_pWorldHandle) { m_pWorldHandle->addOccurence(this, shaderId); } // Update Absolute matrix updateAbsoluteMatrix(); // Update instance m_pStructInstance->structOccurenceCreated(this); }
GLC_StructOccurence* GLC_StructOccurence::updateChildrenAbsoluteMatrix() { updateAbsoluteMatrix(); const int size= m_Childs.size(); for (int i= 0; i < size; ++i) { m_Childs[i]->updateChildrenAbsoluteMatrix(); } return this; }
// Default constructor GLC_StructOccurence::GLC_StructOccurence(GLC_StructInstance* pStructInstance, GLC_WorldHandle* pWorldHandle, GLuint shaderId) : m_Uid(glc::GLC_GenID()) , m_pWorldHandle(pWorldHandle) , m_pNumberOfOccurence(NULL) , m_pStructInstance(pStructInstance) , m_pParent(NULL) , m_Childs() , m_AbsoluteMatrix() , m_HasRepresentation(pStructInstance->structReference()->hasRepresentation()) , m_OccurenceNumber(0) , m_IsVisible(true) , m_pRenderProperties(NULL) { // Update the number of occurences if (pStructInstance->hasStructOccurence()) { GLC_StructOccurence* pFirstOccurence= pStructInstance->firstOccurenceHandle(); m_pNumberOfOccurence= pFirstOccurence->m_pNumberOfOccurence; ++(*m_pNumberOfOccurence); QList<GLC_StructOccurence*> childs= pFirstOccurence->m_Childs; const int size= childs.size(); for (int i= 0; i < size; ++i) { GLC_StructOccurence* pChild= childs.at(i)->clone(m_pWorldHandle, true); addChild(pChild); } } else { m_pNumberOfOccurence= new int(1); } setName(m_pStructInstance->name()); // Inform the world Handle if (NULL != m_pWorldHandle) { m_pWorldHandle->addOccurence(this, shaderId); } // Update Absolute matrix updateAbsoluteMatrix(); // Update instance m_pStructInstance->structOccurenceCreated(this); }
GLC_StructOccurence::GLC_StructOccurence(GLC_WorldHandle* pWorldHandle, const GLC_StructOccurence& structOccurence, bool shareInstance) : m_Uid(glc::GLC_GenID()) , m_pWorldHandle(pWorldHandle) , m_pNumberOfOccurence(NULL) , m_pStructInstance(NULL) , m_pParent(NULL) , m_Childs() , m_AbsoluteMatrix(structOccurence.m_AbsoluteMatrix) , m_OccurenceNumber(0) , m_IsVisible(structOccurence.m_IsVisible) , m_pRenderProperties(NULL) , m_AutomaticCreationOf3DViewInstance(structOccurence.m_AutomaticCreationOf3DViewInstance) , m_pRelativeMatrix(NULL) { if (shareInstance) { m_pStructInstance= structOccurence.m_pStructInstance; m_pNumberOfOccurence= structOccurence.m_pNumberOfOccurence; ++(*m_pNumberOfOccurence); } else { m_pNumberOfOccurence= new int(1); m_pStructInstance= new GLC_StructInstance(structOccurence.m_pStructInstance); } // Test if structOccurence has representation and has a shader GLuint shaderId= 0; bool instanceIsSelected= false; if ((NULL != m_pWorldHandle) && (NULL != structOccurence.m_pWorldHandle) && structOccurence.m_pWorldHandle->collection()->contains(structOccurence.id())) { GLC_3DViewInstance* p3DViewInstance= structOccurence.m_pWorldHandle->collection()->instanceHandle(structOccurence.id()); if(structOccurence.m_pWorldHandle->collection()->isInAShadingGroup(structOccurence.id())) { shaderId= structOccurence.m_pWorldHandle->collection()->shadingGroup(structOccurence.id()); } instanceIsSelected= p3DViewInstance->isSelected(); // Test the rendering properties if (! p3DViewInstance->renderPropertiesHandle()->isDefault()) { m_pRenderProperties= new GLC_RenderProperties(*(p3DViewInstance->renderPropertiesHandle())); } } else if (NULL != structOccurence.m_pRenderProperties) { m_pRenderProperties= new GLC_RenderProperties(*(structOccurence.m_pRenderProperties)); } // Inform the world Handle if (NULL != m_pWorldHandle) { m_pWorldHandle->addOccurence(this, instanceIsSelected, shaderId); if (NULL != m_pRenderProperties && this->has3DViewInstance()) { m_pWorldHandle->collection()->instanceHandle(id())->setRenderProperties(*m_pRenderProperties); delete m_pRenderProperties; m_pRenderProperties= NULL; } } // Check flexibility if (NULL != structOccurence.m_pRelativeMatrix) { m_pRelativeMatrix= new GLC_Matrix4x4(*(structOccurence.m_pRelativeMatrix)); } // Update Absolute matrix updateAbsoluteMatrix(); // Create childs const int size= structOccurence.childCount(); for (int i= 0; i < size; ++i) { GLC_StructOccurence* pChild= structOccurence.child(i)->clone(m_pWorldHandle, true); addChild(pChild); } updateChildrenAbsoluteMatrix(); // Update instance m_pStructInstance->structOccurenceCreated(this); }