Author Topic: Новости разработки WS3D  (Read 1539 times)

0 Members and 1 Guest are viewing this topic.

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 345
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Новости разработки WS3D
« Reply #30 on: August 16, 2018, 12:42:02 PM »
Думаю, что ближе к делу мы с этим разберемся  ;)  Есть предложение - все выбранные настройки должны сохраняться в ini-файл, а при запуске они должны из него подтягиваться (если файл есть в наличии). Нужна возможность эти самые wEngineCreationParameters запросить (могу ошибаться, но не помню такой структуры в том бета-релизе, который имею на руках).
« Last Edit: August 16, 2018, 02:48:55 PM by Vuvk »
Crudux Cruo!

Offline Tiranas

  • Friends
  • Esquire
  • *
  • Posts: 76
  • Reputation 35
  • Совсем Тёмный.
Re: Новости разработки WS3D
« Reply #31 on: August 16, 2018, 03:08:42 PM »
Да, я тоже не нашёл wEngineCreationParameters у себя.
Наверно потом будет.
И зачем ini, когда уже прикручена работа с xml.
Людям с более широким кругозором ведомо, что четкой границы между реальным, действительным и ирреальным воображаемым не существует, что каждый из нас, благодаря тонким физиологическим и психологическим различиям, воспринимает все явления по-своему. (Говард Филлипс Лавкрафт)

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 911
  • Reputation 36
  • Game making is my hobby for life!
Re: Новости разработки WS3D
« Reply #32 on: August 16, 2018, 05:26:31 PM »
Мне понравилась реализация окна запуска. Много настроек. Интересно теперь будет поэкспериментировать с ними, каквсё в проекте будет отображаться.
Quote
Есть предложение - все выбранные настройки должны сохраняться в ini-файл
Quote
И зачем ini, когда уже прикручена работа с xml.
Суть одна: нужен конфигурационный файл, чтобы запоминать настройки. Или даже так: нужна возможность сохранения нескольких вариантов настроек, чтобы потом выбирать нужный вариант, а также переносить конф. файл в другие проекты.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 911
  • Reputation 36
  • Game making is my hobby for life!
Re: Новости разработки WS3D
« Reply #33 on: August 16, 2018, 05:44:44 PM »
Да, вот как это выглядит у меня, вдруг кому-то лень скачивать и смотреть.  ;D
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 889
  • Reputation 63
Re: Новости разработки WS3D
« Reply #34 on: August 16, 2018, 06:47:14 PM »
Quote
нужен конфигурационный файл, чтобы запоминать настройки. Или даже так: нужна возможность сохранения нескольких вариантов настроек, чтобы потом выбирать нужный вариант, а также переносить конф. файл в другие проекты.
Ну раз так, будем делать. И указатель на все настройки wEngineCreationParametes сделаем, для использования внутри программы.

Тогда уж добавить что-то вроде
Code: [Select]
wEngineStartWithXml-для запуска непосредственно из конфигурационного файла, без окна настроек.
Это позволит кому нужно сделать отдельно:
а)Конфигуратор запуска
б)Запуск основной программы из файла.

Предлагаю так:
1)В функцию wEngineStartWithGui добавлю путь к файлу конфигурации. Если его не окажется- будет запущено окно с настройками по умолчанию (как сейчас). Новый конф. файл создаваться не будет.
2)В окне настроек добавить чекбокс (Сохранить ли настройки) и текстовое поле, куда писать имя файла. Таким образом можно будет сделать много разных конфигураций.
3)При закрытии окна настроек (кнопкой ОК) при включенном чекбоксе будет создан файл с нужным именем и нужными настройками.
4) Сделаю wEngineStartWithXml, о котором писалось выше.
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 345
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Новости разработки WS3D
« Reply #35 on: August 16, 2018, 07:30:01 PM »

Если честно, то такое решение мне не очень нравится. Лично я бы сделал как-то так:
1. Старт движка через wEngineStart или wEngineStartWithGui
2. Загрузка конфигов какой-нибудь командой, типа wEngineLoadParameters(const char* path), которая и грузит конфиг из ini или xml
3. Если параметры были загружены командой выше, то при старте через wEngineStartWithGui параметры должны выставиться загруженные
Доп. Неплохо предусмотреть команду для сохранения настроек. Отдельную. Типа wEngineSaveParameters(const char* path)
Доп.доп. И ещё неплохо сотворить функцию, возвращающую все текущие настройки. Ну типа wEngineGetParameters(wEngineParameters* out)
« Last Edit: August 16, 2018, 07:40:10 PM by Vuvk »
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 889
  • Reputation 63
Re: Новости разработки WS3D
« Reply #36 on: August 16, 2018, 08:26:18 PM »
Quote
Загрузка конфигов какой-нибудь командой, типа wEngineLoadParameters(const char* path), которая и грузит конфиг из ini или xml
Ну, допустим будет команда
Code: [Select]
wEngineLoadCreationParameters(const char* path, wEngineCreationParameters* param). Она заполнить структуру параметров, после чего можно будет воспользоваться
Code: [Select]
wEngineStartAdvanced(wEngineCreationParameters param).
Т.е. на выбор- либо устанавливаешь настройки запуска сам, либо грузишь из xml-файла.

