Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 147

SDL3_image - не отрисовывается текстура

23.02.2025, 17:23. Показов 30722. Ответов 166
Метки sdl (Все метки)

Студворк — интернет-сервис помощи студентам
Не отрисовывается текстура! Путь, формат img, установки и подключения dll - проверил трижды. При наложении текстуры, просто белое поле.
Участок кода (ошибок нет):
C++
1
2
3
4
5
6
7
8
SDL_Texture* player = IMG_LoadTexture(renderer, "2.png");
if (!player) {
    SDL_Log("IMG_LoadTexture: %s\n", SDL_GetError());
}
SDL_RenderTexture(renderer, player, NULL, &rect);
SDL_DestroyTexture(player);
 
SDL_RenderPresent(renderer);
Полный код. Может кто то взглянет опытным глазом где я накосячил?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#define SDL_MAIN_USE_CALLBACKS 1
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include<SDL3_image/SDL_image.h>
#include<iostream>
 
static SDL_Window* window = NULL;
static SDL_Renderer* renderer = NULL;
SDL_FRect rect = { 0, 0, 100, 100 }; // создаем квадрат
int speed = 10;
 
SDL_AppResult SDL_AppInit(void** appstate, int argc, char* argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer("SDL3 Game", 800, 640, 0, &window, &renderer);
    return(SDL_APP_CONTINUE);
}
 
 
SDL_AppResult SDL_AppIterate(void* appstate)
{
    SDL_SetRenderDrawColor(renderer, 30, 30, 30, 255);
    SDL_RenderClear(renderer);
 
    // Получаем массив нажатых клавиш
    const bool* keys = SDL_GetKeyboardState(NULL);
    if (keys[SDL_SCANCODE_W]) {
        rect.y -= speed;
    }
    if (keys[SDL_SCANCODE_S]) {
        rect.y += speed;
    }
    if (keys[SDL_SCANCODE_A]) {
        rect.x -= speed;
    }
    if (keys[SDL_SCANCODE_D]) {
        rect.x += speed;
    }
 
    // Отрисовка квадрата и движение вправо
    SDL_SetRenderDrawColor(renderer, 30, 200, 30, 255);
    SDL_RenderFillRect(renderer, &rect);
 
    SDL_Texture* player = IMG_LoadTexture(renderer, "2.png");
    if (!player) {
        SDL_Log("IMG_LoadTexture: %s\n", SDL_GetError());
    }
    SDL_RenderTexture(renderer, player, NULL, &rect);
    SDL_DestroyTexture(player);
 
    SDL_RenderPresent(renderer);
    SDL_Delay(16);
    return SDL_APP_CONTINUE;
}
 
SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
{
    switch (event->type)
    {
    case SDL_EVENT_QUIT:
        return SDL_APP_SUCCESS;
        break;
 
    default:
        break;
    }
    return SDL_APP_CONTINUE;
}
 
void SDL_AppQuit(void* appstate, SDL_AppResult result)
{
    /* SDL will clean up the window/renderer for us. */
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2025, 17:23
Ответы с готовыми решениями:

Использование opengl. Не отрисовывается квадрат
Начал изучать opengl и столкнулся с трудностью уже на 1 примере, согласно которому должен просто отрисовываться белый квадрат, а у меня как...

Удаление текстур OpenGL
Ребята подскажите как удалить текстуру? Через метод glDeleteTextures, если да то какие параметры она принимает? И есть ли другой способ...

SDL : Неадекватная загрузка текстур
Есть следующее приложение: Programm.h #include &lt;windows.h&gt; #include &lt;SDL.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; #pragma...

166
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
05.03.2025, 15:34
Студворк — интернет-сервис помощи студентам
Если пример в сообщении выше соберётся без ошибок и запустится, но не будет выводиться текстура, то добавьте эту строку:

C++
1
SDL_Log("%s", SDL_GetError());
После условия проверки создания окна и рисовальщика:



И после условия проверки загрузки текстуры:



Надеюсь, SDL_GetError() вернёт какую-нибудь информацию по поводу невозможности отображения текстуры, а SDL_Log() выведет строку с текстом ошибки в консоль.

Миниатюры
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 147
05.03.2025, 17:48  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Надеюсь, SDL_GetError() вернёт какую-нибудь информацию по поводу невозможности отображения текстуры, а SDL_Log() выведет строку с текстом ошибки в консоль.
Ни какие тело-движения не помогают. Относительный путь - дает ошибку - не верный путь.
Прописал полный путь и SDL_Log("%s", SDL_GetError());

Собирается проект без ошибок - но спрайта нет ))))) Сейчас обновляю драйвера - посмотрим ))

