+ Ответить в теме
Показано с 1 по 15 из 15
  1. #1
    Аватар для JJ95 JJ95 Восходящая звезда Путешественник
    Сообщений
    445
    Поблагодарили 29 раз(а) в 27 сообщениях

    php_RiBox3D.dll Игровой движок для PHP

    Решил написать обертку для движка RiBox3D

    О движке
    [SPOILER]

    RiBox3D – это игровой 3D-2D-движок от SoftEngine на Blitz3d, BlitzMax, C++, C#, PureBasic и т.д. В движке RiBox3D используется графический API OpenGL.
    А распространяется он в виде DLL-библиотеки.
    Текстуры поддерживаются в таких популярных форматах как: TGA, BMP, PCX, DDS, JPG. Имеется поддержка 3D-моделей в формате ms3d, md2, md5, 3ds, bsp, и собственный формат rib. Для поддержки 3D-звука используется библиотека OpenAL. Физика базируется на NVIDIA PhysX.[/SPOILER]

    Сайт движка: Пока мне не известен

    Пример кода с описанием
    [SPOILER]
    PHP код:
    HideForm($selfSW_SHOW); // скрываем форму

    // Ri_InitEngine Устанавливает трехмерный графический режим. Эта ко***** должна быть выполнена до того как будут использованы любые 3D команды.
    $Width $self->clientWidth// разрешение экрана по ширине
    $Height $self->clientHeight// разрешение экрана по высоте
    $Depth 32// глубина цвета экрана
    $Frequency 75// частота
    $FullScreen 0// режим экрана (0: оконный 1: всегда полный экран)
    $Title "MyGame"// название окна
    $VSync 0// FALSE-отключить синхронизацию кадров, TRUE- включить
    Ri_InitEngine($Width$Height$Depth$Frequency$FullScreen$Title$VSync);
    unset(
    $Width$Height$Depth$Frequency$FullScreen$Title$VSync); // удаляем переменные как они нам больше не нужны

    MessageBox("RiBox3D => PHP\nVer: ".Ri_GetVersion(), "Game info"); // выводим кое какую инфу

    /*********************************************************************************
    Ri_AntiAlias Включает или выключает полноэкранное сглаживание контурных неровностей.
    По умолчанию режим AntiAlias выключен.
    Возвращает уровень сглаживания.
    *********************************************************************************/
    Ri_AntiAlias(true); // True включить полноэкранное сглаживание контурных неровностей, False выключить.

    /*********************************************************************************
    Ri_SetLightPosition Создает источник света и возвращает указатель на него.
    Type
    1: направленный источник света
    2: точечный источник света
    3: прожектор
    *********************************************************************************/

    $Light Ri_CreateLight(1); // тип источника света

    // Ri_SetLightPosition Позиционирует источник света.
    Ri_SetLightPosition($Light0.0150.00.0); // Параметры: Light - указатель источника света ***** X Y Z - позицыя источника света

    // Ri_CreateCamera Создает камеру и возвращает указатель на нее.
    $Camera Ri_CreateCamera();

    // Ri_PositionEntity Позиционирует (размещает) объект в абсолютную позицию в трехмерном пространстве.
    Ri_PositionEntity($Camera0.00.0200.0); // Параметры: Entity - указатель объекта ( Camera, Mesh, Child, AVI ) ***** X Y Z - координаты, куда будет помещен объект

    // Ri_CreateTorus Создает Тор и возвращает указатель на него.
    $Torus Ri_CreateTorus(10.020.03030); // Параметры: R1-R2 радиусы ***** Rings - кольца ***** Sides - стороны

    //**** Создадим бесконечный цикл пока не будет нажата клавиша ESC
    do {
        
    // Ri_BeginScene Начинает прорисовку сцены. Цвет в диапазоне от 0 до 1.
        
    Ri_BeginScene(0.00.00.0); //Параметры:  Red - красный Green - зеленый Blue - голубой

        // Ri_TurnEntity Вращает объект относительно его текущей ориентации.
        
    Ri_TurnEntity($Torus1.10.42.1); //Параметры:  Entity - указатель объекта ( Camera, Mesh, Child, AVI ) *****  Pitch Yaw Roll - угол поворота

    /******
    // Ri_KeyDown Эта ко***** используется, чтобы обнаружить, нажата клавиша или нет. Она возвращает 0, если клавиша не нажата, и 1, если клавиша нажата.
    // Параметры: код клавиши
    *******/

    // Ri_EndScene Заканчивает прорисовку сцены.

    } while (!Ri_KeyDown(1) == Ri_EndScene());


    // Ri_ClearWorld Удаляет все объекты из памяти.
    Ri_ClearWorld();
    // Закрывает движок.
    Ri_CloseEngine();

    app::close(); // закрываем программу 
    [/SPOILER]

    Пример кода без описания
    [SPOILER]
    PHP код:
    HideForm($selfSW_SHOW);

    $Width $self->clientWidth;
    $Height $self->clientHeight;
    $Depth 32;
    $Frequency 75;
    $FullScreen 0;
    $Title "MyGame";
    $VSync 0;
    Ri_InitEngine($Width$Height$Depth$Frequency$FullScreen$Title$VSync);
    unset(
    $Width$Height$Depth$Frequency$FullScreen$Title$VSync);

    MessageBox("RiBox3D => PHP\nVer: ".Ri_GetVersion(), "Game info");

    Ri_AntiAlias(true);

    $Light Ri_CreateLight(1);
    Ri_SetLightPosition($Light0.0150.00.0);

    $Camera Ri_CreateCamera();
    Ri_PositionEntity($Camera0.00.0200.0);

    $Torus Ri_CreateTorus(10.020.03030);

    do {
        
    Ri_BeginScene(0.00.00.0);
        
    Ri_TurnEntity($Torus1.10.42.1);
    } while (!
    Ri_KeyDown(1) == Ri_EndScene());

    Ri_ClearWorld();
    Ri_CloseEngine();

    app::close(); 
    [/SPOILER]

    Скрины
    [SPOILER]


    [/SPOILER]

    php_RiBox3D.dll - Пока в стадии разработки
    всего в обертки на данный момент функций 215 из 574


    Видео: Тык
    Последний раз редактировалось JJ95; 02.02.2014 в 08:47.
    Гениальный программист решит все те проблемы которых до него и не было ...
    Гениальный ум взорвет другой гениальный ум простым решением, а потом его отправит на дно ...
    Жизнь это река событий!!! - разных но связанных между собой не раз это замечал....
    Я не такой как все! если мне будут перечить то и я буду перечить! не кто не вправе мне указывать. а тем более существу в сто раз хуже меня по этому смирись с этим....
    P.s JJ95

  2. Пользователь сказал cпасибо:


  3. #2
    Аватар для Scram! Scram! Восходящая звезда Scram! Восходящая звезда Путешественник
    Сообщений
    426
    Поблагодарили 92 раз(а) в 52 сообщениях

  4. #3
    Аватар для JJ95 JJ95 Восходящая звезда Путешественник
    Сообщений
    445
    Поблагодарили 29 раз(а) в 27 сообщениях
    438 функций на данный момент в обертки из 574
    и их я тестирую и все работает хорошо

    будет выложены мои примеры на данный движок
    Гениальный программист решит все те проблемы которых до него и не было ...
    Гениальный ум взорвет другой гениальный ум простым решением, а потом его отправит на дно ...
    Жизнь это река событий!!! - разных но связанных между собой не раз это замечал....
    Я не такой как все! если мне будут перечить то и я буду перечить! не кто не вправе мне указывать. а тем более существу в сто раз хуже меня по этому смирись с этим....
    P.s JJ95

  5. #4
    Аватар для SlyFox SlyFox Посвященный SlyFox Посвященный SlyFox Посвященный Избранный
    Сообщений
    917
    Поблагодарили 244 раз(а) в 111 сообщениях
    Цитата Сообщение от JJ95 Посмотреть сообщение
    438 функций на данный момент в обертки из 574
    и их я тестирую и все работает хорошо

    будет выложены мои примеры на данный движок
    Обёртку макросами писал?
    [SPOILER][/SPOILER]
    Чего только пхпшники не придумают, чтобы не учить нормальные языки
    Мой блог

  6. #5
    Аватар для JJ95 JJ95 Восходящая звезда Путешественник
    Сообщений
    445
    Поблагодарили 29 раз(а) в 27 сообщениях
    Цитата Сообщение от max95 Посмотреть сообщение
    Обёртку макросами писал?
    если правильно понял что ты имеешь виду - то да.

    вообще когда я скачал архив там был файл RiBox3D.h для c++ там идет экспорт функций из RiBox3D.lib
    а потом я просто пишу обращения к функции к примеру Ri_SetMatrix, правда там его нужно править как много где упоминается void* после замены на long такая
    [SPOILER]
    PHP код:
    $Light Ri_CreateLight(1);
    Ri_SetLightPosition($Light0.0150.00.0); 
    [/SPOILER]
    конституция заработала
    а на с++ это выглядит вот так
    [SPOILER]
    PHP код:
    void *light Ri_CreateLight(1);
    Ri_SetLightPosition(light,0.0f,150.0f,0.0f); 
    [/SPOILER]
    Гениальный программист решит все те проблемы которых до него и не было ...
    Гениальный ум взорвет другой гениальный ум простым решением, а потом его отправит на дно ...
    Жизнь это река событий!!! - разных но связанных между собой не раз это замечал....
    Я не такой как все! если мне будут перечить то и я буду перечить! не кто не вправе мне указывать. а тем более существу в сто раз хуже меня по этому смирись с этим....
    P.s JJ95

  7. #6
    Аватар для Павел Павел Вообще от рук отбился Путешественник
    Сообщений
    414
    Поблагодарили 50 раз(а) в 41 сообщениях
    offtop
    А ты научился пока что только циферки изменять ?

  8. #7
    Аватар для JJ95 JJ95 Восходящая звезда Путешественник
    Сообщений
    445
    Поблагодарили 29 раз(а) в 27 сообщениях
    Цитата Сообщение от Павел Посмотреть сообщение
    offtop
    А ты научился пока что только циферки изменять ?
    а должно был что?
    то есть с нуля написать код?

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

    Цитата Сообщение от Павел Посмотреть сообщение
    А ты научился пока что только циферки изменять ?
    а если бы я тока научился как циферки растравлять, то и не чего не было и самого модуля php_RiBox3D.dll

    [SPOILER]
    и завязывайте в теме offtop создавать
    [/SPOILER]
    Гениальный программист решит все те проблемы которых до него и не было ...
    Гениальный ум взорвет другой гениальный ум простым решением, а потом его отправит на дно ...
    Жизнь это река событий!!! - разных но связанных между собой не раз это замечал....
    Я не такой как все! если мне будут перечить то и я буду перечить! не кто не вправе мне указывать. а тем более существу в сто раз хуже меня по этому смирись с этим....
    P.s JJ95

  9. #8
    Аватар для JJ95 JJ95 Восходящая звезда Путешественник
    Сообщений
    445
    Поблагодарили 29 раз(а) в 27 сообщениях
    Нашел тупую ошибку иногда если как то по другому написать такую строку
    PHP код:
    Ri_InitEngine600,  600,  32 75,  1,"test",0); 
    то выдает такую ошибку


    не понять из за чего она происходит но оно тока происходит в ds а на php.exe работает отлично без ошибок и там fps на много больше почему то я б даже сказал на 40 фпс больше выдает чем в самой ds
    Гениальный программист решит все те проблемы которых до него и не было ...
    Гениальный ум взорвет другой гениальный ум простым решением, а потом его отправит на дно ...
    Жизнь это река событий!!! - разных но связанных между собой не раз это замечал....
    Я не такой как все! если мне будут перечить то и я буду перечить! не кто не вправе мне указывать. а тем более существу в сто раз хуже меня по этому смирись с этим....
    P.s JJ95

  10. #9
    Аватар для JJ95 JJ95 Восходящая звезда Путешественник
    Сообщений
    445
    Поблагодарили 29 раз(а) в 27 сообщениях
    Короче решил отказаться от RiBox3D.lib и сделать нормальный экспорт на c++


    теперь забыл уточнить то что написал
    Нашел тупую ошибку иногда если как то по другому написать такую строку
    PHP код:
    Ri_InitEngine600,  600,  32 75,  1,"test",0); 
    если такую строку от руки написать или заменить к примеру 600 на написанный 600 от руки то выдает такую ошибку, а вот к имени функции(Ri_InitEngine) это не относиться ее хоть как можно написать


    выложу когда напишу экспорт на c++


    вот маленький пример как будет устроена библиотека все работает хорошо, но надо еще об оптимизации подумать и сделать внутренний таймер! а то цикл в php очень медленный, если сделать проверку и запустить код в библиотеки то fps - 700 а если запустить код в ds то fps 60 в полном экране 75
    PHP код:
    #include "stdafx.h"
    #include "WTypes.h"
    #include "stdio.h"
    #include "tchar.h"

    #define hLib LoadLibrary(_T("RiBox3D.dll"))
    typedef BOOL (WINAPI *RiInitEngine)(longlonglonglongboolchar*, bool);

    PHP_FUNCTION(Ri_InitEngine)
    {
        
    long Widthlong Heightlong Depthlong Frequencyint FullScreencharTitleint VSync;
        if (
    zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC"lllllsl", &Height, &Height, &Depth, &Frequency, &FullScreen, &Title, &VSync) == FAILURE) {
        return;
        }
        
    RiInitEngine Ri_InitEngine;
        
    Ri_InitEngine = (RiInitEngine)GetProcAddress(hLib"_Ri_InitEngine@28");
        
    RETURN_BOOL((*Ri_InitEngine)(HeightHeightDepthFrequencyFullScreenTitleVSync));

    Последний раз редактировалось JJ95; 05.02.2014 в 06:38.
    Гениальный программист решит все те проблемы которых до него и не было ...
    Гениальный ум взорвет другой гениальный ум простым решением, а потом его отправит на дно ...
    Жизнь это река событий!!! - разных но связанных между собой не раз это замечал....
    Я не такой как все! если мне будут перечить то и я буду перечить! не кто не вправе мне указывать. а тем более существу в сто раз хуже меня по этому смирись с этим....
    P.s JJ95

  11. #10
    Аватар для JJ95 JJ95 Восходящая звезда Путешественник
    Сообщений
    445
    Поблагодарили 29 раз(а) в 27 сообщениях
    Цитата Сообщение от xsnakes Посмотреть сообщение
    Типа экспорт через lib - это не нормально? XD
    Нужно ломом выдирать адреса функций, вот это нормально? Нормально потому, что ты не можешь сделать с lib!? А я знаю почему не можешь, ведь я тоже с этим сталкивался, но сам легко додумался в чём дело и легко всё решил!
    А дело всё в именах функций, которые в Zend должны передаваться как строки, но в lib они уже объявлены как функции и потому идёт вызов функции при PHP_FUNCTION и ошибка!

    И нужно не на таймерах DS делать отрисовку, а на цикле PHP, в потоке! Тогда и скорость будет выше!
    А ты наверняка засунул код в таймер у которого стоит ограничение на количество интерпретаций в определённый интервал времени! К тому же таймер отрубается когда программа скрыта...
    И выводить более 60 fps - нет смысла! Так как человеческий глаз и более 30 не особо видит! Но чтобы с большей вероятностью попасть на частоту человеческого глаза, отрисовывают 2 к 1, а т.е. 60 fps. А 700 fps твои только будут тормозить игру.
    Реально сейчас попробовал функцию назвать не Ri_InitEngine а RiInitEngine и ошибку больше нет такой, я и не понимал в чем была ошибка.



    xsnakes, можешь дать совет?
    чем лучше будет заменить void* ? сейчас там long я поставил
    а то мне кажется что будет еще какая та хрень в будущем если не учесть этого

    и еще я узнал что void* может вернуть не тока цифры но и текст а это уже плохо
    Последний раз редактировалось JJ95; 05.02.2014 в 09:27.
    Гениальный программист решит все те проблемы которых до него и не было ...
    Гениальный ум взорвет другой гениальный ум простым решением, а потом его отправит на дно ...
    Жизнь это река событий!!! - разных но связанных между собой не раз это замечал....
    Я не такой как все! если мне будут перечить то и я буду перечить! не кто не вправе мне указывать. а тем более существу в сто раз хуже меня по этому смирись с этим....
    P.s JJ95

  12. #11
    Аватар для SlyFox SlyFox Посвященный SlyFox Посвященный SlyFox Посвященный Избранный
    Сообщений
    917
    Поблагодарили 244 раз(а) в 111 сообщениях
    Цитата Сообщение от JJ95 Посмотреть сообщение
    Реально сейчас попробовал функцию назвать не Ri_InitEngine а RiInitEngine и ошибку больше нет такой, я и не понимал в чем была ошибка.



    xsnakes, можешь дать совет?
    чем лучше будет заменить void* ? сейчас там long я поставил
    а то мне кажется что будет еще какая та хрень в будущем если не учесть этого

    и еще я узнал что void* может вернуть не тока цифры но и текст а это уже плохо
    Если нужна будет помощь, maxracov мой скайп.
    Из-за того, что пока работаю над движком.
    Последний раз редактировалось SlyFox; 05.02.2014 в 10:07.
    [SPOILER][/SPOILER]
    Чего только пхпшники не придумают, чтобы не учить нормальные языки
    Мой блог

  13. #12
    Аватар для JJ95 JJ95 Восходящая звезда Путешественник
    Сообщений
    445
    Поблагодарили 29 раз(а) в 27 сообщениях
    Цитата Сообщение от xsnakes Посмотреть сообщение
    void* - это указатель не определённого типа.
    Можно возвращать строку, если ты не уверен в том, что там могут быть только числа! Можно сделать ещё проверку типа через C++ и по типу возвращать результат, если ты во всё там сомневаешься.
    Но вообще если будешь возвращать строку и всё преобразовывать в строку, то не ошибёшься. Число будет числом, строка строкой, только тип в PHP будет у всего строковой, но результат не будет потерян.
    Но лучше возвращать результат соответствующего типа, дабы не выделять больше памяти...
    В документации движка описаны эти моменты, там сказано какой возвращает тип.


    А вот так можно обойти конфликты с lib, просто раскрываем макросы Zend, выбираем что нужно...
    Это в список функций модуля:
    PHP код:
    ZEND_RAW_FENTRY("xGraphics3D"zif_xGraphics3DNULL0
    Это объявление функции, где-то там где я писал...:
    PHP код:
    void zif_xGraphics3D(INTERNAL_FUNCTION_PARAMETERS); 
    А это само тело функции:
    PHP код:
    void zif_xGraphics3D(INTERNAL_FUNCTION_PARAMETERS)
    {
        
    int width 1024height 768depth 0mode 0vsync 1;
        if (
    zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC"|lllll", &width, &height, &depth, &mode, &vsync) == FAILURE)
            
    returzn;
        
    xGraphics3D(widthheightdepthmodevsync);

    Приставка "zif_" обязательна!
    спасибо очень полезно
    Гениальный программист решит все те проблемы которых до него и не было ...
    Гениальный ум взорвет другой гениальный ум простым решением, а потом его отправит на дно ...
    Жизнь это река событий!!! - разных но связанных между собой не раз это замечал....
    Я не такой как все! если мне будут перечить то и я буду перечить! не кто не вправе мне указывать. а тем более существу в сто раз хуже меня по этому смирись с этим....
    P.s JJ95

  14. #13
    Аватар для DimaDark DimaDark Не известно кто Любопытный
    Сообщений
    47
    Поблагодарили 3 раз(а) в 3 сообщениях
    Перезалейте
    Здесь был DimaDark..

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения