armory/blender/arm/material/make.py

81 lines
3 KiB
Python
Raw Normal View History

2016-12-17 15:34:43 +01:00
import bpy
2017-03-15 12:30:14 +01:00
import arm.utils
import arm.material.make_shader as make_shader
import arm.material.mat_batch as mat_batch
import arm.material.mat_state as mat_state
import arm.material.texture as texture
2017-03-14 20:43:54 +01:00
def glsltype(t): # Merge with cycles
if t == 'RGB' or t == 'RGBA' or t == 'VECTOR':
return 'vec3'
else:
return 'float'
def glslvalue(val):
if str(type(val)) == "<class 'bpy_prop_array'>":
res = []
for v in val:
res.append(v)
return res
else:
return val
2017-02-09 22:52:47 +01:00
2017-02-15 16:55:46 +01:00
def parse(material, mat_data, mat_users, mat_armusers, rid):
2016-12-19 01:25:22 +01:00
wrd = bpy.data.worlds['Arm']
2016-12-13 01:09:17 +01:00
2017-03-14 20:43:54 +01:00
# No batch - shader data per material
if not wrd.arm_batch_materials or material.name.startswith('armdefault'):
rpasses, shader_data, shader_data_name, bind_constants, bind_textures = make_shader.build(material, mat_users, mat_armusers, rid)
else:
rpasses, shader_data, shader_data_name, bind_constants, bind_textures = mat_batch.get(material)
2016-12-13 01:09:17 +01:00
2017-03-14 20:43:54 +01:00
# Material
2016-12-19 01:25:22 +01:00
for rp in rpasses:
2017-03-14 20:43:54 +01:00
2016-12-19 01:25:22 +01:00
c = {}
c['name'] = rp
2017-03-14 20:43:54 +01:00
c['bind_constants'] = [] + bind_constants[rp]
c['bind_textures'] = [] + bind_textures[rp]
mat_data['contexts'].append(c)
2016-12-17 15:34:43 +01:00
2016-12-19 01:25:22 +01:00
if rp == 'mesh':
const = {}
const['name'] = 'receiveShadow'
const['bool'] = material.receive_shadow
c['bind_constants'].append(const)
2016-12-13 01:09:17 +01:00
2017-03-14 20:43:54 +01:00
# TODO: Mesh only material batching
if wrd.arm_batch_materials:
# Set textures uniforms
if len(c['bind_textures']) > 0:
c['bind_textures'] = []
for node in material.node_tree.nodes:
if node.type == 'TEX_IMAGE':
2017-03-15 12:30:14 +01:00
tex_name = arm.utils.safe_source_name(node.name)
2017-03-14 20:43:54 +01:00
tex = texture.make_texture(node, tex_name)
if tex == None: # Empty texture
tex = {}
tex['name'] = tex_name
tex['file'] = ''
c['bind_textures'].append(tex)
# Set marked inputs as uniforms
for node in material.node_tree.nodes:
for inp in node.inputs:
if inp.is_uniform:
2017-03-15 12:30:14 +01:00
uname = arm.utils.safe_source_name(inp.node.name) + arm.utils.safe_source_name(inp.name) # Merge with cycles
2017-03-14 20:43:54 +01:00
const = {}
const['name'] = uname
const[glsltype(inp.type)] = glslvalue(inp.default_value)
c['bind_constants'].append(const)
2016-12-15 00:18:59 +01:00
2016-12-19 01:25:22 +01:00
elif rp == 'translucent':
2016-12-17 15:34:43 +01:00
const = {}
const['name'] = 'receiveShadow'
const['bool'] = material.receive_shadow
c['bind_constants'].append(const)
2017-03-14 20:43:54 +01:00
2016-12-17 15:34:43 +01:00
mat_data['shader'] = shader_data_name + '/' + shader_data_name
2017-03-14 20:43:54 +01:00
return shader_data.sd, rpasses