Добавлено через 23 минуты
Обновил драйвера - результатов ноль.
Пока оставим эти телодвижения. Завтра запущу новый системник - посмотрим что будет?
Спасибо за помощь - завтра отпишусь
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.03.2025, 17:58
Покажи файл изображения(прикрепи).

Добавлено через 5 минут
И как не отображается "текстура" ?
Зеленый квадрат?

Просто картинка не подгрузилась из файла.
Что бы посмотреть вывод лога, ваш бинарник нужно запустить из командной строки.
0
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
05.03.2025, 18:30
Цитата Сообщение от SmallEvil Посмотреть сообщение
И как не отображается "текстура" ?
Зеленый квадрат?
Ничего не выводит. Только фон красит в серый цвет. Скриншот прикреплён в этом сообщении.


Цитата Сообщение от SmallEvil Посмотреть сообщение
Просто картинка не подгрузилась из файла.
При запуске из VS в консоль не выводит ничего. На скриншоте выше видно.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Покажи файл изображения(прикрепи).
У меня в архиве под этим сообщением, в папке "assets/sprites"

cosmos44, я прикрепил EXE. Посмотрите выводит ли текстуру и что выводит в консоль.
Вложения
Тип файла: zip texture-exe.zip (1.06 Мб, 6 просмотров)
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 147
05.03.2025, 19:10  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
cosmos44, я прикрепил EXE. Посмотрите выводит ли текстуру и что выводит в консоль.
Запустил exe - все на скрине

0
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
05.03.2025, 19:15
А этот же проект из VS?
Вложения
Тип файла: zip sprite-animation-libs-opengl21.zip (5.60 Мб, 3 просмотров)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.03.2025, 19:15
Цитата Сообщение от 8Observer8 Посмотреть сообщение
При запуске из VS в консоль не выводит ничего.
Как консоль VS связанна с запуском программ, я хз. Да и вообще VS нету у меня.
Да и проблема то не в IDE в общем по этой теме.

app.exe спрайт подгрузился и отрисовался.

Цитата Сообщение от 8Observer8 Посмотреть сообщение
я прикрепил EXE. Посмотрите выводит ли текстуру и что выводит в консоль.
Как видно, всё выводится в консоль, если запустить приложение через cmd.

TC, пусть тоже попробует.
Миниатюры
SDL3_image - не отрисовывается текстура  
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 147
05.03.2025, 19:22  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Как видно, всё выводится в консоль, если запустить приложение через cmd.
Запустите exe из архива. Что у вас в результате? У меня результат на скрине.
test_2.zip

0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.03.2025, 19:23
Цитата Сообщение от SmallEvil Посмотреть сообщение
Просто картинка не подгрузилась из файла.
Просто переименовал файл спрайта :
Миниатюры
SDL3_image - не отрисовывается текстура  
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.03.2025, 19:27
Цитата Сообщение от cosmos44 Посмотреть сообщение
Запустите exe из архива.
Так зависимостей то нет. dll разных )

Добавлено через 25 секунд
Ещё и отладочная версия.
0
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
05.03.2025, 19:31
Цитата Сообщение от SmallEvil Посмотреть сообщение
Как консоль VS связанна с запуском программ
Я за одно и для cosmos44 более развёрнуто поясню, что когда я порчу путь к спрайту в этой строке, добавляя AFSFDSDF:
C++
1
2
    const char* texturePath = "./assets/spritesAFSFDSDF/spritesheet.png";
    texture = IMG_LoadTexture(renderer, texturePath);
, то при запуске из VS функция IMG_LoadTexture() вернёт NULL и сохранит в texturePath, поэтому сработает условие:
C++
1
2
3
4
    if (!texture) {
        SDL_Log("Couldn't load %s: %s\n", texturePath, SDL_GetError());
        return SDL_APP_FAILURE;
    }
Функция SDL_Log() выведет в консоль сообщение об ошибке, что по указанному пути невозможно прочитать файл:
Couldn't load ./assets/spritesAFSFDSDF/spritesheet.png: Couldn't open ./assets/spritesAFSFDSDF/spritesheet.png: The system cannot find the path specified.
Google Translate:
Не удалось загрузить ./assets/spritesAFSFDSDF/spritesheet.png: Не удалось открыть ./assets/spritesAFSFDSDF/spritesheet.png: Системе не удается найти указанный путь.
Миниатюры
SDL3_image - не отрисовывается текстура  
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 147
05.03.2025, 19:34  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Так зависимостей то нет. dll разных )
Дело в том, что текстура загружается и накладывается и при отладке и сборке нет замечаний.

НО-Оооо!!! Текстура не отображается. Не буду мучаться, завтра запущу все на другом системнике.

Добавлено через 2 минуты
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я за одно и для cosmos44 более развёрнуто поясню, что когда я порчу путь к спрайту в этой строке, добавляя AFSFDSDF:
В данном случае отрабатывает ошибка - IMG_LoadTexture это проверено не раз.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.03.2025, 19:36
Цитата Сообщение от cosmos44 Посмотреть сообщение
Не буду мучаться, завтра запущу все на другом системнике.
Так и что это изменит?
Почему вы решили что проблема в железе?

Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я за одно и для cosmos44 более развёрнуто поясню
Понятно. Можно наблюдать ошибки из IDE.
0
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
05.03.2025, 20:10
Цитата Сообщение от cosmos44 Посмотреть сообщение
Не буду мучаться, завтра запущу все на другом системнике.
Очень хорошо, что версия проекта на SDL3 + шейдерный OpenGL запускается у вас в виде EXE и выводит текстуру. Хотя бы можно будет практиковаться в C++, используя OpenGL для вывода спрайтов. На шейдерах хорошо понимаются основы компьютерной графики. Когда потом будете запускать этот проект sprite-animation-libs-opengl21.zip, то нужно будет только один путь изменить - путь к SDL3 в CMakePreset.json, а больше путей в этом файле нет.

Остальные необходимые библиотеки в этом проекте подключаются в файле CMakeLists.txt по относительным путям:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
target_include_directories(app PRIVATE ./libs/glad-2.0.8/include)
target_include_directories(app PRIVATE ./libs/glm-1.0.1-light)
target_include_directories(app PRIVATE ./libs/stb_image-2.30/include)
 
target_sources(app
PRIVATE
    ./libs/glad-2.0.8/src/glad.c
    src/main.cpp
    src/shader_program.cpp
    src/shader_program.h
    src/texture_loader.cpp
    src/texture_loader.h
    src/vertex_buffers.cpp
    src/vertex_buffers.h
)
Эти библиотеки находятся в папке проекта:

Название: 2d0d6167d0f7a647f294a5a07ffa526b4a5b1208.png
Просмотров: 59

Размер: 6.1 Кб

Спрайтовую анимацию в этом примере я ещё не доделал. Потом доделаю и поясню.
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 147
05.03.2025, 21:22  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Очень хорошо, что версия проекта на SDL3 + шейдерный OpenGL запускается у вас в виде EXE и выводит текстуру. Хотя бы можно будет практиковаться в C++, используя OpenGL для вывода спрайтов. На шейдерах хорошо понимаются основы компьютерной графики. Когда потом будете запускать этот проект sprite-animation-libs-opengl21.zip, то нужно будет только один путь изменить - путь к SDL3 в CMakePreset.json, а больше путей в этом файле нет.
Изменил пути и запустил sprite-animation-libs-opengl21.zip - отработка на скрине ниже.
Я мало чего понимаю?! Вопрос?! То что ниже, это работает иная библиотека - OpenGL
? А не - SDL3-image

1
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
05.03.2025, 22:08
Цитата Сообщение от cosmos44 Посмотреть сообщение
Вопрос?! То что ниже, это работает иная библиотека - OpenGL
? А не - SDL3-image
Да, я удалил SDL3_image. Вместо неё подключил библиотеку stb_image. Она используется в файле "texture_loader.cpp" и нужна только для загрузки данных из файла текстуры:
C++
1
2
3
4
5
6
7
#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
 
