armory/blender/arm/assets.py

207 lines
6 KiB
Python
Raw Normal View History

2016-10-19 13:28:06 +02:00
import shutil
import os
2017-10-21 16:09:06 +02:00
import stat
2017-01-18 14:52:51 +01:00
import bpy
2020-04-17 00:58:26 +02:00
import arm.log as log
2017-03-15 12:30:14 +01:00
import arm.utils
2016-10-19 13:28:06 +02:00
if arm.is_reload(__name__):
2021-08-04 22:49:38 +02:00
log = arm.reload_module(log)
arm.utils = arm.reload_module(arm.utils)
else:
arm.enable_reload(__name__)
2021-08-04 22:49:38 +02:00
2016-07-19 19:42:46 +02:00
assets = []
2017-11-23 22:05:07 +01:00
reserved_names = ['return.']
2019-05-10 18:29:59 +02:00
khafile_params = []
2016-07-28 13:21:27 +02:00
khafile_defs = []
2017-01-18 14:52:51 +01:00
khafile_defs_last = []
2016-09-14 11:49:32 +02:00
embedded_data = []
shaders = []
2017-01-18 14:52:51 +01:00
shaders_last = []
2018-02-16 17:12:19 +01:00
shaders_external = []
shader_datas = []
2017-12-13 14:21:42 +01:00
shader_passes = []
2017-12-20 15:37:58 +01:00
shader_passes_assets = {}
shader_cons = {}
2016-07-19 19:42:46 +02:00
def reset():
global assets
2019-05-10 18:29:59 +02:00
global khafile_params
global khafile_defs
2017-01-18 14:52:51 +01:00
global khafile_defs_last
global embedded_data
global shaders
2017-01-18 14:52:51 +01:00
global shaders_last
2018-02-16 17:12:19 +01:00
global shaders_external
global shader_datas
2018-01-02 17:03:20 +01:00
global shader_passes
2017-12-20 15:37:58 +01:00
global shader_cons
assets = []
2019-05-10 18:29:59 +02:00
khafile_params = []
2017-01-18 14:52:51 +01:00
khafile_defs_last = khafile_defs
khafile_defs = []
embedded_data = []
2017-01-18 14:52:51 +01:00
shaders_last = shaders
shaders = []
2018-02-16 17:12:19 +01:00
shaders_external = []
shader_datas = []
2017-12-13 14:21:42 +01:00
shader_passes = []
2017-12-20 15:37:58 +01:00
shader_cons = {}
shader_cons['mesh_vert'] = []
shader_cons['depth_vert'] = []
shader_cons['depth_frag'] = []
shader_cons['voxel_vert'] = []
shader_cons['voxel_frag'] = []
shader_cons['voxel_geom'] = []
2016-07-19 19:42:46 +02:00
def add(asset_file):
global assets
# Asset already exists, do nothing
if asset_file in assets:
2018-02-24 12:16:11 +01:00
return
asset_file_base = os.path.basename(asset_file)
2018-02-24 12:16:11 +01:00
for f in assets:
f_file_base = os.path.basename(f)
if f_file_base == asset_file_base:
2021-09-09 14:22:14 +02:00
log.warn(f'Asset name "{asset_file_base}" already exists, skipping')
2018-02-24 12:16:11 +01:00
return
assets.append(asset_file)
2018-02-24 12:16:11 +01:00
# Reserved file name
for f in reserved_names:
if f in asset_file:
2021-09-09 14:22:14 +02:00
log.warn(f'File "{asset_file}" contains reserved keyword, this will break C++ builds!')
2016-07-28 13:21:27 +02:00
def add_khafile_def(d):
global khafile_defs
if d not in khafile_defs:
khafile_defs.append(d)
2016-09-14 11:49:32 +02:00
2019-05-10 18:29:59 +02:00
def add_khafile_param(p):
global khafile_params
if p not in khafile_params:
khafile_params.append(p)
2016-09-14 11:49:32 +02:00
def add_embedded_data(file):
global embedded_data
if file not in embedded_data:
embedded_data.append(file)
def add_shader(file):
global shaders
2017-01-18 14:52:51 +01:00
global shaders_last
if file not in shaders:
shaders.append(file)
def add_shader_data(file):
global shader_datas
if file not in shader_datas:
shader_datas.append(file)
2016-10-17 00:02:51 +02:00
2017-12-13 14:21:42 +01:00
def add_shader_pass(data_name):
global shader_passes
# Shader data for passes are written into single shader_datas.arm file
2018-08-16 20:48:00 +02:00
add_shader_data(arm.utils.get_fp_build() + '/compiled/Shaders/shader_datas.arm')
2017-12-13 14:21:42 +01:00
if data_name not in shader_passes:
shader_passes.append(data_name)
2016-10-19 13:28:06 +02:00
2018-02-16 17:12:19 +01:00
def add_shader_external(file):
global shaders_external
shaders_external.append(file)
name = file.split('/')[-1].split('\\')[-1]
2018-08-16 20:48:00 +02:00
add_shader(arm.utils.get_fp_build() + '/compiled/Shaders/' + name)
2018-02-16 17:12:19 +01:00
2016-10-19 13:28:06 +02:00
invalidate_enabled = True # Disable invalidating during build process
2017-10-21 16:07:08 +02:00
def remove_readonly(func, path, excinfo):
os.chmod(path, stat.S_IWRITE)
func(path)
2016-10-19 13:28:06 +02:00
def invalidate_shader_cache(self, context):
# compiled.inc changed, recompile all shaders next time
2016-10-19 13:28:06 +02:00
global invalidate_enabled
if invalidate_enabled == False:
return
2017-05-23 01:03:44 +02:00
fp = arm.utils.get_fp_build()
if os.path.isdir(fp + '/compiled/Shaders'):
2017-10-21 16:07:08 +02:00
shutil.rmtree(fp + '/compiled/Shaders', onerror=remove_readonly)
if os.path.isdir(fp + '/debug/html5-resources'):
shutil.rmtree(fp + '/debug/html5-resources', onerror=remove_readonly)
2017-11-13 15:57:23 +01:00
if os.path.isdir(fp + '/krom-resources'):
shutil.rmtree(fp + '/krom-resources', onerror=remove_readonly)
if os.path.isdir(fp + '/debug/krom-resources'):
shutil.rmtree(fp + '/debug/krom-resources', onerror=remove_readonly)
2017-11-13 16:36:58 +01:00
if os.path.isdir(fp + '/windows-resources'):
shutil.rmtree(fp + '/windows-resources', onerror=remove_readonly)
if os.path.isdir(fp + '/linux-resources'):
shutil.rmtree(fp + '/linux-resources', onerror=remove_readonly)
if os.path.isdir(fp + '/osx-resources'):
shutil.rmtree(fp + '/osx-resources', onerror=remove_readonly)
2016-10-19 13:28:06 +02:00
def invalidate_compiled_data(self, context):
global invalidate_enabled
if invalidate_enabled == False:
return
2017-05-23 01:03:44 +02:00
fp = arm.utils.get_fp_build()
2017-12-20 10:19:44 +01:00
if os.path.isdir(fp + '/compiled'):
shutil.rmtree(fp + '/compiled', onerror=remove_readonly)
2016-10-19 13:28:06 +02:00
def invalidate_mesh_data(self, context):
2017-05-23 01:03:44 +02:00
fp = arm.utils.get_fp_build()
if os.path.isdir(fp + '/compiled/Assets/meshes'):
2017-10-21 16:07:08 +02:00
shutil.rmtree(fp + '/compiled/Assets/meshes', onerror=remove_readonly)
2016-11-08 11:45:25 +01:00
def invalidate_envmap_data(self, context):
2017-05-23 01:03:44 +02:00
fp = arm.utils.get_fp_build()
if os.path.isdir(fp + '/compiled/Assets/envmaps'):
2017-10-21 16:07:08 +02:00
shutil.rmtree(fp + '/compiled/Assets/envmaps', onerror=remove_readonly)
2017-12-20 15:37:58 +01:00
2018-03-13 18:23:00 +01:00
def invalidate_unpacked_data(self, context):
fp = arm.utils.get_fp_build()
if os.path.isdir(fp + '/compiled/Assets/unpacked'):
shutil.rmtree(fp + '/compiled/Assets/unpacked', onerror=remove_readonly)
2019-01-04 15:02:53 +01:00
def invalidate_mesh_cache(self, context):
if context.object == None or context.object.data == None:
return
context.object.data.arm_cached = False
def invalidate_instance_cache(self, context):
if context.object == None or context.object.data == None:
return
invalidate_mesh_cache(self, context)
for slot in context.object.material_slots:
slot.material.arm_cached = False
def invalidate_compiler_cache(self, context):
bpy.data.worlds['Arm'].arm_recompile = True
2017-12-20 15:37:58 +01:00
def shader_equal(sh, ar, shtype):
# Merge equal shaders
for e in ar:
if sh.is_equal(e):
sh.context.data[shtype] = e.context.data[shtype]
sh.is_linked = True
return
ar.append(sh)
def vs_equal(c, ar):
shader_equal(c.vert, ar, 'vertex_shader')
def fs_equal(c, ar):
shader_equal(c.frag, ar, 'fragment_shader')
def gs_equal(c, ar):
shader_equal(c.geom, ar, 'geometry_shader')
def tcs_equal(c, ar):
shader_equal(c.tesc, ar, 'tesscontrol_shader')
def tes_equal(c, ar):
shader_equal(c.tese, ar, 'tesseval_shader')