/**
* Copyright (c) 2003-2009, Xith3D Project Group all rights reserved.
*
* Portions based on the Java3D interface, Copyright by Sun Microsystems.
* Many thanks to the developers of Java3D and Sun Microsystems for their
* innovation and design.
*
* 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 the 'Xith3D Project Group' 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) A
* RISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE
*/
package org.xith3d.scenegraph;
import java.util.ArrayList;
import java.util.HashMap;
import org.openmali.vecmath2.Colorf;
import org.openmali.vecmath2.Matrix3f;
import org.openmali.vecmath2.Matrix4f;
import org.openmali.vecmath2.TexCoordf;
import org.openmali.vecmath2.TupleNf;
import org.openmali.vecmath2.TupleNi;
import org.xith3d.render.CanvasPeer;
/**
* Created on Jul 7, 2006 by florian for project 'xith3d_glsl_shader_support'
*
* @author Florian Hofmann (aka Goliat)
* @author Marvin Froehlich (aka Qudus)
*/
public class GLSLParameters extends NodeComponent// implements StateTrackable< GLSLShaderProgramParameters >
{
private final HashMap< String, Object > uniformVars = new HashMap< String, Object >();
private final ArrayList< String > floatUniformVarNames = new ArrayList< String >();
private final ArrayList< String > intUniformVarNames = new ArrayList< String >();
private final ArrayList< Integer > floatUniformVarBaseSizes = new ArrayList< Integer >();
private final ArrayList< Integer > intUniformVarBaseSizes = new ArrayList< Integer >();
public final int getNumUniformVarsFloat()
{
return ( floatUniformVarNames.size() );
}
public final int getNumUniformVarsInt()
{
return ( intUniformVarNames.size() );
}
public final boolean hasUniformVars()
{
return ( ( floatUniformVarNames.size() > 0 ) || ( intUniformVarNames.size() > 0 ) );
}
public final int getUniformVarBaseSizeFloat( int i )
{
return ( floatUniformVarBaseSizes.get( i ).intValue() );
}
public final int getUniformVarBaseSizeInt( int i )
{
return ( intUniformVarBaseSizes.get( i ).intValue() );
}
public final String getFloatUniformVarName( int i )
{
return ( floatUniformVarNames.get( i ) );
}
public final String getIntUniformVarName( int i )
{
return ( intUniformVarNames.get( i ) );
}
public final float[] getUniformVarValueFloat( String varName )
{
return ( (float[])uniformVars.get( varName ) );
}
public final int[] getUniformVarValueInt( String varName )
{
return ( (int[])uniformVars.get( varName ) );
}
public final float[] getUniformVarValueFloat( int i )
{
return ( (float[])uniformVars.get( floatUniformVarNames.get( i ) ) );
}
public final int[] getUniformVarValueInt( int i )
{
return ( (int[])uniformVars.get( intUniformVarNames.get( i ) ) );
}
// floats
public final void setUniformVar( String name, float[] values )
{
Object oldValueObj = uniformVars.get( name );
float[] newValue;
if ( oldValueObj == null )
{
newValue = new float[ values.length ];
System.arraycopy( values, 0, newValue, 0, values.length );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( 1 );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof float[] ) )
{
int intIndex = intUniformVarNames.indexOf( name );
if ( intIndex >= 0 )
{
intUniformVarNames.remove( intIndex );
intUniformVarBaseSizes.remove( intIndex );
}
newValue = new float[ values.length ];
System.arraycopy( values, 0, newValue, 0, values.length );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( 1 );
uniformVars.put( name, newValue );
}
else if ( ( (float[])oldValueObj ).length != values.length )
{
newValue = new float[ values.length ];
System.arraycopy( values, 0, newValue, 0, values.length );
uniformVars.put( name, newValue );
int floatIndex = floatUniformVarNames.indexOf( name );
floatUniformVarBaseSizes.set( floatIndex, 1 );
}
else
{
newValue = (float[])oldValueObj;
System.arraycopy( values, 0, newValue, 0, values.length );
}
}
// floats
public final void setUniformVar( String name, float value )
{
Object oldValueObj = uniformVars.get( name );
float[] newValue;
if ( oldValueObj == null )
{
newValue = new float[] { value };
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( 1 );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof float[] ) )
{
int intIndex = intUniformVarNames.indexOf( name );
if ( intIndex >= 0 )
{
intUniformVarNames.remove( intIndex );
intUniformVarBaseSizes.remove( intIndex );
}
newValue = new float[] { value };
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( 1 );
uniformVars.put( name, newValue );
}
else if ( ( (float[])oldValueObj ).length != 1 )
{
newValue = new float[] { value };
uniformVars.put( name, newValue );
int floatIndex = floatUniformVarNames.indexOf( name );
floatUniformVarBaseSizes.set( floatIndex, 1 );
}
else
{
newValue = (float[])oldValueObj;
newValue[ 0 ] = value;
}
}
// integers
public final void setUniformVar( String name, int[] values )
{
Object oldValueObj = uniformVars.get( name );
int[] newValue;
if ( oldValueObj == null )
{
newValue = new int[ values.length ];
System.arraycopy( values, 0, newValue, 0, values.length );
intUniformVarNames.add( name );
intUniformVarBaseSizes.add( 1 );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof int[] ) )
{
int floatIndex = floatUniformVarNames.indexOf( name );
if ( floatIndex >= 0 )
{
floatUniformVarNames.remove( floatIndex );
floatUniformVarBaseSizes.remove( floatIndex );
}
newValue = new int[ values.length ];
System.arraycopy( values, 0, newValue, 0, values.length );
intUniformVarNames.add( name );
intUniformVarBaseSizes.add( 1 );
uniformVars.put( name, newValue );
}
else if ( ( (int[])oldValueObj ).length != values.length )
{
newValue = new int[ values.length ];
System.arraycopy( values, 0, newValue, 0, values.length );
uniformVars.put( name, newValue );
int intIndex = intUniformVarNames.indexOf( name );
intUniformVarBaseSizes.set( intIndex, 1 );
}
else
{
newValue = (int[])oldValueObj;
System.arraycopy( values, 0, newValue, 0, values.length );
}
}
// integers
public final void setUniformVar( String name, int value )
{
Object oldValueObj = uniformVars.get( name );
int[] newValue;
if ( oldValueObj == null )
{
newValue = new int[] { value };
intUniformVarNames.add( name );
intUniformVarBaseSizes.add( 1 );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof int[] ) )
{
int floatIndex = floatUniformVarNames.indexOf( name );
if ( floatIndex >= 0 )
{
floatUniformVarNames.remove( floatIndex );
floatUniformVarBaseSizes.remove( floatIndex );
}
newValue = new int[] { value };
intUniformVarNames.add( name );
intUniformVarBaseSizes.add( 1 );
uniformVars.put( name, newValue );
}
else if ( ( (int[])oldValueObj ).length != 1 )
{
newValue = new int[] { value };
uniformVars.put( name, newValue );
int intIndex = intUniformVarNames.indexOf( name );
intUniformVarBaseSizes.set( intIndex, 1 );
}
else
{
newValue = (int[])oldValueObj;
newValue[ 0 ] = value;
}
}
private static final void copyMatricesToArray( Matrix3f[] mats, float[] target )
{
int offset = 0;
for ( int i = 0; i < mats.length; i++ )
{
/*
target[ offset + 0 ] = mats[ i ].m00();
target[ offset + 1 ] = mats[ i ].m10();
target[ offset + 2 ] = mats[ i ].m20();
target[ offset + 3 ] = mats[ i ].m01();
target[ offset + 4 ] = mats[ i ].m11();
target[ offset + 5 ] = mats[ i ].m21();
target[ offset + 6 ] = mats[ i ].m02();
target[ offset + 7 ] = mats[ i ].m12();
target[ offset + 8 ] = mats[ i ].m22();
*/
mats[ i ].getColumnMajor( target, offset );
offset += 9;
}
}
// matrices
// altough 2x2 matrices are avaible in glsl there is no such type in vecmath ...
// i'll just leave it out ... if anyone needs it i can implement it later on
public final void setUniformVar( String name, Matrix3f[] values )
{
Object oldValueObj = uniformVars.get( name );
float[] newValue;
if ( oldValueObj == null )
{
newValue = new float[ values.length * 9 ];
copyMatricesToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( 9 );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof float[] ) )
{
int intIndex = intUniformVarNames.indexOf( name );
if ( intIndex >= 0 )
{
intUniformVarNames.remove( intIndex );
intUniformVarBaseSizes.remove( intIndex );
}
newValue = new float[ values.length * 9 ];
copyMatricesToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( 9 );
uniformVars.put( name, newValue );
}
else if ( ( (float[])oldValueObj ).length != values.length * 9 )
{
newValue = new float[ values.length * 9 ];
copyMatricesToArray( values, newValue );
uniformVars.put( name, newValue );
int floatIndex = floatUniformVarNames.indexOf( name );
floatUniformVarBaseSizes.set( floatIndex, 9 );
}
else
{
newValue = (float[])oldValueObj;
copyMatricesToArray( values, newValue );
}
}
// matrices
// altough 2x2 matrices are avaible in glsl there is no such type in vecmath ...
// i'll just leave it out ... if anyone needs it i can implement it later on
public final void setUniformVar( String name, Matrix3f value )
{
setUniformVar( name, new Matrix3f[] { value } );
}
private static final void copyMatricesToArray( Matrix4f[] mats, float[] target )
{
int offset = 0;
for ( int i = 0; i < mats.length; i++ )
{
/*
target[ offset + 0 ] = mats[ i ].m00();
target[ offset + 1 ] = mats[ i ].m10();
target[ offset + 2 ] = mats[ i ].m20();
target[ offset + 3 ] = mats[ i ].m30();
target[ offset + 4 ] = mats[ i ].m01();
target[ offset + 5 ] = mats[ i ].m11();
target[ offset + 6 ] = mats[ i ].m21();
target[ offset + 7 ] = mats[ i ].m31();
target[ offset + 8 ] = mats[ i ].m02();
target[ offset + 9 ] = mats[ i ].m12();
target[ offset + 10 ] = mats[ i ].m22();
target[ offset + 11 ] = mats[ i ].m32();
target[ offset + 12 ] = mats[ i ].m03();
target[ offset + 13 ] = mats[ i ].m13();
target[ offset + 14 ] = mats[ i ].m23();
target[ offset + 15 ] = mats[ i ].m33();
*/
mats[ i ].getColumnMajor( target, offset );
offset += 16;
}
}
public final void setUniformVar( String name, Matrix4f[] values )
{
Object oldValueObj = uniformVars.get( name );
float[] newValue;
if ( oldValueObj == null )
{
newValue = new float[ values.length * 16 ];
copyMatricesToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( 16 );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof float[] ) )
{
int intIndex = intUniformVarNames.indexOf( name );
if ( intIndex >= 0 )
{
intUniformVarNames.remove( intIndex );
intUniformVarBaseSizes.remove( intIndex );
}
newValue = new float[ values.length * 16 ];
copyMatricesToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( 16 );
uniformVars.put( name, newValue );
}
else if ( ( (float[])oldValueObj ).length != values.length * 16 )
{
newValue = new float[ values.length * 16 ];
copyMatricesToArray( values, newValue );
uniformVars.put( name, newValue );
int floatIndex = floatUniformVarNames.indexOf( name );
floatUniformVarBaseSizes.set( floatIndex, 16 );
}
else
{
newValue = (float[])oldValueObj;
copyMatricesToArray( values, newValue );
}
}
public final void setUniformVar( String name, Matrix4f value )
{
setUniformVar( name, new Matrix4f[] { value } );
}
private static final void copyTuplesToArray( TupleNf<?>[] tuples, float[] target )
{
int offset = 0;
for ( int i = 0; i < tuples.length; i++ )
{
tuples[ i ].get( target, offset );
offset += tuples[ i ].getSize();
}
}
// arrays ==================================================
// float arrays --------------------------------------------
public final void setUniformVar( String name, TupleNf<?>[] values )
{
int size = values[0].getSize();
Object oldValueObj = uniformVars.get( name );
float[] newValue;
if ( oldValueObj == null )
{
newValue = new float[ values.length * size ];
copyTuplesToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( size );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof float[] ) )
{
int intIndex = intUniformVarNames.indexOf( name );
if ( intIndex >= 0 )
{
intUniformVarNames.remove( intIndex );
intUniformVarBaseSizes.remove( intIndex );
}
newValue = new float[ values.length * size ];
copyTuplesToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( size );
uniformVars.put( name, newValue );
}
else if ( ( (float[])oldValueObj ).length != values.length * size )
{
newValue = new float[ values.length * size ];
copyTuplesToArray( values, newValue );
uniformVars.put( name, newValue );
int floatIndex = floatUniformVarNames.indexOf( name );
floatUniformVarBaseSizes.set( floatIndex, size );
}
else
{
newValue = (float[])oldValueObj;
copyTuplesToArray( values, newValue );
}
}
// arrays ==================================================
// float arrays --------------------------------------------
public final void setUniformVar( String name, TupleNf<?> value )
{
setUniformVar( name, new TupleNf<?>[] { value } );
}
// arrays ==================================================
// float arrays --------------------------------------------
public final void setUniformVar( String name, int baseSize, float... values )
{
int size = values.length - ( values.length % baseSize );
Object oldValueObj = uniformVars.get( name );
float[] newValue;
if ( oldValueObj == null )
{
newValue = new float[ size ];
System.arraycopy( values, 0, newValue, 0, size );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( baseSize );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof float[] ) )
{
int intIndex = intUniformVarNames.indexOf( name );
if ( intIndex >= 0 )
{
intUniformVarNames.remove( intIndex );
intUniformVarBaseSizes.remove( intIndex );
}
newValue = new float[ size ];
System.arraycopy( values, 0, newValue, 0, size );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( baseSize );
uniformVars.put( name, newValue );
}
else if ( ( (float[])oldValueObj ).length != size )
{
newValue = new float[ size ];
System.arraycopy( values, 0, newValue, 0, size );
uniformVars.put( name, newValue );
int floatIndex = floatUniformVarNames.indexOf( name );
floatUniformVarBaseSizes.set( floatIndex, baseSize );
}
else
{
newValue = (float[])oldValueObj;
System.arraycopy( values, 0, newValue, 0, size );
}
}
// arrays ==================================================
// int arrays --------------------------------------------
public final void setUniformVar( String name, int baseSize, int... values )
{
int size = values.length - ( values.length % baseSize );
Object oldValueObj = uniformVars.get( name );
int[] newValue;
if ( oldValueObj == null )
{
newValue = new int[ size ];
System.arraycopy( values, 0, newValue, 0, size );
intUniformVarNames.add( name );
intUniformVarBaseSizes.add( baseSize );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof int[] ) )
{
int floatIndex = floatUniformVarNames.indexOf( name );
if ( floatIndex >= 0 )
{
floatUniformVarNames.remove( floatIndex );
floatUniformVarBaseSizes.remove( floatIndex );
}
newValue = new int[ size ];
System.arraycopy( values, 0, newValue, 0, size );
intUniformVarNames.add( name );
intUniformVarBaseSizes.add( baseSize );
uniformVars.put( name, newValue );
}
else if ( ( (int[])oldValueObj ).length != size )
{
newValue = new int[ size ];
System.arraycopy( values, 0, newValue, 0, size );
uniformVars.put( name, newValue );
int intIndex = intUniformVarNames.indexOf( name );
intUniformVarBaseSizes.set( intIndex, baseSize );
}
else
{
newValue = (int[])oldValueObj;
System.arraycopy( values, 0, newValue, 0, size );
}
}
private static final void copyColorsToArray( Colorf[] colors, float[] target )
{
int offset = 0;
for ( int i = 0; i < colors.length; i++ )
{
colors[ i ].get( target, offset );
offset += colors[ i ].getSize();
}
}
// arrays ==================================================
// float arrays --------------------------------------------
public final void setUniformVar( String name, Colorf[] values )
{
int size = values[0].hasAlpha() ? 4 : 3;
Object oldValueObj = uniformVars.get( name );
float[] newValue;
if ( oldValueObj == null )
{
newValue = new float[ values.length * size ];
copyColorsToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( size );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof float[] ) )
{
int intIndex = intUniformVarNames.indexOf( name );
if ( intIndex >= 0 )
{
intUniformVarNames.remove( intIndex );
intUniformVarBaseSizes.remove( intIndex );
}
newValue = new float[ values.length * size ];
copyColorsToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( size );
uniformVars.put( name, newValue );
}
else if ( ( (float[])oldValueObj ).length != values.length * size )
{
newValue = new float[ values.length * size ];
copyColorsToArray( values, newValue );
uniformVars.put( name, newValue );
int floatIndex = floatUniformVarNames.indexOf( name );
floatUniformVarBaseSizes.set( floatIndex, size );
}
else
{
newValue = (float[])oldValueObj;
copyColorsToArray( values, newValue );
}
}
// arrays ==================================================
// float arrays --------------------------------------------
public final void setUniformVar( String name, Colorf value )
{
setUniformVar( name, new Colorf[] { value } );
}
private static final void copyTexCoordsToArray( TexCoordf<?>[] texCoords, float[] target )
{
int offset = 0;
for ( int i = 0; i < texCoords.length; i++ )
{
texCoords[ i ].get( target, offset );
offset += texCoords[ i ].getSize();
}
}
// arrays ==================================================
// float arrays --------------------------------------------
public final void setUniformVar( String name, TexCoordf<?>[] values )
{
int size = values[0].getSize();
Object oldValueObj = uniformVars.get( name );
float[] newValue;
if ( oldValueObj == null )
{
newValue = new float[ values.length * size ];
copyTexCoordsToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( size );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof float[] ) )
{
int intIndex = intUniformVarNames.indexOf( name );
if ( intIndex >= 0 )
{
intUniformVarNames.remove( intIndex );
intUniformVarBaseSizes.remove( intIndex );
}
newValue = new float[ values.length * size ];
copyTexCoordsToArray( values, newValue );
floatUniformVarNames.add( name );
floatUniformVarBaseSizes.add( size );
uniformVars.put( name, newValue );
}
else if ( ( (float[])oldValueObj ).length != values.length * size )
{
newValue = new float[ values.length * size ];
copyTexCoordsToArray( values, newValue );
uniformVars.put( name, newValue );
int floatIndex = floatUniformVarNames.indexOf( name );
floatUniformVarBaseSizes.set( floatIndex, size );
}
else
{
newValue = (float[])oldValueObj;
copyTexCoordsToArray( values, newValue );
}
}
// arrays ==================================================
// float arrays --------------------------------------------
public final void setUniformVar( String name, TexCoordf<?> value )
{
setUniformVar( name, new TexCoordf<?>[] { value } );
}
private static final void copyTuplesToArray( TupleNi<?>[] tuples, int[] target )
{
int offset = 0;
for ( int i = 0; i < tuples.length; i++ )
{
tuples[ i ].get( target, offset );
offset += tuples[ i ].getSize();
}
}
// arrays ==================================================
// int arrays --------------------------------------------
public final void setUniformVar( String name, TupleNi<?>[] values )
{
int size = values[0].getSize();
Object oldValueObj = uniformVars.get( name );
int[] newValue;
if ( oldValueObj == null )
{
newValue = new int[ values.length * size ];
copyTuplesToArray( values, newValue );
intUniformVarNames.add( name );
intUniformVarBaseSizes.add( size );
uniformVars.put( name, newValue );
}
else if ( !( oldValueObj instanceof int[] ) )
{
int floatIndex = floatUniformVarNames.indexOf( name );
if ( floatIndex >= 0 )
{
floatUniformVarNames.remove( floatIndex );
floatUniformVarBaseSizes.remove( floatIndex );
}
newValue = new int[ values.length * size ];
copyTuplesToArray( values, newValue );
intUniformVarNames.add( name );
intUniformVarBaseSizes.add( size );
uniformVars.put( name, newValue );
}
else if ( ( (int[])oldValueObj ).length != values.length * size )
{
newValue = new int[ values.length * size ];
copyTuplesToArray( values, newValue );
uniformVars.put( name, newValue );
int intIndex = intUniformVarNames.indexOf( name );
intUniformVarBaseSizes.set( intIndex, size );
}
else
{
newValue = (int[])oldValueObj;
copyTuplesToArray( values, newValue );
}
}
// arrays ==================================================
// int arrays --------------------------------------------
public final void setUniformVar( String name, TupleNi<?> value )
{
setUniformVar( name, new TupleNi<?>[] { value } );
}
public final void removeUniformVar( String name )
{
int index;
index = floatUniformVarNames.indexOf( name );
if ( index >= 0 )
{
floatUniformVarNames.remove( index );
floatUniformVarBaseSizes.remove( index );
uniformVars.remove( name );
return;
}
index = intUniformVarNames.indexOf( name );
if ( index >= 0 )
{
intUniformVarNames.remove( index );
intUniformVarBaseSizes.remove( index );
uniformVars.remove( name );
return;
}
}
//////////////////////////////////////////////////////////////////
/////////////// SUPPORT FOR STATE TRACKABLE INTERFACE ////////////
//////////////////////////////////////////////////////////////////
public GLSLParameters getCopy()
{
return ( cloneNodeComponent( true ) );
}
@Override
protected void duplicateNodeComponent( NodeComponent original, boolean forceDuplicate )
{
GLSLParameters orgParams = (GLSLParameters)original;
uniformVars.clear();
floatUniformVarNames.clear();
intUniformVarNames.clear();
floatUniformVarBaseSizes.clear();
intUniformVarBaseSizes.clear();
uniformVars.putAll( orgParams.uniformVars );
floatUniformVarNames.addAll( orgParams.floatUniformVarNames );
intUniformVarNames.addAll( orgParams.intUniformVarNames );
floatUniformVarBaseSizes.addAll( orgParams.floatUniformVarBaseSizes );
intUniformVarBaseSizes.addAll( orgParams.intUniformVarBaseSizes );
}
@Override
public GLSLParameters cloneNodeComponent( boolean forceDuplicate )
{
GLSLParameters clone = new GLSLParameters();
clone.duplicateNodeComponent( this, forceDuplicate );
return ( clone );
}
@Override
public boolean equals( Object o )
{
if ( this == o )
return ( true );
if ( !( o instanceof GLSLParameters ) )
return ( false );
return ( false );
}
@Override
public void freeOpenGLResources( CanvasPeer canvasPeer )
{
}
/*
@Override
public int compareTo( GLSLShaderProgramParameters o )
{
if ( this == o )
return ( 0 );
if ( this.getNumVertexShaders() > o.getNumVertexShaders() )
return ( 1 );
else if ( this.getNumVertexShaders() < o.getNumVertexShaders() )
return ( -1 );
else if ( this.getNumFragmentShaders() > o.getNumFragmentShaders() )
return ( 1 );
else if ( this.getNumFragmentShaders() < o.getNumFragmentShaders() )
return ( -1 );
int result = 0;
for ( int i = 0; i < getNumVertexShaders(); i++ )
{
result += this.getVertexShader( i ).compareTo( o.getVertexShader( i ) );
}
for ( int i = 0; i < getNumFragmentShaders(); i++ )
{
result += this.getFragmentShader( i ).compareTo( o.getFragmentShader( i ) );
}
if ( result > 0 )
return ( +1 );
else if ( result < 0 )
return ( -1 );
else
return ( 0 );
}
*/
public GLSLParameters()
{
super( false );
}
}