Прозрачность спрайтов.

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Прозрачность спрайтов.

Сообщение Don Leno » 20.02.2019 (Ср) 19:31

Продолжаю написание простенького класса для моих спрайтов))))
И теперь один из важнейших вопросов: как реализовать в них прозрачность? Как это сделать? Какие апи пользовать? Какие варианты есть подобной реализации? Как быстрее?

Я склоняюсь к версии, что нужно править значения самого массива спрайта Spr(). То есть к примеру определенный цвет (аля TransparentBitBlt) будет прозрачным. Например рисуем спрайт в спрайт и проверяем имеет ли рисуемый прозрачность, если да то берем значение цвета из переменной отвечающей за прозрачность и копируем массив без этого цвета исключая его.

Жду ваших ответов!

Исходник в теме: http://bbs.vbstreets.ru/viewtopic.php?f=6&t=56518

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 20.02.2019 (Ср) 19:40

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

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 20.02.2019 (Ср) 19:52

Я спрашиваю варианты решения данного вопроса, чтоб потом можно было выбрать подходящий. Но прозрачность можно делать ведь не только по цвету, но и по маске?!
Наложения без прозрачности у тебя самописное софтовое

Раз я работаю ручонками с массивами то скорее и будем продолжать с ними работать)))
Вот интересуют как реализовать:
1. Прозрачность по цвету
2. Прозрачность по маске

ОФФТОП (Ссори,гляньте пжлста тему http://bbs.vbstreets.ru/viewtopic.php?f=6&t=56518 там вопрос один появился)))

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 20.02.2019 (Ср) 22:24

Для начала нужно определиться с терминами.
1. Прозрачность, когда возможна частичная прозрачность, задаётся с помощью альфаканала. Назовём её альфа.
2. Когда прозрачным становится выбранный цвет, который называют ColorKey. Так и назовём.
Для альфы нужно иметь возможность грузить изображения в соответствующем формате. Так, как ты сейчас грузишь, с помощью StdPicture, загрузить изображения с альфой не получится.

Теперь к вопросу "как".
1. Каждый из трёх компонентов (R G B) источника умножается на альфу источника, к произведению добавляется соответствующий компонент приёмника, умноженный на (255 - альфа_источника). Полученная сумма делится на 255. Результат помещаем в соответствующий компонент приёмника.
2. Просто в цикле проходим по источнику, если цвет не равен ColorKey, то копируем пиксель в приёмник.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Прозрачность спрайтов.

Сообщение The trick » 20.02.2019 (Ср) 22:58

Mikle писал(а):Так, как ты сейчас грузишь, с помощью StdPicture, загрузить изображения с альфой не получится.

Почему не получится? Получится.

Mikle писал(а):Каждый из трёх компонентов (R G B) источника умножается на альфу источника, к произведению добавляется соответствующий компонент приёмника, умноженный на (255 - альфа_источника). Полученная сумма делится на 255. Результат помещаем в соответствующий компонент приёмника.

Добавлю также что существует так-называемая Premultiplied-aplha (такие как раз юзает AlphaBlend), это когда компоненты RGB уже помножены на альфу и нам не нужно делать одно лишнее умножение. Premultiplied-alpha еще хороша тем что легко можно сделать аддитивный блендинг, установив альфу в 0.
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 21.02.2019 (Чт) 5:51

А вот теперь по подробнее и с примерами пжлста!
To Mikle
По твоим словам понимвю следующее:
Код: Выделить всё
Private type Argb
A as byte
R as byte
G as byte
B as byte
End type

Dim src ad argb
Dim dst as argb
Dim res as argb

Dim multiAR as byte
Dim multiAG as byte
Dim multiAB as byte

MultiAR=src.a*src.r
MultiAG=src.a*src.g
MultiAB=src.a*src.b

Res.r=multiAr+dst.r*(255-src.a)
Res.g=multiAg+dst.g*(255-src.a)
Res.b=multiAb+dst.b*(255-src.a)



То есть подобный код даст мне реализовать полупрозрачность??

To trick
Почему не получится? Получится.


Вот это интересно! Как же. И тебя нет примеров? А то в моем случае как раз stdpicture

Premultiplied-alpha (прежде умноженая альфа?)


Исходя из моего выше описаного кода Premultiplied-alpha - это мои переменые multiAR, multiAG, multiAB? И сохраняются прям в альфа канале файла?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 21.02.2019 (Чт) 8:25

The trick писал(а):Почему не получится? Получится.

С помощью обычного LoadPicture? Речь не о ColorKey, а о полноценной альфе.
С помощью этого можно, понятно. Ещё можно с помощью GDI+

Don Leno писал(а):По твоим словам понимвю следующее:

В твоём коде будут переполнения, делай все промежуточные переменные (например MultiAR) типа Long.
Не вижу в конце деления на 255. Можно ценой небольших потерь в целях повышения производительности на 256.
Don Leno писал(а):мои переменые multiAR, multiAG, multiAB? И сохраняются прям в альфа канале файла?

Как могут три переменные сохраняться в одном альфаканале? Они сохранены прямо в R G B.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Прозрачность спрайтов.

Сообщение The trick » 21.02.2019 (Чт) 9:10

Mikle писал(а):[С помощью LoadPicture? Речь не о ColorKey, а о полноценной альфе.

Да. LoadPicture позволяет грузить изображения с альфа каналом, даже в стандартные контролы альфа загружается прямо из IDE и это можно проверить функциями типа DwmExtendFrameIntoClientArea. Пример в аттаче.
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось The trick 21.02.2019 (Чт) 9:19, всего редактировалось 1 раз.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 21.02.2019 (Чт) 9:18

О! 32-битный bmp LoadPicture таки понимает!

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 21.02.2019 (Чт) 18:45

И сохраняются прям в альфа канале файла?

согласен в торопях сморозил)))

