@ -29,6 +29,7 @@
* 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.shader ;
import com.jme3.export.JmeExporter ;
@ -41,7 +42,6 @@ import com.jme3.math.Matrix4f;
import com.jme3.math.Quaternion ;
import com.jme3.math.Vector2f ;
import com.jme3.math.Vector3f ;
import com.jme3.math.Vector4f ;
import com.jme3.util.BufferUtils ;
import java.io.IOException ;
import java.nio.FloatBuffer ;
@ -51,19 +51,23 @@ public class Uniform extends ShaderVariable {
private static final Integer ZERO_INT = Integer . valueOf ( 0 ) ;
private static final Float ZERO_FLT = Float . valueOf ( 0 ) ;
private static final FloatBuffer ZERO_BUF = BufferUtils . createFloatBuffer ( 4 * 4 ) ;
/ * *
* Currently set value of the uniform .
* /
protected Object value = null ;
protected FloatBuffer multiData = null ;
/ * *
* Type of uniform
* /
protected VarType varType ;
/ * *
* Binding to a renderer value , or null if user - defined uniform
* /
protected UniformBinding binding ;
protected boolean setByCurrentMaterial = false ;
// protected Object lastChanger = null;
@ -209,6 +213,7 @@ public class Uniform extends ShaderVariable {
// public Object getLastChanger(){
// return lastChanger;
// }
public void clearValue ( ) {
updateNeeded = true ;
@ -226,9 +231,8 @@ public class Uniform extends ShaderVariable {
return ;
}
if ( varType = = null ) {
if ( varType = = null )
return ;
}
switch ( varType ) {
case Int :
@ -241,18 +245,16 @@ public class Uniform extends ShaderVariable {
this . value = ZERO_FLT ;
break ;
case Vector2 :
( ( Vector2f ) this . value ) . set ( Vector2f . ZERO ) ;
this . value = Vector2f . ZERO ;
break ;
case Vector3 :
( ( Vector3f ) this . value ) . set ( Vector3f . ZERO ) ;
this . value = Vector3f . ZERO ;
break ;
case Vector4 :
if ( this . value instanceof ColorRGBA ) {
( ( ColorRGBA ) this . value ) . set ( ColorRGBA . BlackNoAlpha ) ;
} else if ( this . value instanceof Quaternion ) {
( ( Quaternion ) this . value ) . set ( Quaternion . ZERO ) ;
this . value = ColorRGBA . BlackNoAlpha ;
} else {
( ( Vector4f ) this . value ) . set ( Vector4f . ZERO ) ;
this . value = Quaternion . ZERO ;
}
break ;
default :
@ -262,35 +264,30 @@ public class Uniform extends ShaderVariable {
}
public void setValue ( VarType type , Object value ) {
if ( location = = - 1 ) {
if ( location = = - 1 )
return ;
}
if ( varType ! = null & & varType ! = type ) {
if ( varType ! = null & & varType ! = type )
throw new IllegalArgumentException ( "Expected a " + varType . name ( ) + " value!" ) ;
}
if ( value = = null ) {
if ( value = = null )
throw new NullPointerException ( ) ;
}
setByCurrentMaterial = true ;
switch ( type ) {
case Matrix3 :
Matrix3f m3 = ( Matrix3f ) value ;
if ( multiData = = null ) {
if ( multiData = = null )
multiData = BufferUtils . createFloatBuffer ( 9 ) ;
}
m3 . fillFloatBuffer ( multiData , true ) ;
multiData . clear ( ) ;
break ;
case Matrix4 :
Matrix4f m4 = ( Matrix4f ) value ;
if ( multiData = = null ) {
if ( multiData = = null )
multiData = BufferUtils . createFloatBuffer ( 16 ) ;
}
m4 . fillFloatBuffer ( multiData , true ) ;
multiData . clear ( ) ;
@ -314,9 +311,8 @@ public class Uniform extends ShaderVariable {
multiData = BufferUtils . ensureLargeEnough ( multiData , v2a . length * 2 ) ;
}
for ( int i = 0 ; i < v2a . length ; i + + ) {
for ( int i = 0 ; i < v2a . length ; i + + )
BufferUtils . setInBuffer ( v2a [ i ] , multiData , i ) ;
}
multiData . clear ( ) ;
break ;
@ -328,9 +324,8 @@ public class Uniform extends ShaderVariable {
multiData = BufferUtils . ensureLargeEnough ( multiData , v3a . length * 3 ) ;
}
for ( int i = 0 ; i < v3a . length ; i + + ) {
for ( int i = 0 ; i < v3a . length ; i + + )
BufferUtils . setInBuffer ( v3a [ i ] , multiData , i ) ;
}
multiData . clear ( ) ;
break ;
@ -342,39 +337,36 @@ public class Uniform extends ShaderVariable {
multiData = BufferUtils . ensureLargeEnough ( multiData , v4a . length * 4 ) ;
}
for ( int i = 0 ; i < v4a . length ; i + + ) {
for ( int i = 0 ; i < v4a . length ; i + + )
BufferUtils . setInBuffer ( v4a [ i ] , multiData , i ) ;
}
multiData . clear ( ) ;
break ;
case Matrix3Array :
Matrix3f [ ] m3a = ( Matrix3f [ ] ) value ;
if ( multiData = = null ) {
if ( multiData = = null )
multiData = BufferUtils . createFloatBuffer ( m3a . length * 9 ) ;
} else {
else {
multiData = BufferUtils . ensureLargeEnough ( multiData , m3a . length * 9 ) ;
}
for ( int i = 0 ; i < m3a . length ; i + + ) {
for ( int i = 0 ; i < m3a . length ; i + + )
m3a [ i ] . fillFloatBuffer ( multiData , true ) ;
}
multiData . clear ( ) ;
break ;
case Matrix4Array :
Matrix4f [ ] m4a = ( Matrix4f [ ] ) value ;
if ( multiData = = null ) {
if ( multiData = = null )
multiData = BufferUtils . createFloatBuffer ( m4a . length * 16 ) ;
} else {
else {
multiData = BufferUtils . ensureLargeEnough ( multiData , m4a . length * 16 ) ;
}
for ( int i = 0 ; i < m4a . length ; i + + ) {
for ( int i = 0 ; i < m4a . length ; i + + )
m4a [ i ] . fillFloatBuffer ( multiData , true ) ;
}
multiData . clear ( ) ;
break ;
@ -382,9 +374,8 @@ public class Uniform extends ShaderVariable {
case Int :
case Float :
case Boolean :
if ( this . value ! = null & & this . value . equals ( value ) ) {
if ( this . value ! = null & & this . value . equals ( value ) )
return ;
}
this . value = value ;
break ;
@ -393,18 +384,16 @@ public class Uniform extends ShaderVariable {
break ;
}
if ( multiData ! = null ) {
if ( multiData ! = null )
this . value = multiData ;
}
varType = type ;
updateNeeded = true ;
}
public void setVector4Length ( int length ) {
if ( location = = - 1 ) {
if ( location = = - 1 )
return ;
}
FloatBuffer fb = ( FloatBuffer ) value ;
if ( fb = = null | | fb . capacity ( ) < length ) {
@ -417,13 +406,11 @@ public class Uniform extends ShaderVariable {
}
public void setVector4InArray ( float x , float y , float z , float w , int index ) {
if ( location = = - 1 ) {
if ( location = = - 1 )
return ;
}
if ( varType ! = null & & varType ! = VarType . Vector4Array ) {
if ( varType ! = null & & varType ! = VarType . Vector4Array )
throw new IllegalArgumentException ( "Expected a " + varType . name ( ) + " value!" ) ;
}
FloatBuffer fb = ( FloatBuffer ) value ;
fb . position ( index * 4 ) ;
@ -446,4 +433,5 @@ public class Uniform extends ShaderVariable {
location = - 2 ;
updateNeeded = true ;
}
}