1248 {
1249 const char* hdaFile = "";
1250
1251 HAPI_Session session;
1252 HAPI_ThriftServerOptions serverOptions{ 0 };
1253 serverOptions.autoClose = true;
1254 serverOptions.timeoutMs = 3000.0f;
1255
1256 HE_CHECK(HAPI_StartThriftNamedPipeServer(&serverOptions,
"hapi",
nullptr,
nullptr))
1257
1258 HAPI_SessionInfo sessionInfo = HAPI_SessionInfo_Create();
1259 HE_CHECK(HAPI_CreateThriftNamedPipeSession(&session, "hapi", &sessionInfo))
1260
1261 HAPI_CookOptions cookOptions = HAPI_CookOptions_Create();
1262 HE_CHECK(HAPI_Initialize(&session, &cookOptions, true, -1,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr))
1263
1264 HAPI_AssetLibraryId assetLibId;
1265 HE_CHECK(HAPI_LoadAssetLibraryFromFile(&session, hdaFile, true, &assetLibId))
1266
1267 int assetCount;
1268 HE_CHECK(HAPI_GetAvailableAssetCount(&session, assetLibId, &assetCount))
1269
1270 if (assetCount > 1)
1271 {
1272 std::cout << "Should only be loading 1 asset here" << std::endl;
1273 }
1274
1275 HAPI_StringHandle assetSh;
1276 HE_CHECK(HAPI_GetAvailableAssets(&session, assetLibId, &assetSh, assetCount))
1277
1278 std::string assetName =
GetString(session, assetSh);
1279
1280 HAPI_NodeId nodeId;
1281 HE_CHECK(HAPI_CreateNode(&session, -1, assetName.c_str(),
"AnAsset",
false, &nodeId))
1282
1283 HE_CHECK(HAPI_CookNode(&session, nodeId, &cookOptions))
1284
1285 int cookStatus;
1286 HAPI_Result cookResult;
1287
1288 do
1289 {
1290 cookResult = HAPI_GetStatus(&session, HAPI_STATUS_COOK_STATE, &cookStatus);
1291 }
1292 while(cookStatus > HAPI_STATE_MAX_READY_STATE && cookResult == HAPI_RESULT_SUCCESS);
1293
1296
1297 HAPI_NodeInfo nodeInfo;
1298 HE_CHECK(HAPI_GetNodeInfo(&session, nodeId, &nodeInfo))
1299
1300 std::vector<HAPI_ParmInfo> parmInfos(nodeInfo.parmCount);
1301 HE_CHECK(HAPI_GetParameters(&session, nodeId, parmInfos.data(), 0, nodeInfo.parmCount))
1302
1303 std::cout << "Parameters: " <<
std::endl;
1304 for (int i = 0; i < nodeInfo.parmCount; ++i)
1305 {
1306 std::cout << "===========" << std::endl;
1307
1308 std::cout << " Name: "
1309 <<
GetString(session, parmInfos[i].nameSH)
1310 << std::endl;
1311
1312 std::cout << " Value: (";
1313
1314 if (HAPI_ParmInfo_IsInt(&parmInfos[i]))
1315 {
1316 int parmIntCount = HAPI_ParmInfo_GetIntValueCount(&parmInfos[i]);
1317
1318 std::vector<int> parmIntValues(parmIntCount);
1319
1320 HE_CHECK(HAPI_GetParmIntValues(&session, nodeId, parmIntValues.data(), parmInfos[i].intValuesIndex, parmIntCount))
1321
1322 for (int v = 0; v < parmIntCount; ++v)
1323 {
1324 if (v != 0)
1325 {
1326 std::cout << ", ";
1327 }
1328 std::cout << parmIntValues[v];
1329 }
1330 }
1331 else if (HAPI_ParmInfo_IsFloat(&parmInfos[i]))
1332 {
1333
1334 int parmFloatCount = HAPI_ParmInfo_GetFloatValueCount(&parmInfos[i]);
1335
1336 std::vector<float> parmFloatValues(parmFloatCount);
1337
1338 HE_CHECK(HAPI_GetParmFloatValues(&session, nodeId, parmFloatValues.data(), parmInfos[i].floatValuesIndex, parmFloatCount))
1339
1340 for (int v = 0; v < parmFloatCount; ++v)
1341 {
1342 if (v != 0)
1343 {
1344 std::cout << ", ";
1345 }
1346 std::cout << parmFloatValues[v];
1347 }
1348 }
1349 else if (HAPI_ParmInfo_IsString(&parmInfos[i]))
1350 {
1351 int parmStringCount = HAPI_ParmInfo_GetStringValueCount(&parmInfos[i]);
1352 std::vector<HAPI_StringHandle> parmSHValues(parmStringCount);
1353
1354 HE_CHECK(HAPI_GetParmStringValues(&session, nodeId,
true, parmSHValues.data(), parmInfos[i].stringValuesIndex, parmStringCount));
1355
1356 for (int v = 0; v < parmStringCount; ++v)
1357 {
1358 if (v != 0)
1359 {
1360 std::cout << ", ";
1361 }
1362
1363 std::cout <<
GetString(session, parmSHValues[v]);
1364 }
1365 }
1366
1368 }
1369 }
#define HE_CHECK(expr)
HoudiniEngine Check macro. Verify HoudiniEngine API Effectiveness.
static std::string GetString(HAPI_Session &session, HAPI_StringHandle stringHandle)