Author Topic: WS3D для С/С++  (Read 864 times)

0 Members and 1 Guest are viewing this topic.

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 932
  • Reputation 36
  • Game making is my hobby for life!
Re: WS3D для С/С++
« Reply #30 on: October 17, 2017, 03:31:01 PM »
Quote
конвертер (если такого нет в природе) заголовка h -> bi
Ну, есть несколько утилит, но одну особенно хвалят: тык
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 897
  • Reputation 63
Re: WS3D для С/С++
« Reply #31 on: October 17, 2017, 05:24:44 PM »
Quote
Надеюсь, что хоть немного ускорил релиз Сишного заголовка
А то. Конечно же. Все всех устраривает, если есть желание, можно продолжить :)
По поводу предложений отпишусь в ЛС. Заголовок, безусловно, еще сырой.
Quote
Ну, есть несколько утилит, но одну особенно хвалят
Обязательно надо ее проверить.
Под лежачий камень мы всегда успеем...

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 897
  • Reputation 63
Re: WS3D для С/С++
« Reply #32 on: October 18, 2017, 01:35:26 AM »
Итак, на данный момент мы имеем 30 вполне работоспособных примеров для будущей С++ -ветви движка WS3D (с 1 по 20 и с 30 по 40).
Заголовок WorldSim3D.h потихоньку шлифуется и приобретает работоспособный вид. Пожелаем нам всем удачи в кропотливом труде.

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

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 346
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: WS3D для С/С++
« Reply #33 on: October 18, 2017, 01:36:27 PM »
+ примеры 41-50 ;)

Вообще, пока что всё неплохо на мой взгляд. Другое дело, что заголовок на данный момент сильно ориентирован на плюсы и на чистом Си работать не будет - нужны правки и костыли. Ну это, конечно, если авторы движка захотят поддержку С...

« Last Edit: October 18, 2017, 01:40:01 PM by Vuvk »
Crudux Cruo!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 932
  • Reputation 36
  • Game making is my hobby for life!
Re: WS3D для С/С++
« Reply #34 on: October 18, 2017, 03:54:28 PM »
Quote
Ну это, конечно, если авторы движка захотят поддержку С...
Конечно, я лично хочу. И ещё С# не помешал бы. Также мой любимый скриптовый язык AngelScript, с которым у меня связаны ностальгичекские воспоминания о первых нескольких годах в игрострое. Вот взялся бы кто и за них...
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 346
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: WS3D для С/С++
« Reply #35 on: October 21, 2017, 07:56:40 AM »
Хотя это и не входило в планы, но тут наметился неплохой аддон (в моём понимании) для работы с заголовком WorldSim3d.h на языке Си. Мы столкнулись с главной сложностью - в Си нельзя прописать дефолтные значения для аргументов функций, а также конструкторы для структур, которые бы выставляли значения по умолчанию в поля. Я имею ввиду "из коробки". В итоге родилась идея - немного "повысить уровень" языка Си. И понеслось...

На данный момент доступны конструкторы/деструкторы базовых типов и структур движка WS3D.
Базовые типы:
Code: [Select]
Int = int_t
Short = short_t
Bool = bool_t
и т.д.
Также были добавлены строки - АНСИ и Широкая:
Code: [Select]
String = string_t
WString = wstring_t
Вместимостью в 1024 знака.
Для создания "неведомых" типов (массив, собственные структуры и прочее) можно использовать макрос create(тип, кол-во):
Code: [Select]
    int* array = create(int, 100);

Компилятор должен поддерживать стандарт С11, в частности _Generic-макросы, для того, чтобы в структуры выставлялись значения по умолчанию. Если компилятор такого не умеет, то конструкторы просто выставят все значения в 0. У базовых типов всегда выставляется 0. Никакого мусора!
Пример использования:
Code: [Select]
    // структура в стэке со значениями по умолчанию
    wEAXReverbParameters  param0 = wEAXReverbParameters_t;
    // структура в куче со значениями по умолчанию
    wEAXReverbParameters* param1 = new(wEAXReverbParameters_t);
    // освобождаем память
    delete(param1);

    // в общем виде
    int* int_= new(Int);
    printf("Now int_ is %d\n", *int_);
    *int_ = 10;
    printf("Now int_ is %d\n", *int_);
    delete(int_);

    // двумя способами. Имена типов-синонимы
    bool* bool_;
    bool_ = new(Bool);
    delete(bool_);
    bool_ = new(bool_t);
    delete(bool_);

    // создадим строку, выведем, а потом удалим
    char* str0 = new(String);
    sprintf(str0, "Privet, mir!\n");
    printf(str0);
    delete(str0);

    // хм, а что насчет широкой строки?
    wchar_t* str1 = new(WString);
    swprintf(str1, L"Privet, shirokiy mir!\n");
    wprintf(str1);
    delete(str1);

    // что, если я хочу не базовый тип, а массив?
    int* array = create(int, 100);
    delete(array);

    // и что, даже свои типы можно? Да!
    typedef struct
    {
        int x, y;
    } example_s;

    example_s* ex = create(example_s, 1);
    ex->x = 10;
    ex->y = 100;
    delete(ex);

