/** * convenience tostring * * @return a string */ @Override public String toString() { final StringBuilder builder = new StringBuilder("ShaderNode:"); builder.append("\n\tname=").append(name) .append("\n\tdefinition=").append(definition.getName()) .append("\n\tcondition=").append(condition); if (!inputMapping.isEmpty()) { builder.append("\n\tinputMapping:\n"); for (final VariableMapping mapping : inputMapping) { builder.append("\t\t").append(mapping).append('\n'); } } if (!outputMapping.isEmpty()) { builder.append("\n\toutputMapping:\n"); for (final VariableMapping mapping : outputMapping) { builder.append("\t\t").append(mapping).append('\n'); } } if (builder.charAt(builder.length() - 1) == '\n') { builder.delete(builder.length() - 1, builder.length()); } return builder.toString(); }
private void writeShaderNodes(TechniqueDef techniqueDef, Collection<MatParam> matParams, OutputStreamWriter out) throws IOException { out.write(" VertexShaderNodes {\n"); for (ShaderNode shaderNode : techniqueDef.getShaderNodes()) { if(shaderNode.getDefinition().getType() == Shader.ShaderType.Vertex){ writeShaderNode(out, shaderNode, matParams); } } out.write(" }\n\n"); out.write(" FragmentShaderNodes {\n"); for (ShaderNode shaderNode : techniqueDef.getShaderNodes()) { if(shaderNode.getDefinition().getType() == Shader.ShaderType.Fragment){ writeShaderNode(out, shaderNode, matParams); } } out.write(" }\n\n"); }
/** * Read the ShaderNodesDefinitions block and returns a list of * ShaderNodesDefinition This method is used by the j3sn loader * * note that the order of the definitions in the list is not guaranteed. * * @param statements the list statements to parse * @param key the ShaderNodeDefinitionKey * @return a list of ShaderNodesDefinition * @throws IOException */ public List<ShaderNodeDefinition> readNodesDefinitions(List<Statement> statements, ShaderNodeDefinitionKey key) throws IOException { for (Statement statement : statements) { String[] split = statement.getLine().split("[ \\{]"); if (statement.getLine().startsWith("ShaderNodeDefinition")) { String name = statement.getLine().substring("ShaderNodeDefinition".length()).trim(); if (!getNodeDefinitions().containsKey(name)) { shaderNodeDefinition = new ShaderNodeDefinition(); getNodeDefinitions().put(name, shaderNodeDefinition); shaderNodeDefinition.setName(name); shaderNodeDefinition.setPath(key.getName()); readShaderNodeDefinition(statement.getContents(), key); } } else { throw new MatParseException("ShaderNodeDefinition", split[0], statement); } } return new ArrayList<ShaderNodeDefinition>(getNodeDefinitions().values()); }
shaderNodeDefinition.setType(ShaderType.valueOf(type)); } else if (line.startsWith("Shader ")) { readShaderStatement(statement); shaderNodeDefinition.getShadersLanguage().add(shaderLanguage); shaderNodeDefinition.getShadersPath().add(shaderName); } else if (line.startsWith("Documentation")) { if (isLoadDoc) { doc += "\n" + statement1.getLine(); shaderNodeDefinition.setDocumentation(doc); for (Statement statement1 : statement.getContents()) { try { shaderNodeDefinition.getInputs().add(readVariable(statement1)); } catch (RuntimeException e) { throw new MatParseException(e.getMessage(), statement1, e); try { if (statement1.getLine().trim().equals("None")) { shaderNodeDefinition.setNoOutput(true); } else { shaderNodeDefinition.getOutputs().add(readVariable(statement1));
final String expression = mapping.getRightExpression(); if (!updateVariableFromList(left, definition.getInputs())) { throw new MatParseException(left.getName() + " is not an input variable of " + definition.getName(), statement); } else if (left.getType().startsWith("sampler") && (right == null || !right.getNameSpace().equals(ShaderGenerator.NAME_SPACE_MAT_PARAM))) { throw new MatParseException("Samplers can only be assigned to MatParams", statement); storeGlobal(right, statement); } else if (right.getNameSpace().equals(ShaderGenerator.NAME_SPACE_VERTEX_ATTRIBUTE)) { if (definition.getType() == ShaderType.Fragment) { throw new MatParseException("Cannot have an attribute as input in a fragment shader" + right.getName(), statement); if (definition.getType() == ShaderType.Vertex) { if (updateRightFromUniforms(param, mapping, vertexDeclaredUniforms, statement)) { updateMaterialTextureType(statement, mapping, left, param); if (definition.getType() == ShaderType.Vertex) { if (updateRightFromUniforms(worldParam, mapping, vertexDeclaredUniforms)) { storeVertexUniform(mapping.getRightVariable()); ShaderNodeVariable var = findNodeOutput(node.getDefinition().getOutputs(), right.getName());
if (!updateVariableFromList(right, definition.getOutputs())) { throw new MatParseException(right.getName() + " is not an output variable of " + definition.getName(), statement);
continue; if (shaderNode.getDefinition().getType() == type) { int index = findShaderIndexFromVersion(shaderNode, type); String shaderPath = shaderNode.getDefinition().getShadersPath().get(index); Map<String, String> sources = (Map<String, String>) assetManager.loadAsset(new ShaderAssetKey(shaderPath, false)); String loadedSource = sources.get("[main]");
for (final ShaderNodeVariable var : definition.getInputs()) { for (ShaderNodeVariable var : definition.getOutputs()) { ShaderNodeVariable v = new ShaderNodeVariable(var.getType(), shaderNode.getName(), var.getName(), var.getMultiplicity()); if (!declaredInputs.contains(shaderNode.getName() + "_" + var.getName())) {
/** * returns the shaderpath index according to the version of the generator. * This allow to select the higher version of the shader that the generator * can handle * * @param shaderNode the shaderNode being processed * @param type the shaderType * @return the index of the shader path in ShaderNodeDefinition shadersPath * list * @throws NumberFormatException */ protected int findShaderIndexFromVersion(ShaderNode shaderNode, ShaderType type) throws NumberFormatException { int index = 0; List<String> lang = shaderNode.getDefinition().getShadersLanguage(); int genVersion = Integer.parseInt(getLanguageAndVersion(type).substring(4)); int curVersion = 0; for (int i = 0; i < lang.size(); i++) { int version = Integer.parseInt(lang.get(i).substring(4)); if (version > curVersion && version <= genVersion) { curVersion = version; index = i; } } return index; } }
ShaderNodeDefinition def = findDefinition(statement); shaderNode.setDefinition(def); if(def.isNoOutput()){ unusedNodes.remove(shaderNode.getName());
shaderNodeDefinition.setType(Shader.ShaderType.valueOf(type)); } else if (line.startsWith("Shader ")) { readShaderStatement(statement); shaderNodeDefinition.getShadersLanguage().add(shaderLanguage); shaderNodeDefinition.getShadersPath().add(shaderName); } else if (line.startsWith("Documentation")) { if (isLoadDoc) { doc += "\n" + statement1.getLine(); shaderNodeDefinition.setDocumentation(doc); for (Statement statement1 : statement.getContents()) { try { shaderNodeDefinition.getInputs().add(readVariable(statement1)); } catch (RuntimeException e) { throw new MatParseException(e.getMessage(), statement1, e); try { if (statement1.getLine().trim().equals("None")) { shaderNodeDefinition.setNoOutput(true); } else { shaderNodeDefinition.getOutputs().add(readVariable(statement1));
if (!updateVariableFromList(left, shaderNode.getDefinition().getInputs())) { throw new MatParseException(left.getName() + " is not an input variable of " + shaderNode.getDefinition().getName(), statement1); if (shaderNode.getDefinition().getType() == Shader.ShaderType.Fragment) { throw new MatParseException("Cannot have an attribute as input in a fragment shader" + right.getName(), statement1); throw new MatParseException("Could not find a Material Parameter named " + right.getName(), statement1); if (shaderNode.getDefinition().getType() == Shader.ShaderType.Vertex) { if (updateRightFromUniforms(param, mapping, vertexDeclaredUniforms, statement1)) { updateMaterialTextureType(statement1, mapping, left, param); throw new MatParseException("Could not find a World Parameter named " + right.getName(), statement1); if (shaderNode.getDefinition().getType() == Shader.ShaderType.Vertex) { if (updateRightFromUniforms(worldParam, mapping, vertexDeclaredUniforms)) { storeVertexUniform(mapping.getRightVariable()); throw new MatParseException("Undeclared node" + right.getNameSpace() + ". Make sure this node is declared before the current node", statement1); ShaderNodeVariable var = findNodeOutput(node.getDefinition().getOutputs(), right.getName()); if (var == null) { throw new MatParseException("Cannot find output variable" + right.getName() + " form ShaderNode " + node.getName(), statement1);
private void writeShaderNode( OutputStreamWriter out, ShaderNode shaderNode, Collection<MatParam> matParams) throws IOException { out.write(" ShaderNode "); out.write(shaderNode.getName()); out.write(" {\n"); if (shaderNode.getCondition() != null){ out.write(" Condition: "); out.write(formatCondition(shaderNode.getCondition(), matParams)); out.write("\n"); } out.write(" Definition: "); out.write(shaderNode.getDefinition().getName()); out.write(": "); out.write(shaderNode.getDefinition().getPath()); out.write("\n"); out.write(" InputMappings {\n"); for (VariableMapping mapping : shaderNode.getInputMapping()) { writeVariableMapping(out, shaderNode, mapping, matParams); } out.write(" }\n"); out.write(" OutputMappings {\n"); for (VariableMapping mapping : shaderNode.getOutputMapping()) { writeVariableMapping(out, shaderNode, mapping, matParams); } out.write(" }\n"); out.write(" }\n"); }
if (!updateVariableFromList(right, shaderNode.getDefinition().getOutputs())) { throw new MatParseException(right.getName() + " is not an output variable of " + shaderNode.getDefinition().getName(), statement1);
continue; if (shaderNode.getDefinition().getType() == type) { int index = findShaderIndexFromVersion(shaderNode, type); String shaderPath = shaderNode.getDefinition().getShadersPath().get(index); Map<String, String> sources = (Map<String, String>) assetManager.loadAsset(new ShaderAssetKey(shaderPath, false)); String loadedSource = sources.get("[main]");
for (final ShaderNodeVariable var : definition.getInputs()) { for (ShaderNodeVariable var : definition.getOutputs()) { ShaderNodeVariable v = new ShaderNodeVariable(var.getType(), shaderNode.getName(), var.getName(), var.getMultiplicity()); if (!declaredInputs.contains(shaderNode.getName() + "_" + var.getName())) {
/** * returns the shaderpath index according to the version of the generator. * This allow to select the higher version of the shader that the generator * can handle * * @param shaderNode the shaderNode being processed * @param type the shaderType * @return the index of the shader path in ShaderNodeDefinition shadersPath * list * @throws NumberFormatException */ protected int findShaderIndexFromVersion(ShaderNode shaderNode, ShaderType type) throws NumberFormatException { int index = 0; List<String> lang = shaderNode.getDefinition().getShadersLanguage(); int genVersion = Integer.parseInt(getLanguageAndVersion(type).substring(4)); int curVersion = 0; for (int i = 0; i < lang.size(); i++) { int version = Integer.parseInt(lang.get(i).substring(4)); if (version > curVersion && version <= genVersion) { curVersion = version; index = i; } } return index; } }
ShaderNodeDefinition def = findDefinition(statement); shaderNode.setDefinition(def); if(def.isNoOutput()){ techniqueDef.getShaderGenerationInfo().getUnusedNodes().remove(shaderNode.getName());