Ычан: [d | b / bro / hr / l / m / mu / o / s / tran / tu / tv / vg / x | a / aa / c / fi / jp / rm / tan / to / vn]
[Назад] [Вся нить] [Первые 100 сообщений] [Последние 50 сообщений]
Ответ в нить [Первые 100 сообщений]
Имя
Animapcha image [@] [?]
Тема   ( ответ в 9999)
Сообщение flower
Файл 
Пароль  (для удаления файлов и сообщений)
Параметры   
  • Прежде чем постить, ознакомьтесь с правилами.
  • Поддерживаются файлы типов 7Z, BZ, BZ2, GIF, GZ, JPG, MO, MP3, MP4, OGG, OGV, PDF, PNG, PSD, RAR, SVG, SWF, TXT, WEBM, WEBP, XCF, ZIP размером до 5120 кБ.
  • Ныне 3656 unique user posts. Посмотреть каталог
  • Предельное количество бампов нити: 500
No. 9999  
http://sourceforge.net/projects/rr-rr/
Предыдущий тред: >>4274
No. 10000  
ЗАПИЛИЛ
    СЕРИАЛИЗАЦИЮ
             СКРИПТА
                  ^_____^

Жмём F2/F3 (с эстетичностью не заморачивался, сам принцип), внимание на консоль и test/campfire.sav (в режиме отладки кое-где вставляется текст — можно представить, что вообще происходит и кто сколько занимает... ~some~ — луашные объекты, <<some>> — нативные). Конкретно в кострах скрипт отвечает за генерацию частиц (в общем случае сохраняются непосредственно частицы, но локальным системам достаточно функции-генератора, не ради профита — он призрачен ввиду внушительного размера дампов Lua-функций, а just cause I can) и мерцание света.

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

Фичи:

— скриптовые объекты хранятся по значению или по ссылке на выбор (например, короткие строки — по значению, длинные — по ссылке);

— дампы одинаковых Луа-функций, но с разными замыканиями, записываются лишь однажды (я не нашёл штатного средства установить их идентичность);

— окружения модулей задаются не содержимым таблицы, а именем файла. Это допустимо, т. к. в моей архитектуре их семантика не допускает изменения ни извне, ни изнутри, кроме как во время загрузки. И если внешний скрипт был изменён в оффлайне, а какая-нибудь сериализованная функция не догадалась замкнуться на отдельную функцию из него вместо всего окружения, она увидит эти изменения.

Фундаментальные недостатки всей системы:

— крайне хрупкая совместимость между версиями (вообще забил на неё, ага);

— от Lua унаследовалась несовместимость дампов Lua-функций, а значит, и сейвов, между платформами, например, разной разрядности. Это решаемо (в конце концов, у Lua очень простой байткод), но я бы тогда уже вообще отказался от хранения функций в виде дампов — к сожалению, альтернативы в голову не приходит, т. к. функции могут быть на месте любых значений и отказываться от такой вкусняшки я не хочу.

Т. о. save/load готов процентов на 50, на что я неделю назад и не надеялся. ^_^
To-do: сериализация всего остального (куклы, вейпоинты, сцена, GUI), ну и меню.
No. 10030  
26_06_2013 22:52:52_145.png - (684.76KB, 1153×626)
10030
Запили~л сериализацию вейпоинтов короч. Не обычных, списком точек и рёбер — она-то давно была, а рантаймовых, тех, что получаются склеиванием фрагментов (в свою очередь вейпоинтов, но их уже по-другому и не сохранишь). В том же формате, что и фрагменты, это детище Франкенштейна занимало 150 Кб — может быть, и допустимо, но однозначно не круто.

Идея очевидная: для вейпоинтов, хоть раз приклеивших фрагмент из внешнего файла, вести вместе и сериализовывать вместо них РЕПЛИКУ (пожертвовал точностью мысли ради такого-то красивого слова :3) — действия, которые привели к текущей конфигурации. Получились 11 Кб (>100 фрагментов 12 разновидностей), из которых 10 приходятся на соединительные рёбра — для сравнения, файлы самих фрагментов в сумме дают 60. Такое уже и в сейв положить не зазорно.

На скрине вейпоинты, загруженные из явно другой сцены.
No. 10043  
ОП ты молодец, скажи может тебе нужна какая то помощь. У меня есть опыт работы на паскале, хотя в последние годы использовал PHP.
No. 10046  
1363599946554.gif - (1.65MB, 200×150)
10046
>>10043
>какая то помощь.
>использовал PHP.
No. 10050  
23576682.jpg - (640.22KB, 850×850)
10050
>>10043
Помощь по коду не нужна. Вот порисовать можешь.
No. 10054  
>>10050

Подскажи как и из какого пакета 3D моделирования можно с наименьшими затратами импортировать 3D модели в FPC, какие библиотеки нужны и из какого формата? Blender подойдёт?
No. 10060  
>>10054
Я использую OpenCOLLADA. Но фактически можешь экспортировать в любой формат, который прочитается максом.
No. 10067  
>>10060

1.Расскажи что из SDL, GLUT, GLScene актуально и годно для 3D программирования в Delphi/FPC сейчас? Ты пробовал прикрутить к FPC SDL?
2.Говорят GLUT не торт, что ты об этом думаешь?
No. 10086  
27631678.jpg - (256.59KB, 641×800)
10086
>>10067
Из всего, что ты назвал, графическим движком является только GLScene. Особо не ковырял его (несовместимость с религией), но вроде прикольный, много чего реализовано.