Так что же насчет:
Исходя из моего выше описаного кода Premultiplied-alpha - это мои переменые multiAR, multiAG, multiAB?


Хотелось бы сросить про полупрозрачность, вернее когда прозрачность можно регулировать каким либо значением. К примеру от 0 до 100, где 0 - полная прозрачность, а 100 - без прозрачности. Как такое сделать с массивом??
----------
To Trick
То есть можно просто взять 32-битный битмап и грузить его в PictureBox то изображение будет прозрачным?
То есть если я загружу через loadPicture 32-битный битмап и Сделаю GetDIBits то получу массив с альфа каналом?
А если из массива с альфой я отрисую на форму через SetDiBits то изображение тоже будет с альфой?
----------
В твоём коде будут переполнения, делай все промежуточные переменные (например MultiAR) типа Long.
Не вижу в конце деления на 255. Можно ценой небольших потерь в целях повышения производительности на 256.


спс учту про Long. Писал с мобилки. Код не проверялся. Про деление - упустил(( Но сейчас перепишу!

Так верно??
Код: Выделить всё
Private type Argb
A as byte
R as byte
G as byte
B as byte
End type

Dim src ad argb
Dim dst as argb
Dim res as argb

Dim multiAR as Long
Dim multiAG as Long
Dim multiAB as Long

MultiAR=src.a*src.r
MultiAG=src.a*src.g
MultiAB=src.a*src.b

Res.r=(multiAr+dst.r*(255-src.a))/255
Res.g=(multiAg+dst.g*(255-src.a))/255
Res.b=(multiAb+dst.b*(255-src.a))/255

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Прозрачность спрайтов.

Сообщение The trick » 21.02.2019 (Чт) 19:18

Don Leno писал(а):То есть можно просто взять 32-битный битмап и грузить его в PictureBox то изображение будет прозрачным?

Нет. Встроенные средства не обеспечивают отрисовку с учетом альфа-канала, они просто его игнорируют, в том смысле что не производят смешивания а производят растровую операцию (исключение составляют некоторые типы метафайлов). Т.е. битмап вместе с альфой переносится в окно без смешивания. Если использовать свою реализацию, то это можно сделать, как например тут (кстати тут LoadPicture и PNG поддерживает).

Don Leno писал(а):То есть если я загружу через loadPicture 32-битный битмап и Сделаю GetDIBits то получу массив с альфа каналом?

Да. Но так бы я не стал делать, т.к. BMP раздувают очень сильно файл. Лучше из PNG получить биты и использовать их.

Don Leno писал(а):А если из массива с альфой я отрисую на форму через SetDiBits то изображение тоже будет с альфой?

Нет. Функция же называется SetDiBits, а не BlendDiBits или как-то еще, она просто перенесет биты вместе с альфой. Для отрисовки с учетом альфы, как я написал, нужно использовать AlphaBlend.
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 21.02.2019 (Чт) 20:28

Да. Но так бы я не стал делать, т.к. BMP раздувают очень сильно файл. Лучше из PNG получить биты и использовать их.

Да в наше время об объеме хранения инфы беспокоится не надо))) Пусть BMP раздувают хоть до гига! Суть создать файл (например в фотошопе) 32битный битмап. Загрузить его в мой спрайт и уже отрисовывать ручонками с прозрачностью (из массива в массив)!

