222 lines
5.5 KiB
C
222 lines
5.5 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "c-tinyusd.h"
|
|
|
|
// Return 1: Continue traversal. 0: Terminate traversal.
|
|
int prim_traverse_fun(const CTinyUSDPrim *prim, const CTinyUSDPath *path) {
|
|
if (!prim) {
|
|
return 1;
|
|
}
|
|
|
|
if (!path) {
|
|
return 1;
|
|
}
|
|
|
|
printf("prim trav...\n");
|
|
|
|
return 1;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
if (argc > 1) {
|
|
|
|
int ret = c_tinyusd_is_usd_file(argv[1]);
|
|
if (!ret) {
|
|
printf("%s is not found or not a valid USD file.\n", argv[1]);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
CTinyUSDStage *stage = c_tinyusd_stage_new();
|
|
|
|
c_tinyusd_string_t *warn = c_tinyusd_string_new_empty();
|
|
c_tinyusd_string_t *err = c_tinyusd_string_new_empty();
|
|
|
|
ret = c_tinyusd_load_usd_from_file(argv[1], stage, warn, err);
|
|
|
|
if (c_tinyusd_string_size(warn)) {
|
|
printf("WARN: %s\n", c_tinyusd_string_str(warn));
|
|
}
|
|
|
|
if (!ret) {
|
|
if (c_tinyusd_string_size(err)) {
|
|
printf("ERR: %s\n", c_tinyusd_string_str(err));
|
|
}
|
|
}
|
|
|
|
// print USD(Stage) content as ASCII.
|
|
c_tinyusd_string_t *str = c_tinyusd_string_new_empty();
|
|
|
|
if (!c_tinyusd_stage_to_string(stage, str)) {
|
|
printf("Unexpected error when exporting Stage to string.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
printf("%s\n", c_tinyusd_string_str(str));
|
|
|
|
printf("-- traverse Prim --\n");
|
|
//
|
|
// Traverse Prims in the Stage.
|
|
//
|
|
if (!c_tinyusd_stage_traverse(stage, prim_traverse_fun, err)) {
|
|
if (c_tinyusd_string_size(err)) {
|
|
printf("Traverse error: %s\n", c_tinyusd_string_str(err));
|
|
}
|
|
}
|
|
printf("-- end traverse Prim --\n");
|
|
|
|
//
|
|
// Release resources.
|
|
//
|
|
|
|
if (!c_tinyusd_string_free(str)) {
|
|
printf("str string free failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if (!c_tinyusd_stage_free(stage)) {
|
|
printf("Stage free failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
if (!c_tinyusd_string_free(warn)) {
|
|
printf("warn string free failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
if (!c_tinyusd_string_free(err)) {
|
|
printf("err string free failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
} else {
|
|
|
|
c_tinyusd_string_t *str = c_tinyusd_string_new_empty();
|
|
c_tinyusd_string_t *err = c_tinyusd_string_new_empty();
|
|
|
|
//
|
|
// Create new Prim
|
|
//
|
|
CTinyUSDPrim *prim = c_tinyusd_prim_new("Xform", err);
|
|
// You can also create a builtin Prim with enum
|
|
//CTinyUSDPrim *prim = c_tinyusd_prim_new_builtin(C_TINYUSD_PRIM_XFORM);
|
|
if (!prim) {
|
|
if (err) {
|
|
printf("Failed to new Prim: error = %s\n", c_tinyusd_string_str(err));
|
|
} else {
|
|
printf("Failed to new Prim.\n");
|
|
}
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
CTinyUSDPrim *child_prim = c_tinyusd_prim_new_builtin(C_TINYUSD_PRIM_MESH);
|
|
if (!child_prim) {
|
|
printf("Failed to new Mesh Prim.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
// You can also use c_tinyusd_prim_append_child_move() (eqivalent to emplace_back(std::move(child_prim)))
|
|
// In this case, you don't need to call prim free API.
|
|
if (!c_tinyusd_prim_append_child(prim, child_prim)) {
|
|
printf("Prim: Append child failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if (!c_tinyusd_prim_free(child_prim)) {
|
|
printf("Prim: Child Prim free failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
{
|
|
c_tinyusd_token_vector_t *tokv = c_tinyusd_token_vector_new_empty();
|
|
if (!tokv) {
|
|
printf("New token vector failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if (!c_tinyusd_prim_get_property_names(prim, tokv)) {
|
|
printf("Failed to get property names from a Prim.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if (!c_tinyusd_token_vector_free(tokv)) {
|
|
printf("Freeing token vector failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
|
|
{
|
|
CTinyUSDValue *attr_value = c_tinyusd_value_new_int(7);
|
|
if (!attr_value) {
|
|
printf("Failed to new `int` value.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if (!c_tinyusd_value_to_string(attr_value, str)) {
|
|
printf("Failed to print `int` value.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
printf("Int attribute value: %s\n", c_tinyusd_string_str(str));
|
|
|
|
printf("Is value numeric?: %d\n", c_tinyusd_value_type_is_numeric(c_tinyusd_value_type(attr_value)));
|
|
|
|
if (!c_tinyusd_value_free(attr_value)) {
|
|
printf("Value free failed.\n");
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
}
|
|
|
|
{
|
|
c_tinyusd_string_t *strval = c_tinyusd_string_new("myval");
|
|
|
|
/*
|
|
* NOTE: `token` and `string` value are coped, so need to free it after using it.
|
|
*/
|
|
CTinyUSDValue *attr_value = c_tinyusd_value_new_string(strval);
|
|
if (!attr_value) {
|
|
printf("Failed to new `string` value.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if (!c_tinyusd_string_free(strval)) {
|
|
printf("str free failed.\n");
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
if (!c_tinyusd_value_to_string(attr_value, str)) {
|
|
printf("Failed to print `string` value.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
printf("String attribute value: %s\n", c_tinyusd_string_str(str));
|
|
|
|
if (!c_tinyusd_value_free(attr_value)) {
|
|
printf("Value free failed.\n");
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
}
|
|
|
|
if (!c_tinyusd_prim_free(prim)) {
|
|
printf("Prim free failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if (!c_tinyusd_string_free(str)) {
|
|
printf("str string free failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if (!c_tinyusd_string_free(err)) {
|
|
printf("err string free failed.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|