Quote
Неплохо предусмотреть команду для сохранения настроек. Отдельную. Типа wEngineSaveParameters(const char* path)
Ну, допустим будет такая:
Code: [Select]
wEngineSaveCreationParameters(wEngineCreationParameters param,const char* path)Можно будет сохранить выбранные юзером настройки в файл для подключения к другим проектам.

Quote
И ещё неплохо сотворить функцию, возвращающую все текущие настройки. Ну типа wEngineGetParameters(wEngineParameters* out)
Это может понадобиться только в случае, если стартанули через wEngineStart, в остальных случаях- нет, т.к. настройки и так на виду.
К тому же настройки после старта не меняются, поэтому текущими их трудно назвать. Они имеют смысл только До старта.
Ну допустим, тогда так:
Code: [Select]
wEngineGetCreationParameters(wEngineParameters* out)
Quote
Если параметры были загружены командой выше, то при старте через wEngineStartWithGui параметры должны выставиться загруженные
Ну хорошо, открылось окно настроек, все опции выставлены из файла. Ну кроме фуллскрина (окно настроек ведь не будем делать на весь экран  ;D).
Затем пользователь потыкал кнопки, изменил настройки, запустил основную программу.... И какой смысл был в конф. файле?
Все равно ведь надо предусмотреть сохранение настроек  из окна конфигуратора, разве нет?

Под лежачий камень мы всегда успеем...

Offline Tiranas

  • Friends
  • Esquire
  • *
  • Posts: 76
  • Reputation 35
  • Совсем Тёмный.
Re: Новости разработки WS3D
« Reply #37 on: August 16, 2018, 08:46:43 PM »
Мне кажется это перебор, никто этим заниматься не будет, кроме разработчиков. Галочки для сохранения в стандартный файл со стандартным именем, вполне достаточно или кнопка "сохранить" с диалогом выбора GetSaveFileNameA.
Людям с более широким кругозором ведомо, что четкой границы между реальным, действительным и ирреальным воображаемым не существует, что каждый из нас, благодаря тонким физиологическим и психологическим различиям, воспринимает все явления по-своему. (Говард Филлипс Лавкрафт)

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 889
  • Reputation 63
Re: Новости разработки WS3D
« Reply #38 on: August 17, 2018, 10:25:17 PM »
Привет всем. Я обдумал все вышесказанное и сделал такой вариант: компромиссный, наверное.

Quote
declare function wEngineLoadCreationParameters(byval outParameters as wEngineCreationParameters ptr,_
                                    byval xmlFilePath as zstring ptr) as Boolean
-Загрузка настроек запуска движка из файла. Можно вызвать перед wEngineStartAdvanced, если есть такой файл.

Quote
declare function wEngineSaveCreationParameters(byval inParameters as wEngineCreationParameters ptr,_
                                    byval xmlFilePath as zstring ptr) as Boolean
-сохранение настроек запуска движка в xml-файл

Quote
declare function wEngineStartWithGui(byval captionText as const wstring ptr,_
                           byval fontPath as zstring ptr=0,_
                           byval logo as zstring ptr=0,_
                           byval language as wLanguage=wL_EN,_
                           byval outParams as wEngineCreationParameters ptr=0,
                           byval inXmlConfig as zstring ptr=0) as Boolean
Тут мы видим изменения, точнее, добавления.
outParams-указатель на заполненную структуру с настройками запуска. Для внутреннего использования программистом.
inXmlConfig-путь к файлу, хранящему настройки запуска. Это опционально.
Если путь указан, все настройки будут отображены в окне запуска движка.

В окне запуска появилась возможность:
А) Менять язык интерфейса
Б) Сохранять текущие настройки при выходе через кнопку ОК.

Если интересно, вот тестовый пример.

Его код:
Code: [Select]
/*
 '----------------------------------------------------------------------------
'' Пример сделал Nikolas (WorldSim3D developer)
'' ----------------------------------------------------------------------------
'' Пример 138: Настройка запуска
'' Этот простой пример идентичен примеру 01 : HelloWorld
'' за исключением того, что при запуске появляется окно с выбором настроек.
'' ----------------------------------------------------------------------------
*/

#include <WorldSim3D.h>
#include <SampleFunctions.h>

///Variables
wFont* MyFont                   =0;
wVector2i fromPos               ={120,80};
wVector2i toPos                 ={250,96};

wEngineCreationParameters startParams;

const wchar_t* wndCaption       =L"Example 138: Launch settings ";

wchar_t strBuffer[256]          ={0};
Int32 prevFPS                   =0;