А что скажешь про полупрозрачность? Как это дело просчитывается?? Правильно ли я расписал код в предыдущем посте???

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 21.02.2019 (Чт) 22:29

Don Leno писал(а):Так верно??

По смыслу верно. По производительности лучше заменить обычное деление на целочисленное, а ещё можно заменить 255 на 256, будет небольшое (незаметное) несоответствие, зато скорость вырастет:
Код: Выделить всё
Res.r=(multiAr+dst.r*(256-src.a))\256
Res.g=(multiAg+dst.g*(256-src.a))\256
Res.b=(multiAb+dst.b*(256-src.a))\256

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 22.02.2019 (Пт) 20:11

Код: Выделить всё
Private Type ARGB
    B As Byte
    G As Byte
    R As Byte
    A As Byte
End Type

Private MainDc As Long
Private Spr() As Long
Private bi32BitInfo As BITMAPINFO
Private sprWidth As Long
Private sprHeight As Long

Private SprA() As ARGB
Private BufA() As ARGB

Public Sub DrawAlpha(Src As Sprite, Optional Sx As Long = 0, Optional Sy As Long = 0)
Dim i As Long
Dim multiAR As Long
Dim multiAG As Long
Dim multiAB As Long


    ReDim SprA(sprHeight * sprWidth - 1)
    CopyMemory SprA(0), Spr(0), UBound(Spr()) * 4

    ReDim BufA(Src.Height * Src.Width - 1)
    CopyMemory BufA(0), ByVal Src.DataPTR(0, 0), Src.Height * Src.Width * 4
   
    For i = 0 To UBound(BufA())
    multiAR = BufA(i).A * BufA(i).R
    multiAG = BufA(i).A * BufA(i).G
    multiAB = BufA(i).A * BufA(i).B
        SprA(i).R = (multiAR + SprA(i).R * (256 - BufA(i).A)) \ 256
        SprA(i).G = (multiAG + SprA(i).G * (256 - BufA(i).A)) \ 256
        SprA(i).B = (multiAB + SprA(i).B * (256 - BufA(i).A)) \ 256
    Next i
   
    CopyMemory Spr(0), SprA(0), UBound(Spr()) * 4
End Sub


Все бы хорошо, но у меня выскакивает месага "Переполнение" в этой строке:
Код: Выделить всё
SprA(i).R = (multiAR + SprA(i).R * (256 - BufA(i).A)) \ 256


multiAR =0
SprA(i).R =255
BufA(i).A=0


В чем проблема???

Код: Выделить всё
SprA(i).R =(0+255*(256-0)\256

В итоге:
SprA(i).R =255 ????
Внимание! Это пробный образец кода!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 22.02.2019 (Пт) 21:08

Сделай так:
Код: Выделить всё
SprA(i).R = (multiAR + SprA(i).R * (256& - BufA(i).A)) \ 256


Я надеюсь, это тестовая процедура, и в релизе у тебя не будет всех этих ReDim в методе Draw?

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 23.02.2019 (Сб) 3:46

Mikle, может подскажешь как тогда загрузить данные из массива спрайта src без redimа?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 23.02.2019 (Сб) 8:42

Don Leno писал(а):может подскажешь как тогда загрузить данные из массива спрайта src без redimа?

Загружать не нужно, лучше работать прямо с тем массивом.
Можно вообще сразу работать с массивом типа ARGB.
Можно в классе спрайта ассоциировать массив типа ARGB с обычным Long массивом. (Поиск "ремаппинг SafeArray-дескриптора" по форуму).
Можно логическими операциями и сдвигами выделять компоненты из Long.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 23.02.2019 (Сб) 11:36

Спс Mikle. Позже вечером набросаю исходник и скину сюда код. Если будут вопросы отпишу.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 23.02.2019 (Сб) 19:04

Блин :) Не утерпел, написал пример, это класс спрайта с тремя режимами наложения, VB6 + WinAPI.
У вас нет доступа для просмотра вложений в этом сообщении.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 23.02.2019 (Сб) 19:46

Не утерпел

Ничего спс тебе мне очень пригодиться. Я вообще ваши исходники все храню))))
Но я все таки сам тож напишу, хочу с битовыми операциями повозиться! Мне опыту надо набираться)))
Кстати моя запись
Код: Выделить всё
SprA(i).R = (multiAR + SprA(i).R * (256& - BufA(i).A)) \ 256

