Author Topic: Vox Loader  (Read 778 times)

0 Members and 1 Guest are viewing this topic.

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 897
  • Reputation 36
  • Game making is my hobby for life!
Re: Vox Loader
« Reply #30 on: November 02, 2017, 05:01:50 PM »
Vuvk, последние скрины очень впечатляют.  8)  Ну я имею в виду те, что справа. Хорошо, что показал разницу.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Vox Loader
« Reply #31 on: November 02, 2017, 05:32:10 PM »
Попробовал сделать загрузку через динамические буфферы.
Пока вижу то, что на скрине.

Скорее всего потому, что в том тесте передается буффер индексов в виде указателя на 16-битный набор. Половина индексов просто пропала.

Сейчас я выложу вместе с исходниками загрузчик. Можно будет полноценно экспериментировать.
Crudux Cruo!

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Vox Loader
« Reply #32 on: November 02, 2017, 06:28:40 PM »
Обновил первый пост. Там же видео с демо и ссылка готовый загрузчик + исходники
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Vox Loader
« Reply #33 on: November 02, 2017, 06:33:55 PM »
Эй, а дракон где?!
У меня все модели большие (судя по размеру файла) грузятся норм...
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Vox Loader
« Reply #34 on: November 02, 2017, 06:34:51 PM »
он в vox/scan/dragon.vox
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Vox Loader
« Reply #35 on: November 05, 2017, 11:02:49 PM »
Вопрос к автору.
Мы можем добавить загрузчик vox-моделей в WS3D ?
И если ответ положительный, тогда читать второй вопрос:
Вопрос №2
Какую реализацию генератора меша включить: с потоками или все?
« Last Edit: November 06, 2017, 09:14:24 AM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Vox Loader
« Reply #36 on: November 06, 2017, 12:33:39 PM »
Ответ 1. Конечно можете. Я для этого этим и занимался  :P
Ответ 2. Желательно последнюю многопоточную версию добавить. Во-первых, там задействован алгоритм оптимизации количества вершин, во-вторых, используется несколько потоков для ускорения расчетов = более быстрая загрузка модели.
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Vox Loader
« Reply #37 on: November 06, 2017, 12:48:06 PM »
Ок. Включим сразу в новую редакцию. Как добавить? Как в оригинале название функции, или можно в wMeshLoad() / wMeshDestroy() ?
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Vox Loader
« Reply #38 on: November 06, 2017, 12:49:33 PM »
Quote
wMeshLoad() / wMeshDestroy()
Лучше так, скрыв всю внутреннюю реализацию. Я вот только не проверял что с коллизиями у такой вручную созданной модели?
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Vox Loader
« Reply #39 on: November 06, 2017, 06:37:22 PM »
Мне почему-то кажется, что надо добавить
Code: [Select]
free(colors);в конце функции
Code: [Select]
bool wVoxLoadMesh (const char* fileName, wVoxMesh** mesh)
Я убрал в примере на стр. 72-73
Code: [Select]
//if (voxMesh != NULL)
     //wVoxDestroyMesh(&voxMesh);

На 92 строке после генерации меша добавил
Code: [Select]
wVoxDestroyMesh(&voxMesh);
На 105 примерно добавил:
Code: [Select]
    float minX,minY,minZ,maxX,maxY,maxZ;
    wGetMeshBoundingBox(mesh,&minX,&minY,&minZ,&maxX,&maxY,&maxZ);
    float sizeX,sizeY,sizeZ;
    sizeX=maxX-minX;
    sizeY=maxY-minY;
    sizeZ=maxZ-minZ;

И эти значения использовал вместо voxMesh->sizeX, voxMesh->sizeY, voxMesh->sizeZ для аниматоров.

В конце перед wStop добавил еще раз:
Code: [Select]
wVoxDestroyMesh(&voxMesh);
=================================================================
Мы внедрим в WS3D пока версию загрузчика из vox_loader2.cpp, т.е. без потоков.
Что-то у меня с флагом -std=c++11 мой gcc 4.9.2  упрямится собирать сетевую часть движка. С Вокселями не связано, но с++11 ему чем-то помешал...