int main(int argc, char** args)
{
    /*bool init=wEngineStartWithGui(  L"Example 138",
                                    "../../Assets/Fonts/MSSanSerif9.xml",
                                    "../../Assets/Sprites/logo_490_x_190.png",
                                    wL_RU,
                                    &startParams);*/

    bool init=wEngineStartWithGui(  L"Example 138",
                                    "MSSanSerif9.xml",
                                    "logo_490_x_190.png",
                                    wL_EN,
                                    &startParams,
                                    "outConfig.xml");

    if(!init)
    {
        printf("wEngineStartWithGui() failed!\n");
        printf("\nPress any ke to exit...\n");
        wInputWaitKey();
        return -1;
    }

    //char* fontPath="../../Assets/Fonts/myfont.bmp";
    char* fontPath="myfont.bmp";

    ///Check resources
    if(!CheckFilePath(fontPath))
       return -1;

    ///Show logo WS3D
    wEngineShowLogo(true);

    ///Load resources
    MyFont=wFontLoad(fontPath);

    wColor4s backColor={255,0,125,0};

    while(wEngineRunning())
    {

        wSceneBegin(backColor);

        wSceneDrawAll();

        ///Draw text info
        wFontDraw(MyFont,L"Hello World!",fromPos,toPos);

        wSceneEnd();

        ///Close by ESC
        wEngineCloseByEsc();

        /// update FPS
        if (prevFPS != wEngineGetFPS())
        {
            prevFPS = wEngineGetFPS();
            swprintf(strBuffer, L"%s  FPS : %d", wndCaption, prevFPS);
            wWindowSetCaption(strBuffer);
        }
    };

    ///Stop engine
    wEngineStop();

    return 0;
}


В двух словах поясню:
А)В момент Первого запуска открывается окно с дефолтными настройкам, т.к. конф. файла рядом нет.
Б)При выходе по ОК с сохранением появляется конф. файл.
Б)При последующих запусках в окне отображаются все изменения, сохраненные в прошлый раз при выходе.

Думаю, этого пока достаточно...

Под лежачий камень мы всегда успеем...

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 911
  • Reputation 36
  • Game making is my hobby for life!
Re: Новости разработки WS3D
« Reply #39 on: August 18, 2018, 08:45:29 AM »
Попробовал. Всё работает как задумано. Меня устраивает. Спасибо.  :)
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline ALex98

  • Friends
  • Commoner
  • *
  • Posts: 24
  • Reputation 6
Re: Новости разработки WS3D
« Reply #40 on: August 18, 2018, 09:29:34 PM »
Тоже попробовал. Всё работает нормально. Спасибо :)

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 911
  • Reputation 36
  • Game making is my hobby for life!
Re: Новости разработки WS3D
« Reply #41 on: October 03, 2018, 06:00:16 PM »
Добрый день, все интересующиеся рзработкой проектов на WS3D!
Хорошая новость: идёт альфа-тестирование новой версии WorldSim3D.Уже кое-что исправлено. Скоро появится бета-версия и все желающие смогут бесплатно тестировать овую версию движка и писать отзывы! Напомню, что помимо нескольких добавленных возможностей, теперь можно программировать не только на Фрибейсике, но и на C/C++!  :o
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Marsha

  • Friends
  • Knight
  • *
  • Posts: 128
  • Reputation 11
Re: Новости разработки WS3D
« Reply #42 on: October 17, 2018, 05:31:31 PM »
Скоро появится бета-версия и все желающие смогут бесплатно тестировать овую версию движка и писать отзывы!
Троекратное ура! Очень жду начала тестирования  ;)

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 911
  • Reputation 36
  • Game making is my hobby for life!
Re: Новости разработки WS3D
« Reply #43 on: November 04, 2018, 03:06:40 PM »
Добрый день всем, кто сейчас онлайн!  :) Сегодня состоится релиз WorldSim3D 1.1, но пока бета-версия. Рабочая нумерация версии была 1.0.4, но так как сделаны значительные изменения с прошлой версии движка (1.0.3), то 1.1 - больше отражает реальные изменения в движке. (В консоли вы вероятно увидите 1.0.4, но официально теперь это именно 1.1).

Это пока анонс. Подробности чуть позже.
 
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 889
  • Reputation 63
Re: Новости разработки WS3D
« Reply #44 on: Today at 09:21:56 AM »
Всем привет.  Мы еще живы, оказывается.
Но у нас не лучшие времена, это факт.
С моей стороны активности нет уже месяца 3, не буду придумывать какие-то веские оправдания, потому как их нет.
Далее на эту тему писать не буду, каждый додумает сам....
Что мы имеем на сегодняшний день:
Я взялся пилить редактор уровней для  WS3D. Как я и боялся, взявшись за МЕГАпроект, спёкся. Такое на моей памяти уже было, причем 2 раза. Просто потому, что сделав одну фичу, в свой список я дописывал три. Естественно, проект обречён.
.......................
.......................
Я решил-таки вернуться к проекту, точнее, пересматриваю свое отношение к нему и свои требования....
В процессе работы, еще до застоя, пришлось допиливать и изменять инструментарий, благо все возможности для этого имеются.
На данный момент накопилось немало, хватило-бы, думаю, на очередную версию движка.

Список таков.
Code: [Select]
///Edit
Int32 wGuiListBoxGetSelectedIndex(wGuiObject* lbox);

///Add
bool wParticleSystemIsGlobal(wNode* ps);