Пример выведет следующее:
Quote
Now int_ is 0
Now int_ is 10
Privet, mir!
Privet, shirokiy mir!
« Last Edit: October 21, 2017, 08:09:44 AM by Vuvk »
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 897
  • Reputation 63
Re: WS3D для С/С++
« Reply #36 on: October 21, 2017, 08:25:52 AM »
Кошерно, однако.
В связи с этим вопросы:
1) Этот аддон будет отдельным заголовком, или будем прописывать в основном?
2) Если в отдельном, означает ли это, что для С нужны будут отдельные примеры?
3) Если аддон будет сделан. можно будет его использовать и в С++. Думаю, да.
4) Не возникнет ли проблем с наличием _Generic-макросов в различных версиях компиляторов. В mingw64, например.
5) Что, если переписать два класса stringc и stringw с учетом этих изменений, чтобы можно было их юзать на С? Или в этом нет необходимости?
6) Это окончательный вариант или будут еще?
7) Маленький пример того, как теперь нужно теперь использовать стандартную функцию WS3D, любую.
8) Использование макросов не сможет повредить конвертированию С-заголовка для других ЯП?

« Last Edit: October 21, 2017, 08:58:18 AM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 346
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: WS3D для С/С++
« Reply #37 on: October 21, 2017, 09:09:42 AM »
Лучше отдельным заголовком. Тогда конвертировать будем только главный и проблем не должно возникнуть. Для плюсов его нет смысла использовать вообще - постоянно нужно будет приводить типы. Да и зачем?
_Generic - это часть стандарта С11. Любой компилятор с поддержкой этого стандарта должен понять.
И это не окончательный вариант конечно же. Есть пара идеек как это улучшить. Буду держать в курсе событий.
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 897
  • Reputation 63
Re: WS3D для С/С++
« Reply #38 on: October 21, 2017, 01:50:25 PM »
Понял. Буду тогда ковырять примеры и искать баг со столкновением сцены. Бронирую себе примеры пока с 61 по 80.
81 тоже, так как нужно написать несколько функций для шейдеров, аналогичных бейсик-заголовку. Помещу в SampleFunction.h
« Last Edit: October 21, 2017, 04:13:17 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 346
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: WS3D для С/С++
« Reply #39 on: October 21, 2017, 11:05:52 PM »
Поизучав возможности компилятора GCC и вообще макросов, пришёл к почти идеальному результату.
Теперь для создания объекта в куче можно использовать макрос new почти как в С++.
Вид макроса:
Code: [Select]
new(тип, кол-во)Если количество не будет задано, то будет считаться, что нужен один экземпляр.
Вызов макроса без параметров вернет NULL.
Массивы можно создавать двумя путями:
Code: [Select]
int* array = new(int, 100);или
Code: [Select]
int* array = new(int[100]);Из новых типов оставил только строки. Я их обозвал, как "string_t" и "wstring_t" с синонимами "String" и "WString". но могу сделать и "stringc", "stringw". Тут уж как начальство решит :D

Для достижения цели используются вариативные макросы и встроенные функции из GCC ver >= 3.4.5. _Generic-макросы теперь не нужны и написано всё по стандарту С99.
Ссылка на источник. Там же предупреждение:
Quote
This construct is only available for C.

