Search in sources :

Example 6 with ShaderNodeVariable

use of com.jme3.shader.ShaderNodeVariable in project jmonkeyengine by jMonkeyEngine.

the class ShaderNodeLoaderDelegate method parseMapping.

/**
     * reads a mapping statement. Sets the nameSpace, name and swizzling of the
     * left variable. Sets the name, nameSpace and swizzling of the right
     * variable types will be determined later.
     *
     * <code>
     * Format : <nameSpace>.<varName>[.<swizzling>] =
     * <nameSpace>.<varName>[.<swizzling>][:Condition]
     * </code>
     * 
     * @param statement the statement to read
     * @return the read mapping
     */
protected VariableMapping parseMapping(Statement statement, boolean[] hasNameSpace) throws IOException {
    VariableMapping mapping = new VariableMapping();
    String[] cond = statement.getLine().split(":");
    String[] vars = cond[0].split("=");
    checkMappingFormat(vars, statement);
    ShaderNodeVariable[] variables = new ShaderNodeVariable[2];
    String[] swizzle = new String[2];
    for (int i = 0; i < vars.length; i++) {
        String[] expression = vars[i].trim().split("\\.");
        if (hasNameSpace[i]) {
            if (expression.length <= 3) {
                variables[i] = new ShaderNodeVariable("", expression[0].trim(), expression[1].trim());
            }
            if (expression.length == 3) {
                swizzle[i] = expression[2].trim();
            }
        } else {
            if (expression.length <= 2) {
                variables[i] = new ShaderNodeVariable("", expression[0].trim());
            }
            if (expression.length == 2) {
                swizzle[i] = expression[1].trim();
            }
        }
    }
    mapping.setLeftVariable(variables[0]);
    mapping.setLeftSwizzling(swizzle[0] != null ? swizzle[0] : "");
    mapping.setRightVariable(variables[1]);
    mapping.setRightSwizzling(swizzle[1] != null ? swizzle[1] : "");
    if (cond.length > 1) {
        extractCondition(cond[1], statement);
        mapping.setCondition(conditionParser.getFormattedExpression());
    }
    return mapping;
}
Also used : VariableMapping(com.jme3.shader.VariableMapping) ShaderNodeVariable(com.jme3.shader.ShaderNodeVariable)

Example 7 with ShaderNodeVariable

use of com.jme3.shader.ShaderNodeVariable in project jmonkeyengine by jMonkeyEngine.

the class ShaderNodeDefinition method write.

/**
     * jme serialization (not used)
     *
     * @param ex the exporter
     * @throws IOException
     */
@Override
public void write(JmeExporter ex) throws IOException {
    OutputCapsule oc = (OutputCapsule) ex.getCapsule(this);
    oc.write(name, "name", "");
    String[] str = new String[shadersLanguage.size()];
    oc.write(shadersLanguage.toArray(str), "shadersLanguage", null);
    oc.write(shadersPath.toArray(str), "shadersPath", null);
    oc.write(type, "type", null);
    oc.writeSavableArrayList((ArrayList) inputs, "inputs", new ArrayList<ShaderNodeVariable>());
    oc.writeSavableArrayList((ArrayList) outputs, "inputs", new ArrayList<ShaderNodeVariable>());
}
Also used : OutputCapsule(com.jme3.export.OutputCapsule)

Example 8 with ShaderNodeVariable

use of com.jme3.shader.ShaderNodeVariable in project jmonkeyengine by jMonkeyEngine.

the class ShaderNodeLoaderDelegate method updateVariableFromList.

/**
     * search a variable in the given list and updates its type and namespace
     *
     * @param var the variable to update
     * @param list the variables list
     * @return true if the variable has been found and updated
     */
protected boolean updateVariableFromList(ShaderNodeVariable var, List<ShaderNodeVariable> list) {
    for (ShaderNodeVariable shaderNodeVariable : list) {
        if (shaderNodeVariable.getName().equals(var.getName())) {
            var.setType(shaderNodeVariable.getType());
            var.setMultiplicity(shaderNodeVariable.getMultiplicity());
            var.setNameSpace(shaderNode.getName());
            return true;
        }
    }
    return false;
}
Also used : ShaderNodeVariable(com.jme3.shader.ShaderNodeVariable)

Example 9 with ShaderNodeVariable

use of com.jme3.shader.ShaderNodeVariable in project jmonkeyengine by jMonkeyEngine.

the class ShaderNodeLoaderDelegate method readInputMapping.

/**
     * reads an input mapping
     *
     * @param statement1 the statement being read
     * @return the mapping
     * @throws IOException
     */