>Ты пробовал прикрутить к FPC SDL?
Когда-то прикручивал, потом открутил (хм, всего полгода назад — http://410chan.org/dev/res/4274.html#8358 — а будто вечность прошла... странно): для меня ни разу не проще работы с API системы, зато некоторых фич нет/не было в 1.2 (а реализации SDL_WM_ToggleFullScreen подвендой, по-видимому, не будет никогда).

>Говорят GLUT не торт
Он умер в прошлом веке, freeglut просто не развивается.
No. 10105  
Untitled-2.png - (56.44KB, 835×1650)
10105
Ф-фух. Процентов 80.
Это начинает надоедать.
No. 10148  
05_07_2013 17:07:32_464.png - (2.20MB, 1153×2504)
10148
Переделал прежнюю систему "действий" узлов сцены под анимацию чего угодно (как-нибудь прикручу и GL-параметры) сферическими многомерными сплайнами в вакууме. Как следствие, двери могут открываться менее красиво: движение по схеме "равноускоренно за t1 + равномерно за tU + равноускоренно за t2, да так, чтобы пройти за T = t1 + tU + t2 путь S, а начальная и конечная скорости равнялись v1 и v2" теперь лишь эмулируется. Но это скромная плата за такую-то вкусняшку.

И я всё ещё пилю сериализацию. Собственно, ради неё и переделывал.
No. 10191  
1373381927336.png - (20.39KB, 611×355)
10191
Жирная!!
На самом деле она потянула за собой весь стейт, неожиданно для меня не ругнувшись за весь обход на неизвестный тип. Видимо, таки допилил. :3 Завтра попробую загрузить.
No. 10194  
SaLo.png - (2.54MB, 1161×1959)
10194
Ну вы поняли.

Релиз без меню с ЭФФЕКТАМИ ни за что не выложу. Неверующие — можете пожмякать F5/F6 в версии с SVN, но о багах докладывать пока не нужно, они и так видны невооружённым взглядом: вам сильно повезёт, если на выходе или после нескольких итераций сохранения/загрузки не словите AV, удвоение (но не более и обычной утечки нет; по-видимому, утечка в терминах управляемых языков) памяти, занятой Lua — и вовсе норма, я пожадничал с 3 байтами на кватернион, ну и так далее.

НО ОНО ВООБЩЕ РАБОТАЕТ!!! ヽ(゚∀゚)ノ

Ну что, долавливаю баги и рисую меню. Или ты нарисуешь, Стив? ^_^
No. 10208  
>>10191
А зачем ты сериализуешь все? Сериализуй только изменения.
No. 10222  
>>10208
Не с чем сравнивать, все объекты создаются в рантайме. А если бы и было с чем, я бы забил. А если бы и не забил, 3/4 занимает стейт Lua — опять же, рантайм.

Ну то есть как забил... Почти любой объект и так предваряет битовая маска про включённые поля, но это немного не то, слишком низкий уровень. Отслеживание изменений возможно только на уровне объекта (не топологии) и при условии, что на его составные части не может быть ссылок извне — собственно, с вейпоинтами и сделал нечто похожее.

>долавливаю баги
done
No. 10260  
А сколько тебе лет и когда примерно заинтересовался разработкой игор?
No. 10278  
>>10260
<20, когда увидел Morrowind (~2003).

Запилил >>10148 для GL-параметров. Просто сравните реализацию смерти:

this:AddTimer
{
   single = true, period = 1.5,
   onTimer = function()
      (...)
      local burn = 0

      this.onUpdate.burn = function(_, dt)
         burn = burn + 0.1*dt
         ro:GL{ burnOverK = burn }
         if (burn >= 1) and (this.mp.value == 0) then this:Detach() end
      end
   end
}


-и-

(...)
ro:SlideGL
{
   what = 'burnOverK',
   path = { [0.0] = 0, [1.5] = 0, [11.5] = 1 },

   onDone = function()
      this.onUpdate.post_mortem = function()
         if this.mp.value == 0 then this:Detach() end
      end
   end
}


До эффектов GUI, для которых это и задумывалось, у меня руки до сих пор не дошли, и вообще последние пару недель я не притрагивался к коду, извините уж. ^^"

Ещё одна безумная идея насчёт сериализации состояния Lua. В таблицах, выполняющих роль структур или классов в статических языках — а таких большинство, если не почти все — повторяется набор ключей. Его можно описать однажды и ссылаться индексом. Всё равно больше всего занимают дампы функций, ну его.
No. 10336  
>>10278
Я после Морровинда заинтересовался только тем, как не играть в него.
No. 10368  
>>9999
>9999
ахуеть гет же
Анон как сделать в твоей параше больше двух сырн?
No. 10438  
youmad.jpg - (14.53KB, 319×243)
10438
>Pascal
No. 10448  
bg1.png - (1.01MB, 1600×1000)
10448
Long time no see, Steve!

>>10368
У меня довольно дорогие источники света, поэтому больше двух не делал. Я прикручу оптимизацию, когда реальные источники, находящиеся достаточно близко, "склеиваются", но позже.

↑ У меня есть шансы? ;_;
Завтра меню сделаю.
No. 10455  
Оп, какие у тебя планы на игру?
No. 10465  
>>10448
>У меня есть шансы?
Разумеется нету
> дорогие источники света
убери эту ебаную графику с крузиса и поставь графон уровня моровинда и норма будет
No. 10471  
12829789.png - (380.84KB, 800×800)
10471
ПРИКРУТИЛ МЕНЮ!!! ^_^

Чуть было не застрял навечно. Либо стоило сначала посмотреть, как в других движках делают (хотя не уверен, что будет иначе), либо я растерял всю квалификацию за лето, либо анимированный GUI — это ад, либо всё сразу. Эффекты достались мне дорогой ценой: все эти цепочки AddAction(..., onDone = AddAction(..., onDone = AddAction(..., drink_poison() )...) так и норовят рассыпаться. Есть другие варианты? Пилите багрепорты.

To-do: превьюшки сейвов, Binary Shaders и, наверное, оптимизация из >>10448.

>>10455
Нинаю
>>10465
Ну ты и сам должен понимать: графон определяется скорее качеством контента, нежели технологиями, так что--
No. 10472  
ACK.rar - (4.36KB)
10472
>>10471
Что же мне делать?
Дрова новее не поставить: все установщики говорят, что "у вас самые новые дрова".
No. 10473  
21329070.jpg - (352.27KB, 830×600)
10473
>>10472
Спасибо, не подумал сразу, теперь буду выжимать информацию об ускорителе и т. п. даже их полудохлого OpenGL'я. Но пока я вынужден, даже располагая логом, задать этот вопрос: какая у тебя вообще видеокарта? Если интел — ну, интел так интел, если нет — установщики врут, попробуй удалить старый драйвер.
No. 10475  
>>10471
>Binary Shaders
done

Рванулся было заюзать SQLite, но здесь и сама файловая система отлично подходит.
Я должен зачем-нибудь воткнуть SQLite!!! Она классная.
У меня загрузка бинарника быстрее одной лишь линковки раз в 5, и это без учёта загрузки и компиляции самих шейдеров.
No. 10478  
20_09_2013 13:01:11_636.png - (516.54KB, 1153×626)
10478
Превьюшкииииииииии :3
Внезапный to-do: TrueType-шрифты.
No. 10480  
>>10473
Карточка - ATI Radeon HD 4600.
Дрова стандарто-незаменяемые WDDM v1.1
Я имею в виду, что совсем заменяться не хотят.
ATI Vision процессор видит, но на карточку ругается. Говорит, что дрова свои у него не активны. И активировать их тоже не может.
No. 10481  
>>10480
Последняя версия говорит
"EAssertionFailed" raised: "Assertion failed (DLLoader.pas, line 200)"
No. 10485  
atlas.png - (846.58KB, 1034×768)
10485
http://clb.demon.fi/files/RectangleBinPack.pdf
Научился паковать атласы. Завтра встрою их в движок по-нормальному и посмотрю libfreetype.
No. 10489  
6843796.jpg - (343.10KB, 750×795)
10489
Прикрутил шрифты за 2300.

Перестройка атласа может быть медленной и это исключительно моя вина, послезавтра оптимизирую всякие там блиты изображений, [исразуденормализация]SetPixel(Combine([нормализация]GetPixel())) — это несерьёзно.
No. 10492  
11109925.jpg - (589.49KB, 700×839)
10492
>>10489
>оптимизирую всякие там блиты изображений
done
также добавил поддержку кернинговых пар, теперь и придраться-то не к чему.

Алсо.
(Сейчас покажусь наивным...)
Еду сегодня в метро. Рядом сидит дедок и что-то читает.
Наклоняюсь ближе и вижу, что читает он ВНЕЗАПНО пейпер по CUDA, на английском, конечно.
Это разрушило все мои стереотипы о дедках.

Но вот незадача — следующая станция была его, а я выйти за ним взять контакты не сообразил, хотя не так уж торопился. Успел только перекинуться парой слов — "кудой занимаетесь? — крууть, я тоже GPU мучаю, но до куды не дошёл ещё". Ищи теперь ветра в поле.

Дедок, если читаешь это (ну вдруг)назови свою станцию и отпишись, есть вопросы.
No. 10495  
>>10492
Я не дедок, но на некоторые вопросы по CUDA ответить, думаю, смогу.
No. 10500  
Вынес оконный цикл в отдельный поток.

Может быть нестабильным. Даже так: НЕСТАБИЛЬНЫМ. Особенно на XP. Если есть под рукой XP, докладывайте о результатах с window.allowMT = true — у меня всё мерцает, и если не только у меня, то дело в этой их "новой модели драйвера" начиная с висты.
No. 10515  
9773304.jpg - (1.53MB, 1239×1535)
10515
Переписал события на Condition Variables, ну, кроме тех, что задействованы в WaitForMultipleObjects (реализовать можно, но придётся сильно усложнить структуру события: http://stackoverflow.com/questions/2719580/waitforsingleobject-and-waitformultipleobjects-equivalent-in-linux/7782618#7782618) и MsgWait* (а здесь, я так понимаю, без вариантов). У меня работают раза в 2 быстрее.

И всё же, какую семантику выбрать — Event или CV, и почему? И предоставляют ли CV вменяемый аналог WFMO в значении WaitForAny?
No. 10521  
12919037.jpg - (376.04KB, 902×1100)
10521
Добавил в движок сущность CV наравне с Event. И переписал почти всё на CV. CV — классные. Мне понравилась идея, что если из кода убрать CV, он останется корректным, просто неэффективным.

Под XP реализовал через ивенты вторым вариантом (SetEvent solution) отсюда: http://www.cs.wustl.edu/~schmidt/win32-cv-1.html . Не знаю чё там про некорректность, у меня всё работает)) а если серьёзно, то
>slip through even though it was not waiting on condition variable (...) when a broadcast occurred
прекрасно списывается на spurious wakeup, ничего страшного.

CV на XP эмулируются ивентами, ивенты на Vista+ эмулируются CV. ^^"
No. 10588  
Запилил:
Поддержку геймпада (USB HID API). Наверняка рассыплется на моделях с количеством кнопок, отличным от моего (16). Коль скоро кнопки, в отличие от аналоговых стиков, свой Usage не говорят, я вижу единственное решение — предлагать калибровку пользователю. Кто как делает? Есть другие способы?

СЛИЯНИЕ источников света — сомнительная оптимизация, призванная смягчить отсутствие DS. Постепенно доведу до ума.

— Вроде работает на Intel HD 4000.

Ладно, хватит ерундой заниматься.
No. 10589  
>>10588
>Ладно, хватит ерундой заниматься.
Действительно.
No. 10592  
109040.jpg - (88.21KB, 649×750)
10592
>>10589
Эй!
No. 10603  
>>10592
Да просто обидно, что автор растрачивает талант на всякую ерунду.
No. 10605  
>>10603
Какие глупости ты пишешь.
No. 10606  
>>10605
Просто ты не можешь в иронию.
No. 10669  
31_10_2013 05:12:25_497.png - (586.12KB, 1161×653)
10669
Чуть позже выложу.
No. 10679  
31883777.png - (206.19KB, 750×900)
10679
Прикрутил асинхронный I/O. Reason: компиляция шейдеров в рантайме и так тормознутая, только синхронного кэширования и не хватало. Плюс, для стриминга пригодится, если руки дойдут.

Про ерунду уже сказал, так что понапридумывайте мне ваултов aka кусков уровня.
No. 10729  
>>9999
Анон, тебе приходилось перелопачивать значительную часть кода, когда надо было внести изменения в одно место или когда новую фичу добавлял?
Ты пользуешься какими-нибудь диаграммами классов, схемами, рисунками или все в голове держишь?
No. 10733  
11_11_2013 10:56:14_000.png - (552.85KB, 1161×653)
10733
>>10729
В отдельных фичах не замечал, но того, что в целом я уже переписал весь движок несколько раз, это не отменяет.
>Ты пользуешься какими-нибудь диаграммами классов
Пользовался бы, если бы такие средства существовали для FPC. ha-ha.
>схемами, рисунками
Конечно. Грех, располагая столь слабым CPU, не юзать столь мощную видеокарту, евпочя.

Реализовал какую-никакую ВОДУ:
— Плавучесть — вообще-то громко сказано, т. к. она не то сломана в Newton, не то я с масштабами не рассчитал.... позже доразберусь или реализую реалистичную, т. е. с точным учётом вытесненного объёма, на том, что есть.

— Точная (до погрешности ^^) граница между водой и воздухом — я не знаю, почему та же Беседка до этого не додумалась (или уже додумалась? Исправьте меня, в Скайриме баг всё ещё был). Просто выразил пересечение плоскости воды и ближней плоскости фрустума в экранных координатах и проверил в шейдере Ax + By + C.

А ещё прикрутил выравнивание (без него иногда просто некорректно работают, да) атрибутов, interleaved вершины, объединение совпадающих VAO и шейдеров (с последними оно того не стоило, но пусть остаётся), ну и по мелочи.
No. 10740  
cirno.png - (1.35MB, 1648×956)
10740
Эффект преломления воды шикарный, а вот отражение не очень. Сделай, чтобы было как в крузисе - линейная интерполяция между отраженной и преломленной картинкой в зависимости от дотпродукта нормали в текущей точке на воде и вектора из камеры в эту точку.
В очередной раз говорю, что ты няша! Это очень круто!
No. 10744  
33061861.jpg - (344.18KB, 583×1198)
10744
>>10740
Н-но я изначально так и сделал... T_T

Мне только не нравится отсутствие бликов. А с ними не знаю, как размыть яркие источники света по вертикали, ну, вроде IRL дорожек от Солнца и Луны. Или они должны сами вытянуться, если прикрутить блики, хм?..

Алсо.
Добавил поддержку автоматически построенных атласов всему GUI (не только шрифтам) — раз.
Запилил СПЕШОЛЫ шейдеров наравне с флагами — два.
Что за.
По сути те же флаги, но с отличной семантикой.

Флаги — битовая маска. Следовательно, их пространство ограничено (размер битовой маски), зато сущность легко может "включить" произвольный набор.

СПЕШОЛ — число. Поэтому вариантов СПЕШОЛОВ может быть сколько угодно, но использовать за раз можно лишь 1... ну или позже может пригодиться задание отдельного СПЕШОЛА каждой засветившейся в батче сущностью — материалом, объектом, чем там ещё; в любом случае, жёстко заданный максимум, не сильно превышающий 1.

Пример.
Флаги — "бамп", "свечение", "скелетка".
СПЕШОЛЫ — "объект является качающимися мухоморами", "у объекта плавятся крылышки". То есть нечто такое, что может превысить разумные ограничения на количество флагов, а комбинировать особого смысла нет.

To-do: Lua-консоль.
No. 10745  
>>10744
http://goo.gl/NVUvyX - iLua
http://goo.gl/9bCWdR - lua-rlcompleter
Держи готовую консоль с ридлайном. Ее только обернуть в виджет надо.
No. 10746  
nasu_kumiromi.gif - (10.97KB, 220×300)
10746
>>10745
Не-не-не, я нативную сделаю.

Глядя на stand-alone интерпретатор луы, подумал, что там есть незамеченный мной красивый способ узнать, что чанк синтаксически верен, просто не завершён, посмотрел исходник — incomplete = error && !strcmp(errmsg + errmsglen - 5, "<eof>"). :\
No. 10747  
>>10746
iLua - это рекомендуемая штука с луасайта. У меня там просто пара патчей на нее, которые какие-то дырки фиксили. А ридлайн-связка - разделяемая библиотека. Оно грузится из луы и не имеет контакта с твоим кодом.
No. 10755  
>>10744
вообще дорожки бликов получаюстя на волнующейся воде, потому что у каждой волны на прямой солнце-зритель в силу её формы есть кусок, который наклонен так, что от наблюдателя в нем отражается именно солнце. Аналогично и с любым другим объектом. В программной имитации тебе сответственно нужна такая формула искажения "прямого" отражения, при которой точки позжим образом перераспределяются по всей вертикали с уплотнением и многократным повторением.

Извиняюсь за бесполезный комментарий :3
No. 10756  
AB.png - (1.12MB, 1161×1306)
10756
>>10747
Нннеееееет, хочу велосипед.

>>10755
Так и думал, просто у кого-то блик от солнца выглядит дорожкой, а у кого-то кругом — должно быть, от модели освещения зависит. Всё равно позже посмотрю, уста~л.

Итак. Прикрутил Луа-консоль (РЕДАКТОРА-ТО НЕТ). Поддерживает IME и вообще вместо какой бы то ни было самодеятельности спрашивает символы у системы (WM_CHAR), так что по идее должно печататься всё то же, что в блокноте (с точностью до шрифтов).

Каждая строка немедленно выполняется в окружении трёх переменных:
game; game.scene.phys.gravity = Vec3(0)
con; con:Write(), con:Clear(), псевдонимы — print, cls
mm; mm:Pause(), mm:BGM_switch()
Окружение поддерживается между вызовами (ara на пикрелейтеде).

To-do: выбирать объекты / координаты мышкой?
P.S. С этим надо что-то делать. Около часа выяснял, почему консоль пытается сериализоваться.
No. 10767  
27939665.jpg - (662.22KB, 1129×1596)
10767
Придя в ужас от того, сколько всего мне предполагалось скопипастить, чтобы добавить воде блики, переделал работу с источниками света в шейдере. Теперь, несмотря на то, что типов источников несколько — (позиционные, направленные) × (с тенями, без), "цикл" по ним в шейдере — единственный. Профит в том, что общий код и пачки параметров дублировать не нужно. Так, массив цветов теперь относится ко всем источникам, массив радиусов — ко всем позиционным, etc., вместо отдельных массивов для каждого типа.

Проиллюстрирую страшненьким кодом:
http://pastebin.com/vszB06u2
http://pastebin.com/nj4V0Jzq

При выполнении ряда условий части такого "цикла" преобразуются в честный for по юниформу.
No. 10774  
23_11_2013 00:43:09_249.png - (546.43KB, 1161×653)
10774
^_^
Самая корректная модель бликового освещения из известных мне на данный момент, учитывает кривизну поверхности, коэффициент Френеля и взаимозатенение "микрограней".

Надо будет все более-менее известные перепробовать, и не только на воде, интересно же.
No. 10783  
24_11_2013 07:39:29_631.png - (847.55KB, 1161×653)
10783
>>10774
+сплаттинг, +плавная граница с берегом, +"пена".
Время допилить предметы, инвентари и контейнеры! :3
No. 10847  
AB.png - (381.69KB, 604×520)
10847
>>10783
Не успею к НГ >_>
Пока сделал раздельные инвентари (press X) и подсветку, завтра добавлю контейнеры.
No. 10897  
1.gif - (14.68KB, 400×300)
10897
Сделал автоподбор позиции в лейауте GUI. Идея: перебрать все пустые прямоугольники, упирающиеся во что-нибудь (пикрелейтед, КАК МОЖНО ПОТРАТИТЬ ДВА ДНЯ И 400 СТРОК НА ТАКУЮ МЕЛОЧЬ!!! https://sourceforge.net/p/rr-rr/code/527/tree/framework/UMath.pas#l3111 + https://sourceforge.net/p/rr-rr/code/527/tree/framework/Algo.pas#l560), и в самом подходящем по какой-нибудь эвристике как-нибудь разместить окно. Можно было проще? Как?

В итоге и к Рождеству не успею. :(
No. 10901  
>>10897
1) В игре ты как правило не хочешь, чтобы гуй заполонял весь экран. Для разных типов окон определяешь, с какой стороны они хотят появиться, и когда собственно уже вот-вот надо прочесываешь этот край экрана на предмет свободного места, если его нет - смотри п.2 только с поправкой на то что ты хочешь в нужный бок.

2) Чисто теоретически если ты хочешь, чтобы окно ничего не перекрывало и оставило место другим окнам - ты должен поставить его впритык к существующему окну (если оно одно), или двум (если их несколько и к одному не прицепиться). То есть при большом числе окон тебя интересуют угловые пересечения продолжений торон имеющихся окон и максимальные размеры прямоугольника, доступного из этого угла. И потом втыкаешься либо в наименьший подходящий тебе прямоугольник, либо в наиболее подходящий тебе геометрически (ближайший к центру / к нужному краю).
No. 10921  
12_01_2014 09:36:42_694.png - (0.99MB, 1161×653)
10921
Ничего не сделал, зато сделал ПЕРЕНОСЫ.
Добавлять заодно с экипировкой и юзабельностью фехтование мороженкой или?.. --"
No. 10961  
27006426.png - (326.79KB, 900×805)
10961
Разобрался с потоками сжатия и mmap. Файлы теперь не читаются в память не по делу — так, запрос файла в архиве возвращает поток непосредственно на данных архива.

На какое-то время займусь рефакторингом, перепишу каскадные тени на Texture Arrays (на дворе 2014, а я их не поддерживаю (・_・ヾ), "глобальные" юниформы на общий UBO вместе с более декларативным подходом к описанию юниформов, чтобы отвязать их объявление от реализации (дефолтный блок / GL3.1-UBO / GL4.3-SSBO; надо было сделать это сразу ;_;), координаты в шейдере на short3 + AABB вместо float3, возможно, объединение статических мешей с одинаковыми структурами вершин в большие VBO, и так далее.

Фехтование правда запилю, подсмотрел идею в игре Gun-Katana (http://www.erogereview.com/2009/02/11/gun-katana/). Потом.
No. 11073  
Что хотел выделить:

— Теперь скелеты не создают узлов сцены (с сопутствующим оверхедом) для каждой кости, при этом возможность цеплять узлы к отдельной кости осталась. Это не только оптимизация, но и должно упростить обрезание костей в зависимости от LOD. Мечты, мечты.

— Добавил методы сжатия: Bzip2 — ничем не примечателен; LZHAM (Lempel-Ziv, Huffman, Arithmetic, Markov; http://code.google.com/p/lzham/) — сугубо оффлайновый, зато степень сжатия сравнима с LZMA, а скорость распаковки — с LZO. А ещё BitStream и вспомогательный адаптер за потоками сжатия, главная и единственная функция которого — запоминать / сообщать конец «адаптируемого» потока, не используя позиционирование. (Хотя везде так делают, наверное). Иначе возможен такой сценарий: читаем сжатый файл блоками произвольного размера, декомпрессор ВНЕЗАПНО рапортует конец данных посередине блока, а при попытке сдвинуть позицию назад выясняется, что «адаптируемый» поток не умеет Seek.

— Зависшие скрипты убиваются по таймауту (LUA_HOOKCOUNT).

Это я от UBO отлыниваю, ага.
No. 11251  
Хде мои апдейты блжать?!
No. 11252  
>>11251
Будут.
No. 11255  
>>11252
Слава богу.
No. 11261  
>>11255
Или не будут. Не знаю.
No. 11273  
>>11261
А что такое? У тебя все хорошо, надеюсь?
No. 11544  
08_07_2014 17:31:54_261.png - (1.02MB, 1161×653)
11544
Прикрутил локализацию. В обычные строки вставляются необычные фрагменты, сущности обязуются помнить об этом и получать настоящий текст как localizedText = locale.localize(text). (Сущность может установить обработчик смены локали, чтобы не дёргать это лишний раз, а также оптимизировать случай, когда никаких необычностей в строке всё-таки нет). На данный момент функциональность необычных фрагментов исчерпывается лукапом в свалку луа-скриптов вида

misc =
{
    months =
    {
        jul =
        {
            ru = "Июль",
            be = "Ліпень",
            ...
        },
        ...
    }
}

"8 " .. Localized "misc.month.jul" .. " 2014". Позже добавлю падежи, числительные и т. п., правда, для этого, видимо, необычному фрагменту придётся заниматься детективным расследованием окрестностей строки... а, ну или просто просить все нужные данные на месте Localized и запоминать где-нибудь внутри себя.
No. 11548  
>>11544
Я делал так (быдлокод, яваскрипт): массив английских строк, массив русских строк, "текущий язык" = ссылка на один из этих массивов. Соответственно из текущего языка вставляется нужный элемент массива.

http://www.everfall.com/paste/id.php?06il598zoedx
No. 11552  
>>11548
Разумеется, в реальности твоего способа достаточно. Я ориентировался на «автоматическое» разруливание локализации, т. е. внешне для текста или идентификаторов картинок задаются те же строки, что и раньше, просто слегка магические, возможность изменить язык на лету и подобные, может быть, крутые, но явно спорной полезности вещи.

Также не уверен, логичнее языки как «корни» или «листья» «дерева переводов». Похоже, обычно используют первый вариант, но мне второй показался более симпатичным, хотя бы потому, что не рассинхронизируется каждым чихом.
No. 11601  
pushka.png - (38.37KB, 1224×677)
11601
Nu eto voobsche pushka!
No. 11603  
>>11552
Посмотри, как делаются локализации общепринятыми методами (gettext с кучей оберток на него в разных языках и разных форматах, от гнушного и всяких явастрингов до простого key:value жсона).
Ты придумал очень неудобную и трудноподдерживаемую систему, у тебя какая-то логика в этой штуке, ее там быть точно не должно.
No. 11628  
33038196.jpg - (460.54KB, 829×1000)
11628
>>11603
Я почитал про gettext и мне она не очень понравилась, неуклюжая какая-то, и вообще подходы, основанные на разборе исходников, выглядят кричащей кустарностью. Какая ещё логика? По сути это идентификаторы строк. Нет, то есть была мысль сделать передачу произвольных параметров, типа

local count = 500
gui.control.text = Localized "you_killed" .. Localized("how_much", count) .. Localized "epilogue"

you_killed = { ru = "Ты убил" }

how_much = { ru = function(n) if n < 500 then return n elseif n == 500 then return "пятьсот" else return "больше пятиста" end end }

epilogue = { ru = "наших людей в одиночку. Мы называли тебя человеком-армией. Но я и не думал, что ты настолько молод." }


но это уже извращение. Хотя, если положить функции встроенными и специально предназначенными для разруливания подобных моментов в языке, почему нет:

local count = 500
gui.control.text = "Ты убил " .. count .. Localized("of_our_people", count)

of_our_people = { ru = "наш{его/их/их} {человека/человек/людей}" }


***

Переписал паки. Теперь они умеют непрерывное сжатие, с оглядкой на то, что приоритетом всё же является скорость распаковки. Собственно, непрерывно сжались только шейдеры, скрипты и подобная мелочёвка, так что это было не слишком необходимо.

***

И насчёт Луа. Вообще-то сборка мусора для тех модулей с переводами была слишком агрессивной, подумал уж было выделить им отдельный луа-стейт, но в итоге просто реализовал ссылки, удерживаемые в течение некоторого времени (системными таймерами). В связи с этим, а также учитывая, что в моей архитектуре основной цикл выполняется не внутри скрипта, а просто дёргает иногда скриптовые обработчики, захотелось разрешить выполнять скриптовые функции из разных потоков. Не знаю только, как это по-красивому обставить, явные локи вокруг Push / Call / Pop как-то совсем неок. Call(getArgs, recvResults), что ли.
No. 11635  
>>11628
Мне последнее время приходится много работать с разными локализациями, и кустарным мне кажется именно твой вариант. А геттекст, он немного не так работает, а скорее
gettext("Я хочу здесь этот текст")
В .po что-то вроде
id "Я хочу здесь этот текст"
el "κακή μετάφραση"
Т.е. обычный кей-валью, просто с кучей всяких тулз для автогенерации всего этот локализациомусора, и тысяча оберток еще. И ты совсем даже не паришься о том, что у тебя где-то миллион строк в одном файле, потому что этот файл автогенерируемый, а так же отлично скармливается всяким автопереводчикам.
У тебя я вижу логику из-за вложенных контейнеров, это само по себе несет в себе какую-то логическую связь между внешним контейнером и внутренним. Обычно такие конструкции влекут за собой много изменений, когда ты меняешь какие-то коренные элементы логики.
Про функции в этой штуке забудь, не на пхп же пишешь, в самом деле.
No. 11669  
А какую именно часть движка ты пишешь на паскале, а какую на Луа?
Чистый паскаль, дельфипаскаль (Д1-Д14) или чистый Дельфи (15+)?
Сильно ли любишь Элону?

Если что я тоже очень давно пишу на Паскале, начал на чистом, быстро перешёл на дельфипаскаль, после 4 года на чистом дельфи.
No. 11670  
>>11669
> после
Последние
No. 11800  
Бампну тогда СыОПа на ичаневе.
No. 11815  
Я надеюсь, проект не заброшен?
Мечтаю, что когда-нибудь я скачаю готовую версию и ммм....
Меня охватит единый организм самописного движка.
No. 11907  
36657218_p12.jpg - (182.45KB, 640×640)
11907
>>11669
Ответ со скоростью молнии. Движок на FPC, игра на Lua. Что такое движок, а что — игра? А хрен его знает! Движок предоставляет примитивы вроде звука-в-сцене, таймера-привязанного-к-объекту-сцены, ригид-боди или GUI-окна, которые скрипт собирает во что-нибудь осмысленное, как-то так. В Элоне, да, влюбился в атмосферу приключения, хотя дальше убийства короля даже не проходил: пусть и проникнувшись философией DCSS, ничего не имею против гриндинга, по крайней мере, в таком-то мире, но вот кое-откуда она позаимствовала худшее, что вообще можно было позаимствовать — отвратительные боёвку и особенно магию. Музыка местами хорошая. А впрочем, пойду пройду.

Я рипнул перо ಥ_ಥ Посему говнорисунков не будет, просто расскажу, что сделал:

ГПСЧ с сохраняемыми состояниями. Случайность в макромире подразумевает не Ъ-недетерминированность, а набор факторов, которые ты не смог или не захотел учитывать. Связываем с каждым объектом, использующим RNG, отдельный генератор, и последовательности «случайных» событий повторяются после сохранения/загрузки. PROFIT!

Сопрограммы a.k.a. волокна a.k.a. невытесняющая многопоточность. В луа поддерживаются из коробки, для нативного кода WinAPI предоставляет SwitchToFiber, а POSIX — setcontext, но последний меня пугает. В смысле соотношения пользы и сложности реализации оно того не стоило и у меня иногда падает обработка исключений в волокнах (может, проблема в RTL? ещё проверю), так или иначе, теперь можно в скрипте вместо

Scene:Query(center, radius,
  function(obj)
    print("Объект в радиусе: " .. obj)
  end)


делать

for obj in Scene:ObjectsInRadius(center, radius) do
  print("Объект в радиусе: " .. obj)
end
,

где очередной объект возвращается в недрах поставленного на паузу рекурсивного обхода дерева, т. е. технически это прежний вариант с yield(obj) вместо вызова функции. В пределе на синтетическом тесте вообще без работы по получению следующего значения, т. е. for i := 1 to N do Yield(i), волокна до 5 раз медленнее формирования списка результатов, которое, в свою очередь, до 3 раз медленнее варианта с пользовательской функцией, однако разница быстро нивелируется, если между вызовами итератора или в них самих выполняется хоть какая-то работа. К примеру, взвешенно-случайный выбор элемента алгоритмом, который здесь: http://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/ — назван «king of the hill», с волокном в качестве источника весов медленнее всего в 1.5 раза.
No. 12012  
1016122.jpg - (671.90KB, 1023×723)
12012
Прикрутил https://code.google.com/p/crunch/.
No. 12081  
Сравнительный тест производительности куч от 1337_POCAN.

- Входные данные и примечания -
На графе с 12K точек и 88K рёбер выбраны 2000 пар точек (начало, конец), для каждой из которых существует путь длиной 200–272 (в среднем 228).
Все поиски покрывают 99,25% точек, все пути — 42,4%.

Для алгоритмов Дейкстры и A★ применяются различные реализации очереди с приоритетами.

RMHhttp://en.wikipedia.org/wiki/Randomized_meldable_heap. Используется ГПСЧ https://gitorious.org/crawl/crawl/source/83560a2567f7eacda5d71d64f4a813efe1c88c2f:crawl-ref/source/asg.cc с фиксированным начальным состоянием, причём выжимаются ВСЕ биты (это быстрее).
Наивная куча — подразумевает хранение узлов в неупорядоченном списке и поиск за O(N), но зато Put и Decrease за O(1).

- Статистика по алгоритмам -
A★ в среднем вызвал 6600 Put, 6500 Get и 3400 Decrease, максимальный размер очереди — 310.
Дейкстра в среднем вызвал 10800 Put/Get и 2450 Decrease, максимальный размер очереди — 262.
Поиск в ширину: максимальный размер очереди — 398.

- РЕЗУЛЬТАТЫ -
Двоичная куча: A★ 17,4 с, Дейкстра 22,4 с.
Троичная куча: A★ 15 с, Дейкстра 20 с.
Четверичная куча: A★ 13,8 с, Дейкстра 18 с.
Восьмеричная куча: A★ 13,1 с, Дейкстра 17,2 с.
Шестнадцатеричная куча: A★ 13,2 с, Дейкстра 18,1 с.
Фибоначчиева куча: A★ 17,8 с, Дейкстра 24,2 с.
Двоичная RMH: A★ 12,6 с, Дейкстра 18,6 с.
Троичная RMH: A★ 14.7 с, Дейкстра 18,5 с.
Четверичная RMH: A★ 13,6 с, Дейкстра 17,1 с.
Восьмеричная RMH: A★ 15,6, Дейкстра 19,9 с.

Наивная куча: A★ 10,6 с, Дейкстра 13.3 с.
Поиск в ширину: 6,2 с. лол
No. 12089  
>>12081
Автор Braid об этом весело рассказывал. Про Doom особенно смешно.

https://www.youtube.com/watch?v=JjDsP5n2kSM#t=554
No. 12539  
>>10050
Как хорошо быть программистом, эх
No. 12843  
28_04_2015 14:13:50_133.png - (12.66KB, 270×105)
12843
Перекатился на Lua 5.3. Настоящие целые на уровне VM — это хорошо.
No. 12855  
Простите, а что это такое? Ни на сайте, ни в обоих тредах внятно и четко не сказано, что являет собой эта rr-rr.
Ну разве так можно?
No. 12858  
>>12855
Во-первых, мне лень и писатель из меня так себе.
Во-вторых, это уберёт элемент загадочности, при условии, что он вообще существует.
В-третьих, до «3D-бродилка про Сырну» можно и догадаться (я делал концепт подетальнее, которого один хрен не придерживаюсь).
В-четвёртых, считаю невозможным мейнстримом навязываться аудитории «смарити какой у нас клёвый праэкт можно делать так и вот так» каким бы то ни было образом и не очень люблю, когда так делают (а коль скоро так почти все делают... ну ты понял).
В-пятых и подытоживая — да, можно, мне норм.
No. 12866  
28_05_2015 21:59:43_994.png - (952.09KB, 1050×700)
12866
С мылом и подправленным глазом, хоть проблемы им далеко не исчерпываются.
No. 12932  
контуры-а.png - (347.40KB, 1200×800)
12932
Thy soul shall be my breakfast!
No. 12933  
So sexy~
No. 13006  
Падает при старте
No. 13014  
30957620.png - (786.51KB, 768×768)
13014
>>13006
Спасибо, обновил драйвер, словил то же, исправил. Narkomani. Вот была функция glGenBuffers(..., &id), «старая» модель glBindBuffer(id) + работа с прибинденным буфером без указания id и «новая» glNamedBuffer...(id, ...), так нужно было её сломать до несовместимости, «кароч glGenBuffers на самом деле не создаёт буфер до первого Bind'а, бинди сразу или используй glCreateBuffers, введенную в OpenGL 4.5 не пойми зачем)))». Это могло было быть сделано, чтобы заставить меня как программиста указывать конкретную версию API, чтобы ломающие изменения в дальнейшем обходили меня стороной, но я это и так делаю, лол.
No. 13015  
>>13014
Fixed pipeline api давно depricated, чего ты хотел?
No. 13018  
22934769.jpg - (240.04KB, 680×771)
13018
>>13015
-_-" То API не имеет никакого отношения к FFP (ты бы ещё DOS вспомнил), я назвал модель

bind(A)
foo(...)
bar(...)
bind(B)
foo(...)


исторически более старой против

foo(A, ...)
bar(A, ...)
foo(B, ...)

(ARB_direct_state_access)

но принципиального преимущества нет ни у одной. Первая менее удобна и с ней теоретически больше заморочек при работе из нескольких потоков, т. к. «текущий объект» должен быть thread-local, зато она и более расширяема, тогда как попытка расширить вторую приведёт к объединению недостатков обеих. Мне просто непонятен смысл вводить функции вроде glCreateFramebuffers с чуть другой семантикой, когда уже есть glGenFramebuffers. При том что семантика glCreate*, по-видимому, обратно совместима с glGen*. Нонсенс.
No. 13229  
Сделал интерполяцию строк в скриптах, т. е.
> format "цепочка длины {n} (R = {dist})"
вместо
> format("цепочка длины {0} (R = {1})", n, dist)
или
> "цепочка длины " .. n .. " (R = " .. dist .. ")".
No. 13243  
>>13229
>интерполяцию
значение знаешь?
No. 13244  
Алсо, это твой рисунок последний? Ты нехило так продвинулся, мож ну его этот кодинг, иди лучше хентай рисуй.
No. 13251  
>>13243
https://en.wikipedia.org/wiki/String_interpolation же.
No. 13252  
>>13251
А, спасибо, не знал что это так называется. Термин дурацкий все-таки, при чем тут интерполяция?
55 сообщений пропущено. Показаны 100 первых сообщений.
Удалить сообщение []
Пароль  
[Mod]