Cheb's Game Engine

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: Cheb's Game Engine

Сообщение Cheb » 03.01.2016 13:20:32

своего франкенштейна команде FPC в виде патчей?

Увы, мои монстры - специализированные. Например, chelinfo не поддерживает 64-битные екзешники, хотя в оригинале такая поддержка была. Я просто отрезал ненужное мне (на момент создания не было машины с 64-битным процессором, было в принципе не на чем тестировать).
То есть, патч вышел бы слишком однобоким. Увы. :(

Добавлено спустя 2 часа 3 минуты 47 секунд:
P.S. Паскаль в целом, как я успел заметить, очень не любит когда большой модуль собран из дохрена инклюдов. Крахи третьего - в основном из-за этого (когда я прогоняю Чеперси через утилиту, которая вштыривает все инклюды в основной файл, он перестаёт падать на ней).
А ведь я просто собезъянничал то, как RTL устроена.

Генератор dwarf информации 2.6.4, в частности, начинает колбасить и сосисить если в теле самого unit'а нет ни грамма исполняемого кода, всё в инклюдах. Для Чеперси он: а) составил список 33 имён, хотя файлов там всего 17, многие повторяются и б) перепутал-таки некоторые, и хаками это уже не лечится. То есть строку оно докладывает верно, лезу в исходник - опа, этот инклюд вдвое короче. Имена некоторых инклюдов спутаны.

Проект сейчас:
- 55 .pp / .pas / .lpr файлов
- 42 .h файла
- 104 .inc файла
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 11.01.2016 05:38:04

Совершил большой экскурс в сторону:
1. Двинул своё литературное творчество вперёд ( читатели очень рады, что я , тормоз такой, наконец стронулся с мёртвой точки )
2. Взял ещё одного котёнка. В ветеринарке сказали: какая доходяга, и вштырили ей капельницу на 50 кубиков. Не знаю, по мне, так вполне бодрая: когда две имеющиеся кошки пытаются познакомиться - эта мелочь храбро рычит, показывая, какие у неё большие зубы.

Разгрёб многия говнокоды в Чеперси, в результате чего она работает, но обратная совместимость накрылась.
Но не было сил уже терпеть эзотерический байт-код сценариев сериализации, его генератор и интерпретатор. Переделал всё на нормальные массивы вариантных записей, убрал все тайпкасты целого к процедурной переменной. Будет легче портировать на 64 бита.
Добавил механизм свойств полей, в основном задающие поведение механизма клонирования. Но и опускаемость полей туда же запихал: нехрен разводить longbool на каждый флажок, когда можно их напихать в одно множество, имеющее размер dword.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 13.01.2016 02:31:40

Обновил на своём свой веб-сайте страницу описания проекта и таблицу поддерживаемых платформ, и добавил страницу текущих задач.

З.Ы. В моего нового котёнка за последние дни влили уже стакан физраствора с глюкозой, без преувеличений. А поскольку игла тоненькая, процесс длится часами. Технология отработанная: сначала лежит пластом, потом оживает и начинается ЖОР, потом ей надоедает лежать под капельницей... :| Но не взять я не мог: оно было такое несчастное... Хорошо, что на работу только 18-го.
Последний раз редактировалось Cheb 21.08.2019 09:36:48, всего редактировалось 1 раз.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 15.01.2016 06:05:44

Немного попинал линуксовую версию. До компилируемости ещё семь вёрст лесом.

Из расковырянного потянуло свежачком-с: долго как баран на новые ворота пялился на не найденную функцию X11ConvertKeySymToUnicode . Попытался искать в инете (с винды). Получил ноль ссылок. Хотел уже убиться апстену когда поискал в инете из самой виртуалки дебиан. На этот раз поиск дал три ссылки, одна из которых мой же пост 2009 года: http://www.gamedev.ru/code/forum/?id=90549&page=2#m21
Нашёл в посте ключевое слово "выдрана", хлопнул себя по лбу - и точно, я из-за перелопачивания инклюд с этой какой забыл подцепить. Прямо в папке исходников движка лежала:
Код: Выделить всё
Function X11ConvertKeySymToUnicode(sym : TKeySym) : Integer;
Begin
  If (sym >= $20) And (sym <= $7E) Then
    Exit(sym);
  Case sym Of
    XKc_Cyrillic_GHE_bar           : Exit($492);
    XK_Cyrillic_ghe_bar            : Exit($493);
    XKc_Cyrillic_ZHE_descender     : Exit($496);
    XK_Cyrillic_zhe_descender      : Exit($497);
    XKc_Cyrillic_KA_descender      : Exit($49A);
    XK_Cyrillic_ka_descender       : Exit($49B);
    XKc_Cyrillic_KA_vertstroke     : Exit($49C);
    XK_Cyrillic_ka_vertstroke      : Exit($49D);
   [...]

Какая прелесть Изображение
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 17.01.2016 22:34:16

Установил fpc 2.6.4 на древнеубунту 11.10, где родной - 2.4.4, а репозитории уж три года, как сдохли.
Просто скачал архив и скопировал.

Работает. :)

