123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- # coding:utf-8
- #!/usr/bin/python
- #
- # Copyright (c) Contributors to the Open 3D Engine Project.
- # For complete copyright and license terms please see the LICENSE at the root of this distribution.
- #
- # SPDX-License-Identifier: Apache-2.0 OR MIT
- #
- # -- This line is 75 characters -------------------------------------------
- """Empty Doc String""" # To Do: add documentation
- # -------------------------------------------------------------------------
- # built-ins
- import os
- import sys
- #import simplejson as json
- import json
- # Lumberyard extensions
- from azpy.env_bool import env_bool
- from azpy.constants import ENVAR_DCCSI_GDEBUG
- from azpy.constants import ENVAR_DCCSI_DEV_MODE
- from azpy.constants import *
- # 3rdparty (we provide)
- from box import Box
- from pathlib import Path
- # -------------------------------------------------------------------------
- # -------------------------------------------------------------------------
- # set up global space, logging etc.
- _DCCSI_GDEBUG = env_bool(ENVAR_DCCSI_GDEBUG, False)
- _DCCSI_DEV_MODE = env_bool(ENVAR_DCCSI_DEV_MODE, False)
- _PACKAGENAME = __name__
- if _PACKAGENAME == '__main__':
- _PACKAGENAME = 'DCCsi.SDK.substance.builder.atom_material'
- import azpy
- _LOGGER = azpy.initialize_logger(_PACKAGENAME)
- _LOGGER.debug('Starting up: {0}.'.format({_PACKAGENAME}))
- # -------------------------------------------------------------------------
- # -------------------------------------------------------------------------
- # early attach WingIDE debugger (can refactor to include other IDEs later)
- if _DCCSI_DEV_MODE:
- from azpy.test.entry_test import connect_wing
- foo = connect_wing()
- # -------------------------------------------------------------------------
- # -------------------------------------------------------------------------
- # previous
- class AtomPBR:
- def __init__(self, material_file):
- # loading .material File
- self.material_file = material_file
- self.input_data = open(self.material_file, "r")
- self.material = json.load(self.input_data)
- self.mat_box = Box(self.material)
- self.input_data.close()
- # List of texture slots
- self.tex = ['baseColor', 'metallic', 'roughness', 'normalMap', 'opacity']
- # Construct texture maps
- self.basecolor_tex = ""
- self.metallic_tex = ""
- self.roughness_tex = ""
- self.normalmap_tex = ""
- self.opacity_tex = ""
- def load(self, material_file):
- input_data = open(material_file, "r")
- self.material = json.load(input_data)
- self.mat_box = Box(self.material)
- input_data.close()
- def get_map(self, tex_slot):
- return self.mat_box.properties[tex_slot].parameters.textureMap
- def set_map(self, tex_slot, tex_map):
- self.mat_box.properties[tex_slot].parameters.textureMap = tex_map
- def write(self, material_out):
- output_data = open(material_out, "w+")
- output_data.write(json.dumps(self.mat_box, indent=4))
- output_data.close()
- # -------------------------------------------------------------------------
- # -------------------------------------------------------------------------
- # new?
- class AtomMaterial:
- def __init__(self, material_file):
- # loading .material File
- self.material_file = material_file
- self.input_data = open(self.material_file, "r")
- self.material = json.load(self.input_data)
- self.mat_box = Box(self.material)
- self.input_data.close()
- # List of texture slots
- # old tex maps
- # self.tex = ['DiffuseMap', 'NormalMap', 'SpecularMap', 'EnvironmentMap']
- self.tex = ['baseColor', 'metallic', 'roughness', 'specularF0', 'normal', 'opacity']
- self.texture_map = {'baseColor': 'baseColor',
- 'metallic': 'metallic',
- 'roughness': 'roughness',
- 'specularF0': 'specular',
- 'normal': 'normal',
- 'opacity': 'opacity'
- }
- def load(self, material_file):
- input_data = open(material_file, "r")
- self.material = json.load(input_data)
- self.mat_box = Box(self.material)
- input_data.close()
- def get_material_type(self):
- return self.mat_box.materialType
- # old getMap function
- # def getMap(self, tex_slot):
- # return self.mat_box.properties.general[tex_slot]
- def get_map(self, tex_slot):
- return self.mat_box.properties[tex_slot].textureMap
- def set_map(self, tex_slot, tex_map):
- self.mat_box.properties[tex_slot].textureMap = tex_map
- self.mat_box.properties[tex_slot].useTexture = True
- self.mat_box.properties[tex_slot].factor = 1.0
- def write(self, material_out):
- if not material_out.parent.exists():
- try:
- material_out.parent.mkdir(mode=0o777, parents=True, exist_ok=True)
- _LOGGER.info('mkdir: {}'.format(material_out.parent))
- except Exception as e:
- _LOGGER.error(e)
- raise(e)
- else:
- _LOGGER.info('exists: {}'.format(material_out.parent))
-
- material_out.touch()
- output_data = open(str(material_out), "w+")
- output_data.write(json.dumps(self.mat_box, indent=4))
- output_data.close()
- return material_out
- # -------------------------------------------------------------------------
- ###########################################################################
- # Main Code Block, runs this script as main (testing)
- # -------------------------------------------------------------------------
- if __name__ == "__main__":
- """Run this file as main"""
- _LOGGER.info("Test Run:: {0}.".format({_PACKAGENAME}))
- _LOGGER.info("{0} :: if __name__ == '__main__':".format(_PACKAGENAME))
- material_path = Path(Path(__file__).parent.parent, 'resources', 'atom')
- # material_01 = AtomPBR("atom_pbr.material", "awesome.material")
- # material_01 = AtomPBR("atom_pbr.material")
- material_01 = AtomMaterial(Path(material_path, "StandardPBR_AllProperties.json"))
- # material_01.load("atom_pbr.material")
- # material_01.map(material_01.tex[2]).textureMap = "materials/substance/amazing_xzzzx.tif"
- # # print(material_01.metallic)
- # material_01.write("awesome.material")
- # print(material_01.tex[2])
- # print(material_01.getMap(material_01.tex[3]))
- # material_01.baesColor_tex = "materials/substance/amazing_bc.tif"
- # material_01.setMap(material_01.tex[0], material_01.baesColor_tex)
- # material_01.write("awesome.material")
- # Test material parser for the new format.
- material_01.baseColor_tex = "Textures/Streaming/streaming99.dds"
- material_01.metallic_tex = "Textures/Streaming/streaming99.dds"
- material_01.set_map(material_01.tex[0], material_01.baseColor_tex)
- material_01.set_map(material_01.tex[1], material_01.metallic_tex)
- material_out = material_01.write(Path(material_path, "atom_variant00.material"))
- _LOGGER.info('materialType is:: {}'.format(material_01.get_material_type()))
- if material_out.exists():
- _LOGGER.info('Wrote material file: {}'.format(material_out))
-
- # remove the logger
- del _LOGGER
- # ---- END ---------------------------------------------------------------
|