Skip to content

Commit cb6f3b7

Browse files
authored
v1.1.1
v1.1.1 March 10th, 2025 fbx: - added null and index checks - properly write images when import images arg is invoked - add support for invisibility gltf: - export normal scale - ignore invisible nodes on export obj: - fix parser to remove vulnerability - ignore invisible nodes on export ply: - ignore invisible nodes on export sbsar: - fix for isImageFileSupported() [fixes nested sbsarimages] spz: - ignore invisible nodes on export - initial stl: - ignore invisible nodes on export utility: - don't create subdivisionRule attribute with value none - fix for isImageFileSupported() [fixes nested usdz images] - prevent bad access in utils
2 parents c349263 + 7895957 commit cb6f3b7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1792
-126
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
fi
2828
JSON=$(jq -c . < "$MATRIX_FILE")
2929
MODIFIED_JSON='{"include":[]}'
30-
PLUGINS=("GLTF" "PLY" "OBJ" "STL" "FBX")
30+
PLUGINS=("GLTF" "PLY" "SPZ" "OBJ" "STL" "FBX")
3131
3232
for row in $(echo "${JSON}" | jq -c '.include[]'); do
3333
for plugin in "${PLUGINS[@]}"; do
@@ -195,6 +195,7 @@ jobs:
195195
"-Dpxr_ROOT=${{ github.workspace }}/usd_build"
196196
"-DUSD_FILEFORMATS_ENABLE_GLTF=$([[ "${{ matrix.config }}" == "ALL" || "${{ matrix.config }}" == "GLTF" ]] && echo "ON" || echo "OFF")"
197197
"-DUSD_FILEFORMATS_ENABLE_PLY=$([[ "${{ matrix.config }}" == "ALL" || "${{ matrix.config }}" == "PLY" ]] && echo "ON" || echo "OFF")"
198+
"-DUSD_FILEFORMATS_ENABLE_SPZ=$([[ "${{ matrix.config }}" == "ALL" || "${{ matrix.config }}" == "SPZ" ]] && echo "ON" || echo "OFF")"
198199
"-DUSD_FILEFORMATS_ENABLE_OBJ=$([[ "${{ matrix.config }}" == "ALL" || "${{ matrix.config }}" == "OBJ" ]] && echo "ON" || echo "OFF")"
199200
"-DUSD_FILEFORMATS_ENABLE_STL=$([[ "${{ matrix.config }}" == "ALL" || "${{ matrix.config }}" == "STL" ]] && echo "ON" || echo "OFF")"
200201
"-DUSD_FILEFORMATS_ENABLE_FBX=$([[ "${{ matrix.config }}" == "ALL" || "${{ matrix.config }}" == "FBX" ]] && echo "ON" || echo "OFF")"

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ option(USD_FILEFORMATS_BUILD_TESTS "Build the unit tests" ON)
2727
option(USD_FILEFORMATS_ENABLE_FBX "Enables fbx plugin" ON)
2828
option(USD_FILEFORMATS_ENABLE_GLTF "Enables gltf plugin" ON)
2929
option(USD_FILEFORMATS_ENABLE_OBJ "Enables obj plugin" ON)
30+
option(USD_FILEFORMATS_ENABLE_SPZ "Enables spz plugin" ON)
3031
option(USD_FILEFORMATS_ENABLE_PLY "Enables ply plugin" ON)
3132
option(USD_FILEFORMATS_ENABLE_STL "Enables stl plugin" ON)
3233
option(USD_FILEFORMATS_ENABLE_SBSAR "Enables sbsar plugin" OFF)
@@ -37,6 +38,7 @@ option(USD_FILEFORMATS_FETCH_DRACO "Forces FetchContent for Draco" OFF)
3738
option(USD_FILEFORMATS_FETCH_ZLIB "Forces FetchContent for Zlib" OFF)
3839
option(USD_FILEFORMATS_FETCH_LIBXML2 "Forces FetchContent for LibXml2" ON)
3940
option(USD_FILEFORMATS_FETCH_HAPPLY "Forces FetchContent for Happly" ON)
41+
option(USD_FILEFORMATS_FETCH_SPZ "Forces FetchContent for spz" ON)
4042
option(USD_FILEFORMATS_FETCH_SPHERICAL_HARMONICS "Forces FetchContent for SphericalHarmonics" ON)
4143
option(USD_FILEFORMATS_FETCH_FMT "Forces FetchContent for Fmt" ON)
4244
option(USD_FILEFORMATS_FETCH_FASTFLOAT "Forces FetchContent for FastFLoat" ON)
@@ -110,6 +112,9 @@ endif()
110112
if (USD_FILEFORMATS_ENABLE_SBSAR)
111113
add_subdirectory(sbsar)
112114
endif()
115+
if (USD_FILEFORMATS_ENABLE_SPZ)
116+
add_subdirectory(spz)
117+
endif()
113118
if (USD_FILEFORMATS_ENABLE_STL)
114119
add_subdirectory(stl)
115120
endif()

