{------------------------------------------------------------------------------}
{  _____      _______   ________   _       _        ________    _              }
{ |  __ \    |   __  | |        | | |     | |     /  _____  \  | |             }
{ | |  \ \   |  |__| | |  ____  | | |\    | |     | |     |_|  | |             }
{ | |  |  |  | ______| | |    | | | |\\   | |     | |          | |             }
{ | |  |  |  | |\\     | |    | | | | \\  | |     | |    ___   | |             }
{ | |  |  |  | | \\    | |____| | | |  \\ | |     | |   |_  |  | |     _       }
{ | |_/  /   | |  \\   |        | | |   \\| |     | |_____| |  | |____| |      }
{ |_____/    |_|   \\  |________| |_|    \|_|     \________/   |________|      }
{                                                                              }
{  DRON's OpenGl Engine V 0.88  http://dronprogs.mirgames.ru                   }
{                                                                              }
{  Date: 18.07.2005                                                            }
{                                                                              }
{Лицензия: Вы можете свободно использовать этот движок, как в коммерческих     }
{так и не коммерческих целях, при соблюдение одного условия, в авторах игры    }
{должно быть указано, что игра использует DGLEngine и приведен адрес сайта.    }
{Это так не сложно, так что если вы используете движок, не сочтите за труд!    }
{                                                                              }
{------------------------------------------------------------------------------}

{
История версий:
[+] - добавлено [*] - исправлено [-] - изменено

V 0.1 Date: 20.02.2005: Первый релиз движка

V 0.8 Date: 24.03.2005:
+Блок работы с 3D
+Блок работы со звуком и музыкой (требует DirectX 5.0 или выше)
+Блок работы с сетью через WinSock по протоколу TCP/UDP
*Баг из-за которого на некоторых видеокартах фпс падал в 2-3 раза
+Управление вертикальной синхронизацией
+Управление частотой развертки монитора
+Возможность менять качество текстур
-Способ чтения BMP и JPG из паков, стал быстрее
+Поддержка геймпадов
+Незначительные улучшения и доработки

V 0.85 Date: 9.06.2005
+Работа с видеопамятью
+3D спрайты, 3D полигоны и т.д.
+Процедуры отрисовки цилиндра, эллипса, дуги окружности, заполненного круга, линий с градиентной заливкой, участка текстуры, тайлового спрайта и т.д.
+Сглаживание линий и возможность менять их толщину
+Возможность устанавливать свойства материалов и источников света
+BumpMapping
+Загрузка AVI видеофайлов в качестве текстур
-Функция загрузки звуков
-Функция загрузки текстур, теперь можно устанавливать цвет прозрачности для BMP
+Небольшие изменения и улучшения касательно проигрывания музыки(звуков), ввода текста и многого другого

V 0.86 Date: 25.06.2005
*Теперь окно движка рисуется "умно" и процессор не загружается на 100%, если это не нужно
*Скорость загрузки BMP и JPG текстур увеличена раз в 10, а то и больше

V 0.86a Date: 30.06.2005
*Обнаружен и исправленн баг из-за которого движок работал медленнее по сравнению с версией 0.85

V 0.88 Date: 18.07.2005
*Небольшая оптимизация при отрисовке окна и исправил баг, когда в оконном режиме часть картинки скрывалось заголовком окна
+Функция чтения файла из пака в поток памяти
+Процедура сканирования директорий
+Функция которая возвращает параметры загруженной текстуры, такие как: размеры, качество и прочее
-Возможность изменения способа автомасштабирования моделей и посмотреть кол-во кадров анимации модели
*Оптимизация процедуры отрисовки Rectangle'а
+Возможность менять положение окна на экране
*Баг процедуры отрисовки трехмерного неба (SkyBox)
+Клавиша "Print Screen" теперь зарезервирована движком, по нажатию на нее всегда сохраняются скриншоты в текущую папку
+В 3D появилась возможность устанавливать камеры
*Небольшие доработки сети
*Параметры источника света по умолчанию измененны на аналогичные дефолтовые для OpenGL
+Возможност зеркально отражать текстуру в 2D, как по горизонтале, так и по вертикале

Работа продолжается...

Пишите свои пожилания к следующей версии на dron44@mail.ru
}

unit DGLEngine_header;

interface
uses Windows, Classes;

  const
  //Путь до DLL движка
  DGLE_dll = 'DGLEngine.dll';

{***Engine***}
{Module version: 1.01a}

//Процедура инициализации, создания движка и окна программы
procedure StartEngine; stdcall; external DGLE_dll;
//Регестрирует процедуры отрисовки и обсчета из ЕХЕ файла (работает только до инициализации движка)
//ID: 0 - процедура отрисовки 1 - процедура обсчета 2 - процедура инициализации(выполняется сразу посде создания движка,
//в ней например нужно загружать текстуры или указывать какие либо параметры которые можно менять только после инициализации OpenGl)
//ProcAdress: указатель на процедуру, например @ProcessSceneGame
procedure RegProcedure(ID: WORD; ProcAdress: pointer); stdcall; external DGLE_dll;
//Пишет строку в лог файл
//IsDate: дописывать дату IsTime: - время FileRewrite: пересоздать ли файл
procedure AddToLogFile(FileName, LogStr:String; IsDate : Boolean = false; IsTime : Boolean = false; FileRewrite : boolean = false);  stdcall; external DGLE_dll;
//Устанавливает параметры движка, разрешение, глубину цвета, полноэкранный или оконный режим и будет ли движок читать эти настройки из "Settings.ini"
//Примечание: Если файл "Settings.ini"(или указанный процедурой SetEngineInifileName) отсутствует, то движок его создаст и запишет в него текущие параметры,
//в противном случае, прочитает их из файла и установит именно их, а не те что задает эта процедура
//WriteLog - будет ли движок вести свой логфайл
//VSync - вертикальная синхронизация
//DisplayFrequency - частота развертки монитора (0 - частоту выбирает Windows)
procedure SetEngineInitParametrs(ResX,ResY,ColorDepth, DisplayFrequency : integer; Fullscreen, VSync, UseEngineSettingsIni : boolean; WriteLog : boolean = true); stdcall; external DGLE_dll;
//Устанавливает позицию окна на экране(для оконного режима), вызывать до старта движка
procedure SetWindowPosition(Left, Top : integer); stdcall; external DGLE_dll;
//Меняет имя приложения
procedure ApplicationName(Name : PAnsiChar); stdcall; external DGLE_dll;
//Устанавливает интервал таймера вызова процедуры обсчета (работает только до инициализации движка)
procedure SetGameProcessInterval(Interval : byte); stdcall; external DGLE_dll;
//Возвращает текущие значение FPS
function  GetFPS : integer; stdcall; external DGLE_dll;
//Меняет имя используемого движком ини файла (по умолчанию "Settings.ini")  (работает только до инициализации движка)
procedure SetEngineInifileName(Name : string); stdcall; external DGLE_dll;
//Читает значение из инифайла  section - имя секции без [] key - имя ключа, если возникла ошибка, то функция ыозвпащает пустую строку
function  ReadValueFromIniFile(Filename, Section, Key: string):string; stdcall; external DGLE_dll;
//Записывает значение в инифайл
procedure WriteValueToIniFile(Filename, Section, Key, Value : string); stdcall; external DGLE_dll;
//Сканирует указанную папку и ищит в ней файлы по заданной маске (например '*.map'), записываю пути до них в list
//Примечание: Что бы использовать функцию ниже, прежде чем ее раскомментировать, необходимо расскомментировать вверху в uses модуль Classes, который закомментирован для уменьшения размере EXE
procedure FindFiles(StartFolder, Mask: String; List: TStrings; ScanSubFolders: Boolean = True); stdcall;  external DGLE_dll;
//Возвращает разрешение экрана Ширину
function  GetScreenResX : integer; stdcall; external DGLE_dll;
//Возвращает разрешение экрана Высоту
function  GetScreenResY : integer; stdcall; external DGLE_dll;
//Закончить работу движка (выход из программы)
procedure QuitEngine; stdcall; external DGLE_dll;
//Загрузка текстуры из файла поддерживаются BMP, JPG и TGA (без сжатия)
//Filename: путь до файла
//Texture: целочисленный индекс текстуры
//Detail: степень детализации текстуры, допускаемые значения: 0 - как есть(наилучшее качество), 1 - незначительное размытие 2 - сильное размытие(ухудьшение в 2 раза) 3 - ухудьшение в 4 раза
//Примечания:
//Параметр Detail - не влияет на TGA текстуры
//BMPTransparentColor - задает цвет прозрачности, только для BMP текстур, по умолчанию - Серый(clGray)
//У JPG цвета прозрачности нет
//У TGA прозрачность читается из встроенного в тга альфаканала подходит для сложных спрайтов с альфаканалом
//*!*Желательно что бы ширина/высота картинка была кратна степени двойки 32, 64, 128, 256, 512(выше советую не делать!)
//иначе скорость отрисовки игры снизится и возможно, что текстуры будут отображаться неверно
function  LoadTexture(Filename: String; var Texture: Cardinal; Detail : byte = 0; BMPTransparentColor : cardinal = $808080) : Boolean;  stdcall; external DGLE_dll;
//Извлекает указанный файл из пака и сохраняет его в файл на жестком диске
//Пример использования: ExtractFromPackage('Data\Textures.dcp','Scores.txt','c:\temp.txt);
procedure ExtractFromPackage(const PackageName, Name, DestFilename : string); stdcall; external DGLE_dll;
//Функция читает любой файл из пака в поток памяти
//Примечание: Что бы использовать функцию ниже, прежде чем ее раскомментировать, необходимо расскомментировать вверху в uses модуль Classes, который закомментирован для уменьшения размере EXE
function  LoadFromPackage(const Filename, Name : string):TMemoryStream; stdcall; external DGLE_dll;
//Грузит текстуру из пака поддерживаются BMP, JPG и TGA
//Filename : путь до пака Name: имя в паке, например 'Picture.bmp'
function  LoadTextureFromPackage(Filename, Name : string; var Texture: Cardinal; Detail : byte = 0; BMPTransparentColor : cardinal = $808080) : boolean;  stdcall; external DGLE_dll;
//Удаляет текстуру из памяти
procedure FreeTexture(Texture : Cardinal); stdcall; external DGLE_dll;
//Функция ниже возвращает параметры уже загруженной текстуры по ее идентификатору.
//Примечание: Если текстура уже была удалена из памяти процедурой FreeTexture, то в возврщенном типе Index будет равен 6666, а все остальные параметры будут нулями
type TTextureInfo = record
Index : Cardinal; //Индекс текстуры в памяти OpenGl, обычно совпадает с ее идентификатаром в движке
Width,Height : integer;
Detail,           //то же что указывалось при загрузке текстуры
FileType : byte;  //1-TGA 2 - BMP 3 - JPG
end;
function GetTextureInfo(Texture : Cardinal) : TTextureInfo; stdcall; external DGLE_dll;
//Сохраняет скриншот экрана в файл Folder - папка в которую будет сохранен файл, если Folder='', тогда файл сохраняется в папку с EXE.
//Если произошла ошибка функция возвращает -1 иначе номер сохраенного скриншота от 0 и больше
function  PrintScreen(Folder : string = '') : integer; stdcall; external DGLE_dll;

{***Console***}
{Module version: 1.0}

//Создает консоль (вызывается тильдой "~")
//Font - текстура шрифта Size - размер Step - растояние междусимволами Texture - фон консоли
procedure CreateConsole(Font : Cardinal; Size : real = 1.0; Step : integer = 32; Texture : Cardinal = 0); stdcall; external DGLE_dll;
//Регистрирует консольную команду, которая вызывается без параметров, а ссылается на процедуру в EXE
//ComName - имя команды ProcAdress - указатель на какую либо процедуру
//Примечания, движком резервируется консольная команда "cmndlist" - выводит список всех зарегистрированных команд
procedure RegisterCommandProcedure(ComName : string; ProcAdress : pointer); stdcall; external DGLE_dll;
//Возвращает параметры вызова последней команды, если она ссылалась на процедуру
function  GetLastComParam : string; stdcall; external DGLE_dll;
//Регестрирует команду, которая меняет значение переменной типа integer
//ValueAdress - указатель на какую либо переменную MaxValue/MinValue - ее максимальное/минимальное значение
procedure RegisterCommandValue(ComName : string; ValueAdress : pointer; MaxValue, MinValue : integer); stdcall; external DGLE_dll;
//Добавляет в консоль строчку текста
procedure AddStringToConsole(Text : string); stdcall; external DGLE_dll;
//Очищает содержимое консоли
procedure ClearConsole; stdcall; external DGLE_dll;
//Обработка обсчета консоли
procedure ProcessConsole; stdcall; external DGLE_dll;
//Обработка отрисовки консоли
//Примечание: Вызывать после Begin2D
procedure DrawConsole; stdcall; external DGLE_dll;


{***Graphics 2D***}
{Module version: 1.01}

////*******////
//Переводит движок в режим отрисовки 2D графики
procedure Begin2D; stdcall; external DGLE_dll;
//Возвращает в режим работы с 3D
procedure End2D; stdcall; external DGLE_dll;
//Примечание: Все процедуры блока "Graphics 2D" должны писаться после процедуры Begin2D!!!
////*******////

//Процедуры отрисовки примитивов

//Рисует точку
//Color - например $8040F0, Alpha от 0 до 255
procedure PutPoint2D(X,Y,Color : integer; Alpha : integer = 255) ; stdcall; external DGLE_dll;
//Рисует линию
procedure DrawLine2D(X1, Y1, X2, Y2, Color : integer; Alpha : integer = 255; LineWidth : real = 1.0; Smooth : boolean = false); stdcall; external DGLE_dll;
//Рисует линию с градиентной заливкой
procedure DrawColorLine2D(X1, Y1, X2, Y2, Color1, Color2 : integer; Alpha : integer = 255; LineWidth : real = 1.0; Smooth : boolean = true); stdcall; external DGLE_dll;
//Рисует прямоугольник, если Fill = true, то еще его и зиливает
procedure DrawRectangle2D(X, Y, Width, Height, Color : integer; Alpha : integer = 255; Fill : boolean = false); stdcall; external DGLE_dll;
//Процедура отрисовки залитого прямоугольника с отдельным цветом и альфой для каждого вертекса
procedure DrawRectangle2D_Fill_VertexColor(X, Y, Width, Height, Color1, Color2, Color3, Color4, Alpha1, Alpha2, Alpha3, Alpha4 : integer); stdcall; external DGLE_dll;
//Процедура отрисовки окружности
procedure DrawCircle2D(X, Y, Radius, Color : integer; Alpha : byte = 255); stdcall; external DGLE_dll;
//Процедура отрисовки закрашенного круга
procedure DrawCircle2D_Fill(X, Y, Radius, Color : integer; Alpha : byte = 255); stdcall; external DGLE_dll;
//Процедура отрисовки эллипса Vertices - детальность проработки
procedure DrawEllipse2D(Center: TPoint; Radius0, Radius1, Vertices: Integer; Color: Cardinal; Alpha: byte=255); stdcall; external DGLE_dll;
//Процедура отрисовки эллипса с заливкой
procedure DrawEllipse2D_Fill(Center: TPoint; Radius0, Radius1: Integer; Color: Cardinal; Alpha: byte=255); stdcall; external DGLE_dll;
//Процедура отрисовки дуги окружности
procedure DrawCircleArc2D(X, Y, Radius, Angle1, Angle2, Color: Integer; Alpha : byte = 255); stdcall; external DGLE_dll;
//Процедура отрисовки полигона по точкам
procedure DrawPolygon2D(points : array of Tpoint; Color, Alpha : integer); stdcall; external DGLE_dll;
//Процедура отрисовки полигона по точкам с отдельным цветом и альфой для каждого вертекса
type TColorVertex2D = record X,Y,Color, Alpha : integer; end;
procedure DrawPolygon2D_VertexColor(points : array of TColorVertex2D); stdcall; external DGLE_dll;

//Процедуры отрисовки картинок(спрайтов)

//ImageWidth, ImageHeight - ширина и высота картинки на экране
//FlipX - отразить по оси X, FlipY - отразить по оси Y
//Примечание: Alpha - от 0 до 255, Angle - от 0 до 360 Color - например $FFFFFF(белый)
procedure DrawTexture2D_Simple(Texture : Cardinal; X , Y, ImageWidth, ImageHeight : integer; FlipX : boolean = false; FlipY : boolean = false); stdcall; external DGLE_dll;
//Рисует прямоугольник вырезанный из текстуры
//Примечание: X,Y - положения вырезанного участка текстуры на экране (!)TexWidth, TexHeight - ширина/высота текстуры целиком, а не вырезанного участка
//SplitRect - вырезанный из текстуры прямоугольник(вводить в координатах текстуры а не экрана)
procedure DrawTexture2D_Split(Texture : Cardinal; X , Y, TexWidth, TexHeight : integer; Angle, Alpha, Color : integer; SplitRect : Trect; FlipX : boolean = false; FlipY : boolean = false); stdcall; external DGLE_dll;
//Diffuse - устанавливает будет ли происходить размытие текстуры по альфаканалу, применяется только к альфаканалам в BMP и JPG, нужно для создания эффектов освещения
//Иначе говоря при Diffuse=true альфаканал генерируется по принцыпу, чем цвет пикселя ближе к черному, тем он прозрачнее
procedure DrawTexture2D(Texture : Cardinal; X , Y, ImageWidth, ImageHeight, Angle, Alpha, Color : integer; Diffuse : boolean = false; FlipX : boolean = false; FlipY : boolean = false); stdcall; external DGLE_dll;
//Выводит текстуру с отдельным цветом и альфой для каждого вертекса
procedure DrawTexture2D_VertexColor(Texture : Cardinal; X , Y, ImageWidth, ImageHeight, Color1, Color2, Color3, Color4, Alpha1, Alpha2, Alpha3, Alpha4 : integer; FlipX : boolean = false; FlipY : boolean = false); stdcall; external DGLE_dll;
//Процедуры отрисовки спрайтов
//Примечание: ImageWidth, ImageHeight - высота и ширина картинки на экране, FramesXCount, FramesYCount - кол-во кадров в ширину и высоту, FrameNumber - номер рисуемого кадра, предел значений
//от 1 до FramesXCount*FramesYCount, отсчет кадров ведется слева на право, если номер кадра больше чем кол-во кадров в ширину то берется следующая "строчка".
//Т.е. если имеем картинку 6*6 кадров и задаем FrameNumber=7, то выведется первый кадр из второй строчки.
procedure DrawSprite2D_Simple(Texture : Cardinal; X , Y, ImageWidth, ImageHeight,FramesXCount, FramesYCount, FrameNumber: integer; FlipX : boolean = false; FlipY : boolean = false); stdcall; external DGLE_dll;
procedure DrawSprite2D(Texture : Cardinal; X , Y, ImageWidth, ImageHeight,FramesXCount, FramesYCount, FrameNumber, Angle, Alpha, Color : integer; Diffuse : boolean = false; FlipX : boolean = false; FlipY : boolean = false); stdcall; external DGLE_dll;
//Выводит спрайт с отдельными цветами и альфой каждого вертекса
procedure DrawSprite2D_VertexColor(Texture : Cardinal; X , Y, ImageWidth, ImageHeight,FramesXCount, FramesYCount, FrameNumber, Color1, Color2, Color3, Color4, Alpha1, Alpha2, Alpha3, Alpha4 : integer; FlipX : boolean = false; FlipY : boolean = false); stdcall; external DGLE_dll;
//Вывод для спрайта в ширину/высоту текстуры которого не укладывается росное кол-во кадров
//ImageWidth, ImageHeight, - размеры картинки на экране FrameWidth, FrameHeight - размеры одного кадра
procedure DrawSprite2D_Tile(Texture : Cardinal; X, Y, TexWidth, TexHeight, FrameWidth, FrameHeight, FramesXCount, FramesYCount, FrameNumber, Angle, Alpha, Color : integer; FlipX : boolean = false; FlipY : boolean = false); stdcall; external DGLE_dll;
//Выводит текст
//FontTexture - предварително загруженная текстура шрифта
//Vertical - текст выводится по вертикале
//Step - растояние между буквами, иногда приходится подправлять т.к. расстояние между буквам бывает например слишком большим
procedure DrawText2D(FontTexture : Cardinal; X,Y,Color : integer; Text : string; Alpha : integer = 255; Scale : real = 1.0; Step : integer = 32; Vertical : boolean = false); stdcall; external DGLE_dll;
//Возвращает ширину/высоту текста в пикселях
function  GetTextWidth(Text : string; Scale : real = 1.0; Step : integer = 32):integer; stdcall; external DGLE_dll;

{***Graphics 3D***}
{Module version: 0.5}

//Меняет растояние от передней до дальней секущей плоскости, т.е. ближе передней и дальше дальней - ничего не рисуется. Применяется только для 3D.
//Примечание: Вызывать до создания движка. (значения по умолчанию: ZNear = 1.0 ZFar = 100.0)
procedure SetCutingPlanes(ZNear, ZFar : single); stdcall; external DGLE_dll;
//Устанавливает угол обзора в 3D.
//Примеяание: Вызывать до создания движка. (по умолчанию Angle = 45.0)
procedure SetViewAngle(Angle : single); stdcall; external DGLE_dll;
//Ояищает буфер глубины, после вызова процедуры последующи объекты будут рисоваться поверх уже нарисованных, даже если они формально находятся за ними.
//Эту процедуру нужно вызывать например перед отрисовкой модели оружия в шутере от первого лица, тогда оно не будет врисовываться в стены при приближении к ним.
procedure ClearZBuffer; stdcall; external DGLE_dll;

//Начинает отрисовку 3D объекта или блока 3D объектов
procedure BeginObj3D; stdcall; external DGLE_dll;
//Хавершает отрисовку объекта/блока и возвращает все параметры которые были установленны до вызова процедуры BeginObj3D
procedure EndObj3D; stdcall; external DGLE_dll;

//Процедуры ниже влияют на все выводимые после их вызова примитивы, модели и т.д.

type
  TVertex = record X, Y, Z: single; end;
  TCamera = record
            Eye    : TVertex; //Положение камеры в пространстве
            Center : TVertex; //Точка в которую обращена камера
            end;
//Устанавливаем позицию камеры (лучше вызывать в самом начале отрисовки)
procedure SetCamera(Camera : TCamera); stdcall; external DGLE_dll;
//Перемещает систему координат в указанную точку
procedure Position3D(X,Y,Z : single); stdcall; external DGLE_dll;
//Масштабирует систему координат
procedure Scale3D(Scale : single); stdcall; external DGLE_dll;
//Эти процедуры поворачивают систему координат вокруг осей
procedure RotateX(Angle : single); stdcall; external DGLE_dll;
procedure RotateY(Angle : single); stdcall; external DGLE_dll;
procedure RotateZ(Angle : single); stdcall; external DGLE_dll;
//Меняет текущие цветовые параметры выводимых объектов
procedure Color3D(Color:integer; Alpha : byte; Diffuse : boolean = false); stdcall; external DGLE_dll;
//Устанавливает текстуру для всех последующих выводимых объектов
procedure SetTexture(Texture : Cardinal); stdcall; external DGLE_dll;
//Включает и устанавливает источник света в указанных координатах, с указанными свойствами источника и матерьяла
//Примечание: Процедура EndObj3D; - выключает свет
procedure SetLight(X : single = 1;Y : single = 0;Z : single = 1; light_Ambient : integer = $000000; light_Diffuse : integer =$FFFFFF;
light_Specular : integer =$FFFFFF; material_specular : integer = $000000; material_Shininess : single = 0.0; Visualize : boolean = false); stdcall; external DGLE_dll;
//Преобразают 3D пространство в псевдо 2D т.е. координаты варьируются от 0 до ширины/высоты экрана как в 2D, но выводятся уже 3D объекты
procedure AdductingMatrix3Dto2D; stdcall; external DGLE_dll;
//Возвращает стандартную матрицу пространства
procedure ReturnStandartMatrix3D; stdcall; external DGLE_dll;
//Эта процедура вызывается только в псевдо 2D режиме т.к. процедура Position3D; будет давать неверный результат
//Примечание: Position2D можно вызывать только до каких либо приобразований пространства, таких как RotateY например
procedure Position2D(X,Y : integer); stdcall; external DGLE_dll;

//Возвращает идентификатор 3D шрифта
function  CreateFont3D(const Fontname : string):integer; stdcall; external DGLE_dll;
//Выводит текст уже созданным 3D шрифтом, где FontIdent - его идентификатор
procedure Write3D(FontIdent: integer; Text: string); stdcall; external DGLE_dll;
//Возвращает идентификатор модели. Filename - имя файла модели
//ScaleType - способ масштабирования модели (0 - без масштабирования, 1 - масштабирование с соблюдением пропорций под размеры по осям от -1 до 1 2 - "грубое" масштабирование по всем осям, без соблюдения пропорций)
function  LoadModel(Filename : string; ScaleType : byte = 1) : integer; stdcall; external DGLE_dll;
//Очищает модель из памяти по ее идентификатору
//Примечание: После завершения работы движка очищать модели не обязательно, движок это делает автоматически
procedure FreeModel(ModelIdent : integer); stdcall; external DGLE_dll;
//Рисует модель в текущей системе координат (центр модели лежит в точке (0,0,0) текущей системы коодинат)
//ModelIdent - идентификатор модели Frame - кадр анимации модели Smooth - сглаживать полигоны или нет
procedure DrawModel(ModelIdent : integer; Frame : integer = 0; Smooth : boolean = false); stdcall; external DGLE_dll;
//Возвращает колличество кадров анимации модели
function  ModelFramesCount(Modelident : integer):Integer; stdcall; external DGLE_dll;
//Включает кубические карты текстурирования (например блики)
//Примечание: Для отобраения карт необходимо установить источник света
procedure EnableSphereMapping; stdcall; external DGLE_dll;
//Выключает кубические карты текстурирования
//Примечание: Процедура dsEndObj3D - так же их выключает
procedure DisableSphereMapping; stdcall; external DGLE_dll;
//Создаем текстуру в которую в дальнейшем можно будет записывать содержимое экрана
//Функция возвращает идентификатор на текстуру.
function  CreateTextureToRenderIn(TextureWidth,TextureHeight : integer):Cardinal; stdcall; external DGLE_dll;
//Начинаем рендеринг в текстуру, после вызова этой процедуры все что будет отрисовываться на сцене будет записываться в текстуру
//Texture - идентификатор на ранее созданную текстуру TextureWidth,TextureHeight - ее ширина и высота
procedure StartRenderToTexture(Texture : Cardinal; TextureWidth,TextureHeight : integer); stdcall; external DGLE_dll;
//Заканчиваем рендеринг в текстуру и переходим в стандартный режим
procedure EndRenderToTexture; stdcall; external DGLE_dll;
//Устанавливаем туман Color - цвет тумана  Fog_Start - с какого расстояния начинается туман Fog_End - на каком расстоянии уже ничего не видно
procedure SetFog(Color : Integer; Fog_Start, Fog_End : single); stdcall; external DGLE_dll;
//Выключает ранее включенный туман
procedure DeactiveFog; stdcall; external DGLE_dll;
//Процедура рисует плоскость с BumpMapингом
//LightX, LightY - координаты источника света относительно плоскости, влияют на направление теней на текстуре
procedure DrawBumpMappedPlane(Tex, BumpTex : Cardinal; LightX, LightY : single); stdcall; external DGLE_dll;

//Рисует оси координат текущей координатной системы
//Красная линия - X, Зеленая - Y и Синяя - Z Линии направлены в положительную сторону оси
procedure DrawAxes(Length : single = 1.0); stdcall; external DGLE_dll;
//Рисует точку
procedure DrawPoint(X,Y,Z : single); stdcall; external DGLE_dll;
//Рисует линию
procedure DrawLine(X,Y,Z,X1,Y1,Z1 : single; LineWidth : real = 1.0; Smooth : boolean = true); stdcall; external DGLE_dll;
//Рисует прямоугольник причем его центр лежит в точке (0,0,0) текущей системы координат а Width и Height - его ширина и высота
procedure DrawPoly3D(Width,Height : single); stdcall; external DGLE_dll;
//Рисует полигон по указанным координатам с отдельными текстурными координатами для каждого вертекса
//Текстурные координаты варьируются от 0.0 до 1.0
type TVertex3D = record X,Y,Z, Color, Alpha : integer; TexX, TexY : single; end;
procedure DrawPolygon3D(points : array of TVertex3D); stdcall; external DGLE_dll;
//Рисует спрайт в 3D, значения параметров те-же, что и для 2D
procedure DrawSprite3D(Width,Height : single; FrameWidth, FrameHeight,FramesXCount, FramesYCount, FrameNumber: integer);stdcall; external DGLE_dll;
//Рисует параллелепипед, так же как и предыдущая процедура его центр лежит в точке (0,0,0)
procedure DrawQube(Width,Height,Depth : single); stdcall; external DGLE_dll;
//Рисует сферу с центром в точке (0,0,0)
procedure DrawSphere(Radius : single); stdcall; external DGLE_dll;
//Рисует цилиндр
procedure DrawCylinder(Radius,Height : single); stdcall; external DGLE_dll;
//Рисует эллипс, принцип отрисовки такой же как и у всех объектов выше
procedure DrawEllipse(Width, Height, Depth : single); stdcall; external DGLE_dll;
//Рисует небо Up,Down,Left,Right,Front,Back  - текстуры куба
procedure DrawSky(Up,Down,Left,Right,Front,Back : Cardinal); stdcall;  external DGLE_dll;

{***Advanced 3D Utils****}
{Module version: 0.2}

//*Работа с видеопамятью*//
//После вызова этой процедуры, все отрисовка будет идти не на экран а в видеопамять
//Смысл использования: если есть большая карта или модель с большим кол-вом полигонов, то ее лучше сначало сразу после загрузки
//записать в видеопамять, а затем вызывать командой DrawFromVM, что значительно увеличит скорость работы.
function  StartWriteToVideoMemory : cardinal; stdcall; external DGLE_dll;
procedure EndWriteToVideoMemory; stdcall; external DGLE_dll;
procedure FreeFromVideoMemory(Ident : integer); stdcall; external DGLE_dll;
procedure DrawFromVM(Ident : integer); stdcall; external DGLE_dll;

//*Загрузка AVI файлов*//
//Функция загружает видеофайл и создает текстуру в которую будет происходить рендеринг
//Движок читает любой *.avi файл, если в Windows установлен соответствующий кодек
function  CreateAVITexture(Filename : string) : integer; stdcall; external DGLE_dll;
//Выгружает видеофайл из памяти по его индексу, который возвращает функция создания
procedure FreeAVITexture(index : integer); stdcall; external DGLE_dll;
//Устанавливает текущей текстурой текстуру текущего видеокадра
procedure SetAviTexture(index : integer); stdcall; external DGLE_dll;

{***Sound****}
{Module version: 1.0}

//Играет музыку из файла. Поддерживаются любые форматы при установленном необходимом кодеке в системе
//Looped - будет ли музыка играть зацикленно
procedure PlayMusic(Filename : string; Looped : boolean = true); stdcall; external DGLE_dll;
//Останавливает играющую музыку
procedure StopMusic; stdcall; external DGLE_dll;
//Играет ли в данный момент музыка
function  IsMusicPlaying : boolean; stdcall; external DGLE_dll;
//Возвращает уровень громкости в Windows
function  GetMasterVolume: DWord; stdcall; external DGLE_dll;
//Устанавливает уровень громкости Windows
procedure SetMasterVolume(Volume : WORD); stdcall; external DGLE_dll;

//Инициализирует DirectSound Внимание! Вызывать только после создания движка!
procedure DirectSoundInit; stdcall;external DGLE_dll;
//Загружает сэмпл из файла(только wav) и возвращает его индекс
//FromPackage - грузим ли файл из пака, если да, то Name - имя записи в паке, а Filename - имя файла пака
function  LoadSample(Filename : string; FromPackage : boolean = false; Name : string = ''):integer; stdcall; external DGLE_dll;
//Удаляет выборочно сэмпл из памяти по его индексу
//Примечание: При завершении работы движок очищает все загруженные сэмплы автоматически
procedure FreeSample(Index : integer); stdcall;external DGLE_dll;
//Проиграть сэмпл с указанным индексом
procedure PlaySample(Index : integer); stdcall; external DGLE_dll;
//Устанавливает уровень громкости семпла Index - индекс семпла Volume - уровень громкости от 100(максимум) до 0
procedure SetSampleVolume(Index : integer; Volume : byte); stdcall; external DGLE_dll;
//Устанавливает координаты источника звука в пространстве, для сэмпла с определенным индексом
//(0,0,0) - центр экрана(слушатель) Значения координат примерно варьируются от -50 до +50
procedure SetSample3DPosition(Index : integer; X,Y,Z : real); stdcall; external DGLE_dll;
//Записывает в переменные X,Y,Z текущее положения в пространстве источника звука, для конкретного сэмпла
procedure GetSample3DPosition(Index : integer; var X,Y,Z : single); stdcall; external DGLE_dll;

{***Network***}
{Module version: Beta 2}
//Только для тестовых целей

//Инициализирует сеть, вызывается 1 раз в начале
procedure NET_Init;stdcall; external DGLE_dll;
//Закрывает сеть и очищает ресурсы
procedure NET_Free;stdcall; external DGLE_dll;
//Создает UDP сокет и присваивает ему IP адрес и порт
procedure CreateSocket(ip:PChar;port:Word);stdcall; external DGLE_dll;
//Возвращает внешний IP компьютера, обычно совпадает с внктренним, если компьютер находится только в одной сети
function  GetExternalIP:string; stdcall; external DGLE_dll;
//Возвращает локальный IP компьютера
function  GetLocalIP: string; stdcall; external DGLE_dll;
//Посылает даные на указанный IP
//IP: IP адрес компьютера в сети
//port: порт на котором работает сокет на удаленном компьютере
//Buffer: текстовая строка
//Примечание: Для передачи данных я решил использовать строки т.к. это сильно экономит трафик и значительно
//быстрее чем передавать real или integer, к тому же строки позвалают передавать практически любые типы данных
procedure NET_Send(IP: PChar; port: integer;Buffer:shortstring);stdcall; external DGLE_dll;
//Посылает пакет всем компьютерам локальной сети, у которых в данный момент открыт указанный порт
procedure NET_SendBroadcast(port: integer;Buffer:shortstring);stdcall; external DGLE_dll;
//Отсылает пакет на компьютер с которого был получен последний пакет
procedure NET_AnswerLast(Buffer:shortstring);stdcall; external DGLE_dll;
//Получает пакет, адресованный для этого компьютера
procedure NET_Resive(var Buffer : shortstring);stdcall; external DGLE_dll;

{***Input***}
{Module version: 1.0}

//Нажата ли клавиша
//key - код клавишы (список кодов смотри ниже)
function IsKeyPressed(Key : integer) : boolean; stdcall; external DGLE_dll;
//Нажата ли кнопка мыши
//1 - левая 2 - правая 3 - средняя
function GetMouseButtonPressed : byte; stdcall; external DGLE_dll;
//Независимые процедуры отдельно для левой и правой кнопки мыши
function IsLeftMouseButtonPressed : boolean; stdcall; external DGLE_dll;
function IsRightMouseButtonPressed : boolean; stdcall; external DGLE_dll;
//координаты курсора
function GetMousePos : Tpoint; stdcall; external DGLE_dll;
//двигается ли мышка
function IsMouseMoveing : boolean; stdcall; external DGLE_dll;
//Включает/выключает "забор" набираемого текста (нельзя вызывать циклически)
procedure StartKeyboardTextInput; stdcall; external DGLE_dll;
procedure EndKeyboardTextInput; stdcall; external DGLE_dll;
//Возвращает весь введенный текст после начала "забора"
function GetKeyboardText : string; stdcall; external DGLE_dll;
//Возвращает, зажата ли кнопка джойстика(геймпада)
//JoyNum - индекс джойстика в системе, как правило - 0 (первичный)
//Button - индекс кнопки от 1
function  Input_JoyDown(JoyNum, Button: Byte): boolean; stdcall; external DGLE_dll;
//Возвращает направление на джойстике
//Direction: 1 - влево, 2 - вправо, 3 - вверх, 4 - вниз
function  Input_JoyDirections(JoyNum, Direction: Byte): boolean; stdcall; external DGLE_dll;

//Коды некоторых клавиш для функции IsKeyPressed(Key : integer)
const
    Key_Escape = 27;
    Key_Tab = 9;
    Key_Backspace = 8;
    Key_Space = 32;
    Key_Enter = 13;
    Key_Shift = 16;
    Key_Control = 17;
    Key_Alt = 18;
    Key_F1 =  112;
    Key_F2 =  113;
    Key_F3 =  114;
    Key_F4 =  115;
    Key_F5 =  116;
    Key_F6 =  117;
    Key_F7 =  118;
    Key_F8 =  119;
    Key_F9 =  120;
    Key_F10 = 121;
    Key_F11 = 122;
    Key_F12 = 123;
    Key_Left = 37;
    Key_Up = 38;
    Key_Right = 39;
    Key_Down = 40;
    Key_0 = 48;
    Key_1 = 49;
    Key_2 = 50;
    Key_3 = 51;
    Key_4 = 52;
    Key_5 = 53;
    Key_6 = 54;
    Key_7 = 55;
    Key_8 = 56;
    Key_9 = 57;
    Key_A = 65;
    Key_B = 66;
    Key_C = 67;
    Key_D = 68;
    Key_E = 69;
    Key_F = 70;
    Key_G = 71;
    Key_H = 72;
    Key_I = 73;
    Key_J = 74;
    Key_K = 75;
    Key_L = 76;
    Key_M = 77;
    Key_N = 78;
    Key_O = 79;
    Key_P = 80;
    Key_Q = 81;
    Key_R = 82;
    Key_S = 83;
    Key_T = 84;
    Key_U = 85;
    Key_V = 86;
    Key_W = 87;
    Key_X = 88;
    Key_Y = 89;
    Key_Z = 90;

implementation
end.