///Add
bool wEngineSetClipPlaneByPoints(UInt32 indexPlane,wVector3f point1,wVector3f point2,wVector3f point3,bool enable);

///Add
bool wEngineSetClipPlaneByPointAndNormal(UInt32 indexPlane,wVector3f point,wVector3f normal,bool enable);

///Add
void wEngineEnableClipPlane(UInt32 indexPlane,bool value);

///Edit
wListBoxClearElementColor =>

void wGuiListBoxClearElementColor(wGuiObject* lbox,
                                  UInt32 index,
                                  wGuiListboxColor colorType);

--------------------------------------
--------------------------------------
//ADD
wVector2f wParticleSystemGetParticleSize(wNode* ps);

//ADD
wMaterialTypes wMaterialGetType(wMaterial* material);

//ADD
typedef enum
{
wPET_POINT = 0,
wPET_ANIMATED_MESH,
wPET_BOX,
wPET_CYLINDER,
wPET_MESH,
wPET_RING,
wPET_SPHERE,
wPET_COUNT
}wParticleEmitterType;

///Add
wParticleEmitterType wParticleEmitterGetType(IParticleEmitter* em);

///EDIT
typedef struct
{
    wNode* animMeshNode;///Для эмиттера анимированных мешей (это-НОД)
    const char* animMeshName;
    wMesh* staticMesh;///Для эмиттера статических мешей (Это- статичный МЕШ)
    const char* staticMeshName;
    Int32 nodeId
    bool useNormalDirection = true;
    Float32 normalDirectionModifier;
    bool everyMeshVertex = true;
}wParticleMeshEmitter;


//EDIT
 wEmitter* wParticleMeshEmitterCreate( wNode* ps,
                                      wMesh* staticMesh)

//ADD
///wParticleAnimatedMeshEmitter///

///Add                                 
wEmitter* wParticleAnimatedMeshEmitterCreate(wNode* ps,
                                              wNode* animMeshNode);

//ADD
void wParticleAnimatedMeshEmitterSetParameters(wEmitter* em,
                                               wParticleMeshEmitter params);

//ADD
void wParticleAnimatedMeshEmitterGetParameters(wEmitter* em,
                                               wParticleMeshEmitter* params);

//Fix
wGuiButtonUseAlphaChannel

------------------
///ADD
typedef enum
{
wPAT_NONE = 0,
wPAT_ATTRACT,
wPAT_FADE_OUT,
wPAT_GRAVITY,
wPAT_ROTATE,
wPAT_SCALE,
wPAT_STOP,//
wPAT_PUSH,//
wPAT_SPLINE,//
wPAT_COLOR_MORPH,//
wPAT_COUNT
} wParticleAffectorType;

///ADD
wParticleAffectorType wParticleAffectorGetType(IParticleAffector* affector);

///ADD
UInt32 wParticleSystemGetAffectorsCount(wNode* ps);

///ADD
wAffector* wParticleSystemGetAffectorByIndex(wNode* ps, UInt32 idx);

///ADD- Внимание! Функция вызывает крах... 8-0
/*void wParticleSystemRemoveAffector(wNode* ps,wAffector* affector);*/

///EDIT
typedef struct
{
    wVector3f point;
    Float32 speed;///add new
    bool attract=true;
    bool affectX=true;
    bool affectY=true;
    bool affectZ=true;
}wParticleAttractionAffector;

///ADD
void wParticleScaleAffectorSetTargetScale(wAffector* affector,
                                          wVector2f tScale);
///ADD
wVector2f wParticleScaleAffectorGetTargetScale(wAffector* affector);

//FIX
wGuiObjectBringToFront

///Fix
wParticleFadeOutAffectorGetColor

///Fix
wParticleSplineAffectorGetParameters

///Fix
wParticleColorAffectorGetParameters

///Edit
bool wSceneSave(const char* filename,
wNode* parentNode=0);

///ADD
bool wSceneSaveToFile(wFile* file,
                     wNode* parentNode);

///ADD
bool wSceneSaveToXml(wXmlWriter* writer,
                     const char* relativePath,
                     wNode* parentNode);


///Edit
bool wSceneLoad(const char* filename, wNode* rootNode);

///ADD
bool wSceneLoadFromFile(wFile* file,
                        wNode* rootNode);

///ADD
const char* wGuiGetLastSelectedDirectory();

------------ 06.01.18----------

///EDIT
wXMLReaderCreateUTF8 => wXmlReaderCreateUTF8

///EDIT
void wFileAddZipArchive(const char* cptrFile,
                                   bool boIgnoreCase,
                                   bool boIgnorePaths)

=> bool wFileAddZipArchive(const char* cptrFile,
                                   bool boIgnoreCase,
                                   bool boIgnorePaths)

///EDIT
void wFileAddArchive(const char *cptrFile,
                                bool boIgnoreCase,
                                bool boIgnorePaths,
                                wFileArchiveType aType=wFAT_UNKNOWN,
                                const char* password="");

=> bool wFileAddArchive(const char *cptrFile,
                                bool boIgnoreCase,
                                bool boIgnorePaths,
                                wFileArchiveType aType=wFAT_UNKNOWN,
                                const char* password="");