Добавлено спустя 22 часа 50 минут 42 секунды:
Обнаружил недочёт: если в фоне запустить Intel Burn Test, то логический поток начинает недетски тормозить, в то время, как рендера в основном потоке лишь просаживается FPS. Буду поднимать логическому потоку приоритет.

Муза забастовала, каменный цветок - т.е. основы мира/физики не выписываются, взялся пока за тупую работу. Перелопатил работу с окном/вводом, организовал классы фреймворка, воскресил дурнопахнущий труп фреймворка X11. Сюрприз: со времён fpc 2.2 вызовы многих функций изменились. Заткнул наугад, теперь X сервер ругается, отказываясь создавать окно. Потихоньку поискиваю ископаемые туториалы как подружить Xlib с OpenGL.

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

Надо переделывать работу с текстом, которой сейчас занимается модуль-матка. Заведу отдельную сущность "3d модель, сгенерированная на CPU" и буду обновлять только при изменениях текста.

Завёл поле Mother^.GL.Mode, по умолчанию glm_Deprecated. Постепенно заверну все сопли на glBegin..glEnd в case Mother^.GL.Mode of glm_Deprecated и начну потихоньку выпалывать. Переключение между GL и GL ES будет теми же case'ами.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 11.03.2016 12:02:55

Времени на проект выпадает немного.
Пока ещё обдумываю структуру физики. Очень хотелось бы припахать остальные 2 ядра среднестатистической 4-ядерной машины. Возможно, какой-нить хитрый трюк позволит это сделать, хакнув вокруг однопоточной архитектуры чеперси?

Пока суд да дело, начал портирование на OpenGL ES 2 (виндовую dll-ку отковырял от стима, работает как враппер для DirectX 11). Придётся всё учиться делать самому, что давно планировал, но руки не доходили. Нет никаких GL_ALPHA_TEST, glLoadIdentity() - да вообще ничего нет. Всё надо учиться делать ручками.
Just as planned.
Код: Выделить всё
OpenGL: vOpenGL ES 2.0 (ANGLE 2.1.0.)
  устройство ANGLE (Intel(R) HD Graphics 3000 Direct3D11 vs_4_1 ps_4_1)
  производитель Google Inc.
Экранный буфер: 771x715,  красный ?, зелёный ?, синий ?,
  альфа ?,  глубина ?, трафарет ?.


Порт на Raspberry Pi 2 Model B наконец дошёл до стадии компилируемости. Программа уже умеет падать при запуске.
Код: Выделить всё
Чентра версии 0.19.2195 для Linux-arm,
  откомпилировано 2016/02/27, в 21:14:36, на Free Pascal 2.6.4.
  (режим разработчика)
Операционная система: Raspbian GNU/Linux 8.0 (jessie)
Пользователь: pi
ЦП ARMv7 rev 5 (v7l)
  x4 логических ядра
  кэш второго уровня: размер неизвестен, линейка неизвестно
ОЗУ: 925 Мб
Графический планшет: не найден (ни одно из 3 расширенных устройств ввода не распознано как планшет)
X сервер предупредил о фатальной ошибке
  (BadValue (integer parameter out of range for operation))
  Инициировано аварийное закрытие программы...
Инициировано закрытие программы:
  X сервер неожиданно убил это приложение.
.....................Конец журнала Чентра



Попутно выяснилось, что дефайн cpu386 - реликт для совместимости, и на ARM'е вполне себе установлен. Чтобы действительно определить 32-битный интел - юзайте cpui386

З.Ы. Узнал, что Raspberry Pi 3 Model B - 64-битная, в полтора раза шустрее второй. Когда-нибудь и у нас в продаже появится. От поддержки 64-битных платформ уже никуда не отвертеться - НО! если окажется, что вторая таки хиловата для задуманного громадья - сделаю морду кирпичом и портирую движок на третью.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 13.03.2016 21:04:53

Вам знакомо это состояние, когда во время ремонта из под содранных обоев показывается такое, что сразу ясно: всё, песец, вляпались, всю стенку перелопачивать надо, и три мешка цемента в нагрузку?