README.md

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ These [USD file-format-plugins](https://graphics.pixar.com/usd/release/plugins.h
1818
| [usdobj](obj/README.md) | [Wavefront's obj](https://en.wikipedia.org/wiki/Wavefront_.obj_file) | `.obj` |
1919
| [usdply](ply/README.md) | [Polygon File Format](https://en.wikipedia.org/wiki/PLY_(file_format)) | `.ply` |
2020
| [usdsbsar](sbsar/README.md) | [SBSAR file format](https://developer.adobe.com/console/servicesandapis#) | `.sbsar` |
21+
| [usdspz](spz/README.md) | [Niantic Labs SPZ](https://scaniverse.com/news/spz-gaussian-splat-open-source-file-format) | `.spz` |
2122
| [usdstl](stl/README.md) | [STL file format](https://en.wikipedia.org/wiki/STL_(file_format)) | `.stl` |
2223

2324

@@ -41,19 +42,20 @@ The following tools are needed:
4142
The following dependencies are needed:
4243
|Dependency|Version|Affects|Optional|
4344
|--|--|--|--|
44-
| [Pixar USD](https://github.com/PixarAnimationStudios/USD) | 23.08 | all | no |
45-
| [GTest](https://github.com/google/googletest.git) | 1.11.0 | all tests | yes |
46-
| [Eigen](https://gitlab.com/libeigen/eigen) | 3.4.0 | usdply | no |
47-
| [FBX SDK](https://aps.autodesk.com/developer/overview/fbx-sdk) | 2020.3.7 | usdfbx | no |
48-
| [LibXml2](https://gitlab.gnome.org/GNOME/libxml2) | 2.10.0 | usdfbx | no |
49-
| [Zlib](https://github.com/madler/zlib.git) | 1.2.11 | usdfbx | no |
50-
| [TinyGltf](https://github.com/syoyo/tinygltf) | 2.8.21 | usdgltf | no |
51-
| [Draco](https://github.com/google/draco.git) | 1.56 | usdgltf | yes |
52-
| [Fmt](https://github.com/fmtlib/fmt.git) | 10.1.1 | usdobj | no |
53-
| [FastFloat](https://github.com/lemire/fast_float.git) | 1.1.2 | usdobj | no |
54-
| [Happly](https://github.com/nmwsharp/happly.git) | cfa2611 | usdply | no |
55-
| [Spherical Harmonics](https://github.com/google/spherical-harmonics) | ccb6c7f | usdply | no |
56-
| [Substance](https://developer.adobe.com/substance3d-sdk/) | 9.1.2 | usdsbsar | no |
45+
| [Pixar USD](https://github.com/PixarAnimationStudios/USD) | 23.08 | all | no |
46+
| [GTest](https://github.com/google/googletest.git) | 1.11.0 | all tests | yes |
47+
| [Eigen](https://gitlab.com/libeigen/eigen) | 3.4.0 | usdply, usdspz | no |
48+
| [FBX SDK](https://aps.autodesk.com/developer/overview/fbx-sdk) | 2020.3.7 | usdfbx | no |
49+
| [LibXml2](https://gitlab.gnome.org/GNOME/libxml2) | 2.10.0 | usdfbx | no |
50+
| [Zlib](https://github.com/madler/zlib.git) | 1.2.11 | usdfbx, usdgltf | no |
51+
| [TinyGltf](https://github.com/syoyo/tinygltf) | 2.8.21 | usdgltf | no |
52+
| [Draco](https://github.com/google/draco.git) | 1.56 | usdgltf | yes |
53+
| [Fmt](https://github.com/fmtlib/fmt.git) | 10.1.1 | usdobj | no |
54+
| [FastFloat](https://github.com/lemire/fast_float.git) | 1.1.2 | usdobj | no |
55+
| [Happly](https://github.com/nmwsharp/happly.git) | cfa2611 | usdply | no |
56+
| [Spherical Harmonics](https://github.com/google/spherical-harmonics) | ccb6c7f | usdply, usdspz | no |
57+
| [Spz](https://github.com/nianticlabs/spz) | fd4e2a5 | usdspz | no |
58+
| [Substance](https://developer.adobe.com/substance3d-sdk/) | 9.1.2 | usdsbsar | no |
5759

5860
## Build
5961

@@ -130,8 +132,9 @@ where:
130132
| -DUSD_FILEFORMATS_ENABLE_GLTF | Enables gltf plugin | ON | usdgltf |
131133
| -DUSD_FILEFORMATS_ENABLE_OBJ | Enables obj plugin | ON | usdobj |
132134
| -DUSD_FILEFORMATS_ENABLE_PLY | Enables ply plugin | ON | usdply |
133-
| -DUSD_FILEFORMATS_ENABLE_STL | Enables stl plugin | ON | usdstl |
134-
| -DUSD_FILEFORMATS_ENABLE_SBSAR | Enables sbsar plugin | OFF | usdsbsar |
135+
| -DUSD_FILEFORMATS_ENABLE_SPZ | Enables spz plugin | ON | usdspz |
136+
| -DUSD_FILEFORMATS_ENABLE_STL | Enables stl plugin | ON | usdstl |
137+
| -DUSD_FILEFORMATS_ENABLE_SBSAR | Enables sbsar plugin | OFF | usdsbsar |
135138
| -DUSD_FILEFORMATS_ENABLE_DRACO | Enables draco in usdgltf | OFF | usdgltf |
136139
| -DUSD_FILEFORMATS_FORCE_FETCHCONTENT | Forces FetchContent for various packages | OFF | all |
137140
| -DUSD_FILEFORMATS_FETCH_GTEST | Forces FetchContent for GTest | ON | all tests |

changelog.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,28 @@
1+
v1.1.1 March 10th, 2025
2+
fbx:
3+
- added null and index checks
4+
- properly write images when import images arg is invoked
5+
- add support for invisibility
6+
gltf:
7+
- export normal scale
8+
- ignore invisible nodes on export
9+
obj:
10+
- fix parser
11+
- ignore invisible nodes on export
12+
ply:
13+
- ignore invisible nodes on export
14+
sbsar:
15+
- fix for isImageFileSupported() [fixes nested sbsarimages]
16+
spz:
17+
- ignore invisible nodes on export
18+
- initial
19+
stl:
20+
- ignore invisible nodes on export
21+
utility:
22+
- don't create subdivisionRule attribute with value none
23+
- fix for isImageFileSupported() [fixes nested usdz images]
24+
- prevent bad access in utils
25+
126
v1.1.0 January 31st, 2025
227
fbx:
328
- add display name to USD to save imported names for export

cmake/Findspz.cmake

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#[=======================================================================[.rst:
2+
----
3+
4+
Finds or fetches the spz library.
5+
If USD_FILEFORMATS_FORCE_FETCHCONTENT or USD_FILEFORMATS_FETCH_SPZ are
6+
TRUE, spz will be fetched. Otherwise it will be searched via find commands.
7+
8+
Imported Targets
9+
^^^^^^^^^^^^^^^^
10+
11+
This module provides the following imported targets, if fetched:
12+
13+
``spz::spz``
14+
The spz library
15+
16+
Result Variables
17+
^^^^^^^^^^^^^^^^
18+
19+
This will define the following variables:
20+
21+
``spz_FOUND``
22+
23+
Cache Variables
24+
^^^^^^^^^^^^^^^
25+
26+
The following cache variables may also be set:
27+
28+
``SPZ_INCLUDE_DIR``
29+
The directory containing ``splat-types.h``.
30+
31+
#]=======================================================================]
32+
33+
if(TARGET spz::spz)
34+
return()
35+
endif()
36+
37+
if(NOT TARGET ZLIB::ZLIB)
38+
find_package(ZLIB REQUIRED)
39+
endif()
40+
41+
if(USD_FILEFORMATS_FORCE_FETCHCONTENT OR USD_FILEFORMATS_FETCH_SPZ)
42+
message(STATUS "Fetching spz")
43+
include(FetchContent)
44+
FetchContent_Declare(
45+
spz
46+
GIT_REPOSITORY "https://github.com/raymondyfei/spz.git"
47+
GIT_TAG "fd4e2a57bd6b7462657d41eebda330eca0f35159"
48+
OVERRIDE_FIND_PACKAGE
49+
)
50+
FetchContent_MakeAvailable(spz)
51+
if (spz_POPULATED)
52+
set(spz_FOUND TRUE)
53+
file(GLOB SPZ_SRC_FILES
54+
${spz_SOURCE_DIR}/src/cc/*.cc
55+
${spz_SOURCE_DIR}/src/cc/*.h
56+
)
57+
add_library(spz STATIC)
58+
target_sources(spz PRIVATE ${SPZ_SRC_FILES})
59+
set(SPZ_INCLUDE_DIR "${spz_SOURCE_DIR}/src/cc")
60+
target_include_directories(spz PUBLIC ${SPZ_INCLUDE_DIR})
61+
target_link_libraries(spz PRIVATE ZLIB::ZLIB)
62+
set_property(TARGET spz PROPERTY POSITION_INDEPENDENT_CODE ON)
63+
set_property(TARGET spz PROPERTY CXX_STANDARD 17)
64+
target_compile_definitions(spz PRIVATE "_USE_MATH_DEFINES")
65+
if (NOT MSVC)
66+
target_compile_options(spz PRIVATE "-Wno-shorten-64-to-32")
67+
endif()
68+
69+
add_library(spz::spz ALIAS spz)
70+
elseif(${spz_FIND_REQUIRED})
71+
message(FATAL_ERROR "Could not fetch spz")
72+
endif()
73+
else()
74+
include(FindPackageHandleStandardArgs)
75+
76+
find_path(SPZ_INCLUDE_DIR
77+
NAMES splat-types.h
78+
)
79+
80+
find_package_handle_standard_args(spz
81+
REQUIRED_VARS SPZ_INCLUDE_DIR
82+
)
83+
84+
if(spz_FOUND)
85+
file(GLOB SPZ_SRC_FILES
86+
${SPZ_INCLUDE_DIR}/*.cc
87+
${SPZ_INCLUDE_DIR}/*.h
88+
)
89+
add_library(spz STATIC)
90+
target_sources(spz PRIVATE ${SPZ_SRC_FILES})
91+
target_include_directories(spz PUBLIC ${SPZ_INCLUDE_DIR})
92+
target_link_libraries(spz PRIVATE ZLIB::ZLIB)
93+
set_property(TARGET spz PROPERTY POSITION_INDEPENDENT_CODE ON)
94+
set_property(TARGET spz PROPERTY CXX_STANDARD 17)
95+
target_compile_definitions(spz PRIVATE "_USE_MATH_DEFINES")
96+
97+
if (NOT MSVC)
98+
target_compile_options(spz PRIVATE "-Wno-shorten-64-to-32")
99+
endif()
100+
101+
add_library(spz::spz ALIAS spz)
102+
elseif(${spz_FIND_REQUIRED})
103+
message(FATAL_ERROR "Could not find spz")
104+
endif()
105+
endif()
106+
107+

fbx/src/fbx.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ EmbedReadCBFunction(void* pUserData,
209209
}
210210

211211
bool
212-
readFbx(Fbx& fbx, const std::string& filename, bool onlyMaterials)
212+
readFbx(Fbx& fbx, const std::string& filename, bool importImages, bool onlyMaterials)
213213
{
214214
GUARD(fbx.manager != nullptr, "Invalid fbx manager");
215215

@@ -228,7 +228,7 @@ readFbx(Fbx& fbx, const std::string& filename, bool onlyMaterials)
228228
ios->SetBoolProp(IMP_FBX_TEXTURE, true);
229229
ios->SetBoolProp(IMP_FBX_ANIMATION, !onlyMaterials);
230230
ios->SetBoolProp(IMP_FBX_MODEL, !onlyMaterials);
231-
fbx.loadImages = onlyMaterials;
231+
fbx.loadImages = importImages;
232232

233233
if (!importer->Initialize(filename.c_str(), -1, ios)) {
234234
FbxString error = importer->GetStatus().GetErrorString();

fbx/src/fbx.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,15 @@ struct Fbx
7171
~Fbx();
7272
};
7373

74+
/*
75+
* importImages Indicates whether the fbx should be set to load image data. It should be true if
76+
* the images are being written out, and false otherwise
77+
*
78+
* onlyMaterials Indicates whether the fbx should only load materials. It should only be true if
79+
* the file is being loaded just to separately load image textures, and nothing else is being used
80+
*/
7481
bool
75-
readFbx(Fbx& fbx, const std::string& filename, bool onlyMaterials);
82+
readFbx(Fbx& fbx, const std::string& filename, bool importImages, bool onlyMaterials);
7683

7784
bool
7885
writeFbx(const ExportFbxOptions& options, const Fbx& fbx, const std::string& filename);

fbx/src/fbxExport.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,13 +1295,23 @@ exportFbxNodes(ExportFbxContext& ctx)
12951295
parent->AddChild(fbxNode);
12961296
exportFbxTransform(ctx, node, fbxNode);
12971297

1298+
if (node.markedInvisible) {
1299+
fbxNode->SetVisibility(false);
1300+
}
12981301
if (node.camera >= 0) {
1302+
// Ignore camera invisibility, since it isn't important enough to add a new node
12991303
FbxCamera* fbxCamera = ctx.cameras[node.camera];
13001304
fbxNode->AddNodeAttribute(fbxCamera);
13011305
}
13021306
if (node.light >= 0) {
13031307
FbxLight* fbxLight = ctx.lights[node.light];
1304-
fbxNode->AddNodeAttribute(fbxLight);
1308+
FbxNode* container = fbxNode;
1309+
if (ctx.usd->lights[node.light].markedInvisible) {
1310+
container = FbxNode::Create(ctx.fbx->scene, "light_visibility");
1311+
container->SetVisibility(false);
1312+
fbxNode->AddChild(container);
1313+
}
1314+
container->AddNodeAttribute(fbxLight);
13051315
}
13061316

13071317
for (const auto& [skeletonIndex, meshIndices] : node.skinnedMeshes) {
@@ -1334,10 +1344,18 @@ exportFbxNodes(ExportFbxContext& ctx)
13341344
}
13351345
const Mesh& m = ctx.usd->meshes[meshIndex];
13361346
FbxNode* container = fbxNode;
1337-
if (node.staticMeshes.size() > 1) {
1338-
1339-
std::string containerName = getNodeName(node).c_str() + std::to_string(i);
1347+
if (node.staticMeshes.size() > 1 || m.markedInvisible) {
1348+
// Name the node based on the child index, unless there is only one child, in
1349+
// which case the node is only present to preserve visibility
1350+
std::string containerName =
1351+
node.staticMeshes.size() > 1
1352+
? getNodeName(node).c_str() + std::to_string(i)
1353+
: getNodeName(node).c_str() + std::string("_visibility");
13401354
container = FbxNode::Create(ctx.fbx->scene, containerName.c_str());
1355+
1356+
if (m.markedInvisible) {
1357+
container->SetVisibility(false);
1358+
}
13411359
fbxNode->AddChild(container);
13421360
}
13431361
FbxMesh* fbxMesh = ctx.meshes[meshIndex];

fbx/src/fbxImport.cpp

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,15 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent)
486486
if (clusterCount > 0) {
487487
isSkinnedMesh = true;
488488
FbxCluster* firstCluster = skin->GetCluster(0);
489+
if (firstCluster == nullptr) {
490+
TF_WARN("Skin: %d does not have a first cluster.\n", i);
491+
continue;
492+
}
489493
FbxNode* firstlink = firstCluster->GetLink();
494+
if (firstlink == nullptr) {
495+
TF_WARN("Skin: %d first cluster does not have a first link.\n", i);
496+
continue;
497+
}
490498
size_t skeletonIndex = ctx.skeletonsMap[firstlink];
491499

492500
ctx.meshSkinsMap[meshIndex] = skeletonIndex;
@@ -503,7 +511,15 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent)
503511

504512
for (int j = 0; j < clusterCount; j++) {
505513
FbxCluster* cluster = skin->GetCluster(j);
514+
if (cluster == nullptr) {
515+
TF_WARN("No cluster at skin index %d.\n", j);
516+
continue;
517+
}
506518
FbxNode* link = cluster->GetLink();
519+
if (link == nullptr) {
520+
TF_WARN("No link at skin index %d.\n", j);
521+
continue;
522+
}
507523

508524
size_t jointIndex = ctx.bonesMap[link];
509525

@@ -527,11 +543,28 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent)
527543
int clusterControlPointIndicesCount = cluster->GetControlPointIndicesCount();
528544
int* clusterControlPointIndices = cluster->GetControlPointIndices();
529545
double* pointsWeights = cluster->GetControlPointWeights();
546+
if (clusterControlPointIndices == nullptr) {
547+
TF_WARN("No cluster control point indices for skin cluster: %d.\n", j);
548+
continue;
549+
}
550+
if (pointsWeights == nullptr) {
551+
TF_WARN("No point weights for skin cluster: %d.\n", j);
552+
continue;
553+
}
530554
for (int k = 0; k < clusterControlPointIndicesCount; k++) {
531555
int controlPointIndex = clusterControlPointIndices[k];
532-
double influenceWeight = pointsWeights[k];
533-
indexes[controlPointIndex].push_back(jointIndex);
534-
weights[controlPointIndex].push_back(influenceWeight);
556+
if (controlPointIndex > indexes.size() || controlPointIndex > weights.size()) {
557+
TF_WARN("Control Point Index outside of index or weight bounds. index: %d "
558+
" Index Size: %d Weight Size: %d",
559+
controlPointIndex,
560+
indexes.size(),
561+
weights.size());
562+
continue;
563+
} else {
564+
double influenceWeight = pointsWeights[k];
565+
indexes[controlPointIndex].push_back(jointIndex);
566+
weights[controlPointIndex].push_back(influenceWeight);
567+
}
535568
}
536569
}
537570
}
@@ -2001,6 +2034,16 @@ importFbxNodes(ImportFbxContext& ctx, FbxNode* fbxNode, int parent)
20012034
auto [nodeIndex, node] = ctx.usd->addNode(parent);
20022035
node.name = fbxNode->GetName();
20032036

2037+
if (!fbxNode->GetVisibility()) {
2038+
node.markedInvisible = true;
2039+
}
2040+
if (!fbxNode->VisibilityInheritance.Get()) { // True by default
2041+
TF_WARN("importFbxNodes: Node %s does not inherit visibility (VisibilityInheritance = "
2042+
"false). This is currently unsupported. The node is set as %s",
2043+
fbxNode->GetName(),
2044+
node.markedInvisible ? "invisible" : "visible");
2045+
}
2046+
20042047
ctx.nodeMap[fbxNode] = nodeIndex;
20052048

20062049
TF_DEBUG_MSG(FILE_FORMAT_FBX, "importFbx: node %s\n", node.name.c_str());

0 commit comments

Comments
 (0)