Files
blender-portable-repo/scripts/addons/Substance3DInBlender/sbsar/callbacks.py
T
2026-03-17 14:30:01 -06:00

140 lines
5.1 KiB
Python

"""
Copyright (C) 2023 Adobe.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
# file: shader/callbacks.py
# brief: Callbacks for susbtance outputs and properties
# author Adobe - 3D & Immersive
# copyright 2023 Adobe Inc. All rights reserved.
import bpy
from ..thread_ops import SUBSTANCE_Threads
from ..sbsar.async_ops import _render_sbsar, _set_input_visibility
from ..utils import SUBSTANCE_Utils
from ..common import (
PRESET_CUSTOM,
Code_InputType,
Code_InputIdentifier,
Code_InputWidget,
Code_OutputSizeSuffix,
Code_Response
)
class SUBSTANCE_SbsarCallbacks():
# Output Size
@staticmethod
def on_linked_changed(self, context, parm_identifier):
if not hasattr(self, Code_InputIdentifier.outputsize.value + Code_OutputSizeSuffix.linked.value):
return
_linked = getattr(self, Code_InputIdentifier.outputsize.value + Code_OutputSizeSuffix.linked.value)
_new_width_width = getattr(self, Code_InputIdentifier.outputsize.value + Code_OutputSizeSuffix.width.value)
if _linked:
setattr(self, Code_InputIdentifier.outputsize.value + Code_OutputSizeSuffix.height.value, _new_width_width)
else:
SUBSTANCE_SbsarCallbacks.on_outputsize_changed(self, context, parm_identifier)
@staticmethod
def on_outputsize_changed(self, context, identifier):
if not self.callback["enabled"]:
return
_sbsar = context.scene.loaded_sbsars[context.scene.sbsar_index]
_graph = SUBSTANCE_Utils.get_selected_graph(context)
_preset = int(_graph.presets_list)
if not _graph.outputsize_exists:
return
_input = _graph.inputs[Code_InputIdentifier.outputsize.value]
_output_size_x = getattr(self, Code_InputIdentifier.outputsize.value + Code_OutputSizeSuffix.width.value)
_output_size_y = getattr(self, Code_InputIdentifier.outputsize.value + Code_OutputSizeSuffix.height.value)
_new_value = [int(_output_size_x), int(_output_size_y)]
from ..api import SUBSTANCE_Api
_result = SUBSTANCE_Api.sbsar_input_update(
context,
_sbsar,
_graph,
_input,
_new_value,
SUBSTANCE_SbsarCallbacks.on_input_update
)
if _result[0] == Code_Response.success:
_new_preset_value = SUBSTANCE_Utils.update_preset_outputsize(
_graph.presets[_preset].value,
_input,
Code_InputType.integer2.value,
_new_value
)
_graph.presets[_preset].value = _new_preset_value
# Parameters
@staticmethod
def on_input_update(context, sbsar, graph, input, value):
_value = SUBSTANCE_Utils.value_fix_type(input.identifier, input.guiWidget, input.type, value)
if input.guiWidget == Code_InputWidget.image.value:
if _value == "":
_value = "NONE"
else:
_filepath = bpy.data.images[_value].filepath
if _filepath == "":
_filepath = SUBSTANCE_Utils.render_image_input(bpy.data.images[_value], bpy.context)
_value = _filepath
from ..api import SUBSTANCE_Api
_result = SUBSTANCE_Api.sbsar_input_set(sbsar, graph, input, _value)
if context is not None and _result[0] == Code_Response.success:
SUBSTANCE_Threads.alt_thread_run(_set_input_visibility, (
sbsar,
graph,
_result[1]["data"]["inputs"]))
SUBSTANCE_Threads.alt_thread_run(_render_sbsar, (
context,
sbsar,
int(graph.index)))
graph.presets[PRESET_CUSTOM].value = _result[1]["data"]["preset"]
return _result
@staticmethod
def on_input_changed(self, context, identifier):
if not self.callback["enabled"]:
return
_sbsar = context.scene.loaded_sbsars[context.scene.sbsar_index]
_graph = SUBSTANCE_Utils.get_selected_graph(context)
_preset = int(_graph.presets_list)
if _graph.presets[_preset].name != PRESET_CUSTOM:
_graph.preset_callback = False
_graph.presets_list = _graph.presets[PRESET_CUSTOM].index
_graph.preset_callback = True
_input = _graph.inputs[identifier]
_new_value = getattr(self, identifier)
from ..api import SUBSTANCE_Api
SUBSTANCE_Api.sbsar_input_update(
context,
_sbsar,
_graph,
_input,
_new_value,
SUBSTANCE_SbsarCallbacks.on_input_update
)