public void ClearWorkItemResult(HEU_SessionBase session, HAPI_PDG_GraphContextId contextID, HAPI_PDG_EventInfo eventInfo, HEU_TOPNodeData topNode) { session.LogErrorOverride = false; bool bCleared = false; HAPI_PDG_WorkitemInfo workItemInfo = new HAPI_PDG_WorkitemInfo(); if (session.GetWorkItemInfo(contextID, eventInfo.workitemId, ref workItemInfo)) { //Debug.LogFormat("Clear: index={0}, state={1}", workItemInfo.index, (HAPI_PDG_WorkitemState)eventInfo.currentState); if (workItemInfo.index >= 0) { HEU_PDGAssetLink.ClearWorkItemResultByIndex(topNode, workItemInfo.index); bCleared = true; } } if (!bCleared) { HEU_PDGAssetLink.ClearWorkItemResultByID(topNode, eventInfo.workitemId); } session.LogErrorOverride = true; }
public static bool GetWorkItemInfo(this HEU_SessionBase session, HAPI_PDG_GraphContextId graph_context_id, HAPI_PDG_WorkitemId workitem_id, ref HAPI_PDG_WorkitemInfo workitem_info) { HAPI_Result result = HEU_HAPIImportsPDG.HAPI_GetWorkitemInfo(ref session.GetSessionData()._HAPISession, graph_context_id, workitem_id, ref workitem_info); session.HandleStatusResult(result, "Getting WorkItem", false, true); return(result == HAPI_Result.HAPI_RESULT_SUCCESS); }
/// <summary> /// Load the geometry generated as results of the given work item, of the given TOP node. /// The load will be done asynchronously. /// Results must be tagged with 'file', and must have a file path, otherwise will not be loaded. /// </summary> /// <param name="session">Houdini Engine session that the TOP node is in</param> /// <param name="topNode">TOP node that the work item belongs to</param> /// <param name="workItemInfo">Work item whose results to load</param> /// <param name="resultInfos">Results data</param> /// <param name="workItemID">The work item's ID. Required for clearning its results.</param> public void LoadResults(HEU_SessionBase session, HEU_TOPNodeData topNode, HAPI_PDG_WorkitemInfo workItemInfo, HAPI_PDG_WorkitemResultInfo[] resultInfos, HAPI_PDG_WorkitemId workItemID) { // Create HEU_GeoSync objects, set results, and sync it string workItemName = HEU_SessionManager.GetString(workItemInfo.nameSH, session); //Debug.LogFormat("Work item: {0}:: name={1}, results={2}", workItemInfo.index, workItemName, workItemInfo.numResults); // Clear previously generated result ClearWorkItemResultByID(topNode, workItemID); if (resultInfos == null || resultInfos.Length == 0) { return; } HEU_TOPWorkResult result = GetWorkResultByID(topNode, workItemID); if (result == null) { result = new HEU_TOPWorkResult(); result._workItemIndex = workItemInfo.index; result._workItemID = workItemID; topNode._workResults.Add(result); } // Load each result geometry int numResults = resultInfos.Length; for (int i = 0; i < numResults; ++i) { if (resultInfos[i].resultTagSH <= 0 || resultInfos[i].resultSH <= 0) { continue; } string tag = HEU_SessionManager.GetString(resultInfos[i].resultTagSH, session); string path = HEU_SessionManager.GetString(resultInfos[i].resultSH, session); //Debug.LogFormat("Result for work item {0}: result={1}, tag={2}, path={3}", result._workItemIndex, i, tag, path); if (string.IsNullOrEmpty(tag) || !tag.StartsWith("file")) { continue; } string name = string.Format("{0}_{1}_{2}", topNode._parentName, workItemName, workItemInfo.index); // Get or create parent GO if (topNode._workResultParentGO == null) { topNode._workResultParentGO = new GameObject(topNode._nodeName); HEU_GeneralUtility.SetParentWithCleanTransform(GetLoadRootTransform(), topNode._workResultParentGO.transform); topNode._workResultParentGO.SetActive(topNode._showResults); } GameObject newOrExistingGO = null; int existingObjectIndex = -1; for (int j = 0; j < result._generatedGOs.Count; j++) { if (result._generatedGOs[j] != null) { HEU_GeoSync oldGeoSync = result._generatedGOs[j].GetComponent<HEU_GeoSync>(); if (oldGeoSync != null && oldGeoSync._filePath == path) { oldGeoSync.Reset(); existingObjectIndex = j; newOrExistingGO = result._generatedGOs[j]; break; } } } if (existingObjectIndex < 0) { newOrExistingGO = new GameObject(name); result._generatedGOs.Add(newOrExistingGO); } HEU_GeneralUtility.SetParentWithCleanTransform(topNode._workResultParentGO.transform, newOrExistingGO.transform); // HEU_GeoSync does the loading HEU_GeoSync geoSync = newOrExistingGO.GetComponent<HEU_GeoSync>(); if (geoSync == null) { geoSync = newOrExistingGO.AddComponent<HEU_GeoSync>(); } geoSync._filePath = path; geoSync.SetOutputCacheDirectory(_outputCachePathRoot); geoSync.StartSync(); } }
private void ProcessPDGEvent(HEU_SessionBase session, HAPI_PDG_GraphContextId contextID, ref HAPI_PDG_EventInfo eventInfo) { HEU_PDGAssetLink assetLink = null; HEU_TOPNodeData topNode = null; HAPI_PDG_EventType evType = (HAPI_PDG_EventType)eventInfo.eventType; HAPI_PDG_WorkitemState currentState = (HAPI_PDG_WorkitemState)eventInfo.currentState; HAPI_PDG_WorkitemState lastState = (HAPI_PDG_WorkitemState)eventInfo.lastState; GetTOPAssetLinkAndNode(eventInfo.nodeId, out assetLink, out topNode); //string topNodeName = topNode != null ? string.Format("node={0}", topNode._nodeName) : string.Format("id={0}", eventInfo.nodeId); //Debug.LogFormat("PDG Event: {0}, type={1}, workitem={2}, curState={3}, lastState={4}", topNodeName, evType.ToString(), // eventInfo.workitemId, currentState, lastState); if (assetLink == null || topNode == null || topNode._nodeID != eventInfo.nodeId) { return; } if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_NULL) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.NONE); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_NODE_CLEAR) { NotifyTOPNodePDGStateClear(assetLink, topNode); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_DIRTY_START) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.DIRTYING); //HEU_PDGAssetLink.ClearTOPNodeWorkItemResults(topNode); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_DIRTY_STOP) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.DIRTIED); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_COOK_ERROR) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOK_FAILED); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_COOK_WARNING) { } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_COOK_COMPLETE) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOK_COMPLETE); } else { // Work item events HEU_TOPNodeData.PDGState currentTOPPDGState = topNode._pdgState; if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_WORKITEM_ADD) { NotifyTOPNodeTotalWorkItem(assetLink, topNode, 1); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_WORKITEM_REMOVE) { NotifyTOPNodeTotalWorkItem(assetLink, topNode, -1); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_WORKITEM_STATE_CHANGE) { // Last states if (lastState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_WAITING && currentState != HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_WAITING) { NotifyTOPNodeWaitingWorkItem(assetLink, topNode, -1); } else if (lastState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKING && currentState != HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKING) { NotifyTOPNodeCookingWorkItem(assetLink, topNode, -1); } else if (lastState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_SCHEDULED && currentState != HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_SCHEDULED) { NotifyTOPNodeScheduledWorkItem(assetLink, topNode, -1); } // New states if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_WAITING) { NotifyTOPNodeWaitingWorkItem(assetLink, topNode, 1); } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_UNCOOKED) { } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_DIRTY) { //Debug.LogFormat("Dirty: id={0}", eventInfo.workitemId); ClearWorkItemResult(session, contextID, eventInfo, topNode); } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_SCHEDULED) { NotifyTOPNodeScheduledWorkItem(assetLink, topNode, 1); } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKING) { NotifyTOPNodeCookingWorkItem(assetLink, topNode, 1); } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKED_SUCCESS) { NotifyTOPNodeCookedWorkItem(assetLink, topNode); if (topNode._tags._autoload) { HAPI_PDG_WorkitemInfo workItemInfo = new HAPI_PDG_WorkitemInfo(); if (!session.GetWorkItemInfo(contextID, eventInfo.workitemId, ref workItemInfo)) { Debug.LogErrorFormat("Failed to get work item {1} info for {0}", topNode._nodeName, eventInfo.workitemId); return; } if (workItemInfo.numResults > 0) { HAPI_PDG_WorkitemResultInfo[] resultInfos = new HAPI_PDG_WorkitemResultInfo[workItemInfo.numResults]; int resultCount = workItemInfo.numResults; if (!session.GetWorkitemResultInfo(topNode._nodeID, eventInfo.workitemId, resultInfos, resultCount)) { Debug.LogErrorFormat("Failed to get work item {1} result info for {0}", topNode._nodeName, eventInfo.workitemId); return; } assetLink.LoadResults(session, topNode, workItemInfo, resultInfos, eventInfo.workitemId); } } } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKED_FAIL) { NotifyTOPNodeErrorWorkItem(assetLink, topNode); } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKED_CANCEL) { // Ignore it because in-progress cooks can be cancelled when automatically recooking graph } } if (currentTOPPDGState == HEU_TOPNodeData.PDGState.COOKING) { if (topNode.AreAllWorkItemsComplete()) { if (topNode.AnyWorkItemsFailed()) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOK_FAILED); } else { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOK_COMPLETE); } } } else if (topNode.AnyWorkItemsPending()) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOKING); } } }
/// <summary> /// Process a PDG event. Notify the relevant HEU_PDGAssetLink object. /// </summary> /// <param name="session">Houdini Engine session</param> /// <param name="contextID">PDG graph context ID</param> /// <param name="eventInfo">PDG event info</param> private void ProcessPDGEvent(HEU_SessionBase session, HAPI_PDG_GraphContextId contextID, ref HAPI_PDG_EventInfo eventInfo) { #if HOUDINIENGINEUNITY_ENABLED HEU_PDGAssetLink assetLink = null; HEU_TOPNodeData topNode = null; HAPI_PDG_EventType evType = (HAPI_PDG_EventType)eventInfo.eventType; HAPI_PDG_WorkitemState currentState = (HAPI_PDG_WorkitemState)eventInfo.currentState; HAPI_PDG_WorkitemState lastState = (HAPI_PDG_WorkitemState)eventInfo.lastState; GetTOPAssetLinkAndNode(eventInfo.nodeId, out assetLink, out topNode); //string topNodeName = topNode != null ? string.Format("node={0}", topNode._nodeName) : string.Format("id={0}", eventInfo.nodeId); //HEU_Logger.LogFormat("PDG Event: {0}, type={1}, workitem={2}, curState={3}, lastState={4}", topNodeName, evType.ToString(), // eventInfo.workitemId, currentState, lastState); if (assetLink == null || topNode == null || topNode._nodeID != eventInfo.nodeId) { return; } EventMessageColor msgColor = EventMessageColor.DEFAULT; // Events can be split into TOP node specific or work item specific if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_NULL) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.NONE); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_NODE_CLEAR) { NotifyTOPNodePDGStateClear(assetLink, topNode); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_DIRTY_START) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.DIRTYING); //HEU_PDGAssetLink.ClearTOPNodeWorkItemResults(topNode); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_DIRTY_STOP) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.DIRTIED); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_COOK_ERROR) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOK_FAILED); msgColor = EventMessageColor.ERROR; } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_COOK_WARNING) { msgColor = EventMessageColor.WARNING; } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_COOK_COMPLETE) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOK_COMPLETE); } else { // Work item events HEU_TOPNodeData.PDGState currentTOPPDGState = topNode._pdgState; if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_WORKITEM_ADD) { _totalNumItems++; NotifyTOPNodeTotalWorkItem(assetLink, topNode, 1); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_WORKITEM_REMOVE) { NotifyTOPNodeTotalWorkItem(assetLink, topNode, -1); } else if (evType == HAPI_PDG_EventType.HAPI_PDG_EVENT_WORKITEM_STATE_CHANGE) { // Last states if (lastState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_WAITING && currentState != HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_WAITING) { NotifyTOPNodeWaitingWorkItem(assetLink, topNode, -1); } else if (lastState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKING && currentState != HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKING) { NotifyTOPNodeCookingWorkItem(assetLink, topNode, -1); } else if (lastState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_SCHEDULED && currentState != HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_SCHEDULED) { NotifyTOPNodeScheduledWorkItem(assetLink, topNode, -1); } // New states if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_WAITING) { NotifyTOPNodeWaitingWorkItem(assetLink, topNode, 1); } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_UNCOOKED) { } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_DIRTY) { //HEU_Logger.LogFormat("Dirty: id={0}", eventInfo.workitemId); ClearWorkItemResult(session, contextID, eventInfo, topNode); } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_SCHEDULED) { NotifyTOPNodeScheduledWorkItem(assetLink, topNode, 1); } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKING) { NotifyTOPNodeCookingWorkItem(assetLink, topNode, 1); } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKED_SUCCESS || currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKED_CACHE) { NotifyTOPNodeCookedWorkItem(assetLink, topNode); // On cook success, handle results if (topNode._tags._autoload) { HAPI_PDG_WorkitemInfo workItemInfo = new HAPI_PDG_WorkitemInfo(); if (!session.GetWorkItemInfo(contextID, eventInfo.workitemId, ref workItemInfo)) { HEU_Logger.LogErrorFormat("Failed to get work item {1} info for {0}", topNode._nodeName, eventInfo.workitemId); return; } if (workItemInfo.numResults > 0) { HAPI_PDG_WorkitemResultInfo[] resultInfos = new HAPI_PDG_WorkitemResultInfo[workItemInfo.numResults]; int resultCount = workItemInfo.numResults; if (!session.GetWorkitemResultInfo(topNode._nodeID, eventInfo.workitemId, resultInfos, resultCount)) { HEU_Logger.LogErrorFormat("Failed to get work item {1} result info for {0}", topNode._nodeName, eventInfo.workitemId); return; } assetLink.LoadResults(session, topNode, workItemInfo, resultInfos, eventInfo.workitemId, OnWorkItemLoadResults); } } } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKED_FAIL) { // TODO: on cook failure, get log path? NotifyTOPNodeErrorWorkItem(assetLink, topNode); msgColor = EventMessageColor.ERROR; } else if (currentState == HAPI_PDG_WorkitemState.HAPI_PDG_WORKITEM_COOKED_CANCEL) { // Ignore it because in-progress cooks can be cancelled when automatically recooking graph } } if (currentTOPPDGState == HEU_TOPNodeData.PDGState.COOKING) { if (topNode.AreAllWorkItemsComplete()) { if (topNode.AnyWorkItemsFailed()) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOK_FAILED); } else { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOK_COMPLETE); } } } else if (topNode.AnyWorkItemsPending()) { SetTOPNodePDGState(assetLink, topNode, HEU_TOPNodeData.PDGState.COOKING); } } if (eventInfo.msgSH >= 0) { string eventMsg = HEU_SessionManager.GetString(eventInfo.msgSH, session); if (!string.IsNullOrEmpty(eventMsg)) { AddEventMessage(string.Format("<color={0}>{1} - {2}: {3}</color>\n", _eventMessageColorCode[(int)msgColor], evType, topNode._nodeName, eventMsg)); } } CheckCallback(topNode); #endif }
HAPI_GetWorkitemInfo( ref HAPI_Session session, HAPI_PDG_GraphContextId graph_context_id, HAPI_PDG_WorkitemId workitem_id, ref HAPI_PDG_WorkitemInfo workitem_info);