Твоя запись
Код: Выделить всё
cD.R = (1& * cS.R * cS.A + cD.R * (256& - cS.A)) \ 256

А 1& обязательно нужен. В чем суть то? И почему в заменив (256 - BufA(i).A) на (256& - BufA(i).A) у меня перестало вылетать ошибка переполнения? Я предполагаю таким образом мы переводим числа в Long, чтобы избежать переполнения?? Наверное и 1& для того же?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 24.02.2019 (Вс) 9:40

Don Leno писал(а):А 1& обязательно нужен. В чем суть то? И почему в заменив (256 - BufA(i).A) на (256& - BufA(i).A) у меня перестало вылетать ошибка переполнения?

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

Можно ещё так:
Код: Выделить всё
cD.R = (CLng(cS.R) * cS.A + cD.R * (256& - cS.A)) \ 256

Быстродействие не меняется.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 24.02.2019 (Вс) 10:30

То есть первое число всегда должно быть Long чтобы не было переполнения?

Я воспользовался твоими советами:
Обращаюсь напрямую к массивам посредством Property A,R,G,B. В них с помощью битовых операций выделяю из Long значения ARGB)))
Вроде бы написал весь код, но вот незадача непонятная ошибка. Помогите!!!Исходник ниже.
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 24.02.2019 (Вс) 10:35

Don Leno писал(а):первое число всегда должно быть Long чтобы не было переполнения?

Нет, учитывай порядок действий.
Так всё равно переполняется:
Код: Выделить всё
  a = 100
  b = 100
  c = 100
  d = 100
  Caption = 1& * a * b + c * d

А так нет:
Код: Выделить всё
  a = 100
  b = 100
  c = 100
  d = 100
  Caption = 1& * a * b + 1& * c * d

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 24.02.2019 (Вс) 12:31

Теперь понятнее стало)))

Кстати насчет исходника - я там с Property напортачил так что можете не смотреть))) Позже как исправлю выложу сюда

--------------------------
Обновление)))

Исправил ошибки с Property. Но снова мой проект переполняет!))) Вернее вылетает ошибка "Переполнение". Ставил CLng и CByte, и даже умножение на 1& ничего не помогло! Кроме правда если во всех Property выставить параметр с Byte на Long то тогда работает :!: Это будет правильно?! Или все же можно оставить их на Byte и исправить каким либо другим способом??

И кстати, кто нить может проверить верны ли битовые операции? Буду оч признателен!

Немного о классе:
Созданые Property на все каналы A, R, G и B. Они напрямую выдирают из Long массива значения. Но чтобы получить значение из массива вам понадобиться знать индекс! Для того и добавлено Property Index, чтобы задать напрямую индекс массива и получить данные каналов.

Пример:
Задаем значения ARGB 101го элемента массива
Код: Выделить всё
Dim spr as sprite

spr.Index=100
spr.A=100
spr.R=200
spr.G=125
spr.B=15
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 24.02.2019 (Вс) 19:32

А проверить чему равно Spr(Index) \ 16777216 в момент переполнения? Ничего, что оно отрицательное? Ты хоть пытайся анализировать.
Альфу из переменной типа Long получить немного сложнее, чем R, G или B. Это потому, что Long - знаковый тип.
Попробуй CopyMemory, хотя сразу скажу - то, что ты делаешь, будет тормозить неимоверно.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 24.02.2019 (Вс) 19:48

А как тогда быть? Можно ли снизить потери производительности? Есть варианты?
Столь с кодом мучаюсь((

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Прозрачность спрайтов.

Сообщение Mikle » 24.02.2019 (Вс) 20:56

Don Leno писал(а):А как тогда быть? Можно ли снизить потери производительности? Есть варианты?

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

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Прозрачность спрайтов.

Сообщение Don Leno » 25.02.2019 (Пн) 18:32

Я все таки продолжил свой проект интереса ради и дописал сабу DrawAlpha. Вместо массива Long я использовал как и в твоем исходнике ARGB, но все таки обращение идет через Property(хотя полагаю есть и иные варианты). В итоге тормоза неимоверные для отрисовки одного рисунка 128*128 пикселей! Жаль конечно...а так все хорошо начиналось! Решил называется написать что-то сам и в итоге =0!(((


Вернуться в Мультимедиа

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

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

    TopList