@Override
    protected ShaderGenerationInfo clone() throws CloneNotSupportedException {
        final ShaderGenerationInfo clone = (ShaderGenerationInfo) super.clone();
        clone.attributes = new ArrayList<>();
        clone.vertexUniforms = new ArrayList<>();
        clone.fragmentUniforms = new ArrayList<>();
        clone.fragmentGlobals = new ArrayList<>();
        clone.unusedNodes = new ArrayList<>();
        clone.varyings = new ArrayList<>();

        for (ShaderNodeVariable attribute : attributes) {
            clone.attributes.add(attribute.clone());
        }

        for (ShaderNodeVariable uniform : vertexUniforms) {
            clone.vertexUniforms.add(uniform.clone());
        }

        if (vertexGlobal != null) {
            clone.vertexGlobal = vertexGlobal.clone();
        }

        for (ShaderNodeVariable varying : varyings) {
            clone.varyings.add(varying.clone());
        }

        for (ShaderNodeVariable uniform : fragmentUniforms) {
            clone.fragmentUniforms.add(uniform.clone());
        }

        for (ShaderNodeVariable globals : fragmentGlobals) {
            clone.fragmentGlobals.add(globals.clone());
        }

        clone.unusedNodes.addAll(unusedNodes);

        return clone;
    }
convenient toString method

@return the information
jme3-core/src/main/java/com/jme3/material/ShaderGenerationInfo.java