HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Наши проекты (https://hlfx.ru/forum/forumdisplay.php?forumid=1)
-- Новый ModelViewer (https://hlfx.ru/forum/showthread.php?threadid=6148)
Отправлено FiEctro 13-02-2026 в 20:30:
Цитата:
Ku2zoff писал:
FiEctro как-то не очень это звучит. Где хранить превьюшки? Как их соотносить с моделями, если есть несколько моделей с одинаковыми именами?
Если хранить рядом с самой моделью, то соотносить ничего не придётся. Но каталоги засруться этими превьюшками, что юзеру не шибко надо. Если хранить в папке моделвьювера, то как соотносить? По пути до модели? По хеш-сумме модели? Мне идеальным видится вариант, в котором превьюшка вшита в саму модель. Собсно, это можно реализовать в новом ксаше, с его новыми форматами. А чтобы каждый раз не читать превьюшки из моделей, вычитывать их при изменениях, и хранить в папке моделвьювера в одном файле как виндовый кэш эскизов, для быстрого доступа. Опять же, снова встаёт вопрос, как соотносить, потому что каталогов с моделями может быть много. Если используем браузер с превьюшками, значит работаем с конкретным катлогом. Получается, привязываем превьюшки к каталогу.
Реализаций масса. Хранить превьюшки можно и в папке и в архиве с той же иерархией что и у моделей или вообще как угодно. У файлов помимо имени есть ещё и путь так что одинаковый нейминг вообще не проблема. Вшивать не знаю, обычно так никто не делает, нужно изучать этот вопрос. Естественно загружать нужно не всё, а только то что открыто в браузере. Ну собственно как делает это винда, да. Александр говорил что можно сделать какую то таблицу с блобами для быстрого доступа, но с этим я тоже не имел дела.
Вот что нейронка пишет (для обж):
Цитата:
1) Уникальная идентификация моделей (проблема одинаковых имён)
Никогда не ключуй по имени файла. Ключ должен быть стабильным и уникальным:
Вариант A (обычно достаточно)
canonical_full_path (нормализованный полный путь)
last_write_time
file_size
cache_schema_version (чтобы сбрасывать кэш при смене рендера)
Ключ кэша = hash(path + mtime + size + schema_version) → имя PNG.
Вариант B (реально профессионально на Windows)
Используй File ID:
GetFileInformationByHandleEx(FileIdInfo, ...) → FILE_ID_INFO.FileId
VolumeSerialNumber (из BY_HANDLE_FILE_INFORMATION)
Это даёт стабильный идентификатор файла в пределах тома, и не путается при одинаковых именах.
Если файл переместили/переименовали в пределах тома, FileId сохранится — кэш не “теряется”.
2) Кэш превью (чтобы не рендерить каждый раз)
Храни превью не рядом с моделями, а в %LOCALAPPDATA%\YourApp\thumbs\...
Формат: PNG (простая поддержка) или WebP (меньше размер, но нужна библиотека/кодек).
Размеры: например 256×256 и/или 512×512 (часто делают 256 для списка, 512 для карточки).
Метаданные: рядом .json/.bin или запись в SQLite:
source_id (FileId или canonical path)
mtime/size
параметры рендера (FOV, свет, фон)
версия алгоритма
Инвалидация кэша
Превью считается валидным, если совпадают:
file_id/path
size
last_write_time
schema_version
3) Индексация файлов (быстро и без тормозов UI)
Минимум
Рекурсивный обход папок (Win32 FindFirstFileW/FindNextFileW или std::filesystem).
Собираешь список файлов *.obj (+можно *.fbx и т.п. позже).
Профессионально (если файлов много)
Храни индекс в SQLite (путь, FileId, мтайм, размер, теги, статус превью).
Обновляй индекс:
либо ReadDirectoryChangesW (watcher по выбранным папкам),
либо периодический “рескан” (для сетевых дисков watcher может быть ненадёжным).
UI всегда работает с индексом, а не “лазит по диску” на каждый скролл.
4) Очередь генерации превью (асинхронно, приоритетно)
Ключевой принцип
UI показывает:
имя + путь (или путь в tooltip)
плейсхолдер-картинку
и ставит задачи на превью только для видимых элементов (и чуть вперёд по скроллу).
Очередь
priority queue: visible → next visible → остальное
несколько worker-потоков, но рендер лучше ограничить (1–2 потока), чтобы не убивать GPU/драйвер.
Дедупликация
Если 20 раз запросили один и тот же id — в очереди должна быть одна задача.
5) Как рендерить превью (детерминированно и красиво)
Тебе нужен offscreen render (рендер в текстуру), а потом сохранение.
На Windows самый практичный путь
Direct3D 11:
Создаёшь ID3D11Device один раз на приложение.
Для каждого превью:
Texture2D (RGBA8) с RenderTargetView
DepthStencil
рендеришь сцену
копируешь в staging texture
Map() → получаешь пиксели на CPU
Кодируешь в PNG через WIC (Windows Imaging Component).
Плюс: D3D11 + WIC = “нативно”, без лишних зависимостей.
Камера “автофит”
Чтобы все превью выглядели консистентно:
посчитай AABB модели (min/max)
центр = (min+max)/2
радиус = 0.5 * length(max-min)
поставь камеру в фиксированном направлении (например 3/4):
dir = normalize( (1, 1, 1) ) или (1, 0.8, 1)
расстояние камеры вычисляй так, чтобы модель влезла по FOV:
dist = radius / sin(fov/2) (с небольшим запасом *1.2)
Свет и фон
1 directional + 1 fill (мягче тени)
лёгкий ambient
фон: нейтральный градиент или “студийный” серый
включи гамма-коррекцию (sRGB), MSAA если хочешь “дорого”
Материалы OBJ/MTL
ищи .mtl, текстуры — относительные пути от mtl/obj
если текстуры не найдены — дефолтный материал (серый) и всё равно делай превью (не “пусто”).
6) UI: список/плитка без лагов (виртуализация)
Независимо от того, Win32/Qt/ImGui:
делай виртуализированный список (рисуются только видимые элементы)
подгружай превью лениво
кешируй уже декодированные текстуры (LRU в памяти), но ограничивай память, например 200–500 миниатюр.
Пользовательская часть:
показывай не только имя, а ещё “папку” (или …\parent\file.obj), иначе одинаковые имена будут неотличимы.
tooltip = полный путь.
7) Практическая структура проекта (как обычно делают)
Модули:
AssetIndex (скан/SQLite/обновление)
ThumbnailCache (путь → ключ → PNG + мета)
ThumbnailRenderer (D3D11 offscreen → pixels)
ThumbnailJobs (очередь, приоритеты, воркеры)
BrowserUI (виртуализация, запросы превью, поиск/фильтры)
Потоки:
UI thread: только рисует и отправляет запросы
IO thread(s): чтение файлов/текстур
Render thread (1): GPU рендер превью
Encode thread: PNG/WIC (можно вместе с render, но лучше разделять при нагрузке)
8) Мелочи, которые отличают “профессионально” от “работает”
Версионирование кэша (поменял свет/камеру → schema_version++)
Защита от “тяжёлых” моделей (таймаут/лимит треугольников для превью)
Логи статуса: “ошибка парсинга”, “не найден mtl”, “нет текстур”
Параллельная загрузка текстур + кеш текстур (иначе 100 превью будут каждый раз читать одно и то же)
Отмена задач: если пользователь резко проскроллил — старые задачи можно отменить/понизить приоритет.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено Дядя Миша 14-02-2026 в 05:40:
Цитата:
Ku2zoff писал:
Но каталоги засруться этими превьюшками, что юзеру не шибко надо
Ну винда точно так же засирает папки превьюшками, создавая thumbs.db
Цитата:
Ku2zoff писал:
Собсно, это можно реализовать в новом ксаше, с его новыми форматами
Запросто__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Ku2zoff 14-02-2026 в 06:19:
Цитата:
Дядя Миша писал:
винда точно так же засирает папки превьюшками, создавая thumbs.db
Кажется, начиная с висты, файл эскизов один: thumbcache в папке пользователя. А XP создавала в каждой папке файлик thumbs.db. Думаю, что и то, и другое вариант, только вместо общего кэша в папке пользователя общий кэш в папке моделвьювера. Я бы всё-таки рассмотрел вариант зашивать превьюшку в модель и забабахать плагин для проводника, чтобы модели отображались превьюшками, как обычные картиники. Видео файлы ведь могут так отображаться после установки кодек-пака.
Отправлено FiEctro 14-02-2026 в 12:06:
Цитата:
Ku2zoff писал:
и забабахать плагин для проводника
И опять наткнуться на теже грабли когда у тебя несколько версий плагина, а проводник один 
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено JPEG 16-02-2026 в 17:03:
https://gamebanana.com/tools/21890
ну што, крупное обновление, новые функции
- драг н мать его дроп текстур. Туда и обратно. Можно на окно текстур, на окно модели. Если тащить несколько текстур в программу, то заменятся те, у кого совпадут имена. Если же тащить внешнюю картинку на текстуру в программе - она заменится и унаследует имя от внешней. Для ремапов сохраняется в бмп 8-бит
- импорт текстур любого разрешения - uv растянется само.
- чтение и запись в пнг 24-бит, 8-бит, бмп. Маски становятся альфой, альфа становится маской, всё автоматизировано, применяется классический флойд-дизер
- сохранение моделей, в том числе с t.mdl. При открытии t.mdl или 01.mdl 02 и тп. - открывается основная модель.
- переименовывание текстур
- можно выделить несколько текстур и применить ко всем флаг (пока при выделении общие флаги не показываются как общие отдельной галкой)
- ручная смена размера текстур. С сохранением аспекта и без, сглаживается хорошо
- поддержка ремапов обоих форматов (старый и тфцшный)
- отображение аддитивных текстур, ремапов и масочных в том виде, в котором они будут в игре (а в миниатюрах в исходном) - удобно
- Показ uv mask. Экспорт в пнг с альфой и толщиной линии в 1 пиксель без сглаживания
- корректный шейдинг для фуллбрайт и флетшейда. Аддитивные текстуры с правильным всратым хлшным порядком отрисовки (когда неаддитивные части модели позади перекрывают аддитивные как будто они над ними) - хотя не особо тестировал, но вообще оно ни в одном хлмф не было правильным.
- дальность прорисовки в 131к юнита для Райда
- блендинг, в том числе кс-формата
- блендинг между секвенциями. Для v_ отлючён
- градиентный фон
- флаги отображения партиклевых эффектов - эффекты отображаются (не прям 1в1, но представление дают). Флаги освещения (форсированный скайлайт и уменьшение шейдинга)
- переключение рендер модов на цифорки + один новый режим (я думаю вообще можно их всех галочками сделать, тогда будет проще комбинировать, а-ля текстурный режим без шейдинга + скелет, к примеру)
- акты и лупы в секвенциях. Пока список активитис захардкоден
- остановка анимации на пробел в любом окне, листание покадрово, отображение текущего кадра (никогда раньше не замечал что у гибсов зачем-то анимация из двух кадров - теперь по счётчику сразу видно)
- переименовывание, копирование в буфер, удаление и открытие в проводнике для моделей в окне миниатюр. Учитываются внешние части модели (t.mdl, 01 02 03... mdl). Текстуру кстати можно тоже в буфер копировать и потом вставить в проводник, либо в редактор изображений, в браузер и тп.
- осветлил шейдинг, чуть подкорректировал хром
- поиск по вводу клавиши в абсолютно любом списке (анимации, миниатюры, текстуры). Как в проводнике windows - быстро ввёл sc - перешил на scientist, с паузой - сначла выбрались модели на s, потом на c и т.п.
некоторые вещи пока не оттачивал (а-ля запрет ввода русских символов, приоритет отображения при нескольких выбранных флагах, макс и мин разрешение и т.п.). Полёт пока не делал, надо подумать, как лучше, на z как в джеке или на зажатый пкм как в бспгай/годоте (ну или и то, и то). ui ещё не трогал. Бон контроллеров максимум вроде 8 всего, можно вообще их разделить - по высоте вместятся - для каждого свой слайдер, чем один общий. И надо будет извлекать значения блендов и ремапов в текстовом виде.
А вообще удивительный эффект, я миллиард раз видел все эти стандартные модели, но сейчас благодаря развёрнутому браузеру текстур с крупным видом, я впервые вижу текстуры этих моделей))
__________________
https://www.moddb.com/mods/half-life-system-error
https://vk.com/aaatrigger
Отправлено Дядя Миша 17-02-2026 в 05:49:
Цитата:
JPEG писал:
применяется классический флойд-дизер
Как жы я ненавижу дизеринг на восьмибитных текстурах.
Цитата:
JPEG писал:
но вообще оно ни в одном хлмф не было правильным.
Вообще-то в моём было правильным
Цитата:
JPEG писал:
флаги отображения партиклевых эффектов - эффекты отображаются (не прям 1в1, но представление дают).
Можно поподробнее? Смысл тех эффектов - в движении модели, пока модель не движется, партиклы не спавнятся. А во вьювере она неподвижна.
Цитата:
JPEG писал:
на z как в джеке или на зажатый пкм как в бспгай/годоте
На ЛКМ - вращение камеры, полёт на WSAD, в Джеке оно так же.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FiEctro 17-02-2026 в 06:06:
Цитата:
JPEG писал:
- сохранение моделей, в том числе с t.mdl. При открытии t.mdl или 01.mdl 02 и тп. - открывается основная модель.
Кстати объясните смысл вот этого? Для чего с моделью тащить эти файлики?__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено JPEG 17-02-2026 в 15:03:
Цитата:
Дядя Миша писал:
Как жы я ненавижу дизеринг на восьмибитных текстурах.
мне нравится дизер Байера, такой с узорами) Ну а без него совсем плохо, резкие переходы ж
Цитата:
FiEctro писал:
Вообще-то в моём было правильным
ну возьми модель гмана, сделай литсо аддитивным и глянь, что будет. В игре воротник отрисовывается поверх)) Не исключаю, что это может быть только в стим-версии, хз, пока не проверял
Цитата:
Дядя Миша писал:
На ЛКМ - вращение камеры, полёт на WSAD, в Джеке оно так же.
в Джеке на лкм выбор объекта. Если нажать z то полет, пока не нажмешь лкм (это отменит полет). А в бспгай, годоте, и скорее всего юнити - нужно зажать пкм. В целом и то, и то удобно. В хлмв просто на пкм же зум. Сейчас зум дублируется на колесико, может и можно занять пкм
Добавлено 17-02-2026 в 18:03:
Цитата:
Дядя Миша писал:
Смысл тех эффектов - в движении модели,
поэтому там упрощенное состояние, а-ля при рокет трейле - частицы движутся вверх (по-сути это пламя), дым вверх, кровь вниз течет и тп. Это вьювер, поэтому оно всегда отображается. Можно канеш к анимации привязать и симулировать движение, чтобы хвост тянулся, но мудрёно и всё равно криво получится__________________
https://www.moddb.com/mods/half-life-system-error
https://vk.com/aaatrigger
Отправлено Ku2zoff 18-02-2026 в 07:33:
Цитата:
FiEctro писал:
Кстати объясните смысл вот этого? Для чего с моделью тащить эти файлики?
Когда оперативки было мало, модели компилили с разбиением на части. T-файлы для сохранения текстур, выделенный сервер их не грузит, тем самым экономит оперативку. 01-0X файлы с анимациями. Тоже, видимо для экономии памяти, чтобы всё сразу не грузить. Хотя, не очень понятно зачем. Скорее всего оригинальный компилятор не справлялся и вылетал. Такое поведение легко воспроизвести, попытавшись скомпилить модельки игроков из CS 1.6/CZ/DoD милкой. Либо дробишь модель на части, либо вылет в конце компиляции.
Добавлено 18-02-2026 в 14:31:
Цитата:
JPEG писал:
Если нажать z то полет, пока не нажмешь лкм (это отменит полет). А в бспгай, годоте, и скорее всего юнити - нужно зажать пкм. В целом и то, и то удобно. В хлмв просто на пкм же зум.
ЛКМ - вращение камеры вокруг модели. ПКМ - вращение камеры относительно точки обзора (как в игре), СКМ - перемещение камеры в шести направлениях. Колёсико - зум. Z - переключение на хаммероподобное управление, если вдруг кому-то так удобно.
Добавлено 18-02-2026 в 14:33:
Цитата:
FiEctro писал:
И опять наткнуться на теже грабли когда у тебя несколько версий плагина, а проводник один
Про какой плагин ты говоришь? Их огромное множество, естественно они могут конфликтовать друг с другом. Если у юзера руки из седалища, а не из плеч.
Отправлено FiEctro 18-02-2026 в 09:00:
Цитата:
Ku2zoff писал:
Про какой плагин ты говоришь? Их огромное множество, естественно они могут конфликтовать друг с другом. Если у юзера руки из седалища, а не из плеч.
По мне использовать встроенный в софт браузер файлов куда удобнее и предсказуемее чем полагаться на винду, учитывая что ещё винда тоже разная бывает.
Цитата:
Ku2zoff писал:
Когда оперативки было мало, модели компилили с разбиением на части. T-файлы для сохранения текстур, выделенный сервер их не грузит, тем самым экономит оперативку. 01-0X файлы с анимациями. Тоже, видимо для экономии памяти, чтобы всё сразу не грузить. Хотя, не очень понятно зачем. Скорее всего оригинальный компилятор не справлялся и вылетал. Такое поведение легко воспроизвести, попытавшись скомпилить модельки игроков из CS 1.6/CZ/DoD милкой. Либо дробишь модель на части, либо вылет в конце компиляции.
Наверное это что то связано с отрисовкой в софтварном режиме как обычно.__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено Ku2zoff 18-02-2026 в 09:50:
Цитата:
FiEctro писал:
использовать встроенный в софт браузер файлов куда удобнее и предсказуемее чем полагаться на винду
Согласен. Но при условии, что софт - комбайн, включающий в себя все редакторы. Точнее, необходимый набор: просмотровщики форматов, компиляторы/декомпиляторы, редакторы уровней, скриптов, шейдеров и проч. Узкоспециализированные 3д, звуковые и текстурные редакторы могут быть внешними.
Добавлено 18-02-2026 в 16:50:
А то, перескакивание с моделвьювера в редактор уровней, например, с помощью ALT+TAB такое себе занятие ради установки модельке одного флага, или замены одной текстуры.
Отправлено Дядя Миша 18-02-2026 в 16:35:
Цитата:
FiEctro писал:
Для чего с моделью тащить эти файлики?
В 98-м году Вальв экономила память, подгружала модельку по частям.
Цитата:
JPEG писал:
мне нравится дизер Байера, такой с узорами) Ну а без него совсем плохо, резкие переходы ж
Индексация нейронкой даёт вполне приличный результат и без дизеринга.
Цитата:
Ku2zoff писал:
T-файлы для сохранения текстур, выделенный сервер их не грузит, тем самым экономит оперативку
Да дурь это. Никакой проблемы отрезать хвост файла с текстурами при загрузке нет. Я в ксаше так и делаю, точнее наоборот.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено JPEG 19-02-2026 в 14:59:
добавил поддержку $freecoords, теперь модельки из диффужина и старого мира грузит нормально (если они без $boneweights
). В окне текстур в таком случае текстура отображается с повторами в затайленном виде, приводя изумлённого юзера в замешательство (этот параметр часто используется там, где не ожидаешь его встретить).
добавил простую но супер-прикольную фичу - дабблклик по текстуре открывает ее через любимый просмоторщик пользователя (при дабблклике все текстуры распаковываются во временную папку в пнг и происходит открытие выбранной текстуры) В принципе так можно даже сразу редактирование добавить через внешний софт с мгновенной записью в модель, был бы смысл
добавил вывод встроенного в модель имени,
там бывают интересные вещи скрыты: имя автора, имя компилятора, изначальное имя модели, все эти xpшные пути до файлов и т.п.
экспорт uvшек для всех выделенных текстур
драг н дроп пофиксил, до этого не всегда срабатывал
Отправлено Дядя Миша 19-02-2026 в 15:25:
Цитата:
JPEG писал:
добавил поддержку $freecoords, теперь модельки из диффужина и старого мира грузит нормально

__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено JPEG 14-04-2026 в 19:04:
Что нового:
- режим полета
- миниатюры в проводнике windows для моделей hl, q1, q2
- поддержка моделей q1/hexen 2, q2, hl alpha (пока анимация дерганная), sin, heretic 2, alice/fakk2 (сейчас без скелеталки). Читает obj, но парсер нужно доработать. mdx от kingpina есть, но там видимо пути до текстур в коде игры прописываются, и субмодели лежат отдельно, поэтому пока неудобно пользоваться.
https://gamebanana.com/tools/21890
__________________
https://www.moddb.com/mods/half-life-system-error
https://vk.com/aaatrigger