public void Initialize(HEU_SessionBase session, HAPI_ObjectInfo objectInfo, HAPI_Transform objectTranform, HEU_HoudiniAsset parentAsset) { _objectInfo = objectInfo; _objectTransform = objectTranform; _parentAsset = parentAsset; SyncWithObjectInfo(session); // Translate transform to Unity (TODO) List<HAPI_GeoInfo> geoInfos = new List<HAPI_GeoInfo>(); // Get display geo info HAPI_GeoInfo displayGeoInfo = new HAPI_GeoInfo(); if(!session.GetDisplayGeoInfo(_objectInfo.nodeId, ref displayGeoInfo)) { return; } //Debug.LogFormat("Found geoinfo with name {0} and id {1}", HEU_SessionManager.GetString(displayGeoInfo.nameSH, session), displayGeoInfo.nodeId); geoInfos.Add(displayGeoInfo); // TODO: The following editable node query also retrieves geo nodes for terrain with visualization nodes. Need to review to check if we're using the // correct query flags, and handling returned nodes correctly. // Get editable nodes, cook em, then create geo nodes for them HAPI_NodeId[] editableNodes = null; HEU_SessionManager.GetComposedChildNodeList(session, _objectInfo.nodeId, (int)HAPI_NodeType.HAPI_NODETYPE_SOP, (int)HAPI_NodeFlags.HAPI_NODEFLAGS_EDITABLE, true, out editableNodes); if(editableNodes != null) { foreach(HAPI_NodeId editNodeID in editableNodes) { if (editNodeID != displayGeoInfo.nodeId) { session.CookNode(editNodeID, HEU_PluginSettings.CookTemplatedGeos); HAPI_GeoInfo editGeoInfo = new HAPI_GeoInfo(); if (session.GetGeoInfo(editNodeID, ref editGeoInfo)) { geoInfos.Add(editGeoInfo); } } } } //Debug.LogFormat("Object id={5}, name={0}, isInstancer={1}, isInstanced={2}, instancePath={3}, instanceId={4}", // HEU_SessionManager.GetString(objectInfo.nameSH, session), objectInfo.isInstancer, objectInfo.isInstanced, // HEU_SessionManager.GetString(objectInfo.objectInstancePathSH, session), objectInfo.objectToInstanceId, objectInfo.nodeId); // Go through geo infos to create geometry int numGeoInfos = geoInfos.Count; for(int i = 0; i < numGeoInfos; ++i) { // Create GeoNode for each _geoNodes.Add(CreateGeoNode(session, geoInfos[i])); } // This has been moved to GenerateGeometry but kept here just in case. //ApplyObjectTransformToGeoNodes(); }
public void Reset() { _objName = ""; _parentAsset = null; _objectInfo = new HAPI_ObjectInfo(); _geoNodes = new List<HEU_GeoNode>(); _objectTransform = new HAPI_Transform(true); }
internal void Initialize(HEU_SessionBase session, HAPI_ObjectInfo objectInfo, HAPI_Transform objectTranform, HEU_HoudiniAsset parentAsset, bool bUseOutputNodes) { _objectInfo = objectInfo; _objectTransform = objectTranform; _parentAsset = parentAsset; SyncWithObjectInfo(session); // Translate transform to Unity (TODO) List<HAPI_GeoInfo> geoInfos = new List<HAPI_GeoInfo>(); HEU_HAPIUtility.GatherAllAssetGeoInfos(session, parentAsset.AssetInfo, objectInfo, bUseOutputNodes, ref geoInfos); int numGeoInfos = geoInfos.Count; for (int i = 0; i < numGeoInfos; ++i) { // Create GeoNode for each _geoNodes.Add(CreateGeoNode(session, geoInfos[i])); } }
protected virtual bool LoadObjectBuffers(HEU_SessionBase session, ref HAPI_ObjectInfo objectInfo) { // Get display SOP geo info and cook the node HAPI_GeoInfo displayGeoInfo = new HAPI_GeoInfo(); if (!_session.GetDisplayGeoInfo(objectInfo.nodeId, ref displayGeoInfo)) { return false; } if (!CookNode(session, displayGeoInfo.nodeId)) { return false; } bool bResult = true; bool bHasInstancer = false; HEU_LoadObject obj = new HEU_LoadObject(); obj._objectNodeID = objectInfo.nodeId; obj._displayNodeID = displayGeoInfo.nodeId; if (LoadNodeBuffer(session, obj._displayNodeID, obj)) { _loadData._loadedObjects.Add(obj); if (!bHasInstancer && obj._instancerBuffers != null && obj._instancerBuffers.Count > 0) { bHasInstancer = true; } } else { bResult = false; } if (bResult && bHasInstancer) { BuildBufferIDsMap(_loadData); } return bResult; }
// OBJECTS ---------------------------------------------------------------------------------------------------- /// <summary> /// Get the object info on an OBJ node. /// </summary> /// <param name="nodeID">The node ID</param> /// <param name="objectInfo">Object info to populate</param> /// <returns>True if successfully queried object info</returns> public virtual bool GetObjectInfo(HAPI_NodeId nodeID, ref HAPI_ObjectInfo objectInfo) { return false; }
public void SetObjectInfo(HAPI_ObjectInfo newObjectInfo) { _objectInfo = newObjectInfo; }
internal void SetObjectInfo(HAPI_ObjectInfo newObjectInfo) { _objectInfo = newObjectInfo; }
// This is the old way of getting outputs. Keep it for now for legacy. TODO: Remove this later internal void GatherAllAssetOutputsLegacy(HEU_SessionBase session, HAPI_ObjectInfo objectInfo, bool bUseOutputNodes, ref List<HEU_GeoNode> geoNodes) { List<HAPI_GeoInfo> geoInfos = new List<HAPI_GeoInfo>(); // Get display geo info HAPI_GeoInfo displayGeoInfo = new HAPI_GeoInfo(); if (!session.GetDisplayGeoInfo(objectInfo.nodeId, ref displayGeoInfo)) { return; } //HEU_Logger.LogFormat("Found geoinfo with name {0} and id {1}", HEU_SessionManager.GetString(displayGeoInfo.nameSH, session), displayGeoInfo.nodeId); geoInfos.Add(displayGeoInfo); if (bUseOutputNodes) { int outputCount = 0; if (!session.GetOutputGeoCount(objectInfo.nodeId, out outputCount)) { outputCount = 0; } if (outputCount > 0) { HAPI_GeoInfo[] outputGeoInfos = new HAPI_GeoInfo[outputCount]; if (!session.GetOutputGeoInfos(objectInfo.nodeId, ref outputGeoInfos, outputCount)) { outputGeoInfos = new HAPI_GeoInfo[0]; } foreach (HAPI_GeoInfo geoInfo in outputGeoInfos) { if (geoInfo.nodeId == displayGeoInfo.nodeId) { continue; } bool bValidOutput = true; int parentId = HEU_HAPIUtility.GetParentNodeID(session, geoInfo.nodeId); while (parentId >= 0) { if (parentId == geoInfo.nodeId) { // This output node is inside the display geo // Do not use this output to avoid duplicates bValidOutput = false; break; } parentId = HEU_HAPIUtility.GetParentNodeID(session, parentId); } if (bValidOutput) { // Need to cook output geometry to get their parts HAPI_GeoInfo cookedGeoInfo = new HAPI_GeoInfo(); session.CookNode(geoInfo.nodeId, HEU_PluginSettings.CookTemplatedGeos); // Get the refreshed geo info if (session.GetGeoInfo(geoInfo.nodeId, ref cookedGeoInfo)) { geoInfos.Add(cookedGeoInfo); } } } } } // Get editable nodes, cook em, then create geo nodes for them HAPI_NodeId[] editableNodes = null; HEU_SessionManager.GetComposedChildNodeList(session, objectInfo.nodeId, (int)HAPI_NodeType.HAPI_NODETYPE_SOP, (int)HAPI_NodeFlags.HAPI_NODEFLAGS_EDITABLE, true, out editableNodes); if (editableNodes != null) { foreach (HAPI_NodeId editNodeID in editableNodes) { if (editNodeID != displayGeoInfo.nodeId) { session.CookNode(editNodeID, HEU_PluginSettings.CookTemplatedGeos); HAPI_GeoInfo editGeoInfo = new HAPI_GeoInfo(); if (session.GetGeoInfo(editNodeID, ref editGeoInfo)) { geoInfos.Add(editGeoInfo); } } } } //HEU_Logger.LogFormat("Object id={5}, name={0}, isInstancer={1}, isInstanced={2}, instancePath={3}, instanceId={4}", // HEU_SessionManager.GetString(objectInfo.nameSH, session), objectInfo.isInstancer, objectInfo.isInstanced, // HEU_SessionManager.GetString(objectInfo.objectInstancePathSH, session), objectInfo.objectToInstanceId, objectInfo.nodeId); // Go through geo infos to create geometry int numGeoInfos = geoInfos.Count; for (int i = 0; i < numGeoInfos; ++i) { // Create GeoNode for each geoNodes.Add(CreateGeoNode(session, geoInfos[i])); } }
/// <summary> /// Gets the object infos and transforms for given asset. /// </summary> /// <param name="assetID">ID of the asset</param> /// <param name="nodeInfo">HAPI_NodeInfo of the asset</param> /// <param name="objectInfos">Array of retrieved object infos</param> /// <param name="objectTransforms">Array of retrieved object transforms</param> /// <returns>True if succesfully retrieved object infos and transforms</returns> public static bool GetObjectInfos(HEU_SessionBase session, HAPI_NodeId assetID, ref HAPI_NodeInfo nodeInfo, out HAPI_ObjectInfo[] objectInfos, out HAPI_Transform[] objectTransforms) { objectInfos = new HAPI_ObjectInfo[0]; objectTransforms = new HAPI_Transform[0]; if (nodeInfo.type == HAPI_NodeType.HAPI_NODETYPE_SOP) { // For SOP assets, we use the parent IDs to get the object info and geo info objectInfos = new HAPI_ObjectInfo[1]; if (!session.GetObjectInfo(nodeInfo.parentId, ref objectInfos[0])) { return(false); } // Identity transform will be used for SOP assets, so not querying transform objectTransforms = new HAPI_Transform[1]; objectTransforms[0] = new HAPI_Transform(true); } else if (nodeInfo.type == HAPI_NodeType.HAPI_NODETYPE_OBJ) { int objectCount = 0; if (!session.ComposeObjectList(assetID, out objectCount)) { return(false); } if (objectCount <= 0) { // Since this asset is an object type and has 0 object as children, we use the object itself objectInfos = new HAPI_ObjectInfo[1]; if (!session.GetObjectInfo(nodeInfo.id, ref objectInfos[0])) { return(false); } // Identity transform will be used for single object assets, so not querying transform objectTransforms = new HAPI_Transform[1]; objectTransforms[0] = new HAPI_Transform(true); } else { // This object has children, so use GetComposedObjectList to get list of HAPI_ObjectInfos objectInfos = new HAPI_ObjectInfo[objectCount]; if (!session.GetComposedObjectList(nodeInfo.parentId, objectInfos, 0, objectCount)) { return(false); } // Now get the object transforms objectTransforms = new HAPI_Transform[objectCount]; if (!HEU_SessionManager.GetComposedObjectTransformsMemorySafe(session, nodeInfo.parentId, HAPI_RSTOrder.HAPI_SRT, objectTransforms, 0, objectCount)) { return(false); } } } else { Debug.LogWarningFormat(HEU_Defines.HEU_NAME + ": Unsupported node type {0}", nodeInfo.type); return(false); } return(true); }