Cheb's Game Engine

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

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

Re: Cheb's Game Engine

Сообщение Cheb » 08.02.2017 18:36:07

Движок GNU GPL.

Исходники выкладываются в каждом тесте, ЕМНИП, с 18-го, папка внутри архива /chentrah/modules/chentrah/src

Репозиторий не развожу, т.к. на текущей стадии это не имеет смысла. Слишком часто перелопачиваю организацию исходников. Всё хранится на ноутбуке, где разрабатывается, + регулярные резервные копии.

Не могут: там пока нет, собственно, того, что в общепринятом понимании считают "движком".
Плюс, я вообще не расчитывал на работу с каким-либо 2d. Всё будет 3d (игра + редактор моделей с аниматором и раскрасчиком текстур прямо по моделям, ради этого редактора уже давно припилена поддержка рисовальных планшетов с чувствительностью к нажатию)
Из 2d компонентов - есть работающий GUI, построенный на парадигме резиновых таблиц, но на этом и всё. Как библиотека движок есть и будет до отвращения низкоуровневым.

Следующий этап - как раз создание механизма текстурных атласов и хитровывернутого механизма текстурирования 3d ландшафтов, а то я пока даже 3d модель с сиськами отобразить не могу :evil:

TL;DR: я слишком долго "семь раз отмерял".
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение скалогрыз » 08.02.2017 19:02:54

концепеция "это 2d, а это 3d", как видно
Cheb писал(а):Плюс, я вообще не расчитывал на работу с каким-либо 2d

...
Cheb писал(а):Из 2d компонентов - есть работающий GUI

глупости.
в наши дни 2d это не более, чем частный случай 3d (лол! "бесперспективный" :mrgreen: ).

Это ещё в конце 90х можно было кочевряжится, и говорить, вот это 2d,а это 3d. Потому что 2d тогда ещё обсчитывался CPU, а сейчас такого уже нет.
И даже OpenGL, именно Open Graphic Library, а не исключительно Open 3D GL

Cheb писал(а):Репозиторий не развожу, т.к. на текущей стадии это не имеет смысла.

Ну и напрасно. тебе бы помогли уже. Да и чтение собственных коментариев в логах, иногда может быть весьма занимательным

Cheb писал(а):Движок GNU GPL

не хорони старания - делай LGPL
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение vitaly_l » 08.02.2017 19:24:12

Cheb писал(а):игра + редактор моделей с аниматором и раскрасчиком текстур прямо по моделям, ради этого редактора уже давно припилена поддержка рисовальных планшетов с чувствительностью к нажатию

А чего готовый не взяли? Блендер-3d - бесплатный, и очень сильный 3D пакет. При этом освобождается куча времени на остальной - очень тяжкий труд. Готовить в нём очень просто, и полно уроков. За пару дней можно освоить. Единственный сильный минус - навыки программирования, в блендере получить нельзя.
Cheb писал(а):я слишком долго "семь раз отмерял".

зато теперь будет легче.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Cheb's Game Engine

Сообщение Лекс Айрин » 08.02.2017 19:43:17

vitaly_l писал(а):Блендер-3d - бесплатный, и очень сильный 3D пакет.


Это рисовалка. Т. е. как бы отдельный продукт. А речь идет явно о части движка. Ну или дополнительном к нему инструменте.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Cheb's Game Engine

Сообщение vitaly_l » 08.02.2017 19:51:08

Лекс Айрин писал(а):А речь идет явно о части движка

Да, но создание редактора - занимает кучу времени. С другой стороны: в итоге можно дать возможность играющим самим разукрашивать и создавать персонажей, а равно и делать их анимацию - это будет забавно.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Cheb's Game Engine

Сообщение Лекс Айрин » 08.02.2017 20:35:09

vitaly_l, можно то можно... только в движке это делается на лету(показывать то надо 50-60 кадров в минуту), а в том же блендере построение модели может быть сколь угодно долгим (например, при создании фильмов, для этого используют графические фермы(кластеры) и работают они не один день).
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Cheb's Game Engine

Сообщение vitaly_l » 08.02.2017 20:50:52

Лекс Айрин писал(а):можно то можно... только в движке это делается на лету(показывать то надо 50-60 кадров в минуту), а в том же блендере построение модели может быть сколь угодно долгим (например, при создании фильмов, для этого используют графические фермы(кластеры) и работают они не один день).

