blender-xray icon indicating copy to clipboard operation
blender-xray copied to clipboard

Сохранение progressive ogf мешей

Open PavelBlend opened this issue 3 years ago • 5 comments

Эта проблема так же есть в game level экспортёре: #328

PavelBlend avatar Feb 27 '22 14:02 PavelBlend

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

Когда тестировал swi, я создавал меш, который отображает смещение и количество треугольников в виде линий: 01 Одна полоска - это swi. Начало полоски - это offset, а конец полоски - это offset + triangles_count.

У некоторых swi есть пересекающиеся диапазоны треугольников. Отличается только начало и конец.

Значения vertices count можно легко сгенерировать, так как оно увеличивается на 1 в каждой последующей swi. Значения triangles count тоже легко сгенерировать, они тоже увеличиваются, но на 2. А offset легко сгенерировать, если диапазоны треугольников пересекаются.

Проблема в том, что треугольники нужно отсортировать так, чтобы offset можно было наращивать (прибавлять 6, так как 2 треугольника хранят 6 индексов) и получать корректную модель.

Вот код, который создаёт меш на картинке:

import bpy


a = (
    (651, 80, 63),
    (639, 78, 62),
    (627, 76, 61),
    (615, 74, 60),
    (603, 72, 59),
    (591, 70, 58),
    (579, 68, 57),
    (567, 66, 56),
    (375, 64, 55),
    (363, 62, 54),
    (354, 60, 53),
    (345, 58, 52),
    (336, 56, 51),
    (330, 54, 50),
    (174, 52, 49),
    (162, 50, 48),
    (150, 48, 47),
    (141, 46, 46),
    (9, 44, 45),
    (0, 42, 44)
)

verts = []
fcount = 0
for i, (o, f, v) in enumerate(a):
    verts.extend((
        (o * 0.1, i * 0.2, 0.0),
        (o * 0.1, i * 0.2 + 0.1, 0.0),
        (o * 0.1 + f * 3 * 0.1, i * 0.2 + 0.1, 0.0),
        (o * 0.1 + f * 3 * 0.1, i * 0.2, 0.0)
    ))
    fcount += 1
faces = []
for i in range(fcount):
    faces.append((i*4, i*4+1, i*4+2, i*4+3))
me = bpy.data.meshes[0]
me.clear_geometry()
me.from_pydata(verts, (), faces)

Кортеж a хранит swi из реального ogf файла. Первое число - смещение, второе - количество треугольников, третье - количество вершин.

PavelBlend avatar Feb 27 '22 14:02 PavelBlend

@SamArtGit, спасибо за наводку от atanda про Sliding Window VIPM with Hugue's Hoppe QEM. Я там разное интересное по этой теме нашёл.

igelbox avatar Mar 01 '22 00:03 igelbox

Скопировал из #468, чтоб всё в 1м месте было:

Поигрался я тут с SWI на примере green_stalker_4.ogf и вот видно, что там хренова куча SWI-уровней и на каждом пропадает по 1 ребру. Но, самое странное, почему-то мелкие детали (сумки, шарф, сапоги) не упрощаются даже на самых низкодетализированных уровнях:

https://user-images.githubusercontent.com/5264687/155866919-130fe066-5b37-4f22-99a6-28c46e7c4a38.mov

igelbox avatar Mar 01 '22 00:03 igelbox

А хочется узнать - есть какой-либо прогресс по данному топику? Фича очень-очень, поэтому интересно есть ли что-то на ближайшее будущее.

LittleBabyGABE avatar Apr 18 '22 01:04 LittleBabyGABE

Есть PR #472, он ждёт ревью. Пока он не замёржен - можете попробовать установить аддон из ветки, что в этом PR указана. Заодно и с тестированием поможете - может я там чего странного понаписал.

igelbox avatar Apr 18 '22 16:04 igelbox