Ладно, позже доберусь пересобрать все что можно с новым компилятором.

Да, и пришлось от всяких typedef uint16_t  uint16 избавиться.....     
« Last Edit: November 06, 2017, 08:30:55 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Vox Loader
« Reply #40 on: November 07, 2017, 05:50:36 AM »
Quote
Мне почему-то кажется, что надо добавить
free(colors);

Упс. Вот и одна из утечек памяти...

Quote
И эти значения использовал вместо voxMesh->sizeX, voxMesh->sizeY, voxMesh->sizeZ для аниматоров.
Вполне резонно, т.к. пользователь не будет иметь доступа к этой внутренней структуре ;)
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Vox Loader
« Reply #41 on: December 30, 2017, 01:43:17 PM »
Размышления по поводу того, почему пример с загрузчиком vox-моделей работает на С++, но отказывается запускаться на freebasic.
Как я и предположил ранее, проблема в выделении памяти.

Проанализировав код и используя старый дедовский способ отладки с помощью вывода в консоль через printf()  (ну, тут можно и посмеяться), найдено "тонкое место". В загрузчике моделей используются динамические массивы для вертексов и индексов. Что логично и понятно.
Но есть статичный массив
Code: [Select]
mergedF[x][y][z], каждый размер равен размеру чанка, в нашем случае меша.
При больших значениях получается довольно большой массив < sizeMesh*sizeMesh*sizeMesh >. Здесь и наступает коллапс.

Подправил так (в vox_loader2.cpp):

В начале:
Code: [Select]
bool**** mergedF;
В функции wVoxGenerateMesh_optimal:
вместо bool mergedF[sz][sz][sz] = {0}; теперь это:
Code: [Select]
    mergedF=(bool****)calloc(sizeof(bool***), sz);
    for(unsigned int x=0;x<sz;++x)
    {
        mergedF[x]=(bool***)calloc(sizeof(bool**), sz);
    }
    for (unsigned int x = 0; x < sz; ++x)
        for (unsigned int y = 0; y < sz; ++y)
        {
            mergedF[x][y] = (bool**)calloc(sizeof(bool*), sz);
        }
    for (unsigned int x = 0; x < sz; ++x)
        for (unsigned int y = 0; y < sz; ++y)
            for (unsigned int z = 0; z < sz; ++z)
            {
                mergedF[x][y][z] = (bool*)calloc(sizeof(bool), sz);
            }
Лично я предпочитаю new/delete, но чтоб не нарушать единообразие кода, сделано через calloc, как у автора Vuvk-а.

Соответственно во всех местах подправил такое:
(!(mergedF[x0][y0][z]))) на
Code: [Select]
(!(*mergedF[x0][y0][z])))
Ну и в конце очищаем память (в районе 1200-й строки):

Code: [Select]
    for (unsigned int x = 0; x < sz; ++x)
        for (unsigned int y = 0; y < sz; ++y)
            for (unsigned int z = 0; z < sz; ++z)
                free(mergedF[x][y][z]);

    for (unsigned int x = 0; x < sz; ++x)
        for (unsigned int y = 0; y < sz; ++y)
            free(mergedF[x][y]);

    for (unsigned int x = 0; x < sz; ++x)
        free(mergedF[x]);

    free(mergedF);

Собственно, все.
Теперь запускается и на бейсике, уверен, будет работать и на паскале и других ЯП.

На этом все, всем удачи. Воксели у нас будут точно.

PS. Выкладывать исходник не вижу смысла, так как в нем присутствуют еще и исправления, связанные с новыми цветами wColor4s, измененные типы данных и функции теперь несовместимы с исходниками, выложенными автором.


« Last Edit: December 30, 2017, 01:46:17 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Vox Loader
« Reply #42 on: December 31, 2017, 10:05:34 AM »
Quote
сделано через calloc, как у автора Vuvk-а
Ну, в Си нет никаких new/delete, поэтому и использовал calloc  :D
Приятно видеть, когда твоя поделка продолжает развиваться даже после того, как ты прекратил над ней работать :)
Crudux Cruo!