Вот у меня такая же *** произошла когда порасковыривал рассадники glBegin/glEnd.
Всё, песец, всю подсистему отображения текста перелопачивать надо. :cry:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Mirage » 13.03.2016 22:57:12

Cheb писал(а):Всё, песец, всю подсистему отображения текста перелопачивать надо.


Она ушла дальше рендера букв с битмапа?
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Cheb's Game Engine

Сообщение Cheb » 14.03.2016 10:04:10

К счастью, недалеко.
Там была заложена возможность поддержки множества битмапных шрифтов с наборами по размеру и внутренним механизмом вычисления кернинга (было когда-то давно, но вырезал). Идея была, что можно матке вставить новый шрифт, и все модули его подхватят. Но это породило такие турусы на колёсах... :(

Механизм по прежнему останется "вот тебе прямоугольник, вот тебе текст, делай что хочешь, но чтоб влезло". Но у модуля и матки теперь будут независимые копии этого кода, и добавится ещё один слой: при каждом изменении будет генерироваться стандартный меш, который можно рендерить стандартными средствами.

Урезание межмодульного API: (см. закоментированные строки)
Код: Выделить всё
  PMotherBuiltinFont = ^TMotherBuiltinFont;
  TMotherBuiltinFont = packed record
    Texture: GLuint;
    MaxChars: integer;
    TexCoords: PVector2f;
    CharMap: PInteger; //65536 elements, addressed by Ord(UnicodeChar)
    Monospace: boolean;
    KerningDelta: PShortInt; //MaxChars * MaxChars matrix. Always null for monospace fonts.
    ReservedStub: array[0..3] of ptruint;
  end;

  {March 2016, paradigm shift: now Mother only supplies modules with textures
    and basic data about glyph placement. The relevant routines are repeated
    in universal includes, less headache with Mother API and more flexibility
    this way. }
  TMotherText = packed record
    NumBuiltinFonts: integer;
    BuiltinFont: PMotherBuiltInFont; { нагло пользуюсь тем,
      что к указателям можно адресоваться как к массивам, C-style }

    FixedFontQuality: integer; //read-only, autoregulated! 0 = hq font, 1 = built-in lq font
    FixedFontEmergencyDownsample: boolean;

//    StringHeightToFontFace: procedure (size: integer; face: Pinteger; zoom: PGLfloat); cdecl;
//    FitStringIntoRectangle: procedure (Size, numChars, numLines, Width, Height: integer; fit: PStringFitRec);  cdecl;
//    GetStringWidth: function (Size, numChars: integer): GLfloat; cdecl;
//    GetStringHeight: function (Size, numLines: integer): GLfloat; cdecl;

    //the caller is responsible for switching to FFP and setting the ortho projection!
//    SetRenderState: procedure (noshadow: boolean); cdecl;
//    RenderString: procedure (fit: PStringFitRec; Left, Top: glFloat; w: PUnicodeChar); cdecl;
    ReservedStub: array[0..15] of ptruint;
  end;
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 14.03.2016 10:19:01

Последний пост не читал, рекомендую FreeType. Там тебе и векторные шрифты, и битмапные, и кернинг, и что ты там ещё понагородил.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 14.03.2016 11:55:29

И она кроссплатформенно цепляется подключением одого модуля?
Если нет - я пока посижу на своём велосипеде с одним моноширинным битматным шрифтом, по крайне мере до выхода беты готовой игры.

Шрифты сейчас - не главное. Именно поэтому бесит необходимость с этим ковыряться и терять время.

Добавлено спустя 3 часа 50 минут 1 секунду:
З.Ы. Насколько я о ней изучил, мне нравится FreeType. Проблема в том, что нельзя до бесконечности полировать какашку. А мой движок, пока на нём не слабана хотя бы техдемка тетриса - был и есть и остаётся какашкой. Вешью в себе.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 16.05.2016 14:52:23

Идёт *очень* медленный процесс перелопачивания на новую парадигму. Займёт полгода, по оптимистичным оценкам.

Весь код, рассчитанный на менеджед объекты со сборщиком мусора, надо переделать на объекты со счётчиком ссылок: вместо TManagedObject теперь TChepersyObject = class(TObject, Iunknown).
Все случаи применения метода Scrape надо переделать на присваивание nil и проследить чтобы не поломались всякие хаки.
Всё это включает, вт.ч., крайне хитровывернутые системы управления ресурсами (TGenericAsset и иже с ним).

Как побочный эффект, Чеперси *опять* теряет обратную совместимость.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение hinst » 22.05.2016 13:53:32

1. Где игра?
2.
Cheb писал(а):Весь код, рассчитанный на менеджед объекты со сборщиком мусора, надо переделать на объекты со счётчиком ссылок: вместо TManagedObject теперь TChepersyObject = class(TObject, Iunknown).


То есть код был рассчитан на сборщик мусора.... которого нет?
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Cheb's Game Engine

Сообщение Cheb » 26.05.2016 04:32:08

Где игра?

Изображение

был рассчитан на сборщик мусора.... которого нет?

Так скажем, сборка была сделана через... не будем о грустном, и в штатном режиме объекты накакивались, никогда не освобождая память. Также применялся волшебный хак "стереть всё кладбище нахрен не разбираясь".

Оглянувшись назад, понял, что менеджед со сборкой мусора мне как рыбе зонтик был, нужен был именно счётчик ссылок.

Дорога впереди длинная. Изображение
Последний раз редактировалось Cheb 31.07.2018 22:55:44, всего редактировалось 1 раз.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 28.05.2016 14:29:56

Улита едет - когда-то будет:
Код: Выделить всё
  procedure TBasicFramework._DrawGLcursor;
  var
    x, y: integer;
    Mesh: TBasicMesh;
  begin
   if f_PointerVisible and not Mother^.Display.MouseIsBeyondOurWindow
   then begin
     case  Mother^.GAPI.Mode of
       gapi_DeprecatedImmediateGL: begin
         glEnable(GL_TEXTURE_2D);
         glEnable(GL_ALPHA_TEST);
         glEnable(GL_BLEND);
         glAlphaFunc(GL_GREATER, 0);
         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
         glDisable(GL_CULL_FACE);
         glDisable(GL_DEPTH_TEST);
         glViewport(0, 0, Mother^.Display.WindowClientRect.Width, Mother^.Display.WindowClientRect.Height);
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         glMatrixMode(GL_MODELVIEW);
         glLoadIdentity();
         glOrtho(0, Mother^.Display.WindowClientRect.Width, Mother^.Display.WindowClientRect.Height, 0, 0 ,1);
         glBindTexture(GL_TEXTURE_2D, f_cursortexture);
         x:= round(MouseX - PointerXHotSpot);
         y:= round(MouseY - PointerYHotSpot);
{         glColor4f(1, 1, 1, Mother^.Display.FadeIn);
         glBegin(GL_QUADS);
           glTexCoord2f(0, 1);
           glVertex2f(x, y + 32); //bottom left corner
           glTexCoord2f(0, 0);
           glVertex2f(x, y);
           glTexCoord2f(1, 0);
           glVertex2f(x + 32, y);
           glTexCoord2f(1, 1);
           glVertex2f(x + 32, y + 32);
         glEnd;
}
      end;
    else
      DieUnsupportedGLMode;
    end;
     Mesh:= TBasicMesh.Create;
     Mesh.AddQuad2d(
       1, 1, 1, Mother^.Display.FadeIn,
       x, y, x+32, y+32,
       0, 0, 1, 1);
     Mesh.Render;
     Mesh.Free;
   end;
  end;
 
  //, где
 
  type

  TBasicMesh = class
  public
    colors: array of TVector4f;
    normals, texcoords: array of TVector3f;
    vertices: array of TVector4f;
    indices: array of GLint;
    matrix: TMatrix4f;
    //assumes origin in *upper* left corner (y axis downwards, z axis towards the viewer)
    procedure AddQuad2d(r, g, b, a, left, top, right, bottom, txleft, txtop, txright, txbottom: GLfloat);
    //substitute for glOrtho unavalilable in GL ES
    procedure Ortho(left, right, bottom, top,  nearVal, farVal: GLfloat);
    procedure SetGLStatesForGUI;
    procedure OrthoApplicationWindow;
    procedure Render; virtual;
  protected

  end;
 
  //...
 
procedure TBasicMesh.Render;
var i: integer;
begin
  if Length(indices) <= 0 then Exit;

  case  Mother^.GAPI.Mode of
   {$ifndef glesonly}
    gapi_DeprecatedImmediateGL: begin
      glBegin(GL_TRIANGLES);
      for i:=0 to High(indices) do begin
        glColor4fv(@colors[indices[i]]);
        glNormal3fv(@normals[indices[i]]);
        glTexCoord3fv(@texcoords[indices[i]]);
        glVertex3fv(@vertices[indices[i]]);
      end;
      glEnd;
    end;
    gapi_GL21:begin
Die('***NotImplementedYet');
    end;
   {$endif glesonly}
    gapi_GLES2: begin
Die('***NotImplementedYet');
    end;
  else
    DieUnsupportedGLMode;
  end;
end;
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31

Рейтинг@Mail.ru