Update runtime materials

This commit is contained in:
Lubos Lenco 2017-05-25 20:14:53 +02:00
parent 9d9f39aeb4
commit 517a79d8c1
2 changed files with 45 additions and 44 deletions

View file

@ -60,7 +60,6 @@ class ShaderData {
sd = {
name: matname + '_data',
vertex_structure: [],
contexts: []
};
@ -69,28 +68,6 @@ class ShaderData {
};
}
public function add_elem(name:String, size:Int) {
for (e in sd.vertex_structure) {
if (e.name == name) return;
}
var elem:TVertexData = { name: name, size: size };
sd.vertex_structure.push(elem);
}
public function is_elem(name:String) {
for (elem in sd.vertex_structure)
if (elem.name == name)
return true;
return false;
}
public function get_elem(name:String):TVertexData {
for (elem in sd.vertex_structure)
if (elem.name == name)
return elem;
return null;
}
public function add_context(props:Dynamic):ShaderContext {
var con = new ShaderContext(this, material, sd, props);
// if con not in self.sd['contexts']:
@ -99,16 +76,6 @@ class ShaderData {
}
public function get() {
// TODO: temporary, Sort vertex data
// for sd in self.data['shader_datas']:
var vs:Array<TVertexData> = [];
var ar = ['pos', 'nor', 'tex', 'tex1', 'col', 'tang', 'bone', 'weight', 'off'];
for (ename in ar) {
var elem = get_elem(ename);
if (elem != null)
vs.push(elem);
}
sd.vertex_structure = vs;
return data;
}
}
@ -139,7 +106,8 @@ class ShaderContext {
compare_mode: props.compare_mode,
cull_mode: props.cull_mode,
fragment_shader: '',
vertex_shader: ''
vertex_shader: '',
vertex_structure: Reflect.hasField(props, 'vertex_structure') ? props.vertex_structure : [ {"name": "pos", "size": 3}, {"name": "nor", "size": 3}]
};
// if 'blend_source' in props:
@ -170,9 +138,40 @@ class ShaderContext {
}
public function get() {
// TODO: Sort vertex data
var vs:Array<TVertexData> = [];
var ar = ['pos', 'nor', 'tex', 'tex1', 'col', 'tang', 'bone', 'weight', 'off'];
for (ename in ar) {
var elem = get_elem(ename);
if (elem != null)
vs.push(elem);
}
data.vertex_structure = vs;
return data;
}
public function add_elem(name:String, size:Int) {
for (e in data.vertex_structure) {
if (e.name == name) return;
}
var elem:TVertexData = { name: name, size: size };
data.vertex_structure.push(elem);
}
public function is_elem(name:String) {
for (elem in data.vertex_structure)
if (elem.name == name)
return true;
return false;
}
public function get_elem(name:String):TVertexData {
for (elem in data.vertex_structure)
if (elem.name == name)
return elem;
return null;
}
public function add_constant(ctype:String, name:String, link:String = null) {
for (c in constants)
if (c.name == name)
@ -343,7 +342,7 @@ class Shader {
var out_ext = '';
if (shader_type == 'vert' && vertex_structure_as_vsinput) {
var vs = context.shader_data.vertex_structure;
var vs = context.data.vertex_structure;
for (e in vs) {
add_in('vec' + e.size + ' ' + e.name);
}
@ -399,6 +398,7 @@ typedef TShaderOut = {
class Cycles {
static var con:ShaderContext;
static var vert:Shader;
static var frag:Shader;
static var geom:Shader;
@ -450,12 +450,13 @@ class Cycles {
return ls;
}
public static function parse(canvas:TNodeCanvas, _vert:Shader, _frag:Shader, _geom:Shader, _tesc:Shader, _tese:Shader, _matcon:TMaterialContext):TShaderOut {
public static function parse(canvas:TNodeCanvas, _con:ShaderContext, _vert:Shader, _frag:Shader, _geom:Shader, _tesc:Shader, _tese:Shader, _matcon:TMaterialContext):TShaderOut {
nodes = canvas.nodes;
links = canvas.links;
parsed = [];
con = _con;
vert = _vert;
frag = _frag;
geom = _geom;
@ -826,7 +827,7 @@ class Cycles {
// else if (node.type == 'ATTRIBUTE') {
// # Vcols only for now
// # node.attribute_name
// c_state.mat_add_elem('col', 3)
// con.add_elem('col', 3)
// return 'vcolor'
// }
@ -1108,7 +1109,7 @@ class Cycles {
// global parse_teximage_vector
matcon.bind_textures.push(tex);
curshader.context.sdata.add_elem('tex', 2);
curshader.context.add_elem('tex', 2);
curshader.add_uniform('sampler2D $tex_name');
var uv_name = '';
// if (isInputLinked(node.inputs[0]) and parse_teximage_vector:
@ -1137,7 +1138,7 @@ class Cycles {
// elif node.type == 'ATTRIBUTE':
// # UVMaps only for now
// c_state.mat_add_elem('tex', 2)
// con.add_elem('tex', 2)
// mat = c_state.mat_get_material()
// mat_users = c_state.mat_get_material_users()
// if mat_users != None and mat in mat_users:
@ -1146,7 +1147,7 @@ class Cycles {
// lays = mat_user.data.uv_layers
// # Second uvmap referenced
// if len(lays) > 1 and node.attribute_name == lays[1].name:
// c_state.mat_add_elem('tex1', 2)
// con.add_elem('tex1', 2)
// return 'texCoord1', 2
// return 'texCoord', 2
@ -1193,7 +1194,7 @@ class Cycles {
// elif socket == node.outputs[1]: # Normal
// return 'vec2(0.0)', 2
// elif socket == node.outputs[2]: # UV
// c_state.mat_add_elem('tex', 2)
// con.add_elem('tex', 2)
// return 'texCoord', 2
// elif socket == node.outputs[3]: # Object
// return 'vec2(0.0)', 2
@ -1293,7 +1294,7 @@ class Cycles {
// frag.write('vec3 n = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
// # frag.write('n = normalize(TBN * normalize(n));')
// frag.write('n = TBN * normalize(n);')
// c_state.mat_add_elem('tang', 3)
// con.add_elem('tang', 3)
// parse_teximage_vector = True
// frag.write_pre = False

View file

@ -122,7 +122,7 @@ def make_base(con_mesh, parse_opacity):
written = False
if write_material_attribs != None:
written = write_material_attribs(frag)
written = write_material_attribs(con_mesh, frag)
if written == False:
frag.write('vec3 basecol;')
frag.write('float roughness;')
@ -132,7 +132,7 @@ def make_base(con_mesh, parse_opacity):
frag.write('float opacity;')
cycles.parse(mat_state.nodes, con_mesh, vert, frag, geom, tesc, tese, parse_opacity=parse_opacity)
if write_material_attribs_post != None:
write_material_attribs_post(frag)
write_material_attribs_post(con_mesh, frag)
if con_mesh.is_elem('tex'):
vert.add_out('vec2 texCoord')