sbsar_info.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. # coding:utf-8
  2. #!/usr/bin/python
  3. #
  4. # Copyright (c) Contributors to the Open 3D Engine Project.
  5. # For complete copyright and license terms please see the LICENSE at the root of this distribution.
  6. #
  7. # SPDX-License-Identifier: Apache-2.0 OR MIT
  8. #
  9. # -- This line is 75 characters -------------------------------------------
  10. """Empty Doc String""" # To Do: add documentation
  11. # -------------------------------------------------------------------------
  12. # built-ins
  13. import os
  14. import sys
  15. import site
  16. import subprocess
  17. import logging
  18. # Lumberyard extensions
  19. from azpy.env_bool import env_bool
  20. from azpy.constants import ENVAR_DCCSI_GDEBUG
  21. from azpy.constants import ENVAR_DCCSI_DEV_MODE
  22. from azpy.constants import *
  23. # 3rdparty
  24. from unipath import Path
  25. import click
  26. # -------------------------------------------------------------------------
  27. # -------------------------------------------------------------------------
  28. # substance automation toolkit (aka pysbs)
  29. # To Do: manage with dynaconf environment
  30. _PYSBS_DIR_PATH = Path(PATH_PROGRAMFILES_X64,
  31. 'Allegorithmic',
  32. 'Substance Automation Toolkit',
  33. 'Python API',
  34. 'install').resolve()
  35. site.addsitedir(str(_PYSBS_DIR_PATH)) # 'install' is the folder I created
  36. # Susbstance
  37. import pysbs.batchtools as pysbs_batch
  38. import pysbs.context as pysbs_context
  39. # -------------------------------------------------------------------------
  40. # -------------------------------------------------------------------------
  41. # set up global space, logging etc.
  42. _DCCSI_GDEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False)
  43. _DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False)
  44. _PACKAGENAME = __name__
  45. if _PACKAGENAME == '__main__':
  46. _PACKAGENAME = 'DCCsi.SDK.substance.builder.sbsar_info'
  47. import azpy
  48. _LOGGER = azpy.initialize_logger(_PACKAGENAME)
  49. _LOGGER.debug('Starting up: {0}.'.format({_PACKAGENAME}))
  50. # -------------------------------------------------------------------------
  51. # -------------------------------------------------------------------------
  52. # global space debug flag
  53. _DCCSI_GDEBUG = os.getenv(ENVAR_DCCSI_GDEBUG, False)
  54. # global space debug flag
  55. _DCCSI_DEV_MODE = os.getenv(ENVAR_DCCSI_DEV_MODE, False)
  56. _MODULE_PATH = Path(__file__)
  57. _ORG_TAG = 'Amazon_Lumberyard'
  58. _APP_TAG = 'DCCsi'
  59. _TOOL_TAG = 'sdk.substance.builder.sbsar_info'
  60. _TYPE_TAG = 'module'
  61. _MODULENAME = __name__
  62. if _MODULENAME == '__main__':
  63. _MODULENAME = _TOOL_TAG
  64. # -------------------------------------------------------------------------
  65. # -------------------------------------------------------------------------
  66. # Defining CONSTANTS
  67. # To Do: shouldn't need this _BASE_ENVVAR_DICT (replace with dynaconf config)
  68. from collections import OrderedDict
  69. _SYNTH_ENV_DICT = OrderedDict()
  70. _SYNTH_ENV_DICT = azpy.synthetic_env.stash_env(_SYNTH_ENV_DICT)
  71. # grab a specific path from the base_env
  72. _PATH_DCCSI = _SYNTH_ENV_DICT[ENVAR_PATH_DCCSIG]
  73. _PATH_O3DE_PROJECT = _SYNTH_ENV_DICT[ENVAR_PATH_O3DE_PROJECT]
  74. # build some reuseable path parts
  75. _PATH_MOCK_ASSETS = Path(_PATH_O3DE_PROJECT, 'Assets').norm()
  76. _PATH_MOCK_SUBLIB = Path(_PATH_MOCK_ASSETS, 'SubstanceSource').norm()
  77. _PATH_MOCK_SBS = Path(_PATH_MOCK_SUBLIB, 'sbs').norm()
  78. _PATH_MOCK_SBSAR = Path(_PATH_MOCK_SUBLIB, 'sbsar').norm()
  79. _PATH_MOCK_MAT = Path(_PATH_MOCK_ASSETS, 'Textures').norm()
  80. _PATH_MOCK_MAT_SUB = Path(_PATH_MOCK_MAT, 'Substance').norm()
  81. # this will combine two parts into a single path (object)
  82. # It also returnd the fixed-up version (norm)
  83. _PATH_INPUT_SBS = Path(_PATH_MOCK_SBS, 'bronze_yellow.sbs').norm()
  84. _PATH_COOK_OUTPUT = _PATH_MOCK_SBSAR.norm()
  85. _PATH_RENDER_OUTPUT = _PATH_MOCK_MAT_SUB
  86. # quick test variables, will be removed
  87. _PYSBS_CONTEXT = pysbs_context.Context()
  88. # --------------------------------------------------------------------------
  89. # --------------------------------------------------------------------------
  90. def output_info(_outputCookPath, _outputName):
  91. """ SBSAR information"""
  92. info_lists = []
  93. input_n_output = pysbs_batch.sbsrender_info(input=os.path.join(_outputCookPath, _outputName + '.sbsar'),
  94. stdout=subprocess.PIPE)
  95. for info_list in input_n_output.stdout.read().splitlines():
  96. info_lists.append(info_list.decode('utf-8'))
  97. _outputs, _params, _presets, _inputs, _input, _input_type = [], [], [], [], [], []
  98. for info_list in info_lists:
  99. if 'OUTPUT' in info_list:
  100. _outputs.append(info_list.split(' ')[3])
  101. elif 'INPUT $' in info_list:
  102. _params.append(info_list.split(' ')[3:])
  103. elif 'PRESET' in info_list:
  104. _presets.append(info_list.split('PRESET ')[1])
  105. elif 'INPUT' in info_list and (not '$'in info_list):
  106. _inputs.append(info_list.split(' ')[3:])
  107. _input.append(info_list.split(' ')[3:][0])
  108. _input_type.append(info_list.split(' ')[3:][1])
  109. info_list = {'texmaps': _outputs,
  110. 'params': _params,
  111. 'presets': _presets,
  112. 'inputs': _inputs,
  113. 'input': _input,
  114. 'input_type': _input_type}
  115. return info_list
  116. # --------------------------------------------------------------------------
  117. # --------------------------------------------------------------------------
  118. @click.command()
  119. @click.option('--sbsar_path', default=_PATH_COOK_OUTPUT, help='Sbsar directory.')
  120. @click.option('--sbsar_name', default=_PATH_INPUT_SBS.stem, help='Sbsar name.')
  121. @click.option('--output_type', default='inputs', help='Output Type: \n'
  122. 'texmaps | presets | inputs | input | input_type | params')
  123. def sbsar_info(sbsar_path, sbsar_name, output_type):
  124. click.echo(output_info(sbsar_path, sbsar_name)[output_type])
  125. ###########################################################################
  126. # Main Code Block, runs this script as main (testing)
  127. # -------------------------------------------------------------------------
  128. if __name__ == '__main__':
  129. """Run this file as main"""
  130. _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_PACKAGENAME))
  131. _LOGGER.debug("Test Run:: {0}.".format({_MODULENAME}))
  132. _LOGGER.debug("{0} :: if __name__ == '__main__':".format(_TOOL_TAG))
  133. _LOGGER.debug(sbsar_info())
  134. # remove the logger
  135. del _LOGGER
  136. # ---- END ---------------------------------------------------------------