///EDIT
void wFileAddPakArchive(const char *cptrFile,
                                   bool boIgnoreCase,
                                   bool boIgnorePaths)

=> bool wFileAddPakArchive(const char *cptrFile,
                                   bool boIgnoreCase,
                                   bool boIgnorePaths )

///EDIT
void wFileAddDirectory(const char* cptrFile,
                                  bool boIgnoreCase,
                                  bool boIgnorePaths)

=> bool wFileAddDirectory(const char* cptrFile,
                                  bool boIgnoreCase,
                                  bool boIgnorePaths)

///ADD
///wFileList///
wFileList* wFileListCreateEmpty(const char *fPath,
                                bool ignoreCase,
                                bool ignorePaths);

///Creates a list of files and directories in the current working directory and returns it
wFileList* wFileListCreate();

void wFileListRemove(wFileList* flist);

///Returns the base path of the file list.
const char* wFileListGetPath(wFileList* flist);

///Sorts the file list. You should call this after adding any items to the file list.
void wFileListSort(wFileList* flist);
///////
///Add as a file or folder to the list.
Int32 wFileListAddItem(wFileList* flist, const char* fullPath,
                       UInt32 offset,UInt32 size,
                       bool isDirectory, UInt32 id=0);

///Searches for a file or folder in the list.
Int32 wFileListFindFile(wFileList* flist, const char* fileName,
                        bool isFolder=false);

///Get the number of files in the filelist.
UInt32 wFileListGetFilesCount(wFileList* flist);

///Gets the name of a file in the list, based on an index.
const char* wFileListGetFileBaseName(wFileList* flist,UInt32 idx);

///Gets the full name of a file in the list including the path, based on an index.
const char* wFileListGetFileName(wFileList* flist,UInt32 idx);

///Returns the file offset of a file in the file list, based on an index
UInt32 wFileListGetFileOffset(wFileList* flist,UInt32 idx);

///Returns the size of a file in the file list, based on an index.
UInt32 wFileListGetFileSize(wFileList* flist,UInt32 idx);

///Returns the ID of a file in the file list, based on an index.
UInt32 wFileListGetFileId(wFileList* flist,UInt32 idx);

///Check if the file is a directory.
bool wFileListIsItemDirectory(wFileList* flist,UInt32 idx);


///ADD to wFile
typedef unsigned int wFileArchive;
typedef unsigned int wFileList;

///Get the archive at a given index
wFileArchive* wFileGetArchiveByIndex(UInt32 index);

wFileList* wFileGetArchiveFileList(wFileArchive* fArchive);

wFileArchiveType wFileGetArchiveType(wFileArchive* fArchive);

///Get the number of archives currently attached to the file system
UInt32 wFileGetArchivesCount();

///Changes the search order of attached archives
void wFileMoveArchive(UInt32 sourceIndex, Int32 relative);

///Removes an archive from the file system
void wFileRemoveArchiveByName(const char* fileName);

void wFileRemoveArchiveByIndex(UInt32 index);

void wFileRemoveArchive(wFileArchive* fArchive);

///Opens a file based on its name   (from archive).
wFile* wFileOpenForReadFromArchive(wFileArchive* fArchive,
                                   const char* cptrFile);

///Opens a file based on its position in the file list.
wFile* wFileOpenForReadByIndexFromArchive(wFileArchive* fArchive,
                                              UInt32 fileIdx);



///flatten a path and file name for example: "/you/me/../." becomes "/you"
const char* wFileGetFlattenPath(const char* directory,
                                const char* root=0);

-----------------------12-01-19

///EDIT
    wMF_COUNT
}wMaterialFlags;
--15-01-19
wAnimatorDestroy => wNodeDestroyAnimator

typedef enum
{
    wSNAT_FLY_CIRCLE,//Fly circle scene node animator.
    wSNAT_FLY_STRAIGHT,//Fly straight scene node animator.
    wSNAT_FOLLOW_SPLINE,//Follow spline scene node animator.
    wSNAT_ROTATION,//Rotation scene node animator.
    wSNAT_TEXTURE,//Texture scene node animator.
    wSNAT_DELETION,//Deletion scene node animator.
    wSNAT_COLLISION_RESPONSE,//Collision respose scene node animator.
    wSNAT_CAMERA_FPS,//FPS camera animator.
    wSNAT_CAMERA_MAYA,//Maya camera animator.
    wSNAT_COUNT,//Amount of built-in scene node animators.
    wSNAT_UNKNOWN,//Unknown scene node animator.
    wSNAT_FORCE_32_BIT//This enum is never used, it only forces the compiler to compile this enumeration to 32 bit.
}wSceneNodeAnimatorType;

void wAnimatorSetEnable(wAnimator* anim, bool enable,UInt32 timeNow);

bool wAnimatorIsEnable(wAnimator* anim);

bool wAnimatorIsFinished(wAnimator* anim);

#ifdef __cplusplus
void wAnimatorSetStartTime(wAnimator* anim, UInt32 time, bool resetPauseTime=true);
#else
void wAnimatorSetStartTime(wAnimator* anim, UInt32 time, bool resetPauseTime);
#endif // __cplusplus

