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(); }
/** * reads a list of ShaderNode{} blocks * * @param statements the list of statements to parse * @throws IOException */ protected void readShaderNode(List<Statement> statements) throws IOException { for (Statement statement : statements) { String line = statement.getLine(); String[] split = statement.getLine().split("[ \\{]"); if (line.startsWith("Definition")) { ShaderNodeDefinition def = findDefinition(statement); shaderNode.setDefinition(def); if (def.isNoOutput()) { techniqueDef.getShaderGenerationInfo().getUnusedNodes().remove(shaderNode.getName()); } } else if (line.startsWith("Condition")) { String condition = line.substring(line.lastIndexOf(":") + 1).trim(); extractCondition(condition, statement); shaderNode.setCondition(conditionParser.getFormattedExpression()); } else if (line.startsWith("InputMapping")) { for (Statement statement1 : statement.getContents()) { VariableMapping mapping = readInputMapping(statement1); techniqueDef .getShaderGenerationInfo() .getUnusedNodes() .remove(mapping.getRightVariable().getNameSpace()); shaderNode.getInputMapping().add(mapping); } } else if (line.startsWith("OutputMapping")) { for (Statement statement1 : statement.getContents()) { VariableMapping mapping = readOutputMapping(statement1); techniqueDef.getShaderGenerationInfo().getUnusedNodes().remove(shaderNode.getName()); shaderNode.getOutputMapping().add(mapping); } } else { throw new MatParseException("ShaderNodeDefinition", split[0], statement); } } }
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 + ")"); } } } }
/** * store a varying * * @param node the shaderNode * @param variable the variable to store */ public void storeVaryings(ShaderNode node, ShaderNodeVariable variable) { variable.setShaderOutput(true); if (node.getDefinition().getType() == Shader.ShaderType.Vertex && shaderNode.getDefinition().getType() == Shader.ShaderType.Fragment) { DeclaredVariable dv = varyings.get(variable.getName()); if (dv == null) { techniqueDef.getShaderGenerationInfo().getVaryings().add(variable); dv = new DeclaredVariable(variable); varyings.put(variable.getName(), dv); } dv.addNode(shaderNode); // if a variable is declared with the same name as an input and an output and is a varying, // set it as a shader output so it's declared as a varying only once. for (VariableMapping variableMapping : node.getInputMapping()) { if (variableMapping.getLeftVariable().getName().equals(variable.getName())) { variableMapping.getLeftVariable().setShaderOutput(true); } } } }