![]() |
Ответ: [TrueHorror] - разработка
Цитата:
http://aras-p.info/texts/CompactNormalStorage.html алсо: на самом деле не высшего качества паковка. в том же юнити даже белая сфера с директ лайтом даёт артифакты. когда всё затекстурено и сложная геометрия, не так очевидно. но если нужно гуд качество, я б выбрал best-fit normals, их в крайзисе2 юзали. |
Ответ: [TrueHorror] - разработка
mr.DIMAS, а у тебя как?
|
Ответ: [TrueHorror] - разработка
А я как обычно леплю как хочу.
RGBA8 диффуз, собственнаясветимость( тупо яркость 0..1 для амбиент пасса ) RGBA8 нормали RGBA8 глубина Поясню почему глубина в таком говне. Потому что на даче я сидел с ноутом в котором GMA 3150( только хдр текстуры( A2R10G10B10 ) и RGBA8 ) ну вот так вот. В первом проходе запаковываю глубину в 4 байта. Во вторых проходах распаковываю глубину из 4 байтов( код есть у... Борескова :-D ) С макросом USE_R32F_DEPTH можно перекомплить под флоат текстуру. Кароч все через жопу и целый 1 байт не используется. |
Ответ: [TrueHorror] - разработка
Цитата:
|
Ответ: [TrueHorror] - разработка
Суть best-fit normals в том что они все возможные значения умещающиеся в объем куба распределили по площади сферы и записали в кубмэпу?
Если там качество в более чем в 50 раз лучше, зачем тогда в Crysis 3 обратно стереографик вернули? |
Ответ: [TrueHorror] - разработка
Цитата:
|
Ответ: [TrueHorror] - разработка
Цитата:
|
Ответ: [TrueHorror] - разработка
А мне норм, я не кукурузис делаю.
|
Ответ: [TrueHorror] - разработка
Цитата:
вместо кубмапы 2д текстурой можно обходиться, т.к. кубмапа там имеет повторы/симметрию. Цитата:
|
Ответ: [TrueHorror] - разработка
Ок.
Короче, чтобы было ещё понятнее, если ещё кто-то будет читать данный тред: RGB - это 3 канала по 8 бит. 8 бит могут принимать 256 различных значений. 3 канала по 8 бит это 256х256х256=16777216 различных комбинаций. Нормализованная нормаль - это 3d вектор длиной 1.0f. Если принять во внимание всё множество положений такого вектора в пространстве, получится сфера с радиусом 1.0f. Если такую сферу вставить в куб такого же размера, например из вокселей, которых 256х256х256 в кубе, и превратить абстрактную сферу в дискретную сферу из вокселей, то мы обнаружим что используется ~289880 вокселей, что составляет всего 1.73% от всех возможных значений. И в общем все эти техники упаковки нормалей сделаны для того чтобы по максимуму использовать все возможные значения умещающихся в 24 бита. |
Ответ: [TrueHorror] - разработка
ну не все, стереографик и прочее что у Араса на страничке они вообще про впихивание аж в 2 байта, ну а про бестфит всё правильно сказал.
|
Ответ: [TrueHorror] - разработка
А в каком пространстве лучше сохранять нормали в G-Buffer и в каком дальше считать, например SSAO?
В доках Crytek в world space делают, а в других примерах через view space. Или тут больше от упаковки зависит, а дальше уже переводить для расчёта как удобней? //============================= D3DXCreateEffectFromFile создаёт буфер только в случае ошибки, а иногда там и предупреждения есть, которые в случае отсутствия ошибок не выводятся. Можно буфер другим способом получить? |
Ответ: [TrueHorror] - разработка
я делаю в ворлдспейс и бестфита на него хватает, но по идее вью спейс должен лучше точность распределять вроде.
|
Ответ: [TrueHorror] - разработка
Вложений: 1
Прошлый вариант SSAO оказался не очень удачный - чтобы обходиться одним буфером глубины требуется ставить пару костылей, связанных с самозатенением поверхности. Возможно если еще поиграть с настройками, можно сделать что-то более менее вменяемое.
С другой стороны, раз сейчас всюду стали использовать G-Buffer и там обычно всегда есть нормали, то можно их использовать и для SSAO. Поэтому я добавил G-Buffer. Пока использую обычные regular normals в world space, которые помещаются в A2R10G10B10, на самом деле для SSAO этого достаточно, но мне понравился способ упаковки best fit normals и думаю затем его сделать и использовать A8R8G8B8, где альфа уже будет свободна для чего-нибудь другого, тем более что в составе полноценного рендера нормали пригодятся для тех же бликов и отражений, где точность более критична. Еще, как выше указал Mr_F_, надо попробовать посчитать во view space и сравнить оба варианта. Для глубины сейчас используется R32F. На скрине видно ещё не сглаженный SSAO. Сейчас я переписал ранее написанные в RenderMonkey шейдеры в эффект и собрал приложение на котором можно будет это тестить. Вложение 20902 На скрине видно что вокруг носа чайника чуть более светлый ореол. Видимо связано с тем, что формула, которая должна уменьшать эффект затенения с расстоянием, начинает его чрезмерно уменьшать в сторону увеличения яркости - тут нужно посмотреть какие есть варианты в реализациях SSAO из других источников. Кстати, на скрине можно видеть 527 FPS, для 1080p вроде неплохо. Последующее сглаживание снизит этот показатель, но остаётся возможность оптимизации самого SSAO шейдера и G-Buffer'а, которые надеюсь смогут компенсировать потери на сглаживании. |
Ответ: [TrueHorror] - разработка
Слух, поделишься шейдером? А то если я опять в графоний уйду то там и останусь на месяц другой.
По игре. На втором уровне в шахте сделал первую "головоломку" - придется самому собирать взрывное устройство чтобы взорвать стену. На третьем уровне нужно найти 3 предохранителя чтобы запитать всю электронику. В итоге инвентарь используется по полной. Также фонарик теперь разряжается( воу, воу я знаю что это банально ), а так как он работает от топливного элемента то заряжается либо спиртягой либо водкой :-D. Клюква во всей красе, но я не стал добавлять "банальные" батарейки ибо откуда им взяться в... ну спойлерить я не буду. Сейчас много времени уходит на ̶у̶н̶и̶в̶е̶р̶ медию, модельки в основном( а к ним развертки, текстуры ) а так как опыта просто мало то пока сделал какой-то сраный стеллаж и коробку :-D. |
Ответ: [TrueHorror] - разработка
Цитата:
|
Ответ: [TrueHorror] - разработка
Как и где (по каким туториалам) делал карту ? Нравится мне твой стиль если честно !
|
Ответ: [TrueHorror] - разработка
По мне так карты не айс. Делал по впечатлениям от фоток здесь и фоток заброшенных зданий. Из туторов прочел только тутор ARENSHI по моделированию ландшафта. Текстурировал вообще по тупому. Сначала по фейсам накладывал материалы и затем UVWMap -> Box и там изменял размеры бокса в итоге текстуры накладываются довольно прилично, главное сохранять этот модификатор в стеке и тогда текстуры всегда( ну почти ) будут хорошо ложиться.
Если кто подскажет метод текстурирования лучше то буду премного благодарен. |
Ответ: [TrueHorror] - разработка
Вложений: 3
Когда делал размытие по глубине, абсолютно случайно получился мультяшный шейдер :)
Вложение 20903 Как уже можно догадаться по скрину, в размытии я просто тестирую разницу глубины (переведенную в world space, чтобы от положений zfar znear clip planes'ов результат не изменялся) и если глубина меньше порогового значения -- пиксели размываются. Алгоритм взял из головы, опять же нужно посмотреть -- наверняка есть более быстрые варианты. Вот что в итоге получилось. Также вокруг носика чайника уже нет белого ореола. Вложение 20904Вложение 20905 Теперь нужно приводить коды в порядок. |
Ответ: [TrueHorror] - разработка
Цитата:
|
Ответ: [TrueHorror] - разработка
2ARENSHI, у меня в максе( 2012 ) для меша уровня включен бэкфейскуллинг( Direct3D ), но когда вьюпорт передвигаешь( или любой объект ) то куллинг как бы исчезает и нелицевые грани черными становятся и непрозрачными, но все нормально когда вьюпорт не трогаешь. это баг или что? меня заебало это мельтяшение перед глазами. как это лечить?
|
Ответ: [TrueHorror] - разработка
Цитата:
http://f5.s.qip.ru/18HME8JBQ.jpg Можно попробовать установить сервиспак для 2012 макса отсудава http://knowledge.autodesk.com/suppor...t=score&page=1 А можно поставить 2014 версию. Работаю в ней. Вроде стабильнячок. |
Ответ: [TrueHorror] - разработка
Попробовал сменить рендер на Nitrous и все этот баг исчез. Но сервис пак поставлю обязательно.
|
Ответ: [TrueHorror] - разработка
И еще вопрос про Peel. Сегодня сделал несколько объектов( в основном трубы ) и развертки к ним делал Pelt'ом, получилось годно, но как я понял, для статичной геометрии( ну сам меш уровня ) этот метод не годится?
|
Ответ: [TrueHorror] - разработка
Цитата:
Процесс будет приблизительно такой: Отмечаем шов на дне пещеры http://f6.s.qip.ru/18HME8JBX.jpg выделяем все полигоны и жмакаем на квик пил http://f5.s.qip.ru/18HME8JBY.jpg Кстати, если результат пила не удовлетворит, можно пробовать разные виды релаксов.http://f6.s.qip.ru/18HME8JBZ.jpg (спасибо АВТОМАТу за находку) Все эти релаксы и пилы идеальны для органики. А бокс, планар и цилиндрик маппинг для хардэджевых объектов :) |
Ответ: [TrueHorror] - разработка
А как труЪ пацаны делают такие объекты как протянутые по стенкам провода и прочую длинную мишуру? Сейчас я делаю так: создаю цилиндр лоуполи, обрубаю верхушки и начинаю тягать контур( 3 ) торца перемещением\вращением с зажатым шифтом, то бишь просто тяну и там где надо поворачиваю. Получается довольно быстро но может есть какой-то секрет?
|
Ответ: [TrueHorror] - разработка
Вложений: 1
Буду выкладывать скриншоты с уровней над которыми работаю. Третий уровень.
|
Ответ: [TrueHorror] - разработка
Цитата:
http://forum.boolean.name/showpost.p...6&postcount=20 |
Ответ: [TrueHorror] - разработка
Трубы и провода рисую сплайнами. В настройках сплайна ставлю галочку для для генерации ювв и отображения сплайна в виде трубы.
|
Ответ: [TrueHorror] - разработка
Где такие нормали делал ?
|
Ответ: [TrueHorror] - разработка
|
Ответ: [TrueHorror] - разработка
Цитата:
2mr.DIMAS, а у тебя шейдеры в коде прямо? У тебя отдельные шейдеры или эффекты? |
Ответ: [TrueHorror] - разработка
Прямо в коде, когда буду точно уверен что не буду изменять шейдеры,то откомпилю в натив и положу в соответствующую папку. А пока компилятся при запуске.
|
Ответ: [TrueHorror] - разработка
Ну я SSAO в эффекте делаю, так что распарсишь там по шейдерам сам тогда.
|
Ответ: [TrueHorror] - разработка
Ага, без проблем.
|
Ответ: [TrueHorror] - разработка
В графонии вылез какой-то трудно уловимый баг.
Кароч суть в том что сильно тормозит IDirect3DDevice9->Present(0,0,0,0) я погуглил с чем это может быть связано, но так и не нашел ответа. Причем тормоза Present'a прямо пропорциональны разрешению - чем больше тем больше тормоза. Я вообще не могу вкурить в чем косяк. Есть мысли? |
Ответ: [TrueHorror] - разработка
Цитата:
//============================================= У меня тоже вопрос по шейдеру: Допустим если я упаковываю глубину таким образом: (Здесь input.z - это координата во view space) Код:
output.depth = float4( ( input.z - nearZPlane ) / ( farZPlane - nearZPlane ), 1.0f, 1.0f, 1.0f ); (texCoord - это текстурные координаты экранного квада) Код:
const float vz = tex2D( smpDepth, texCoord ).r * ( farZPlane - nearZPlane ) + nearZPlane; Все верно? |
Ответ: [TrueHorror] - разработка
Ну вроде да. Но два тангенса разве не будут жрать столько же сколько умножение на матрицу?
Насчет моего вопроса - я сам дурак, забыл выключить альфатест перед вторым проходом дефереда( и все из-за рефакторинга ). |
Ответ: [TrueHorror] - разработка
Вложений: 1
Цитата:
Из последних изменений: * Поменял упаковку в G-Buffer с world space на view space, и последующие вычисления во view space'е идут. * Раньше характер затенения зависел от расстановки Z плоскостей, теперь не зависит, но вот чуть-чуть качество испортилось. С матрицами тогда тоже попробую. Вот видно что затенения какие то полосатые стали :crazy: Вложение 20910 |
Ответ: [TrueHorror] - разработка
А че по сюжету?)
|
Ответ: [TrueHorror] - разработка
А где-то позади был пост про сюжет. Я его и не менял.
Вкратце: Играем за бывшего шахтера. Он с компашкой занимается разведкой заброшенных шахт на наличие драгоценных металлов. В одну из таких они и отправились. В силу обстоятельств главный герой прибывает на место на неделю позже остальных. Ну и дальше все в игре раскрывается по запискам. Менять сюжет не вижу смысла, ибо под него все и заточено. |
Ответ: [TrueHorror] - разработка
|
Ответ: [TrueHorror] - разработка
Цитата:
Исправил полосатость. Добавил ограничения по дистанции -- теперь вблизи пятно затенения не будет разрастаться, а в далеке затенение будет исчезать. Немного оптимизировал. ssao_v01.zip fx/ssao.fx - сам эффект. src/* - исходники той штуки на которой тестируется эффект. bin - там рабочие *.exe debug и release сборки. bat - батники для сборки (я использовал gcc). x/rot_texture.jpg - нужная для эффекта текстура, которая рэндомно отклоняет лучи. В эффекте 4 прохода: G-Buffer, SSAO и два gauss-blur'а по горизонтали и вертикали. Эффект будет дорабатываться, так что я не знаю почему ты решил использовать отдельные шейдеры -- через эффект можно эффективней взаимодействовать разработчикам движка и шейдеров. |
Ответ: [TrueHorror] - разработка
На самом деле я уже пожалел о своем выборе. Но мне ничего не мешает прикрутить сасао через эффект. Сейчас я в основном занимаюсь ̶у̶н̶и̶в̶е̶р̶о̶м̶ моделированием и текстурированием, так что в движок пока не лезу. Второй уровень( шахта ) и третий уровень( заброшенный подземный научный центр ) стали больше на 50%. Второй доделан полностью, третий на 90%. Четвертый ( канализация :-D) сделал геометрию на 50 процентов. Пятый( снова шахта, но больше ) только на бумаге, и последний( лес ) еще даже не зарисовал. Кароч вот как-то так.
|
Ответ: [TrueHorror] - разработка
А что лучше делать DirectInput или XInput?
Чуток почитал MSDN, в целом суть такая что XBox 360 контроллеры и другие новые имеют лучшую совместимость с XInput, но остались еще legacy устройства, которым нужен DirectInput. Сам я пока пользовался только DirectInput, и в случае клавиатуры и мыши, которые представляются как виртуальные унифицированные устройства, ещё ничего, но вот когда дело доходит до геймпадов и других устройств, с которыми нужно напрямую работать -- в коде какой то ужас начинается: чтобы изменить один параметр, нужно запускать перебор объектов, передавать в функцию перебора каллбек, в каллбек передавать указатели с контектом и параметрами и т.д. и т.п. В XInput же обещают всё намного удобней и проще. Вот. |
Ответ: [TrueHorror] - разработка
Я на сосноли\соснольщиков с геймпадами не ориентируюсь поэтому DirectInput'a хватает. хз вообще что взять, надо XInput поковырять и тогда поймешь.
|
Ответ: [TrueHorror] - разработка
Цитата:
На самом деле он удобен не только для игр со сложным управлением, а просто хотя бы чтобы сидеть на диване или в кресле. Даже та же консоль -- это просто железка: тебе никто не мешает делать для неё такие же игры как для ПК. Тем более что скоро Стим-Машины и их аналоги появятся. |
Ответ: [TrueHorror] - разработка
Посмотрел XInput -- он сделан для Xbox 360 контроллеров и прочих совместимых штук. Клавиатуры и мыши там нет. Но работа с контроллером действительно намного удобней. Так же поддерживаются дополнительные возможности, такие как вибрация, управление гарнитурами подключёнными к контроллеру, управление беспроводными контроллерами и т.д. Остаётся выяснить какое количество несовместимых с XInput контроллеров сейчас существует и делать вывод о целесообразности использовать DirectInput рядом с XInput (а так делать можно).
А вот насчёт клавиатуры и мыши (выше в теме уже где-то было) -- DirectInput для них устарел и лучше использовать сообщения Windows (имхо для шутеров-то можно и оставить DirectInput для мыши например). Ещё я видел что в Windows 8 (которая поддерживает концепцию "одна система на всех окнах") используют другие методы ввода, учитывающие как мышь, так и сенсорный экран и другие устройства ввода. |
Ответ: [TrueHorror] - разработка
Делай для XInput, для директинпута есть тулзы типа https://code.google.com/p/x360ce/ , которые позволяют назначить кнопки и оси любого джойстика так, чтобы игра думала что это XInput устройство
|
Ответ: [TrueHorror] - разработка
Цитата:
|
Ответ: [TrueHorror] - разработка
Вложений: 1
У себя в движке использую свою корявую библу. Тащит мышь, клаву. Есть поддержка KeyUp, KeyDown, KeyHit, MouseDown, MouseUp, MouseHit, позиция мыши относительно начала клиентской области окна. Мне хватает с головой.
|
Ответ: [TrueHorror] - разработка
Цитата:
Хотя я сам тоже через DirectInput всё сделал, но вот сейчас буду переделывать. //================================================== ====== К тому же у тебя в MagicInput обращение к клавиатуре через GetDeviceState -- при низком FPS у тебя нажатия будут выпадать или будет неправильная очередность при быстром наборе текста. Через состояние устройства можно опрашивать только аналоговые устройства (мышь, рули, контроллеры и т.п.) |
Ответ: [TrueHorror] - разработка
Долго отдыхал от игродела. Играл в дарксоулс 2. Но настало время вернуться.
Прошел свою игрушку с не затуманенными мозгами и понял, что очень мало интерактива в игре. Поэтому добавил разные интерактивные объекты: 1) Лестницы 2) Двери( есть и запертые двери, но ко всем есть ключи - ибо это не сайлент хилл :-D ) 3) Вентиляционные ходы( общее название, на самом деле можно будет ползать и в узких проходах - например в трещине в скале ) По лестницами можно лазать вверх-вниз. По вентиляционным ходам можно ползать туда-сюда. Вообще полезно отдыхать от геймдева - сразу свежие мысли в голову приходят. |
Ответ: [TrueHorror] - разработка
Как на ваш взгляд: стоит ли делать видимым тело персонажа, и соответственно анимировать его для разных действий - типа того, как сделано в Outlast?
P.S. Переехал на C++11 и Bullet Physics 2.81. Сделал в движке строгую типизацию - до этого все хендлы объектов из движка передавались в виде указателя на объект reinterpret_cast к int. В итоге появлялись трудно уловимые баги. |
Ответ: [TrueHorror] - разработка
Цитата:
Я думаю пока лучше экономить. Цитата:
Еще там какие-то расхождения со стандартом в ексепшонах, там нет ключевого слова noexcept, вместо него throw(), хотя в стандарте 98 throw() означает любое исключение, а в С++11 писать throw считается устаревшим -- достаточно только noexcept, таким образом компилятор не будет генерировать дополнительный код для перехвата и сделает программу быстрей, однако в std есть много того что кидает исключения, поэтому где попало noexcept ставить нельзя. |
Ответ: [TrueHorror] - разработка
Цитата:
|
Ответ: [TrueHorror] - разработка
Да С++11 это почти новый язык, если будешь только фичи добавлять с существующий код -- не раскроешь весь потенциал.
Страуструп в 4 издании говорит что нужно архитектурно новые подходы делать, тогда новые фичи будут как можно лучше ложиться в общий контекст задуманного. Вообще из своей практики еще могу добавить: override -- удобно помечать виртуальные функции, чтобы случайно при опечатке не создать похожую, но не виртуальную функцию. Компилятор скажет что такой функции в базовом классе нет. final -- помечать класс что он финальный, в этом случае можно не делать деструктор virtual (обычно делали, чтобы не забыть когда начнешь наследовать), теперь если попытаешься наследовать то нужно будет убрать final, и сразу автоматически это напоминает проверить деструктор на virtual. списки инициализации -- теперь переменные рекомендуется инициализировать вот так: int a { 10 }; потому что у списков инициализации более строгая типизация, и например в данном случае: char a { 257 }; будет ошибка, и ты не накосячишь с переполнением значения. К тому же списки инициализаций напрямую инициализируют переменную без промежуточных присваиваний. Тоже относиться к классам. Также полезны variadic templates -- они заменяют собой функции с переменным числом аргументов. Не часто, но кое-где я нашел им применение. Ексепшены стали удобней и быстрее. Например можно оформить конструктор так: B::B( void ) try : A() { //code } catch ( const except& ex ) { //deinit throw; } Таким образом мы в случае неудачи восстанавливаем состояние объекта локально, затем передаем ексепшен вызывающему коду, для более глобальных действий. Под try попадает также и конструктор базового класса. Еще в классах можно создавать конструкторы перемещения и операторы присваивания с перемещением -- однако я пока не нашел им широкого применения. Ещё, раньше чтобы скрыть конструктор копирования и оператор присваивания (обычные) не писали их тело, таким образом компилятор выдавал ошибку компиляции, теперь же можно помечать такие функции A( const A& a ) = delete; Лямбда местами удобно использовать, например при обобщении кода внутри функций. Применение библиотеки стало намного лучше и читабельней. Так что теперь имхо её можно применять чаще, даже внутри движка, за исключением очень критических к производительности мест. Вот но в общем если относиться к С++11 только как к дополнительным фичам, не получится раскрыть его возможности полностью. |
Ответ: [TrueHorror] - разработка
Эх, открыл бы я для себя C++11 раньше, в начале написания движка, то архитектурно он был бы другим нежели сейчас. А так мне только фичи можно использовать, ибо архитектура уже есть и каждое ее изменение проходит болезненно. Когда доделаю игру, тогда вполне возможно начнется глобальный рефакторинг движка с учетом нового стандарта.
|
Ответ: [TrueHorror] - разработка
Можно разделить движок на отдельные модули, так чтобы циклически производить рефакторинг и модернизацию каждого, в относительно короткий по времени цикл.
Стараться держать общий объем кода в пределах своих возможностей, чтобы не терять контроля и гибкости разработки. Одним словом не делать "на века", а с вероятностью что может через месяц-два придется заменить/переписать/модернизировать. Таким образом стараться минимизировать кол-во своего кода, пользоваться функционалом других библиотек, убирать устаревшие или "запасные" возможности, которыми на вряд ли будут пользоваться. Я например задаю себе вопрос, если гипотетически сурцы исчезнут, за сколько я могу с нуля восстановить коды движка. Если в пределах 2-3 месяцев, значит объем кодов движка в целом удовлетворяет моим возможностям. В целом есть много способов улучшать и увеличивать возможности движка, без увеличения объёма исходного кода. |
Ответ: [TrueHorror] - разработка
Вложений: 4
Улучшаю существующие уровни. На сей раз это шахта. Добавил крепь на своды и дощатый пол.
|
Ответ: [TrueHorror] - разработка
|
Ответ: [TrueHorror] - разработка
Вложений: 1
Поругалась что OpenAL32 не юзабельна и вылетела.
Upd Удалил и заработало В общем после начала напряг вид руки и все еще звук зажигалки. Пошел в тоннель там меня завалило и появилось задание проверить вход , после того как сходил ко входу оно не исчезло. Вошел в пещеры - фпс как рукой сняло. Вседозволенность перемещения это не очень крутая фича без подсказок куда идти. Полез по лестнице - пролез через нее и цеплялся не знай чем (скрины). После лестницы остались звуки топанья по металу. Зарядил фонарик керосином. Добрался до детонатора но он не взрывается ( предполагаю что бомбу надо сделать) Запустил игру в окне а его двигать нельзя :4to: |
Ответ: [TrueHorror] - разработка
Энжой йор свой движок :(
![]() |
Ответ: [TrueHorror] - разработка
Блин я на восьмерке не тестировал. Вообще хз че может быть. Может поможет удаление OpenAL32.dll?
upd. Поиск сказал что это из-за перемешивания 32 битных и 64 битных библиотек. Хотя я компилировал всё в 32 бита. И еще - поставь http://www.microsoft.com/ru-ru/downl....aspx?id=30679 Цитата:
|
Часовой пояс GMT +4, время: 10:43. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot