Этот пост из серии " Смотрите, я баг нашёл "
Нашёл в интернет нужный код, но он компилируется только в линуксе (потому что используются старые библиотеки, которые под винду уже не найти).
Выпилил эти библиотеки, заменив их на актуальные аналоги. Теперь проект нормально собирается как в линуксе, так и в вижуалке.
Что я сделал:
- Сгрёб все
cpp/h
-файлы в одну папку (так удобнее между ними переключаться). - Заменил библиотеки
freeglut -> GLFW + GLEW
,libpng -> stbImage
. - Навернул на всё это свою камеру.
Ничего больше не менял. Ну кроме путей к файлам текстур.
Однако, в ходе тестирования обнаружились очень странные вещи. Например, при запуске в линуксе изображение нормальное. А на винде тот же код выдаёт перевёрнутую матрицу. Но это-то ладно. С камерой должно быть всё просто. Я ещё не до конца разобрался, как в том проекте устроена камера.
А вот следующее чюдо вообще не понятно. Есть код:
#include "ConfigTables.h"
void _eatComment(FILE* fp){
char str[100];
#ifdef _WIN32
fscanf_s(fp, "\n//");
#else
fscanf(fp, "\n//");
#endif // _WIN32
while (str[0] != '\n')
{
#ifdef _WIN32
fscanf_s(fp, "%c", str);
#else
fscanf(fp, "%c", str);
#endif // _WIN32
}
}
int ConfigTables::Load(const char* path){
#ifdef _WIN32
FILE* fp;
if (fopen_s(&fp, path, "r"))
#else
FILE* fp = fopen(path, "r");
if (!fp)
#endif // _WIN32
{
return false;
}
if(fp){
// eat comment
_eatComment(fp);
// load the tri counts
for(int i = 0; i < 256; i++){
int count = 0;
#ifdef _WIN32
fscanf_s(fp, "%d", &count);
#else
fscanf(fp, "%d", &count);
#endif // _WIN32
TriCount[i] = count;
#ifdef CONFIG_TABLES_DEBUG
printf("%d ", count);
#endif
}
#ifdef CONFIG_TABLES_DEBUG
printf("\n\n");
#endif
// eat the next comment
_eatComment(fp);
// load the triangle lists
for(int i = 0; i < 256; i++){
for(int j = 0; j < 15; j++){
int ti = 0; // tri index
#ifdef _WIN32
fscanf_s(fp, "%d", &ti); <<<<<<<<<вот тут в релизе всегда нули
#else
fscanf(fp, "%d", &ti);
#endif // _WIN32
TriLists[i][j] = ti;
#ifdef CONFIG_TABLES_DEBUG
printf("%d ", TriLists[i][j]);
#endif
}
#ifdef CONFIG_TABLES_DEBUG
printf("\n");
#endif
}
fclose(fp);
return 1;
}
// error opening file
return 0;
}
Оно парсит текстовый файл, доставая из него таблицу треугольников marching cubes
. Её можно и вручную в массив забить (я потом так и сделаю) и должно заработать. Но данный пост не про это.
Прикол в том, что в дебаге это работает, а в релизе во втором цикле получаются нули. Если внимательно присмотреться, то можно увидеть, что функция _eatComment
содержит ошибки. Если переписать вот так:
void _eatComment(FILE* fp)
{
char c = 0;
#ifdef _WIN32
fscanf_s(fp, "\n//");
#else
fscanf(fp, "\n//");
#endif // _WIN32
while (c != '\n')
{
#ifdef _WIN32
fscanf_s(fp, "%c", &c, 1);
#else
fscanf(fp, "%c", &c);
#endif // _WIN32
}
}
то таблица правильно считывается как в дебаге, так и в релизе. Но тут начинаются чюдеса. В дебаге матрица остаётся перевёрнутой, а в релизе она переворачивается в нормальное состояние! Верх становится верхом, а низ низом.
Проверил код парсинга в пустом проекте - то же самое. Но как оно вообще компилируется, если в функцию передаётся неправильное количество аргументов? И почему не крашится, если вместо ссылки на char
передаётся char[100]
без ссылки?