public VariableMapping readInputMapping(Statement statement1) throws IOException {
    VariableMapping mapping = null;
    try {
        mapping = parseMapping(statement1, new boolean[] { false, true });
    } catch (Exception e) {
        throw new MatParseException("Unexpected mapping format", statement1, e);
    }
    ShaderNodeVariable left = mapping.getLeftVariable();
    ShaderNodeVariable right = mapping.getRightVariable();
    if (!updateVariableFromList(left, shaderNode.getDefinition().getInputs())) {
        throw new MatParseException(left.getName() + " is not an input variable of " + shaderNode.getDefinition().getName(), statement1);
    }
    if (left.getType().startsWith("sampler") && !right.getNameSpace().equals("MatParam")) {
        throw new MatParseException("Samplers can only be assigned to MatParams", statement1);
    }
    if (right.getNameSpace().equals("Global")) {
        //Globals are all vec4 for now (maybe forever...)
        right.setType("vec4");
        //        updateCondition(right, mapping);
        storeGlobal(right, statement1);
    } else if (right.getNameSpace().equals("Attr")) {
        if (shaderNode.getDefinition().getType() == Shader.ShaderType.Fragment) {
            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());
        if (param == null) {
            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)) {
                storeVertexUniform(mapping.getRightVariable());
            }
        } else {
            if (updateRightFromUniforms(param, mapping, fragmentDeclaredUniforms, statement1)) {
                if (mapping.getRightVariable().getType().contains("|")) {
                    String type = fixSamplerType(left.getType(), mapping.getRightVariable().getType());
                    if (type != null) {
                        mapping.getRightVariable().setType(type);
                    } else {
                        throw new MatParseException(param.getVarType().toString() + " can only be matched to one of " + param.getVarType().getGlslType().replaceAll("\\|", ",") + " found " + left.getType(), statement1);
                    }
                }
                storeFragmentUniform(mapping.getRightVariable());
            }
        }
    } else if (right.getNameSpace().equals("WorldParam")) {
        UniformBinding worldParam = findWorldParam(right.getName());
        if (worldParam == null) {
            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());
            }
        } else {
            if (updateRightFromUniforms(worldParam, mapping, fragmentDeclaredUniforms)) {
                storeFragmentUniform(mapping.getRightVariable());
            }
        }
    } else {
        ShaderNode node = nodes.get(right.getNameSpace());
        if (node == null) {
            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);
        }
        right.setNameSpace(node.getName());
        right.setType(var.getType());
        right.setMultiplicity(var.getMultiplicity());
        mapping.setRightVariable(right);
        storeVaryings(node, mapping.getRightVariable());
    }
    checkTypes(mapping, statement1);
    return mapping;
}
Also used : UniformBinding(com.jme3.shader.UniformBinding) MatParam(com.jme3.material.MatParam) ShaderNode(com.jme3.shader.ShaderNode) VariableMapping(com.jme3.shader.VariableMapping) ShaderNodeVariable(com.jme3.shader.ShaderNodeVariable) IOException(java.io.IOException) AssetNotFoundException(com.jme3.asset.AssetNotFoundException)

Example 10 with ShaderNodeVariable

use of com.jme3.shader.ShaderNodeVariable in project jmonkeyengine by jMonkeyEngine.

the class ShaderNodeLoaderDelegate method readOutputMapping.

/**
     * reads an output mapping
     *
     * @param statement1 the statement being read
     * @return the mapping
     * @throws IOException
     */
public VariableMapping readOutputMapping(Statement statement1) throws IOException {
    VariableMapping mapping = null;
    try {
        mapping = parseMapping(statement1, new boolean[] { true, false });
    } catch (Exception e) {
        throw new MatParseException("Unexpected mapping format", statement1, e);
    }
    ShaderNodeVariable left = mapping.getLeftVariable();
    ShaderNodeVariable right = mapping.getRightVariable();
    if (left.getType().startsWith("sampler") || right.getType().startsWith("sampler")) {
        throw new MatParseException("Samplers can only be inputs", statement1);
    }
    if (left.getNameSpace().equals("Global")) {
        //Globals are all vec4 for now (maybe forever...)
        left.setType("vec4");
        storeGlobal(left, statement1);
    } else {
        throw new MatParseException("Only Global nameSpace is allowed for outputMapping, got" + left.getNameSpace(), statement1);
    }
    if (!updateVariableFromList(right, shaderNode.getDefinition().getOutputs())) {
        throw new MatParseException(right.getName() + " is not an output variable of " + shaderNode.getDefinition().getName(), statement1);
    }
    checkTypes(mapping, statement1);
    return mapping;
}
Also used : VariableMapping(com.jme3.shader.VariableMapping) ShaderNodeVariable(com.jme3.shader.ShaderNodeVariable) IOException(java.io.IOException) AssetNotFoundException(com.jme3.asset.AssetNotFoundException)

Aggregations

ShaderNodeVariable (com.jme3.shader.ShaderNodeVariable)8 VariableMapping (com.jme3.shader.VariableMapping)4 InputCapsule (com.jme3.export.InputCapsule)3 AssetNotFoundException (com.jme3.asset.AssetNotFoundException)2 OutputCapsule (com.jme3.export.OutputCapsule)2 MatParam (com.jme3.material.MatParam)2 IOException (java.io.IOException)2 ShaderType (com.jme3.shader.Shader.ShaderType)1 ShaderNode (com.jme3.shader.ShaderNode)1 UniformBinding (com.jme3.shader.UniformBinding)1 ArrayList (java.util.ArrayList)1