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);
        }
      }
    }
  }