bool CWizDatabase::UpdateAttachments(const std::deque<WIZDOCUMENTATTACHMENTDATAEX>& arrayAttachment) { if (arrayAttachment.empty()) return true; __int64 nVersion = -1; bool bHasError = false; std::deque<WIZDOCUMENTATTACHMENTDATAEX>::const_iterator it; for (it = arrayAttachment.begin(); it != arrayAttachment.end(); it++) { const WIZDOCUMENTATTACHMENTDATAEX& data = *it; Q_EMIT processLog("attachment: " + data.strName); if (!UpdateAttachment(data)) { bHasError = true; } nVersion = std::max<__int64>(nVersion, data.nVersion); } if (!bHasError) { SetObjectVersion(WIZDOCUMENTATTACHMENTDATAEX::ObjectName(), nVersion); } return !bHasError; }
//------------------------------------------------------------------------ void CVehiclePartEntityAttachment::SetAttachmentEntity(EntityId entityId) { DetachAttachment(); IEntity* pEntity = gEnv->pEntitySystem->GetEntity(entityId); if (!pEntity) return; m_attachmentId = entityId; m_pVehicle->GetEntity()->AttachChild(pEntity); UpdateAttachment(); m_pVehicle->SetObjectUpdate(this, IVehicle::eVOU_AlwaysUpdate); }
/** * This is called recursively for all children of the root Node */ inline int UpdateNodesAndAttachments( Node& node, int parentFlags, BufferIndex updateBufferIndex, ResourceManager& resourceManager, RenderQueue& renderQueue, Layer& currentLayer, Shader* defaultShader, int inheritedDrawMode ) { Layer* layer = ¤tLayer; // Short-circuit for invisible nodes if ( !node.IsVisible( updateBufferIndex ) ) { return 0; } // If the node was not previously visible BufferIndex previousBuffer = updateBufferIndex ? 0u : 1u; if ( !node.IsVisible( previousBuffer ) ) { // The node was skipped in the previous update; it must recalculate everything node.SetAllDirtyFlags(); } // Some dirty flags are inherited from parent int nodeDirtyFlags( node.GetDirtyFlags() | ( parentFlags & InheritedDirtyFlags ) ); if ( node.GetInheritedShader() == NULL ) { nodeDirtyFlags |= ShaderFlag; } int cumulativeDirtyFlags = nodeDirtyFlags; if ( node.IsLayer() ) { // all childs go to this layer layer = node.GetLayer(); // assume layer is clean to begin with layer->SetReuseRenderers( updateBufferIndex, true ); // Layers do not inherit the DrawMode from their parents inheritedDrawMode = DrawMode::NORMAL; } DALI_ASSERT_DEBUG( NULL != layer ); UpdateNodeShader( node, nodeDirtyFlags, defaultShader ); UpdateNodeOpacity( node, nodeDirtyFlags, updateBufferIndex ); UpdateNodeGeometry( node, nodeDirtyFlags, updateBufferIndex ); UpdateNodeTransformValues( node, nodeDirtyFlags, updateBufferIndex ); // Setting STENCIL will override OVERLAY, if that would otherwise have been inherited. inheritedDrawMode |= node.GetDrawMode(); if ( node.HasAttachment() ) { /* * Add renderables for the children into the current Layer */ RenderableAttachment* renderable = UpdateAttachment( node.GetAttachment(), node, updateBufferIndex, resourceManager, nodeDirtyFlags ); if( NULL != renderable ) { // Update the world matrix after renderable update; the ScaleForSize property should now be calculated UpdateNodeWorldMatrix( node, *renderable, nodeDirtyFlags, updateBufferIndex ); // The attachment is ready to render, so it is added to a set of renderables. AddRenderableToLayer( *layer, *renderable, updateBufferIndex, inheritedDrawMode ); } } else if( node.IsObserved() ) { // This node is being used as a property input for an animation, constraint, // camera or bone. Ensure it's matrix is updated UpdateNodeWorldMatrix( node, nodeDirtyFlags, updateBufferIndex ); } // if any child node has moved or had its sort modifier changed, layer is not clean and old frame cannot be reused // also if node has been deleted, dont reuse old render items if( nodeDirtyFlags & RenderableUpdateFlags ) { layer->SetReuseRenderers( updateBufferIndex, false ); } // recurse children NodeContainer& children = node.GetChildren(); const NodeIter endIter = children.End(); for ( NodeIter iter = children.Begin(); iter != endIter; ++iter ) { Node& child = **iter; cumulativeDirtyFlags |=UpdateNodesAndAttachments( child, nodeDirtyFlags, updateBufferIndex, resourceManager, renderQueue, *layer, defaultShader, inheritedDrawMode ); } return cumulativeDirtyFlags; }
//------------------------------------------------------------------------ void CVehiclePartEntityAttachment::SetLocalTM(const Matrix34 &localTM) { m_localTM = VALIDATE_MAT(localTM); UpdateAttachment(); }
//------------------------------------------------------------------------ void CVehiclePartEntityAttachment::Update(const float frameTime) { CVehiclePartBase::Update(frameTime); UpdateAttachment(); }