Added support for int arrays uniforms. thanks to abies.
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10495 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
3d76821f02
commit
05e080100e
@ -643,6 +643,7 @@ public class OGLESShaderRenderer implements Renderer {
|
||||
|
||||
uniform.clearUpdateNeeded();
|
||||
FloatBuffer fb;
|
||||
IntBuffer ib;
|
||||
switch (uniform.getVarType()) {
|
||||
case Float:
|
||||
Float f = (Float) uniform.getValue();
|
||||
@ -683,6 +684,10 @@ public class OGLESShaderRenderer implements Renderer {
|
||||
assert fb.remaining() == 16;
|
||||
GLES20.glUniformMatrix4fv(loc, 1, false, fb);
|
||||
break;
|
||||
case IntArray:
|
||||
ib = (IntBuffer) uniform.getValue();
|
||||
GLES20.glUniform1iv(loc, ib.limit(), ib);
|
||||
break;
|
||||
case FloatArray:
|
||||
fb = (FloatBuffer) uniform.getValue();
|
||||
GLES20.glUniform1fv(loc, fb.limit(), fb);
|
||||
|
@ -34,6 +34,7 @@ package com.jme3.shader;
|
||||
import com.jme3.math.*;
|
||||
import com.jme3.util.BufferUtils;
|
||||
import java.nio.FloatBuffer;
|
||||
import java.nio.IntBuffer;
|
||||
|
||||
public class Uniform extends ShaderVariable {
|
||||
|
||||
@ -128,10 +129,10 @@ public class Uniform extends ShaderVariable {
|
||||
updateNeeded = true;
|
||||
|
||||
if (multiData != null){
|
||||
ZERO_BUF.clear();
|
||||
multiData.clear();
|
||||
|
||||
while (multiData.remaining() > 0){
|
||||
ZERO_BUF.clear();
|
||||
ZERO_BUF.limit( Math.min(multiData.remaining(), 16) );
|
||||
multiData.put(ZERO_BUF);
|
||||
}
|
||||
@ -202,6 +203,15 @@ public class Uniform extends ShaderVariable {
|
||||
m4.fillFloatBuffer(multiData, true);
|
||||
multiData.clear();
|
||||
break;
|
||||
case IntArray:
|
||||
int[] ia = (int[]) value;
|
||||
if (this.value == null) {
|
||||
this.value = BufferUtils.createIntBuffer(ia);
|
||||
} else {
|
||||
this.value = BufferUtils.ensureLargeEnough((IntBuffer)this.value, ia.length);
|
||||
}
|
||||
((IntBuffer)this.value).clear();
|
||||
break;
|
||||
case FloatArray:
|
||||
float[] fa = (float[]) value;
|
||||
if (multiData == null) {
|
||||
|
@ -38,6 +38,7 @@ public enum VarType {
|
||||
Vector3("vec3"),
|
||||
Vector4("vec4"),
|
||||
|
||||
IntArray(true,false,"int[]"),
|
||||
FloatArray(true,false,"float[]"),
|
||||
Vector2Array(true,false,"vec2[]"),
|
||||
Vector3Array(true,false,"vec3[]"),
|
||||
|
@ -1121,6 +1121,24 @@ public final class BufferUtils {
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public static IntBuffer ensureLargeEnough(IntBuffer buffer, int required) {
|
||||
if (buffer != null) {
|
||||
buffer.limit(buffer.capacity());
|
||||
}
|
||||
if (buffer == null || (buffer.remaining() < required)) {
|
||||
int position = (buffer != null ? buffer.position() : 0);
|
||||
IntBuffer newVerts = createIntBuffer(position + required);
|
||||
if (buffer != null) {
|
||||
buffer.flip();
|
||||
newVerts.put(buffer);
|
||||
newVerts.position(position);
|
||||
}
|
||||
buffer = newVerts;
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
public static ShortBuffer ensureLargeEnough(ShortBuffer buffer, int required) {
|
||||
if (buffer != null) {
|
||||
buffer.limit(buffer.capacity());
|
||||
|
@ -877,6 +877,7 @@ public class JoglRenderer implements Renderer {
|
||||
|
||||
uniform.clearUpdateNeeded();
|
||||
FloatBuffer fb;
|
||||
IntBuffer ib;
|
||||
GL gl = GLContext.getCurrentGL();
|
||||
switch (uniform.getVarType()) {
|
||||
case Float:
|
||||
@ -918,6 +919,10 @@ public class JoglRenderer implements Renderer {
|
||||
assert fb.remaining() == 16;
|
||||
gl.getGL2ES2().glUniformMatrix4fv(loc, 1, false, fb);
|
||||
break;
|
||||
case IntArray:
|
||||
ib = (IntBuffer) uniform.getValue();
|
||||
gl.getGL2ES2().glUniform1iv(loc, ib.remaining(), ib);
|
||||
break;
|
||||
case FloatArray:
|
||||
fb = (FloatBuffer) uniform.getValue();
|
||||
gl.getGL2ES2().glUniform1fv(loc, fb.remaining(), fb);
|
||||
|
@ -823,6 +823,7 @@ public class LwjglRenderer implements Renderer {
|
||||
|
||||
uniform.clearUpdateNeeded();
|
||||
FloatBuffer fb;
|
||||
IntBuffer ib;
|
||||
switch (uniform.getVarType()) {
|
||||
case Float:
|
||||
Float f = (Float) uniform.getValue();
|
||||
@ -863,6 +864,10 @@ public class LwjglRenderer implements Renderer {
|
||||
assert fb.remaining() == 16;
|
||||
glUniformMatrix4(loc, false, fb);
|
||||
break;
|
||||
case IntArray:
|
||||
ib = (IntBuffer) uniform.getValue();
|
||||
glUniform1(loc, ib);
|
||||
break;
|
||||
case FloatArray:
|
||||
fb = (FloatBuffer) uniform.getValue();
|
||||
glUniform1(loc, fb);
|
||||
|
Loading…
x
Reference in New Issue
Block a user