armory/blender/material/shader_data.py
2016-12-13 01:09:17 +01:00

102 lines
3 KiB
Python

from material.shader import Shader
class ShaderData:
def __init__(self, material):
self.material = material
self.contexts = []
self.sd = {}
self.data = {}
self.data['shader_datas'] = [self.sd]
self.sd['name'] = material.name + '_data'
self.sd['vertex_structure'] = []
self.add_elem('pos', 3)
self.add_elem('nor', 3)
self.sd['contexts'] = []
def add_elem(self, name, size):
elem = { 'name': name, 'size': size }
self.sd['vertex_structure'].append(elem)
def add_context(self, props):
con = ShaderContext(self.material, self.sd, props)
self.sd['contexts'].append(con.get())
return con
def get(self):
return self.data
class ShaderContext:
def __init__(self, material, shader_data, props):
self.material = material
self.shader_data = shader_data
self.data = {}
self.data['name'] = props['name']
self.data['depth_write'] = props['depth_write']
self.data['compare_mode'] = props['compare_mode']
self.data['cull_mode'] = props['cull_mode']
self.data['texture_units'] = []
self.tunits = self.data['texture_units']
self.data['constants'] = []
self.constants = self.data['constants']
def get(self):
return self.data
def add_constant(self, ctype, name, link=None):
for c in self.constants:
if c['name'] == name:
return
c = { 'name': name, 'type': ctype }
if link != None:
c['link'] = link
self.constants.append(c)
def add_texture_unit(self, ctype, name, link=None):
for c in self.tunits:
if c['name'] == name:
return
c = { 'name': name }
if link != None:
c['link'] = link
self.tunits.append(c)
def vert(self):
self.data['vertex_shader'] = self.material.name + '_' + self.data['name'] + '.vert'
self.vert = Shader(self)
vs = self.shader_data['vertex_structure']
for e in vs:
self.vert.add_in('vec' + str(e['size']) + ' ' + e['name'])
return self.vert
def frag(self):
self.data['fragment_shader'] = self.material.name + '_' + self.data['name'] + '.frag'
self.frag = Shader(self)
self.frag.ins = self.vert.outs
self.frag.add_out('vec4 fragColor')
return self.frag
def geom(self):
self.data['geometry_shader'] = self.material.name + '_' + self.data['name'] + '.geom'
self.geom = Shader(self)
return self.geom
def tesc(self):
self.data['tesscontrol_shader'] = self.material.name + '_' + self.data['name'] + '.tesc'
self.tesc = Shader(self)
return self.tesc
def tese(self):
self.data['tesseval_shader'] = self.material.name + '_' + self.data['name'] + '.tese'
self.tese = Shader(self)
return self.tese