public static HEU_GenerateGeoCache GetPopulatedGeoCache(HEU_SessionBase session, HAPI_NodeId geoID, HAPI_PartId partID) { #if HEU_PROFILER_ON float generateGeoCacheStartTime = Time.realtimeSinceStartup; #endif HEU_GenerateGeoCache geoCache = new HEU_GenerateGeoCache(); Debug.Assert(geoID != HEU_Defines.HEU_INVALID_NODE_ID, "Invalid Geo ID! Unable to update materials!"); Debug.Assert(partID != HEU_Defines.HEU_INVALID_NODE_ID, "Invalid Part ID! Unable to update materials!"); geoCache._geoInfo = new HAPI_GeoInfo(); if (!session.GetGeoInfo(geoID, ref geoCache._geoInfo)) { return null; } geoCache._partInfo = new HAPI_PartInfo(); if (!session.GetPartInfo(geoID, partID, ref geoCache._partInfo)) { return null; } geoCache._partName = HEU_SessionManager.GetString(geoCache._partInfo.nameSH, session); // Unity max indices limitation! #if UNITY_2017_3_OR_NEWER uint UNITY_MAX_VERTS = uint.MaxValue; #else uint UNITY_MAX_VERTS = ushort.MaxValue; #endif uint maxVertexCount = Convert.ToUInt32(geoCache._partInfo.vertexCount); if (maxVertexCount > UNITY_MAX_VERTS) { Debug.LogErrorFormat("Part {0} has vertex count of {1} which is above Unity maximum of {2}.\nUse Unity 2017.3+ or reduce this in Houdini.", geoCache._partName, maxVertexCount, UNITY_MAX_VERTS); return null; } geoCache._vertexList = new int[geoCache._partInfo.vertexCount]; if (!HEU_GeneralUtility.GetArray2Arg(geoID, partID, session.GetVertexList, geoCache._vertexList, 0, geoCache._partInfo.vertexCount)) { return null; } geoCache._houdiniMaterialIDs = new HAPI_NodeId[geoCache._partInfo.faceCount]; if (!session.GetMaterialNodeIDsOnFaces(geoID, partID, ref geoCache._singleFaceHoudiniMaterial, geoCache._houdiniMaterialIDs, geoCache._partInfo.faceCount)) { return null; } geoCache.PopulateUnityMaterialData(session); if (!geoCache.PopulateGeometryData(session)) { return null; } #if HEU_PROFILER_ON Debug.LogFormat("GENERATE GEO CACHE TIME:: {0}", (Time.realtimeSinceStartup - generateGeoCacheStartTime)); #endif return geoCache; }