GLuint createTexture(const char *path)
{
    int h_image, w_image, cnt;
    unsigned char *data = stbi_load(path, &w_image, &h_image, &cnt, 0);
Данные закружаются в "data". Далее, вызывается команда:
C++
1
2
    GLuint texture;
    glGenTextures(1, &texture);
, которая создаёт область в памяти видеокарты, куда можно будет загрузить полученные из файла данные. Вызывается команда привязки к выделеной области на видеокарте, используя полученный идентификатор "texture":
C++
1
glBindTexture(GL_TEXTURE_2D, texture);
Далее, вызываются команды настройки, которые нужны когда текстура растягивается или сжимается - разное поведение будет при разных настройках:
C++
1
2
3
4
5
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    // GL_NEAREST - for pixel graphics
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
И наконец, вызывается функция для загрузки данных прочитанных из файла в выделенный буфер для текстуры в памяти видеокарты:
C++
1
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w_image, h_image, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
Данные текстуры так и хранятся в буфере на видеокарте, пока не произойдёт закрытие программы. К каждому пикселю тектуры можно обратиться из фрагментного (другое название - пиксельный) шейдера, используя двумерные координаты, но только они обозначаются обычно не (x, y), а (u, v), либо (s, v), но суть такая же. Начало текстурных координат в левом верхнем углу. Ось Y смотрит вниз. Конец текстуры - это единица и по X и по Y:
Название: 5c6943bf279942bf0a6c43d89b48b16adbaafec6.png
Просмотров: 51

Размер: 37.3 Кб
В память видеокарты ещё нужно загрузить массив координат вершин треугольников. В данном примере два треугольника, которые образуют квадрат. Вершины тоже загружаются через создание буфера и привязку к нему. Загружается в программе и массив текстурных координат - тоже через создание буфера и привязки к нему через идентификатор и последующей загрузкой. Хорошо бы вам прочитать первую главу книги "WebGL. Программирование трёхмерной графики". Читается легко, объясняется очень доступно и подробно с картинками. Ничего, что там примеры на JavaScript - там функции WebGL с названиями, как в OpenGL, а код шейдеров один в один.
1
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 147
05.03.2025, 22:16  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Да, я удалил SDL3_image. Вместо неё подключил библиотеку stb_image. Она используется в файле "texture_loader.cpp" и нужна только для загрузки данных из файла текстуры:
Последний вопрос на сегодня! Вы смотрите конкретные уроки или чисто устное изучение?
В первом или втором варианте, дайте пожалуйста ссылку на ресурс.
0
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
05.03.2025, 23:12
Цитата Сообщение от cosmos44 Посмотреть сообщение
Вы смотрите конкретные уроки или чисто устное изучение?
В первом или втором варианте, дайте пожалуйста ссылку на ресурс.
Я прочитал несколько глав и купил в бумажном виде на Ozon книгу "WebGL. Программирование трёхмерной графики". Прочитал её полностью. Разобрался во всех примерах книги. Примеры скопировал в песочницу. Она просто написана для начинающих. Кусками перечитывал и продолжаю перечитывать оригинал на английском в электронном виде. Было бы очень здорово, если вы вы начали переписывать примеры из этой книги на OpenGL, C++ и SDL3. Я смотрел несколько уроков на канале ThinMatrix на YouTube в этом плейлисте. Например, уроки по созданию текста, загрузку и проигрывание скелетной анимации из .dae Collada из Blender и базовую работу со звуком с помощью OpenAL. Уроки у него на Java и OpenGL. Не очень сложно переписывать, например, на C++. Когда переписываешь, то учишься. Но лучше сначала прочитать несколько глав из той книги. Мне ещё нравятся уроки "The Coding Train" по Box2D: плейлист. Надо хватать базу и раскручивать её через практику. Например, научились рисовать прямоугольник и задавать ему положение, размер и цвет. Это значит, что уже можно написать игровую демку Змейка. Научились пускать шарик и определять коллизии на Box2D - можно написать игровые демки Pong и Arkanoid. Научились выводить текстуры и реализовывать спрайтовую анимацию - уже открывается больше возможностей.
0
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
06.03.2025, 01:02
Пример спрайтовой анимации на OpenGL и SDL3:
Вложения
Тип файла: zip sprite-animation-opengl.zip (556.0 Кб, 0 просмотров)
Тип файла: zip sprite-animation-opengl-exe.zip (1.06 Мб, 0 просмотров)
0
9954 / 2956 / 497
Регистрация: 05.10.2013
Сообщений: 8,081
Записей в блоге: 242
06.03.2025, 03:21
Есть идея проверить может ли SDL нарисовать что-либо, например, линию или прямоугольник на вашем компьютере. Можно попробовать скопировать и запустить какой-нибудь учебный пример из официальных примеров
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2025, 03:21

Неправильная отрисовка текстур в OpenGL
Всем доброго дня, недавно начал изучать как работать с графикой и решил повторить пример из урока, а именно - вращающийся кубик. Но...

QRubberBand медленно отрисовывается
С помощью QRubberBand выделяю участок наследника QGraphicsView для последующего сохранения, решил поставить ограничение на мышь чтобы если...

Не отрисовывается график
учусь делать оконное приложение вот по этому уроку. http://doc.qt.io/Qt-5/Qtqml-tutorials-extending-qml-example.html получилось...

Генератор текстур( с чего начать)
Всем привет, решил для своего 3д проекта написать генератор текстур, пока что необходима текстура булыжника. Никто не подскажет с помощью...

Qt с++ картинка постоянно отрисовывается
Ребята помогите пожалуйста, картинки один раз перемешивались и орисовывались и всё... а у меня эти действии повторяются каждый раз когда я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить сумму и количество положительных элементов массива, расположенных в четных строках. Решение: Создан документ с. . .
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности. . . .
Обработка трёх чисел: утроение и возведение в степень
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Даны три действительных числа. Утроить те из них, значения которых неотрицательны, и возвести в четвертую степень отрицательные. . . .
Расчёт стоимости яблок по весу
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Написать программу вычисления стоимости некоторого количества (по весу) яблок. Решение: Создан документ, с табличной частью. . .
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru