@ -91,85 +91,12 @@ public class ShaderNodeLoaderDelegate {
this . var = var ;
}
public void makeCondition ( ) {
var . setCondition ( null ) ;
for ( ShaderNode node : nodes ) {
String condition = null ;
for ( VariableMapping mapping : node . getInputMapping ( ) ) {
if ( mapping . getRightVariable ( ) . equals ( var ) ) {
if ( mapping . getCondition ( ) = = null ) {
condition = null ;
break ;
}
if ( condition = = null ) {
condition = "(" + mapping . getCondition ( ) + ")" ;
} else {
if ( ! condition . contains ( mapping . getCondition ( ) ) ) {
condition = condition + " || (" + mapping . getCondition ( ) + ")" ;
}
}
}
}
if ( node . getCondition ( ) = = null & & condition = = null ) {
var . setCondition ( null ) ;
return ;
}
if ( node . getCondition ( ) ! = null ) {
if ( condition = = null ) {
condition = node . getCondition ( ) ;
} else {
if ( ! condition . contains ( node . getCondition ( ) ) ) {
condition = "(" + node . getCondition ( ) + ") && (" + condition + ")" ;
}
}
}
if ( var . getCondition ( ) = = null ) {
var . setCondition ( condition ) ;
} else {
if ( ! var . getCondition ( ) . contains ( condition ) ) {
var . setCondition ( "(" + var . getCondition ( ) + ") || (" + condition + ")" ) ;
}
}
}
}
public final void addNode ( ShaderNode c ) {
if ( ! nodes . contains ( c ) ) {
nodes . add ( c ) ;
}
}
}
protected void computeConditions ( ) {
updateConditions ( vertexDeclaredUniforms ) ;
updateConditions ( fragmentDeclaredUniforms ) ;
updateConditions ( varyings ) ;
for ( DeclaredVariable v : varyings . values ( ) ) {
for ( ShaderNode sn : techniqueDef . getShaderNodes ( ) ) {
if ( sn . getDefinition ( ) . getType ( ) = = Shader . ShaderType . Vertex ) {
for ( VariableMapping mapping : sn . getInputMapping ( ) ) {
if ( mapping . getLeftVariable ( ) . equals ( v . var ) ) {
if ( mapping . getCondition ( ) = = null | | v . var . getCondition ( ) = = null ) {
mapping . setCondition ( v . var . getCondition ( ) ) ;
} else {
mapping . setCondition ( "(" + mapping . getCondition ( ) + ") || (" + v . var . getCondition ( ) + ")" ) ;
}
}
}
}
}
}
updateConditions ( attributes ) ;
// updateConditions(fragmentGlobals);
// vertexGlobal.makeCondition();
}
/ * *
* Read the ShaderNodesDefinitions block and returns a list of
* ShaderNodesDefinition This method is used by the j3sn loader
@ -603,13 +530,19 @@ public class ShaderNodeLoaderDelegate {
//multiplicity is not an int attempting to find for a material parameter.
MatParam mp = findMatParam ( multiplicity ) ;
if ( mp ! = null ) {
//It's tied to a material param, let's create a define and use this as the multiplicity
addDefine ( multiplicity , VarType . Int ) ;
multiplicity = multiplicity . toUpperCase ( ) ;
mapping . getLeftVariable ( ) . setMultiplicity ( multiplicity ) ;
//only declare the variable if the define is defined.
mapping . getLeftVariable ( ) . setCondition ( mergeConditions ( mapping . getLeftVariable ( ) . getCondition ( ) , "defined(" + multiplicity + ")" , "||" ) ) ;
} else {
throw new MatParseException ( "Wrong multiplicity for variable" + mapping . getLeftVariable ( ) . getName ( ) + ". " + multiplicity + " should be an int or a declared material parameter." , statement ) ;
}
}
right . setMultiplicity ( multiplicity ) ;
//the right variable must have the same multiplicity and the same condition.
right . setMultiplicity ( multiplicity ) ;
right . setCondition ( mapping . getLeftVariable ( ) . getCondition ( ) ) ;
}
dv = new DeclaredVariable ( right ) ;
map . put ( right . getName ( ) , dv ) ;
@ -713,7 +646,6 @@ public class ShaderNodeLoaderDelegate {
if ( right . getNameSpace ( ) . equals ( "Global" ) ) {
right . setType ( "vec4" ) ; //Globals are all vec4 for now (maybe forever...)
// updateCondition(right, mapping);
storeGlobal ( right , statement1 ) ;
} else if ( right . getNameSpace ( ) . equals ( "Attr" ) ) {
@ -721,7 +653,6 @@ public class ShaderNodeLoaderDelegate {
throw new MatParseException ( "Cannot have an attribute as input in a fragment shader" + right . getName ( ) , statement1 ) ;
}
updateVarFromAttributes ( mapping . getRightVariable ( ) , mapping ) ;
// updateCondition(mapping.getRightVariable(), mapping);
storeAttribute ( mapping . getRightVariable ( ) ) ;
} else if ( right . getNameSpace ( ) . equals ( "MatParam" ) ) {
MatParam param = findMatParam ( right . getName ( ) ) ;
@ -888,8 +819,6 @@ public class ShaderNodeLoaderDelegate {
if ( shaderNode . getDefinition ( ) . getType ( ) = = Shader . ShaderType . Vertex ) {
ShaderNodeVariable global = techniqueDef . getShaderGenerationInfo ( ) . getVertexGlobal ( ) ;
if ( global ! = null ) {
// global.setCondition(mergeConditions(global.getCondition(), var.getCondition(), "||"));
// var.setCondition(global.getCondition());
if ( ! global . getName ( ) . equals ( var . getName ( ) ) ) {
throw new MatParseException ( "A global output is already defined for the vertex shader: " + global . getName ( ) + ". vertex shader can only have one global output" , statement1 ) ;
}
@ -976,27 +905,6 @@ public class ShaderNodeLoaderDelegate {
return def ;
}
/ * *
* updates a variable condition form a mapping condition
*
* @param var the variable
* @param mapping the mapping
* /
// public void updateCondition(ShaderNodeVariable var, VariableMapping mapping) {
//
// String condition = mergeConditions(shaderNode.getCondition(), mapping.getCondition(), "&&");
//
// if (var.getCondition() == null) {
// if (!nulledConditions.contains(var.getNameSpace() + "." + var.getName())) {
// var.setCondition(condition);
// }
// } else {
// var.setCondition(mergeConditions(var.getCondition(), condition, "||"));
// if (var.getCondition() == null) {
// nulledConditions.add(var.getNameSpace() + "." + var.getName());
// }
// }
// }
/ * *
* store a varying
*
@ -1033,9 +941,6 @@ public class ShaderNodeLoaderDelegate {
* @return the merged condition
* /
public String mergeConditions ( String condition1 , String condition2 , String operator ) {
if ( operator . equals ( "||" ) & & ( condition1 = = null | | condition2 = = null ) ) {
return null ;
}
if ( condition1 ! = null ) {
if ( condition2 = = null ) {
return condition1 ;
@ -1058,8 +963,6 @@ public class ShaderNodeLoaderDelegate {
public void storeVariable ( ShaderNodeVariable variable , List < ShaderNodeVariable > varList ) {
for ( ShaderNodeVariable var : varList ) {
if ( var . getName ( ) . equals ( variable . getName ( ) ) ) {
// var.setCondition(mergeConditions(var.getCondition(), variable.getCondition(), "||"));
// variable.setCondition(var.getCondition());
return ;
}
}
@ -1094,12 +997,7 @@ public class ShaderNodeLoaderDelegate {
return nodeDefinitions ;
}
private void updateConditions ( Map < String , DeclaredVariable > map ) {
for ( DeclaredVariable declaredVariable : map . values ( ) ) {
declaredVariable . makeCondition ( ) ;
}
}
public void clear ( ) {
nodeDefinitions . clear ( ) ;
nodes . clear ( ) ;