В блендере делают модель, так чтобы она отвечала параметрам движка и кости соответственно настраивают. Затем модель грузится в движок и потом в движке с ней можно делать всё что угодно. С третьей, стороны, можно сделать и анимацию в блендере, и выгрузить её с параметрами движка. Там есть возможность подключать скрипты, на вывод. Но если здесь уже готов редактор, то нет смысла менять шило на мыло. Т.к. в принципе - любой движок можно адаптировать под редактор и естественно, своё всегда - ближе к телу.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Cheb's Game Engine

Сообщение Cheb » 09.02.2017 02:19:04

Блендер-3d - бесплатный, и очень сильный 3D пакет.

Мне не нужно сильный. Мне нужно простой, но с теми фичами, которые я хочу, а не какие общеприняты.

Т.к. в принципе - любой движок можно адаптировать под редактор и естественно, своё всегда - ближе к телу.

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

например, при создании фильмов, для этого используют графические фермы

Это вообще как-то перепендикулярно, мне нужен редактор именно под игровые модели.

в наши дни 2d это не более, чем частный случай 3d

Ну, может человек имел в виду API для создания 2д игр. Какового нема.

не хорони старания - делай LGPL

Чё то я запутался: я же собирался его сделать LGPL - какого чёрта тогда он у меня под полной GPL? :?
Отойду от аврала на работе - исследую, какого х.


Так... Раз уж скатились на обсуждение тулзета, давайте рассмотрим, что я от этого моделероаниматорораскрасчика хочу.

1. Единый формат: модель хранится в том же формате, что и сохранёнки aka сессия. То есть, это такой же снапшот объектного графа на чеперси. Нулевые затраты на создание экспортёра: просто сохранить кусок графа, это в чеперси уже есть.

2. Единое пространство модели: её можно одновременно модифицировать, анимировать, раскрашивать и скульптить, свободно переключаясь между этими стадиями в процессе. Никаких времяпоедающих костылей типа

3. Анимация с привязкой вершин к костям НЕ матрицами, а силами. Да, слишком дорого для реального времени и так никто не делает. Поэтому для большинства моделей на экране анимация будет предрасчитанной (это как в quake 2 и 3 - набор ключевых кадров, для каждого координаты и нормали всех вершин). В реальном времени - только анимация ближних/тех, кто на оси взгляда. Чем толще CPU, тем кучерявее.

4. Построение модели снизу вверх. Нынче модно наскульптить в збрашах, потом упрощать до низкополигональной. У меня будет создание низкополигональной (базовый дальний LOD) с последующим увеличением за счёт subdivision. x4, x16 и т.д. Причём, скульптинг - это рисование карты выпуклостей/впкулостей в том же раскрасчике, что выражается в карте нормалей, а высшие уровни сетки просто изгибаются под эту карту неровностей.
Никаких екструдов и прочей новомодной чепухи. Только по одной вершине, по одному треугольнику за раз. Только хардкор.

5. Многослойность модели (например, рука/детальная рука с ногтями/упрощённая варежка - это варианты типа слоёв в фотошопе. Или нога босая / в носке / сапог - тоже вариации. Или, например, разные головы, у которых на стыке с шеей мазки кисти раскрасчика с шеи заходят на голову, а мазки кисти с головы - на шею. В идеале, все персонажи любого пола и толщины - это вообще одна модель гуманоида с 100500 мутаторов и слоёв.

6. Хранение текстуры в виде мазков кисти, привязанных к треугольникам модели. Не уверен, насколько эффективно с точки зрения экономии дискового пространства (при намеченных объёмах, вообще-то, насрать), но зато скин становится подобен векторной графике, не особо зависящим от разрешения. Понадобилась шкурка более высокого разрешения - поставил в очередь, и за N кадров отрисовал в фоне, повторяя все движения кистью.
Естественно, движок будет уметь многое из того, что редактор, заметная часть кода общая. Движок как минимум будет уметь анимировать и генерировать текстуры с развёрткой.

7. Хранение текстуры безотносительно развёртки (вытекает из 6). Точнее, развёртка создаётся под рисунок, а не рисунок под развёртку. Указываешь линии разреза, выставляешь приоритеты (на роже разрешение выше) и оно само автоматом генерирует развёртку и утрамбовывает её куски в текстуру. Получилось говно? Выставляешь линии разреза по другому.

8. Активное использование палитр во все щели - я не понял, почему их со времён 256-цветных игр почти перестали применять? Когда нужен синенький вместо красненького - тупо перекрашивают вручную, и плодят ещё одну текстуру. Фу.
В том числе добавлю поддержку для скинов в формате OA / Quake3 - с автоматическим распознанием окрашивабельных участков на основе красной/синей командных шкурок и возможностью перекраски в любой цвет радуги просто передачей в шейдер другой константы.

Всё. Спать, спать, спать. Завтра опять скрещивать университетского ужа с федеральным ежом :x

Добавлено спустя 23 минуты 33 секунды:
З.Ы. Пример идеального на мой вкус интерфейса 3d редактора

1. Окно всегда разбито на 4 части: 3d вид, и 3 проекции верх/низ, лево/право, перед/зад (и панель инструментов сбоку).

2. Проекции всегда жёстко синхронизированы, никакого независимого перемещения. Подвинул камеру в одной - подвинулась и в других.

3. Вращение в 3д вьюпорте - всегда вокруг точки, заданной центрами вьюпортов проекций. Можно переставить эту точку поудобнее, например, ctrl-щелчком по грани в 3д вьюпорте.

4. Размеры вьюпортов легко меняются перетаскиванием за центральный крестик.

5. Индикация, какая из проекций какая (лево или право, верх или низ) осуществляется перемещением 3d вьюпорта в разные углы. Индикация перёд/зад - перемещением его право/лево и инверсией узора (ёлочкой) на разделителях.

6. Можно всегда переключиться в иную систему координат: вращением в 3д вьюпорте задать направления осей x y и z и сделать их текущими. Можно иметь несколько таких настроек и свободно переключаться между ними / переименовывать их.


Хррррр... :x

Добавлено спустя 3 минуты 9 секунд:
З.З.Ы. И все координаты всегда, мать их, в миллиметрах! Изображение

Добавлено спустя 6 часов 59 минут 6 секунд:
Ну и напрасно. тебе бы помогли уже.

Не та стадия, когда стоит допускать посторонних к разработке. Вот когда окончательно кристаллизуется парадигма и создам основные механизмы (например, расслаиваемый мир мультиплеера) - тогда милости просим.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение vitaly_l » 09.02.2017 09:44:53

Cheb писал(а):Мне нужно простой, но с теми фичами, которые я хочу, а не какие общеприняты

Это правильно, особенно когда прочитал про ноу-хау: векторные текстуры - круто.
Cheb писал(а):Никаких екструдов и прочей новомодной чепухи. Только по одной вершине, по одному треугольнику за раз.

Это зря, т.к. экструдер - основной инструмент при построении модели. Например намечаешь на прямоугольнике: руки и ноги, затем вытягиваешь/выдавливаешь их экструдером. И второй удобный инструмент, boolean т.к. он позволяет "отрезать" или "присоединять" из одной фигуры часть другой фигуры. А только треугольниками, самому сложно будет.
Cheb писал(а):нога босая / в носке / сапог - тоже вариации. Или, например, разные головы, у которых на стыке с шеей мазки кисти раскрасчика с шеи заходят на голову

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

Добавлено спустя 4 минуты 46 секунд:
Кстати, мазки векторной кисти действительно везде одинаковые, только у более взрослых персонажей добавляются морщины и складки. Так что, свой редактор - более чем оправдан.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Cheb's Game Engine

Сообщение Лекс Айрин » 09.02.2017 09:50:31

Cheb писал(а):Это вообще как-то перепендикулярно, мне нужен редактор именно под игровые модели.


Про то и речь.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Cheb's Game Engine

Сообщение Cheb » 09.02.2017 10:12:34

А только треугольниками, самому сложно будет.

Да, сложно. Зато она будет ручной выделки.
В идеале, как я это вижу, тот же экструдинг, но экструдятся не полигоны, а линии (вершины, соединённые последовательно). Потом подгоняешь ея, подвигая/удаляя по одной вершине, и даёшь команду соединить две линии полоской треугольников. Где лицо, где задница - определяется камерой в 3д вьюпорте.

И, самое главное - внутренняя структура, объём из тетраэдров с физическими свойствами. Что жизненно важно для организации расчленёнки и анимации случаев типа жирного монстра, колышущегося и образующего складки в реальном времени.
Вообще, каждая модель должна иметь скелет. И не скелет в понимании матриц костей, а ещё одну модель из мослов, рёбер, черепа и т.д., вставленную внутрь модели тела. И уже к которой физическими связями привязано мясо.
В норме скелет не рисуется, но участвует в физике. Если требуется художественная расчленёнка - движок может убирать куски плоти (физика же), оставляя скелет видимым. Здравствуйте пробивание огромных рваных дыр, расплавление со стеканием с чуть медленнее рассыпающегося скелета, и прочие вкусности.
А не дурацкие резиновые крысы из обливиона, которых молоти, не молоти двуручником - они только летают, как мячики.
И не дурацкая расчленёнка из третьегно фолаута, где люди разрываются строго по линиям, как туалетная бумага.
Вот, кстати, люди как бы ещё не в 2007 году сделали, почему нигде не применяется? (NSFW, расчленёнка!) http://www.codercorner.com/Movies/CharacterCut.avi
А идеальная игра - (NSFW, расчленёнка!) https://youtu.be/6MZwqMSCBF8?t=155 :mrgreen:

Тогда одну модель можно трансформировать, от ребёнка до взрослого, с любым набором вторичных и первичных признаков.

Вот, и я об этом. Только не матрицы, а морфинг.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение vitaly_l » 09.02.2017 10:37:07

Cheb писал(а):экструдятся не полигоны, а линии (вершины

Это пофигу, т.к. полигоны - это на самом деле вершины, соединённые в определённом порядке. Важно, чтобы был инструмент позволяющий модифицировать несколько вершин за раз.
Cheb писал(а):Вот, и я об этом. Только не матрицы, а морфинг.
Не знаю, как устроен этот движок. Я делал всё на матрицах. Матрицы, привязывались к костям и их можно было масштабировать, и тогда персонаж легко менял свои размеры или анимацию. А морфиг, безусловно ещё более крутая штука, т.к. позволяет находить среднее между А и Б, в то время как матрицы - только скэйлят, вращают и перемещают. И плюс, морфинг быстрее, но очень затратен по ресурсам диска.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Cheb's Game Engine

Сообщение Cheb » 16.02.2017 04:36:19

По ходу, чисто случайно, заглянул в диспетчер задач. А там!..
Утечка памяти довольно бодренькая, по мегабайту в секунду где-то. Причём, в программе-матке, не в модуле.
По ходу буду самоотладчик ещё и для этого вставлять. Чтобы, значит, можно было включить мониторинг диспетчера памяти, который для *каждого* вызывающего адреса заведёт счётчик захапанного, и внизу экрана будет выводиться список финалистов с указанием объёма, строки, и имени исходника.
Схема проста, как мычание: диапазон адресов "своего" кода весьма скромный, ничего не стоит завести вчетверо больший массив, где к каждому адресу привязан longint. Такая схема тормозить практически не будет. А самодебаг на lineinfo (64 бит) и франкенlineinfo (32 бит) уже есть.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 19.02.2017 04:44:16

Устроил великий разгребамс чеперси, приводя к совместимости между 32-битной и 64-битной версиями. Привёл, заодно
1. Вычистив мерзкий баг: по сценарию множества сохранялись в одном формате, а преобразующая процедура грузила их в другом, устаревшем. Лишнее чтение из потока - и всё съехало. Отлавливать всю эту радость было ВЕСЕЛО, ибо давало упоротые глюки сильно ниже по течению.
2. Добавив мерзкий хак, что статические массивы из 256 или меньше элементов регистрируются как записи с полями, именуемыми 'a0'..'a255'. Ибо нефиг статическими массивами баловаться, я бы иначе удавился, пытаясь им вставить поддержку совместимости вперёд/назад. А так - почти на халяву. Пространство имён трещит и стонет, да. И заголовок потока опух килобайт до 150.
3. Выбросив к чертям поддержку типа extended (в x86_64 это double, а парсер устраивает хоровые вопли о неизвестном типе в сохранёнке)

Пооосле чего, x86_64 начала нормально грузить сессию, сохранённую в 386, иии... падать. Там, похоже, деление на ноль в алгоритме подгонки разбиения текста на строки если текст - пустой.
Но дело не в этом, а в том, что от этого НЕ ДОЛЖНО всё умирать с красным экраном смерти с адресом исключения "где-то в атсрале, хозяина".
Два часа биения лбом об стол - установил, что в x86_64 вылезает исключение в процедуре отлова исключения, и всё умирает. Отложил на нуегонафикпотом, ушёл спать.

..а ведь хотел сегодня заняться классами 3d моделей :cry:

Добавлено спустя 12 часов 45 минут 59 секунд:
..отследил до чтения по нулевому адресу в процедуре AddLog (пытается вывести "произошла ошибка, подробности ниже"). Чёзана :evil:

Добавлено спустя 8 минут 16 секунд:
..что-то хитровывернуто так запарывается, что AV лезет после возврата из процедуры - видимо, в неявной секции финализации. :evil:

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

Re: Cheb's Game Engine

Сообщение Cheb » 24.02.2017 22:25:28

Врооде бы, всё разгрёб, всё переделал, заработало -- и ВНЕЗАПНО перестал работать lineinfo!
Матерные слова уже кончились. :evil:
Код: Выделить всё
МОДУЛЬ Тест №21 (текстурный атлас) РУХНУЛ

Сбой в процедуре синхронизации потоков для прорисовки

Стек вызовов:
  001100392DDh в _test021-x86_64.dll
  00110039879h в _test021-x86_64.dll
  00110078A43h в _test021-x86_64.dll
  0011009CE45h в _test021-x86_64.dll
  0011009CC9Dh в _test021-x86_64.dll
  0011007477Fh в _test021-x86_64.dll
  001100018C5h в _test021-x86_64.dll
  00000469594h в chentrah-x86_64.exe
  000004E518Ch в chentrah-x86_64.exe
  00000472253h в chentrah-x86_64.exe
  00000401A4Eh в chentrah-x86_64.exe

Матка передала модулю непойманное системное исключение в потоке main thread

ВОИ поймал C000008Eh, FLOAT_DIVIDE_BY_ZERO
  по адресу 001100B7535h в _test021-x86_64.dll
  (нет отладочной информации:   
функция RTL не смогла получить информацию о строках)


Добавлено спустя 4 часа 4 минуты 26 секунд:
Сам себе злобный дятел, надо было в командной строке компилятору кормить -gl но не -gw
Возникает закономерный вопрос - а раньше-то оно как работало?
Трёхмегабайтный екзешник и трёхмегабайтная длл вызывают у меня приступы острого отвращения (32-битные версии после вынимания отладочной информации и выполнения strip весят по мегабайту с хвостиком)
Вроде был же способ сделать выборочный strip ?

И, опять, какого беса для некоторых точек указан номер строки, но не имя исходника? :(
Код: Выделить всё
МОДУЛЬ Тест №21 (текстурный атлас) РУХНУЛ

Сбой в процедуре синхронизации потоков для прорисовки

Стек вызовов:
  :3148 в _test021-x86_64.dll
  :3148 в _test021-x86_64.dll
  mo_logic.pp:840 (TLOGIC__RENDER)  в _test021-x86_64.dll
  mo_threads.pp:610 (LOGICDORENDER)  в _test021-x86_64.dll
  mo_threads.pp:646 (TTHREADMANAGER__CALLLOGICFORRENDER)  в _test021-x86_64.dll
  mo_module.pp:208 (TMODULE__PULSE)  в _test021-x86_64.dll
  _chentrah_module.lpr:83 (PULSE)  в _test021-x86_64.dll
  cl_module.inc:572 (TMODULE__PULSE)  в debug-chentrah-x86_64.exe
  framework_basic.pp:375 (TBASICFRAMEWORK__PULSE)  в debug-chentrah-x86_64.exe
  cl_main.inc:426 (RUN)  в debug-chentrah-x86_64.exe
  chentrah.lpr:110 (main)  в debug-chentrah-x86_64.exe

Матка передала модулю непойманное системное исключение в потоке main thread

ВОИ поймал C0000005h, Access Violation,

    Попытка чтения по нулевому адресу
  :547 в debug-chentrah-x86_64.exe

ВОИ поймал C000008Eh, FLOAT_DIVIDE_BY_ZERO
  mo_gui.pp:1478 (TTEXTRECT__REFIT)  в _test021-x86_64.dll


Добавлено спустя 3 часа 29 минут 57 секунд:
Вообще интересно, почему именно в 64-битной версии полезло деление на ноль.
Мне удалось вспомнить, что когда-то давным-давно, когда ещё Win98 была немёртвой, а процессоры - поголовно одноядерными, я скопипастил один хак, задающий флаги сопроцессора на игнорирование переполнений с плавающей запятой, поскольку считалось, что без этого драйвера OpenGL неработоспособны из-за внутренних ошибок.
То есть, как бы, необходимое условие для работы с 3д графикой.
Ну, а в 64-битной версии этот хак отсутствует, деление на ноль и вылезло.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Пред.След.

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

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

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

Рейтинг@Mail.ru