PavelBlend / blender-xray

STALKER (aka xray-engine) import/export plugin for Blender 3D
BSD 2-Clause "Simplified" License
187 stars 39 forks source link

Fix metarial creation for v4.0 BSDF node #716

Closed AziatkaVictor closed 5 months ago

AziatkaVictor commented 10 months ago

Added support for 4.0 version of Blenders BSDF Node: image For old version was problem with changing "Specular" when importing models, it calls now "Specular IOR Level".

SamArtGit commented 10 months ago

Вить, а импорт .object? %)

AziatkaVictor commented 10 months ago

Вить, а импорт .object? %)

Я тестировал у себя, вроде как импорт и экспорт работает нормально. Но тут только полноценные тесты покажут.

codecov-commenter commented 10 months ago

Codecov Report

Attention: 11 lines in your changes are missing coverage. Please review.

Comparison is base (ba4999c) 75.44% compared to head (ec0d60a) 75.40%.

Files Patch % Lines
io_scene_xray/ops/level_shaders.py 33.33% 2 Missing and 2 partials :warning:
io_scene_xray/ops/shader.py 0.00% 3 Missing :warning:
io_scene_xray/formats/level/imp/material.py 33.33% 1 Missing and 1 partial :warning:
io_scene_xray/utils/material.py 33.33% 1 Missing and 1 partial :warning:

:exclamation: Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files ```diff @@ Coverage Diff @@ ## develop #716 +/- ## =========================================== - Coverage 75.44% 75.40% -0.04% =========================================== Files 210 210 Lines 20212 20222 +10 Branches 3448 3453 +5 =========================================== Hits 15249 15249 - Misses 4146 4152 +6 - Partials 817 821 +4 ```

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

PavelBlend commented 10 months ago

@AziatkaVictor я пока не хочу добавлять поддержку 4.0. Пока у меня нет возможности его запустить и тестировать на нём аддон.

Там есть проблемы не только с шейдерами. Начиная с версии 3.5 и выше разработчики изменили mesh формат. Аддон работает в 3.5-3.6 так как была оставлена обратная совместимость. Работоспособность в 4.0 под вопросом.

Если сейчас сказать, что аддон работает в 4.0, то пользователи столкнутся с проблемами и будут писать баг-репорты, которые я не смогу исправить из-за того, что у меня 4.0 не работает.

AziatkaVictor commented 10 months ago

@PavelBlend тогда может стоит сделать просто пред-релизную версию для 4.0? Или же просто сделать второстепенную ветку для этого? Я понимаю, что сейчас могут полететь баг-репорты, на которые ты не можешь повлиять, но мне кажется будет лучше дать возможность хотя бы пощупать новую версию.

И кстати, почему у тебя не работает 4.0? Это не придирка, просто интересно.

SamArtGit commented 10 months ago

И кстати, почему у тебя не работает 4.0?

А вот: https://github.com/PavelBlend/blender-xray/issues/708#issuecomment-1813118112

PavelBlend commented 10 months ago

может стоит сделать просто пред-релизную версию для 4.0? Или же просто сделать второстепенную ветку для этого?

@AziatkaVictor ну тогда сделаю ветку. Только я не могу проверить аддон на работоспособность и вносить изменения для 4.0. Могу только чужие pull request'ы принять.

По поводу твоего кода: может заменить bpy.app.version_string на bpy.app.version? Тогда не придётся использовать int. Вот пример:

if bpy.app.version >= (4, 0, 0):
    node.inputs['Specular IOR Level'].default_value = 0.0
else:
    node.inputs['Specular'].default_value = 0.0

И ещё, чтобы не дублировать код, можно создать функцию в io_scene_xray\utils\version.py, которая будет принимать Principled нод и менять ему значения:

def set_princp_specular(node):
    if bpy.app.version >= (4, 0, 0):
        node.inputs['Specular IOR Level'].default_value = 0.0
    else:
        node.inputs['Specular'].default_value = 0.0
AziatkaVictor commented 10 months ago

@PavelBlend идея отличная, на самом деле, даже сам хотел её предложить. Просто не хотелось умничать, ибо я в твоём проекте совсем немного разобрался. За совет спасибо, не знал, что можно таким образом через tuple проводить сравнения версий, поэтому сделал так.

В любом случае, сделай пред-релиз с версией для 4.0 и новый тег для Issues. Как я погляжу, тестеров у тебя будет достаточно. Ну и я считаю, что никого не обидит, если ошибки новой версии немного подождут или не будут решены вовсе. Все-таки, плагин некоммерческий, а пользоваться им очень хочется.

PavelBlend commented 10 months ago

@AziatkaVictor я запустил автоматические тесты на блендере 4.0 без GUI и посыпались другие ошибки:

  File "D:\git\blender-xray\io_scene_xray\log.py", line 284, in wrapper
    return method(self, context)
  File "D:\git\blender-xray\io_scene_xray\utils\stats.py", line 277, in wrapper
    result = method(self, context)
  File "D:\git\blender-xray\io_scene_xray\utils\ie.py", line 70, in wrapper
    result = method(self, context, *args)
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\ops.py", line 133, in execute
    main.export_file(
  File "D:\git\blender-xray\io_scene_xray\log.py", line 270, in wrap
    return func(*args, **kwargs)
  File "D:\git\blender-xray\io_scene_xray\utils\stats.py", line 238, in wrapper
    result = method(*args, **kwargs)
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\main.py", line 558, in export_file
    export_body(bpy_obj, writer, context)
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\main.py", line 547, in export_body
    export_main(bpy_obj, writer, context)
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\main.py", line 530, in export_main
    materials, bone_writers, some_arm, bpy_root, uv_map_names = export_meshes(
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\main.py", line 312, in export_meshes
    if len(bpy_arm_obj.pose.bone_groups):
AttributeError: 'Pose' object has no attribute 'bone_groups'
  File "D:\git\blender-xray\tests\cases\test_object_export.py", line 548, in test_merge_objects
    bpy.ops.xray_export.object(
  File "C:\progs\blender\blender-4.0.1-windows-x64\4.0\scripts\modules\bpy\ops.py", line 109, in __call__
    ret = _op_call(self.idname_py(), kw)
RuntimeError: Error: Python: Traceback (most recent call last):
  File "D:\git\blender-xray\io_scene_xray\log.py", line 284, in wrapper
    return method(self, context)
  File "D:\git\blender-xray\io_scene_xray\utils\stats.py", line 277, in wrapper
    result = method(self, context)
  File "D:\git\blender-xray\io_scene_xray\utils\ie.py", line 70, in wrapper
    result = method(self, context, *args)
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\ops.py", line 133, in execute
    main.export_file(
  File "D:\git\blender-xray\io_scene_xray\log.py", line 270, in wrap
    return func(*args, **kwargs)
  File "D:\git\blender-xray\io_scene_xray\utils\stats.py", line 238, in wrapper
    result = method(*args, **kwargs)
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\main.py", line 558, in export_file
    export_body(bpy_obj, writer, context)
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\main.py", line 547, in export_body
    export_main(bpy_obj, writer, context)
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\main.py", line 530, in export_main
    materials, bone_writers, some_arm, bpy_root, uv_map_names = export_meshes(
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\main.py", line 255, in export_meshes
    merged_obj = merge_meshes(armature_meshes, bpy_arm_obj)
  File "D:\git\blender-xray\io_scene_xray\formats\obj\exp\main.py", line 112, in merge_meshes
    utils.obj.apply_obj_modifier(mod, context=override)
  File "D:\git\blender-xray\io_scene_xray\utils\obj.py", line 128, in apply_obj_modifier
    bpy.ops.object.modifier_apply(context, modifier=mod.name)
  File "C:\progs\blender\blender-4.0.1-windows-x64\4.0\scripts\modules\bpy\ops.py", line 106, in __call__
    C_exec, C_undo = _BPyOpsSubModOp._parse_args(args)
  File "C:\progs\blender\blender-4.0.1-windows-x64\4.0\scripts\modules\bpy\ops.py", line 60, in _parse_args
    raise ValueError("1-2 args execution context is supported")
ValueError: 1-2 args execution context is supported
  File "D:\git\blender-xray\tests\cases\test_ogf_export.py", line 216, in test_export_motions
    bpy.ops.pose.group_add()
  File "C:\progs\blender\blender-4.0.1-windows-x64\4.0\scripts\modules\bpy\ops.py", line 109, in __call__
    ret = _op_call(self.idname_py(), kw)
AttributeError: Calling operator "bpy.ops.pose.group_add" error, could not be found
  File "D:\git\blender-xray\tests\cases\test_ops.py", line 952, in test_level_shader_nodes
    bpy.ops.io_scene_xray.create_level_shader_nodes(mode='ACTIVE_LEVEL')
  File "C:\progs\blender\blender-4.0.1-windows-x64\4.0\scripts\modules\bpy\ops.py", line 109, in __call__
    ret = _op_call(self.idname_py(), kw)
RuntimeError: Error: Python: Traceback (most recent call last):
  File "D:\git\blender-xray\io_scene_xray\ops\level_shaders.py", line 796, in execute
    _create_shader_nodes(mat, shader_groups, self.light_format)
  File "D:\git\blender-xray\io_scene_xray\ops\level_shaders.py", line 665, in _create_shader_nodes
    _create_and_link_nodes(mat, diff_img, shader_groups, light_format)
  File "D:\git\blender-xray\io_scene_xray\ops\level_shaders.py", line 598, in _create_and_link_nodes
    group = _create_group_nodes(
  File "D:\git\blender-xray\io_scene_xray\ops\level_shaders.py", line 377, in _create_group_nodes
    tex_rgb = shader_group.inputs.new('NodeSocketColor', 'Texture Color')
AttributeError: 'ShaderNodeTree' object has no attribute 'inputs'
  File "D:\git\blender-xray\tests\cases\test_ops.py", line 706, in test_remove_rig
    bpy.ops.io_scene_xray.remove_rig()
  File "C:\progs\blender\blender-4.0.1-windows-x64\4.0\scripts\modules\bpy\ops.py", line 109, in __call__
    ret = _op_call(self.idname_py(), kw)
RuntimeError: Error: Python: Traceback (most recent call last):
  File "D:\git\blender-xray\io_scene_xray\utils\__init__.py", line 58, in wrapper
    result = method(self, context, *args)
  File "D:\git\blender-xray\io_scene_xray\ops\rig\remove_rig.py", line 85, in execute
    move_bones_on_first_layer(arm_obj)
  File "D:\git\blender-xray\io_scene_xray\ops\rig\remove_rig.py", line 59, in move_bones_on_first_layer
    bone.layers = layers
AttributeError: 'Bone' object has no attribute 'layers'
  File "D:\git\blender-xray\tests\cases\test_rig.py", line 13, in test_rig
    bpy.ops.io_scene_xray.create_connected_bones()
  File "C:\progs\blender\blender-4.0.1-windows-x64\4.0\scripts\modules\bpy\ops.py", line 109, in __call__
    ret = _op_call(self.idname_py(), kw)
RuntimeError: Error: Python: Traceback (most recent call last):
  File "D:\git\blender-xray\io_scene_xray\utils\__init__.py", line 58, in wrapper
    result = method(self, context, *args)
  File "D:\git\blender-xray\io_scene_xray\ops\rig\connect_bones.py", line 274, in execute
    connect_bones(arm, mesh_objects)
  File "D:\git\blender-xray\io_scene_xray\ops\rig\connect_bones.py", line 203, in connect_bones
    bone.layers = bone_layers
AttributeError: 'EditBone' object has no attribute 'layers'

Так что не знаю, стоит ли вообще над 4.0 работать.

И нужно ещё выяснить, будут ли ошибки в 3д окне при отрисовке шейпов и центров масс костей.

AziatkaVictor commented 9 months ago

@PavelBlend да, так как они переработали UI для слоёв костей тоже. Так что много чего стоит сделать, но оно того стоит.

PavelBlend commented 5 months ago

@AziatkaVictor привет. У меня по прежнему не запускается 4.0 и выше. Поэтому я даже не могу изучить его новые возможности и изменения. Посмотреть как всё работает, а не только читать в документации. И писать код мне придётся "в слепую", запуская блендер через консоль без UI (через cmd). Это долго. Поэтому я не смогу адаптировать аддон под 4.0+. Я закрою этот PR, так как доработать его я не могу. А то, что исправлено - это слишком мало. Аддон всё равно не будет полноценно работать.

AziatkaVictor commented 5 months ago

Поэтому я не смогу адаптировать аддон под 4.0+. Я закрою этот PR, так как доработать его я не могу. А то, что исправлено - это слишком мало. Аддон всё равно не будет полноценно работать.

Печально. Думаю, многие бы хотели использовать аддон вместе с 4.0, но да ладно. Это не такая огромная проблема.

А на счет изменений, я и не планировал полностью чинить аддон под 4.0, так как я особо и не разбираюсь в том, как он устроен и какие функции как должны работать. Этот фикс я делал исключительно для того, чтобы был минимально необходимый функционал для работы. Мне, как человеку, который работает над созданием уровней, было необходимо использовать импорт/экспорт *.object файлов, поэтому сделал для себя и выкатил коммит сюда.

Как я уже говорил, неплохим вариантом было бы все-таки создание бета-версии аддона, где будут тестироваться твои правки, через код и через других людей. В этом нет ничего такого, все-таки, аддон делается за спасибо, а реализован он очень даже грамотно.