/****************************************************************
 *
 * 作   者：王建军
 * 时   间：2024/03/27
 * 开发语言：C++
 * 开发工具：QtCreator(Qt)
 * 文   件：pesdkutility.h
 * 版   权：武汉创景可视技术有限公司
 *
 ***************************************************************/
#ifndef PESDKUTILTIY_H
#define PESDKUTILTIY_H

#include <QString>

#include "VsMacros.h"
#include "VsInterface.h"

/**
* @brief 封装一些pe sdk常用函数
* pe sdk模型节点，使用VsDatabase结构体封装，FBX模型节点，使用FbxNode类
* pe sdk模型, 使用的格式是vis, 为了名称上统一, 下面涉及到vis模型节点，统一称为visnode
**/

namespace Vis
{
/**
* @brief 根据节点路径获取pe节点
* @param path pe平台节点路径
**/
VsDatabase* fieldPathToVisNode(std::string path);

VsDatabase* getVisNodeByVsKey(VS_KEY visKey);

VsDatabase* getParentByVisNode(VsDatabase* visNode);

VsDatabase* getParentByVisKey(VS_KEY visKey);

/**
* @brief 打印pe节点的信息
* @param penode pe平台的节点
**/
std::string debugVisNode(VsDatabase* visNode);

/**
* @brief 遍历vis模型节点，将vis模型节点保存fbx
* @param visNode pe平台的vis模型节点
* @param savePath 保存fbx的路径
* @note 遍历平台模型节点，获取坐标信息，将坐标信息填充到fbx节点中，其中有很多细节:
* (1) vis模型节点, 通过函数VsDatabase* visChildNode = db->childList;获取子节点,
*    父节点和子节点之间，好像只有矩阵变换的信息没有什么信息，也就是说，父节点不存在网格三维坐标，只有根节点有三维坐标
* (2) vis模型中倒数第一节点，也就是根节点，必然是带有网格三维坐标
* (3) vis模型中倒数第二节点，可以包含多个同名根节点，每个同名根节点，又有多个网格，这么多网格中，又没有名称id，着实蛋疼
* (4) fbx模型节点中，节点可以包含很多属性，比如：网格，相机，灯光......
* (5) fbx模型中节点中，一个节点只能包含一个网格
* ......
* (n) fbx模型，很复杂，看起来好像很吓人，其实，autodesk公司，他们写了非常完整说明文档https://help.autodesk.com/view/FBX/2020/ENU/?guid=FBX_Developer_Help_welcome_to_the_fbx_sdk_what_new_fbx_sdk_2020_html
*    只要看一下文档，就能理解fbx中大部分的内容
*    vis模型，没有一个文档，没有一个例子，面对虚空吧......
* (n+1) 后来的维护者，不知经过多少年后，你看到了这个内容，或许，你也不知道我在写什么，请您静下心来，慢慢的看代码，并测试运行
**/
void traverseVisNodeAndSaveAsFbxFile(VsDatabase *visNode, std::string savePath);
}


#endif // PESDKUTILTIY_H