UInt32 wAnimatorGetStartTime(wAnimator* anim);

wSceneNodeAnimatorType wAnimatorGetType(wAnimator* anim);

///FLY CIRCLE ANIMATOR
typedef struct
{
    wVector3f center;
    wVector3f direction;
    Float32 radius;
    Float32 radiusEllipsoid;
}wAnimatorFlyingCircle;

///FLY STRAIGHT ANIMATOR
typedef struct
{
    wVector3f startPoint;
    wVector3f endPoint;
    u32 timeForWay;
    bool loopMode;
    bool pingPongMode;
}wAnimatorFlyingStraight;

///SPLINE ANIMATOR
typedef struct
{
    wVector3f* points;
    u32 pointsCount;
    f32 speed;
    f32 tightness;
    bool loopMode;
    bool pingPongMode;
}wAnimatorSpline;

///ROTATION ANIMATOR
typedef struct
{
    wVector3f rotation;
}wAnimatorRotation;

void wAnimatorFlyingCircleSetParameters(wAnimator* anim,wAnimatorFlyingCircle params);

void wAnimatorFlyingCircleGetParameters(wAnimator* anim,wAnimatorFlyingCircle* params);

void wAnimatorFlyingStraightSetParameters(wAnimator* anim,wAnimatorFlyingStraight params);

void wAnimatorFlyingStraightGetParameters(wAnimator* anim,wAnimatorFlyingStraight* params);

void wAnimatorRotationSetParameters(wAnimator* anim,wAnimatorRotation params);

void wAnimatorRotationGetParameters(wAnimator* anim,wAnimatorRotation* params);

void wAnimatorSplineSetParameters(wAnimator* anim,wAnimatorSpline params);

void wAnimatorSplineGetParameters(wAnimator* anim,wAnimatorSpline* params);


Испоравлены примеры: 25, 27 (частицы)
35 (сохранение сцены)
129, 135 (убрано wTextureDestroy)

----------------26-01-19
EDIT
///FLY CIRCLE ANIMATOR
typedef struct
{
    wVector3f center;
    wVector3f direction;
    f32 radius;
    f32 radiusEllipsoid;
    f32 speed; (new parameter!)
}wAnimatorFlyingCircle;

///Edit
typedef struct
{
    UInt8 alpha;
    UInt8 red;
    UInt8 green;
    UInt8 blue;
}

typedef struct
{
    UInt8 red;
    UInt8 green;
    UInt8 blue;
}
wColor3s;
wColor4s;

-----------06/02-19-------------
///ADD
void wGuiTabControlAttachTab(CGUITabControl* control,
                                         CGUITab* tab);

void wGuiTabControlDetachTab(wGuiObject* control,
                             wGuiObject* tab);
///ADD
typedef enum
{
wBMF_MODULATE_1X = 1,
wBMF_MODULATE_2X = 2,
wBMF_MODULATE_4X = 4
}wBlendModulateFunc;

typedef enum
{
wBAS_NONE=0,//! Use no alpha, somewhat redundant with other settings
wBAS_VERTEX_COLOR,//! Use vertex color alpha
wBAS_TEXTURE//! Use texture alpha channel
}wBlendAlphaSource;

///EDIT
void DLL_EXPORT wMaterialSetBlendingMode(SMaterial* material,
                                        u32 paramNumber,
                                        const wBlendFactor blendSrc,
                                        const wBlendFactor blendDest,
                                        const wBlendModulateFunc modulate=wBMF_MODULATE_1X,
                                        const wBlendAlphaSource alphaSource=wBAS_TEXTURE);


///ADD
void DLL_EXPORT wMaterialGetBlendingMode(SMaterial *material,
                                         u32 paramNumber,
                                         wBlendFactor* blendSrc,
                                         wBlendFactor* blendDest,
                                         wBlendModulateFunc* modulate,
                                         wBlendAlphaSource* alphaSource)

///ADD
f32 DLL_EXPORT wNodeGetAnimationSpeed( IAnimatedMeshSceneNode* node);

///ADD
s32 DLL_EXPORT wNodeGetAnimationFramesCount(IAnimatedMeshSceneNode* node);

///ADD
bool wNodeGetAnimationLoopMode(wNode* node);

///ADD
void wNodeGetAnimationRange (wNode* node,
                             wVector2i* range);


///EDIT
typedef enum
{
     wMAT_STAND,
     wMAT_RUN,
     wMAT_ATTACK,
     wMAT_PAIN_A,
     wMAT_PAIN_B,
     wMAT_PAIN_C,
     wMAT_JUMP,
     wMAT_FLIP,
     wMAT_SALUTE,
     wMAT_FALLBACK,
     wMAT_WAVE,
     wMAT_POINT,
     wMAT_CROUCH_STAND,
     wMAT_CROUCH_WALK,
     wMAT_CROUCH_ATTACK,
     wMAT_CROUCH_PAIN,
     wMAT_CROUCH_DEATH,
     wMAT_DEATH_FALLBACK,
     wMAT_DEATH_FALLFORWARD,
     wMAT_DEATH_FALLBACKSLOW,
     wMAT_BOOM,
     wMAT_COUNT,
     wMAT_UNKNOWN
}wMd2AnimationType;

