/*
* Copyright (c) 2009-2012 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.material;
import com.jme3.export.InputCapsule;
import com.jme3.export.JmeExporter;
import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule;
import com.jme3.export.Savable;
import com.jme3.shader.ShaderNodeVariable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* this class is basically a struct that contains the ShaderNodes informations
* in an appropriate way to ease the shader generation process and make it
* faster.
*
* @author Nehon
*/
public class ShaderGenerationInfo implements Savable {
/**
* the list of attributes of the vertex shader
*/
protected List<ShaderNodeVariable> attributes = new ArrayList<ShaderNodeVariable>();
/**
* the list of all the uniforms to declare in the vertex shader
*/
protected List<ShaderNodeVariable> vertexUniforms = new ArrayList<ShaderNodeVariable>();
/**
* the global output of the vertex shader (to assign ot gl_Position)
*/
protected ShaderNodeVariable vertexGlobal = null;
/**
* the list of varyings
*/
protected List<ShaderNodeVariable> varyings = new ArrayList<ShaderNodeVariable>();
/**
* the list of all the uniforms to declare in the fragment shader
*/
protected List<ShaderNodeVariable> fragmentUniforms = new ArrayList<ShaderNodeVariable>();
/**
* the list of all the fragment shader global outputs (to assign ot gl_FragColor or gl_Fragdata[n])
*/
protected List<ShaderNodeVariable> fragmentGlobals = new ArrayList<ShaderNodeVariable>();
/**
* the unused node names of this shader (node whose output are never used)
*/
protected List<String> unusedNodes = new ArrayList<String>();
/**
*
* @return the attributes
*/
public List<ShaderNodeVariable> getAttributes() {
return attributes;
}
/**
*
* @return the vertex shader uniforms
*/
public List<ShaderNodeVariable> getVertexUniforms() {
return vertexUniforms;
}
/**
*
* @return the fragment shader uniforms
*/
public List<ShaderNodeVariable> getFragmentUniforms() {
return fragmentUniforms;
}
/**
*
* @return the vertex shader global ouput
*/
public ShaderNodeVariable getVertexGlobal() {
return vertexGlobal;
}
/**
*
* @return the fragment shader global outputs
*/
public List<ShaderNodeVariable> getFragmentGlobals() {
return fragmentGlobals;
}
/**
*
* @return the varyings
*/
public List<ShaderNodeVariable> getVaryings() {
return varyings;
}
/**
* sets the vertex shader global output
*
* @param vertexGlobal the global output
*/
public void setVertexGlobal(ShaderNodeVariable vertexGlobal) {
this.vertexGlobal = vertexGlobal;
}
/**
*
* @return the list on unused node names
*/
public List<String> getUnusedNodes() {
return unusedNodes;
}
/**
* the list of unused node names
* @param unusedNodes
*/
public void setUnusedNodes(List<String> unusedNodes) {
this.unusedNodes = unusedNodes;
}
/**
* convenient toString method
*
* @return the informations
*/
@Override
public String toString() {
return "ShaderGenerationInfo{" + "attributes=" + attributes + ", vertexUniforms=" + vertexUniforms + ", vertexGlobal=" + vertexGlobal + ", varyings=" + varyings + ", fragmentUniforms=" + fragmentUniforms + ", fragmentGlobals=" + fragmentGlobals + '}';
}
@Override
public void write(JmeExporter ex) throws IOException {
OutputCapsule oc = ex.getCapsule(this);
oc.writeSavableArrayList((ArrayList) attributes, "attributes", new ArrayList<ShaderNodeVariable>());
oc.writeSavableArrayList((ArrayList) vertexUniforms, "vertexUniforms", new ArrayList<ShaderNodeVariable>());
oc.writeSavableArrayList((ArrayList) varyings, "varyings", new ArrayList<ShaderNodeVariable>());
oc.writeSavableArrayList((ArrayList) fragmentUniforms, "fragmentUniforms", new ArrayList<ShaderNodeVariable>());
oc.writeSavableArrayList((ArrayList) fragmentGlobals, "fragmentGlobals", new ArrayList<ShaderNodeVariable>());
oc.write(vertexGlobal, "vertexGlobal", null);
}
@Override
public void read(JmeImporter im) throws IOException {
InputCapsule ic = im.getCapsule(this);
attributes = ic.readSavableArrayList("attributes", new ArrayList<ShaderNodeVariable>());
vertexUniforms = ic.readSavableArrayList("vertexUniforms", new ArrayList<ShaderNodeVariable>());
varyings = ic.readSavableArrayList("varyings", new ArrayList<ShaderNodeVariable>());
fragmentUniforms = ic.readSavableArrayList("fragmentUniforms", new ArrayList<ShaderNodeVariable>());
fragmentGlobals = ic.readSavableArrayList("fragmentGlobals", new ArrayList<ShaderNodeVariable>());
vertexGlobal = (ShaderNodeVariable) ic.readSavable("vertexGlobal", null);
}
}