XProger
eXgine v0.80


Описание

 eXgine (далее именуемый - движок) является функциональным ядром любого игрового (и не только) движка. Распространяется в виде бесплатной (для любых целей) динамической библиотеки eXgine.dll с открытым исходным кодом, ориентированной на использование в Delphi. Первоначальная цель его создания - помочь своему создателю в вынесении кода рутинной системщины за пределы приложения (чтобы глаза не мозолила), при этом сочетать хорошую функциональность и относительно малый размер. В итоге, знания заложенные в библиотеку создали достаточно хороший и удобный фундамент для создания игры...
 В основу архитектуры заложены принципы ООП, призванной дать удобный и быстрый доступ к функциям объектов движка. На данный момент он состоит из 10 основных объектов. Использование или неиспользование каждого из которых является сугубо личным правом программиста. Объекты построены по принципу интерфейсов (абстрактных/виртуальных объектов) содержащих указатели на реализацию своих методов.
 Не запрещено использование кода библиотеки в своих (быть может корыстных ;) целях. Автор библиотеки не несёт никакой ответственности за работу его кода, но заинтересован в корректности этой работы... так что, любые замечания готов услышать и учесть :)
 К возможностям или достоинствам движка можно причислить:  Данный документ описывает результат и работу функций основных объектов движка.
меню


Шаблон

 Обычный проект основанный на eXgine выглядит приблизительно так:
program ex_tmpl;

uses
  OpenGL, eXgine;

procedure Update;
begin
// Выход при нажатии Escape (код клавиши 27)
  if inp.Down(27) then eX.Quit;
end;

procedure Render;
begin
  ogl.Clear(True, True);
  ogl.Set3D(90, 0.1, 512);
// ...здесь вывод каких-то 3D объектов... 
  tex.Disable;
  ogl.Set2D(0, 0, wnd.Width, wnd.Height);
  glColor3ub(random(256), random(256), random(256));
  ogl.TextOut(0, 224, 248, 'Драфствуйте!');  // Вывод 2D графики - текста  
end;
  
begin
  wnd.Create('Main Window');
  eX.SetProc(PROC_UPDATE, @Update);
  eX.SetProc(PROC_RENDER, @Render);
  log.Print('Hello World!');  // Дурью маемся ;)
// Установка полноэкранного режима
  wnd.Mode(True, 640, 480, 32, 85);
// Вход в главный цикл
  eX.MainLoop(50);
end.
меню


IEngine

 Основной интерфейс посредством которого реализуется доступ к остальным объектам движка.
 eXgine.dll содержит функцию exInit, которая производит инициализацию всех объектов и возвращает основной IEngine объект. В стандартном заголовке к библиотеке eXgine.pas, при инициализации значения первых 8 функций записываются в одноимённые глобальные переменные, основной же объект IEngine находится в переменной eX.
меню


ILog

 Объект отвечает за ведение лога. Файл лога создаётся автоматически при вызове exInit, или же (при указании nil) создаётся вручную в любое время.
 Во время работы приложения ведение лога можно начинать и заканчивать, возможности продолжения записи после закрытия файла - нет. Помимо записанных команд лог по умолчанию содержит тайминги в миллисекундах. Тайминг представляет из себя время с предыдущей записи в файл.
меню


IWindow

 Объект даёт доступ к некоторым параметрам окна и видеорежима. Также производит инициализацию графического и звукового ядра.
меню


IInput

 Даёт информацию о состоянии устройств ввода. Такими устройствами считаются клавиатура, мышь и джойстик/геймпад/руль. В стандартном заголовке существует набор специальных констант: M_ - клавиша мыши, J - джойстика. Для клавиатуры подходят стандартные Windows VK_ константы [0..255].
меню


IOpenGL

 Объект-надстройка над графическим API. Несёт в себе набор часто необходимых функций. Становится работоспособным только после создания основного окна.
меню


IVBuffer

 VBuffer (Vertex Buffer) представляет из себя контейнер данных меша (индексы вершин полигонов, координаты вершин, текстурные координаты вершин, нормали к вершинам) с функциями вывода на экран. Удобство заключается в том, что при поддержке соответствующих расширений данные сохраняются в памяти видеокарты, что позволяет разгрузить шину и повысить скорость вывода.
 Данные в буфере оптимизируются при его компиляции (формат хранения вершин и индексов), что позволяет достичь максимальной производительности.
меню


ITexture

 Осуществляет работу с текстурами. Вся система текстур построена на основе чёткого менеджмента с отловом количества ссылок на текстуру. Так например, текстура не высвободится до тех пор, пока Free не будет вызван столько же раз сколько была произведена загрузка текстуры или её создание (за исключением обновления групп текстур). Все текстуры делятся на группы, задаваемые пользователем. Это может пригодиться в экономии времени при перезагрузке большого количества (заведомо неизвестных) текстур. Идеология метода в том, что все неиспользуемые текстуры освободятся при вызове Update_End, а те что нужны не будут тронуты т.к. имел место запрос на их повторную загрузку с момента вызова Update_Begin.
 Помимо этого реализована поддержка мультитекстурирования и самого быстрого (на сегодняшний день) рендеринга в текстуру с использованием FBO (реализован драйвером видеокарты)
меню


IShader

 Ещё одна надстройка над OpenGL обеспечивающая более удобный интерфейс для работы с шейдерами.
 Существует поддержка вершинных и фрагментных программ написанных на GLSL (реализован драйвером видеокарты). Следовательно если видеокарта не поддерживает ARB шейдеры (или драйвера старые) могут возникнуть ошибки...
 Стандартный объект IShader находится в переменной vfp (Vertex Fragment Program)
меню


ISound

 Отвечает за звук. В частности, реализован 3D звук через панорамный. Почему не 3D? Потому, что скорость и качество работы стандартного DirectSound3D не устраивает.
 Звуковой менеджер работает по тому же принципу, что и текстурный.
меню


INetwork

 Внимание! Данный модуль находится на стадии разработки/тестирования
 Сетевой модуль для работы по протоколам UDP и TCP. Процесс получения новых пакетов работает в отдельном потоке.
 Интерфейсы IUDP и ITCP имеют общий интерфейс IProtocol, отвечающий за работу с буфером отправки и сокетом.
меню


IVector

 Объект реализующий некоторые функции векторной алгебры. Не рекомендуется использовать в критичных по скорости выполнения расчётах, т.к. до скорости работы inline функций ему очень далеко ;)
меню


История разработки

! исправлено
+ добавлено
- удалено
меню