抄写diffcloth的源码
论文看不懂,代码也调不会,就直接抄代码吧,算了一下两万多行,抄吧,边抄边查边学,总能学会的。那么就开始抄src/code/engine/Macros.h吧。
首先,第一个难点:
#define GLM_ENABLE_EXPERIMENTAL
#define GLFW_INCLUDE_NONE
查一下deepseek,是这样说的:
在C++中使用GLM(OpenGL Mathematics)和GLFW(GLFW - 一个OpenGL的图形库)时,你遇到的两个宏定义#define GLM_ENABLE_EXPERIMENTAL和#define GLFW_INCLUDE_NONE有其特定的用途和必要性。下面我将解释每个宏的含义以及为什么它们被使用。
1. #define GLM_ENABLE_EXPERIMENTAL
GLM是一个现代的C++数学库,专门为OpenGL程序提供矩阵、向量、颜色等数学运算。从GLM 0.9.6版本开始,一些高级功能被标记为实验性(experimental),这意味着它们可能在未来的版本中发生变化或被移除。为了使用这些实验性功能,你需要在你的代码中定义GLM_ENABLE_EXPERIMENTAL宏。
示例用法:
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/glm.hpp>
#include <glm/gtx/rotate_vector.hpp> // 例如,使用实验性的旋转向量功能
这样,你就可以访问GLM的这些实验性扩展功能了。
2. #define GLFW_INCLUDE_NONE
GLFW是一个跨平台的库,用于创建窗口、接收输入和处理事件。在GLFW的某些版本中,为了避免与Windows.h或其他库的潜在冲突,你可以通过定义GLFW_INCLUDE_NONE来防止GLFW自动包含任何标准头文件。
示例用法:
#define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h> // 确保在包含GLFW头文件之前定义此宏
如果你在使用Windows平台并且已经包含了Windows.h,那么定义GLFW_INCLUDE_NONE可以帮助避免重复包含标准头文件导致的编译错误或警告。
第二个难点:
#include <sstream>
这个头文件没学过。查到如下资料:
#include <sstream> 是 C++ 中用于包含标准字符串流库的头文件,该库提供了处理字符串的输入/输出功能。 12
主要功能
<sstream> 头文件定义了三个核心类:
std::istringstream:从字符串中读取数据,类似 std::cin 的功能。 23
std::ostringstream:向字符串写入数据,类似 std::cout 的功能。 23
std::stringstream:支持读写操作,兼具前两者的功能。 23
典型用法示例
读取字符串:
std::istringstream iss(str);
while (iss) { std::string word; iss >> word; std::cout << word << endl;
}
``` :ml-citation{ref="3,4" data="citationList"}
写入字符串:
std::ostringstream oss;
oss << "Hello" << " World";
std::string result = oss.str();
``` :ml-citation{ref="2,3" data="citationList"}
类型转换:
std::stringstream ss;
ss << 123;
int num = ss.str(); // 输出 123
``` :ml-citation{ref="2,4" data="citationList"}
第三个难点:
#define GL_SILENCE_DEPRECATION
在MacOS 10.14及以上版本中,使用OpenGL时会出现glTranslatef等函数被标记为过时(deprecated)的警告。要消除这些警告,可以加这个宏
第四个难点:
#define ARRAY_COUNT(x) (sizeof(x) / sizeof( (x)[0] ) )
这个写法很奇特,可以学习学习。
第五个难点:
#ifdef USE_DEBUG
在调试版本中,通常定义USE_DEBUG宏,此时包含调试信息的代码会被编译。
第六个难点:
#define DEBUG_PRINTF(x) printf x
这种语法活久见。