///ADD
wMd2AnimationType wNodeGetPlayedMD2Animation(wNode* node)

///ADD
bool DLL_EXPORT wNodeDestroyChild(ISceneNode* node, ISceneNode* child);

///ADD
IShadowVolumeSceneNode* DLL_EXPORT wNodeGetShadowVolume(IMeshSceneNode* node);

///ADD
typedef enum
{
//! No VBO's used. Vertices+indices send to graphic-card on each render.
wOVM_NO_VBO,
//! VBO's used. Draw the complete meshbuffers if any polygon in it is visible.
//! This allows VBO's for the meshbuffers to be completely static, but basically means
//! the octree is not used as an octree (not it still does do all the octree calculations)
//! Might work in very specific cases, but if this is gives you the best fastest results
//! you should probably compare as well to simply using a static mesh with no octree at all.
//! In most cases the other 2 options should work better with an octree.
wOVM_USE_VBO,
//! VBO's used. The index-buffer information is updated each frame
//! with only the visible parts of a tree-node.
//! So the vertex-buffer is static and the index-buffer is dynamic.
//! This is the default
wOVM_USE_VBO_WITH_VISIBITLY
}
wOctreeVBOMode;

typedef enum
{
    //! Check against box of the camera frustum
//! This is the default
wOPC_BOX,
//! against the camera frustum
wOPC_FRUSTUM
}
wOctreePolygonCheck;

typedef struct
{
    wOctreeVBOMode VBOmode=wOVM_USE_VBO_WITH_VISIBITLY;
    wOctreePolygonCheck checkMode=wOPC_BOX;
    s32 minimalPolysPerNode;///read only
    bool hasShadowVolume=false;///read only
}wOctreeParameters;

void DLL_EXPORT wNodeSetOctreeParameters(IOctreeSceneNode* node, wOctreeParameters param);

void DLL_EXPORT wNodeGetOctreeParameters(IOctreeSceneNode* node, wOctreeParameters* param);


----------------------03/03/2019
///Edit
wNode* DLL_EXPORT wNodeCreateCube( float size,
bool tangent,
wColor4s color )

///Edit
wNode* DLL_EXPORT wNodeCreateSphere(float radius,
                                 int polyCount,
                                 bool tangent,
                                 wColor4s color)

wMesh* DLL_EXPORT wMeshCreateSphere(const char* name,
                                    float radius,
                                    int polyCount,
                                    bool tangent);

///EDIT
wMesh* DLL_EXPORT wMeshCreateCube(const char* name,
                                  wVector3f size,
                                  bool tangent);


-----------
///EDIT
wNode* DLL_EXPORT wNodeCreateFromStaticMesh(IMesh* mesh,bool tangent);

///EDIT
wNode* DLL_EXPORT wNodeCreateFromMeshAsOctree(IAnimatedMesh *vptrMesh,
                                          int minimalPolysPerNode,
                                          bool alsoAddIfMeshPointerZero,
                                          bool tangent)

///EDIT
typedef enum
{
          //' for irr-file reader info
wSNT_CUBE=1,              //' "cube"
wSNT_SPHERE=2,            //' "sphere"
wSNT_CYLINDER=3,
wSNT_CONE=4,
wSNT_PLANE=5,


wSNT_TEXT=6,              //' "text"
wSNT_WATER_SURFACE=7,    //' "waterSurface"
wSNT_TERRAIN=8,          //' "terrain"
wSNT_SKY_BOX=9,          //' "skyBox"
wSNT_SKY_DOME=10,          //' "skyDome"
wSNT_SHADOW_VOLUME=11,    //' "shadowVolume"
wSNT_OCTREE=12,            //' "octree"   ,   "octTree"
wSNT_MESH =13,            //' "mesh"
wSNT_LIGHT=14,            //' "light"
wSNT_EMPTY=15,            //' "empty"
wSNT_DUMMY_TRANSFORMATION=16,  //' "dummyTreansormation"
wSNT_CAMERA=17,                //' "camera"
wSNT_BILLBOARD=18,             //' "billBoard"
wSNT_ANIMATED_MESH=19,         //' "animatedMesh"
wSNT_PARTICLE_SYSTEM=20,       //' "particleSystem"
wSNT_VOLUME_LIGHT=21,          //' "volumeLight"
//'for version <=1.4.x irr files
wSNT_CAMERA_MAYA=22,           //' "cameraMaya"
wSNT_CAMERA_FPS=23,            //' "cameraFPS"
wSNT_Q3SHADER_SCENE_NODE=24,   //' "quacke3Shader"
//'added
wSNT_UNKNOWN=25,               //' "unknown"
wSNT_ANY=26
}wSceneNodeType;

///EDIT
wNode* DLL_EXPORT wNodeCreateCylinder(f32 radius,
                                      f32 length,
                                      u32 tesselation,
                                      wColor4s clr=wCOLOR4s_WHITE,
                                      bool closeTop=true,
                                      f32 oblique=0,
                                      bool tangent=false);

