diff --git a/cpp_src/fbx_parse.cpp b/cpp_src/fbx_parse.cpp index f22a8c4..ec808d2 100644 --- a/cpp_src/fbx_parse.cpp +++ b/cpp_src/fbx_parse.cpp @@ -7,9 +7,9 @@ using namespace std; extern "C" { // 定义给Rust调用的接口函数 - void fbx_parse(const char* fbx_path) + void fbx_parse(const FttContext* ctx) { - printf("%s\n", fbx_path); + printf("%s\n", ctx->fbx_file); FbxManager* lSdkManager = FbxManager::Create(); if (lSdkManager){ printf("FbxManager created\n"); @@ -23,7 +23,7 @@ extern "C" { printf("FbxScene creation failed.\n"); } FbxImporter* lImporter = FbxImporter::Create(lSdkManager, ""); - bool s = lImporter->Initialize(fbx_path, -1, lSdkManager->GetIOSettings()); + bool s = lImporter->Initialize(ctx->fbx_file, -1, lSdkManager->GetIOSettings()); if (s){ printf("FbxImporter initialized\n"); } else{ @@ -34,16 +34,15 @@ extern "C" { FbxNode* lRootNode = lScene->GetRootNode(); if (lRootNode) { - each_node(lRootNode, 0); + each_node(ctx, lRootNode, 0); } else { printf("No root node found in the scene.\n"); } } - void load_fbx_mesh_to_db(const char* fbx_path) + void load_fbx_mesh_to_db(const FttContext* ctx) { - FbxNode* root = get_fbx_root_node(fbx_path); - - each_node(root, 0); + FbxNode* root = get_fbx_root_node(ctx->fbx_file); + each_node(ctx, root, 0); } } diff --git a/cpp_src/fbx_wrap.cpp b/cpp_src/fbx_wrap.cpp index abec411..6bc780d 100644 --- a/cpp_src/fbx_wrap.cpp +++ b/cpp_src/fbx_wrap.cpp @@ -55,7 +55,7 @@ FbxNode* get_fbx_root_node(const char* fbx_path) } -void each_node(FbxNode* parent_node, int level) +void each_node(const FttContext* ctx, FbxNode* parent_node, int level) { // info print_node_info(parent_node, level); @@ -67,12 +67,8 @@ void each_node(FbxNode* parent_node, int level) { std::vector triangles; int count = load_triangles(attr, triangles); - printf("triangles: %ld;", triangles.size()); - std::cout << "(" - << get<0>(triangles[0]) << ", " - << get<1>(triangles[0]) << ", " - << get<2>(triangles[0]) << ")" - << std::endl; + printf("triangles: %ld\n", triangles.size()); + // save data to database } } @@ -83,7 +79,7 @@ void each_node(FbxNode* parent_node, int level) for (int i = 0; i < parent_node->GetChildCount(); i++) { FbxNode* child = parent_node->GetChild(i); - each_node(child, level + 1); + each_node(ctx, child, level + 1); } } } diff --git a/cpp_src/include/fbx_wrap.h b/cpp_src/include/fbx_wrap.h index 3e58362..174beed 100644 --- a/cpp_src/include/fbx_wrap.h +++ b/cpp_src/include/fbx_wrap.h @@ -1,14 +1,12 @@ #include #include +#include +#include using namespace std; using Triangle = std::tuple; -struct Context { - -}; - /** * 递归遍历FBX节点树结构 * @param parent_node 起始父节点,从此节点开始向下遍历(若为nullptr则函数不执行任何操作) @@ -16,7 +14,7 @@ struct Context { * @note 函数内部会递归访问parent_node的所有直接子节点和间接子节点 * @warning 若输入的parent_node无效(如野指针)可能导致程序崩溃 */ -void each_node(FbxNode* parent_node, int level); +void each_node(const FttContext* ctx, FbxNode* parent_node, int level); /** * 打印FBX节点的基本信息(含层级缩进) * @param node 待打印信息的节点指针(nullptr时输出警告日志) diff --git a/cpp_src/include/tools.h b/cpp_src/include/tools.h new file mode 100644 index 0000000..d829ffb --- /dev/null +++ b/cpp_src/include/tools.h @@ -0,0 +1,5 @@ + +typedef struct { + char* fbx_file; + char* out_dir; +} FttContext; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index cc043b0..cddae0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,19 +1,39 @@ +use std::{ffi::CString, os::raw::c_char}; + fn main() { - convert_fbx_to_3dtiles("/mnt/f/BaiduNetdiskDownload/绿科模型/绿科-三维视图-{三维}111.fbx"); + convert_fbx_to_3dtiles("/root/data/绿科-三维视图-{三维}111.fbx", "/root/data/out"); +} + +#[repr(C)] +pub struct FttContext { + pub fbx_file: *mut c_char, + pub out_dir: *mut c_char } unsafe extern "C" { pub unsafe fn fbx_parse(name_in: *const u8); - pub unsafe fn load_fbx_mesh_to_db(path: *const u8); + pub unsafe fn load_fbx_mesh_to_db(ctx: *const FttContext); } -fn convert_fbx_to_3dtiles(fbx_path: &str) { +fn convert_fbx_to_3dtiles(fbx_path: &str, out_dir: &str) { + + + let ctx = &FttContext{ + fbx_file: CString::new(fbx_path).unwrap().into_raw(), + out_dir: CString::new(out_dir).unwrap().into_raw() + }; unsafe { // fbx_parse(fbx_path.as_ptr() as *const u8); // 1. load to disk - load_fbx_mesh_to_db(fbx_path.as_ptr() as *const u8); + // fbx_path.as_ptr() as *const u8 + load_fbx_mesh_to_db(ctx); + + + // free + let _ = CString::from_raw(ctx.fbx_file); + let _ = CString::from_raw(ctx.out_dir); } // unsafe {