Пример использования:
Code: [Select]

    // структура из WS3D в стэке со значениями по умолчанию.
    // Для этого используется константная структура:
    //   её имя = имя_типа + "_с" (_constant)
    wEAXReverbParameters  param0 = wEAXReverbParameters_c;
    // структура в куче со значениями по умолчанию
    wEAXReverbParameters* param1 = new(wEAXReverbParameters);
    // освобождаем память
    delete(param1);

    // в общем виде
    int* num = new(int);
    printf("Now num is %d\n", *num);
    *num = 10;
    printf("Now num is %d\n", *num);
    delete(num);

    // если задать количество аргументов = 0 или больше 2, то макрос вернет NULL
    void* null;
    null = new();
    if (null == NULL)
        printf("null is NULL!\n");
    /*
    // пока что не работает
    null = new(int, 1, "anything");
    if (null == NULL)
        printf("null is NULL yet!\n");
    */

    // укажем количество создаваемых объектов...
    bool* boolean = new(bool, 1);
    delete(boolean);

    // создадим строку, выведем, а потом удалим
    char* str0 = new(String);
    sprintf(str0, "Privet, mir!\n");
    printf(str0);
    delete(str0);

    // хм, а что насчет широкой строки?
    wchar_t* str1 = new(WString);
    swprintf(str1, L"Privet, shirokiy mir!\n");
    wprintf(str1);
    delete(str1);

    // что, если я хочу не базовый тип, а массив?
    int* array;
    array = new(int, 100);
    delete(array);
    // массив можно задавать и так:
    array = new(int[100]);
    delete(array);

    // массив строк???
    WString* str_arr = new(WString, 10);
    for (int i = 0; i < 10; ++i)
    {
        // создаем строку, заполняем, выводим, удаляем
        str_arr[i][0] = new(WString);
        swprintf(str_arr[i], L"It's %d string\n", i);
        wprintf(str_arr[i]);
        delete(str_arr[i]);
    }
    // удаляем массив
    delete(str_arr);

    // и что, даже свои типы можно? Да!
    typedef struct
    {
        int x, y;
    } example_s;

    example_s* ex = new(example_s);
    ex->x = 10;
    ex->y = 100;
    delete(ex);

Вывод в консоль:
Quote
Now num is 0
Now num is 10
null is NULL!
Privet, mir!
Privet, shirokiy mir!
It's 0 string
It's 1 string
It's 2 string
It's 3 string
It's 4 string
It's 5 string
It's 6 string
It's 7 string
It's 8 string
It's 9 string
« Last Edit: October 21, 2017, 11:17:31 PM by Vuvk »
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 897
  • Reputation 63
Re: WS3D для С/С++
« Reply #40 on: October 21, 2017, 11:23:22 PM »
Quote
int* array = new(int[100]);

У меня никак не укладывается это в голове.
Т.е. в голом С нельзя так?
Code: [Select]
int* array=new int[100];
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 346
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: WS3D для С/С++
« Reply #41 on: October 21, 2017, 11:28:13 PM »
Ты привел команду из С++.
В си аналогичное поведение у
Code: [Select]
int* array = malloc(sizeof(int) * 100);
Я использую calloc, как базис, чтобы не было мусора.
Crudux Cruo!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 897
  • Reputation 63
Re: WS3D для С/С++
« Reply #42 on: October 21, 2017, 11:33:53 PM »
В плюсах для работы с памятью тоже иногда пригождается
Code: [Select]
malloc()
....
free
В Ньютоне память резервируется именно так, как ты привел.

« Last Edit: October 21, 2017, 11:41:25 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 346
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: WS3D для С/С++
« Reply #43 on: October 22, 2017, 11:12:42 AM »
7) Маленький пример того, как теперь нужно теперь использовать стандартную функцию WS3D, любую.
Ну, допустим, пример использования со звуком (в первую очередь же для этого всё делалось):
Code: [Select]
void* sndEffect = wCreateSoundEffect();
wEAXReverbParameters* rvrbParams = new(wEAXReverbParameters);
rvrbParams->EchoTime = 0.5f;
wSoundEffectSetEAXReverbParameters(sndEffect, *rvrbParams);
delete(rvrbParams);
Это если "по-мудреному". В упрощенном виде (стэковый вариант):
Code: [Select]
void* sndEffect = wCreateSoundEffect();
wEAXReverbParameters rvrbParams = wEAXReverbParameters_с;
rvrbParams.EchoTime = 0.5f;
wSoundEffectSetEAXReverbParameters(sndEffect, rvrbParams);


8) Использование макросов не сможет повредить конвертированию С-заголовка для других ЯП?
А вот это интересный вопрос... Поживем - увидим.

Сейчас пишу комментарии в заголовке и инструкцию как этим пользоваться.
Crudux Cruo!