///ADD
wMesh* DLL_EXPORT wMeshCreateCylinder(const char* name,
                                      f32 radius,
                                      f32 length,
                                      u32 tesselation,
                                      bool closeTop,
                                      f32 oblique,
                                      bool tangent);

///EDIT
wNode* DLL_EXPORT wNodeCreateCone(f32 radius,f32 length,u32 tesselation,
                                  wColor4s clrTop=wCOLOR4s_WHITE,
                                  wColor4s clrBottom=wCOLOR4s_WHITE,
                                  bool tangent=false);
#else
wNode* DLL_EXPORT wNodeCreateCone(f32 radius,f32 length,u32 tesselation,
                                  wColor4s clrTop,
                                  wColor4s clrBottom,
                                  bool tangent);

///ADD
wMesh* DLL_EXPORT wMeshCreateCone(const char* name,
f32 radius,
f32 length,
u32 tesselation,
bool tangent);

///EDIT
wNode* DLL_EXPORT wNodeCreatePlane(wVector2f tileSize,
                                   wVector2u tileCount=wVECTOR2u_ONE,
                                   wMaterial* material=0,
                                   wVector2f textureRepeatCount=wVECTOR2f_ONE,
                                   bool tangent=false);

///ADD
typedef struct
{
    Float32 size;
    bool tangent;
} wNodeCubeParameters;

typedef struct
{
    Float32 radius;
    Int32 polyCount;
    bool tangent;
}wNodeSphereParameters;

typedef struct
{
    Float32 radius;
    Float32 length;
    UInt32 tesselation;
    bool closeTop;
    Float32 oblique;
    bool tangent;
}wNodeCylinderParameters;

typedef struct
{
    Float32 radius;
    Float32 length;
    UInt32 tesselation;
    bool tangent;
}wNodeConeParameters;

typedef struct
{
    wVector2f tileSize;
    wVector2u tileCount;
    wVector2f textureRepeatCount;
    bool tangent;
}wNodePlaneParameters;

///ADD
void DLL_EXPORT wNodeSetCubeParameters(CCubeSceneNode* cube,
                                       wNodeCubeParameters params);

void DLL_EXPORT wNodeGetCubeParameters(CCubeSceneNode* cube,
                                       wNodeCubeParameters* params);

///ADD
void DLL_EXPORT wNodeSetSphereParameters(CSphereSceneNode* sphere,
                                         wNodeSphereParameters params);

void DLL_EXPORT wNodeGetSphereParameters(CSphereSceneNode* sphere,
                                         wNodeSphereParameters* params);

void DLL_EXPORT wNodeSetCylinderParameters(CCylinderSceneNode* cylinder,
                                           wNodeCylinderParameters params);

void DLL_EXPORT wNodeGetCylinderParameters(CCylinderSceneNode* cylinder,
                                           wNodeCylinderParameters* params);

void DLL_EXPORT wNodeSetConeParameters(CConeSceneNode* cone,
wNodeConeParameters params);


void DLL_EXPORT wNodeGetConeParameters(CConeSceneNode* cone,
wNodeConeParameters* params);

void DLL_EXPORT wNodeSetPlaneParameters(CPlanSceneNode* plane,
                                        wNodePlaneParameters params);

void DLL_EXPORT wNodeGetPlaneParameters(CPlaneSceneNode* cone,
                                        wNodePlaneParameters* params);

///EDIT
void wMaterialScaleTexture =>
void wMaterialSetTextureScale(wMaterial* material,
                              UInt32 texIdx,
                              wVector2f scale);

///ADD
wVector2f wMaterialGetTextureScale(wMaterial* material,
                                   UInt32 texIdx);

///EDIT
void wMaterialScaleTextureFromCenter =>
void wMaterialSetTextureScaleFromCenter(wMaterial* material,
                                       UInt32 texIdx,
                                       wVector2f scale);

///EDIT
void wMaterialTranslateTexture =>
void wMaterialSetTextureTranslation(wMaterial* material,
                                    UInt32 texIdx,
                                    wVector2f translate);

///ADD
wVector2f wMaterialGetTextureTranslation(wMaterial* material,
                                         UInt32 texIdx);

///EDIT
void wMaterialTranslateTextureTransposed =>
void wMaterialSetTextureTranslationTransposed(wMaterial* material,
                                              UInt32 texIdx,
                                              wVector2f translate);

///EDIT
void wMaterialRotateTexture =>
void wMaterialSetTextureRotation(wMaterial* material,
                                 UInt32 texIdx,
                                 Float32 angleDeg);

///ADD
Float32 wMaterialGetTextureRotation(wMaterial* material,
                                UInt32 texIdx);

///ADD
void wMaterialSaveTextureMatrix(wMaterial* material,
                                UInt32 texIdx,
                                Float32* array16Ptr);

///ADD
void wMaterialRestoreTextureMatrix(wMaterial* material,
                                   UInt32 texIdx,
                                   Float32* array16Ptr);

Отныне писать обязуюсь чаще...
Под лежачий камень мы всегда успеем...