- Added textureArray support (thanks to phate666)

- Added a testcase and test materials to use them

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8551 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
rem..om 13 years ago
parent 83f3b2b1a3
commit fafd79e5d3
  1. 113
      engine/src/core/com/jme3/texture/TextureArray.java
  2. 2
      engine/src/lwjgl-ogl/com/jme3/renderer/lwjgl/TextureUtil.java
  3. 87
      engine/src/test/jme3test/texture/TestTextureArray.java
  4. 50
      engine/src/test/jme3test/texture/UnshadedArray.frag
  5. 70
      engine/src/test/jme3test/texture/UnshadedArray.j3md
  6. 38
      engine/src/test/jme3test/texture/UnshadedArray.vert

@ -0,0 +1,113 @@
package com.jme3.texture;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* This class implements a Texture array
* warning, this feature is only supported on opengl 3.0 version.
* To check if a hardware supports TextureArray check :
* renderManager.getRenderer().getCaps().contains(Caps.TextureArray)
* @author phate666
*/
public class TextureArray extends Texture {
private WrapMode wrapS = WrapMode.EdgeClamp;
private WrapMode wrapT = WrapMode.EdgeClamp;
/**
* Construct a TextureArray
* warning, this feature is only supported on opengl 3.0 version.
* To check if a hardware supports TextureArray check :
* renderManager.getRenderer().getCaps().contains(Caps.TextureArray)
*/
public TextureArray() {
super();
}
/**
* Construct a TextureArray from the given list of images
* warning, this feature is only supported on opengl 3.0 version.
* To check if a hardware supports TextureArray check :
* renderManager.getRenderer().getCaps().contains(Caps.TextureArray)
* @param images
*/
public TextureArray(List<Image> images) {
super();
int width = images.get(0).getWidth();
int height = images.get(0).getHeight();
Image arrayImage = new Image(images.get(0).getFormat(), width, height,
null);
for (Image img : images) {
if (img.getHeight() != height || img.getWidth() != width) {
Logger.getLogger(TextureArray.class.getName()).log(
Level.WARNING,
"all images must have the same width/height");
continue;
}
arrayImage.addData(img.getData(0));
}
setImage(arrayImage);
}
@Override
public Texture createSimpleClone() {
TextureArray clone = new TextureArray();
createSimpleClone(clone);
return clone;
}
@Override
public Texture createSimpleClone(Texture rVal) {
rVal.setWrap(WrapAxis.S, wrapS);
rVal.setWrap(WrapAxis.T, wrapT);
return super.createSimpleClone(rVal);
}
@Override
public Type getType() {
return Type.TwoDimensionalArray;
}
@Override
public WrapMode getWrap(WrapAxis axis) {
switch (axis) {
case S:
return wrapS;
case T:
return wrapT;
default:
throw new IllegalArgumentException("invalid WrapAxis: " + axis);
}
}
@Override
public void setWrap(WrapAxis axis, WrapMode mode) {
if (mode == null) {
throw new IllegalArgumentException("mode can not be null.");
} else if (axis == null) {
throw new IllegalArgumentException("axis can not be null.");
}
switch (axis) {
case S:
this.wrapS = mode;
break;
case T:
this.wrapT = mode;
break;
default:
throw new IllegalArgumentException("Not applicable for 2D textures");
}
}
@Override
public void setWrap(WrapMode mode) {
if (mode == null) {
throw new IllegalArgumentException("mode can not be null.");
}
this.wrapS = mode;
this.wrapT = mode;
}
}

@ -474,7 +474,7 @@ public class TextureUtil {
border,
format,
dataType,
0);
data);
}else{
glTexSubImage3D(target,
i, // level

@ -0,0 +1,87 @@
package jme3test.texture;
import java.util.ArrayList;
import java.util.List;
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.renderer.Caps;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.scene.VertexBuffer.Type;
import com.jme3.texture.Image;
import com.jme3.texture.Texture;
import com.jme3.texture.TextureArray;
import com.jme3.util.BufferUtils;
public class TestTextureArray extends SimpleApplication
{
@Override
public void simpleInitApp()
{
Material mat = new Material(assetManager, "jme3test/texture/UnshadedArray.j3md");
for (Caps caps : renderManager.getRenderer().getCaps()) {
System.out.println(caps.name());
}
if(!renderManager.getRenderer().getCaps().contains(Caps.TextureArray)){
throw new UnsupportedOperationException("Your hardware does not support TextureArray");
}
Texture tex1 = assetManager.loadTexture( "Textures/Terrain/Pond/Pond.jpg");
Texture tex2 = assetManager.loadTexture("Textures/Terrain/Rock2/rock.jpg");
List<Image> images = new ArrayList<Image>();
images.add(tex1.getImage());
images.add(tex2.getImage());
TextureArray tex3 = new TextureArray(images);
mat.setTexture("ColorMap", tex3);
Mesh m = new Mesh();
Vector3f[] vertices = new Vector3f[8];
vertices[0] = new Vector3f(0, 0, 0);
vertices[1] = new Vector3f(3, 0, 0);
vertices[2] = new Vector3f(0, 3, 0);
vertices[3] = new Vector3f(3, 3, 0);
vertices[4] = new Vector3f(3, 0, 0);
vertices[5] = new Vector3f(6, 0, 0);
vertices[6] = new Vector3f(3, 3, 0);
vertices[7] = new Vector3f(6, 3, 0);
Vector3f[] texCoord = new Vector3f[8];
texCoord[0] = new Vector3f(0, 0, 0);
texCoord[1] = new Vector3f(1, 0, 0);
texCoord[2] = new Vector3f(0, 1, 0);
texCoord[3] = new Vector3f(1, 1, 0);
texCoord[4] = new Vector3f(0, 0, 1);
texCoord[5] = new Vector3f(1, 0, 1);
texCoord[6] = new Vector3f(0, 1, 1);
texCoord[7] = new Vector3f(1, 1, 1);
int[] indexes = { 2, 0, 1, 1, 3, 2 , 6, 4, 5, 5, 7, 6};
m.setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(vertices));
m.setBuffer(Type.TexCoord, 3, BufferUtils.createFloatBuffer(texCoord));
m.setBuffer(Type.Index, 1, BufferUtils.createIntBuffer(indexes));
m.updateBound();
Geometry geom = new Geometry("Mesh", m);
geom.setMaterial(mat);
rootNode.attachChild(geom);
}
/**
* @param args
*/
public static void main(String[] args)
{
TestTextureArray app = new TestTextureArray();
app.start();
}
}

@ -0,0 +1,50 @@
uniform vec4 m_Color;
#if defined(HAS_GLOWMAP) || defined(HAS_COLORMAP) || (defined(HAS_LIGHTMAP) && !defined(SEPARATE_TEXCOORD))
#define NEED_TEXCOORD1
#endif
#ifdef HAS_COLORMAP
uniform sampler2DArray m_ColorMap;
#endif
#ifdef NEED_TEXCOORD1
varying vec3 texCoord1;
#endif
#ifdef HAS_LIGHTMAP
uniform sampler2D m_LightMap;
#ifdef SEPERATE_TEXCOORD
varying vec3 texCoord2;
#endif
#endif
#ifdef HAS_VERTEXCOLOR
varying vec4 vertColor;
#endif
void main(){
vec4 color = vec4(1.0);
#ifdef HAS_COLORMAP
color *= texture2DArray(m_ColorMap, texCoord1);
#endif
#ifdef HAS_VERTEXCOLOR
color *= vertColor;
#endif
#ifdef HAS_COLOR
color *= m_Color;
#endif
#ifdef HAS_LIGHTMAP
#ifdef SEPARATE_TEXCOORD
color.rgb *= texture2D(m_LightMap, texCoord2).rgb;
#else
color.rgb *= texture2D(m_LightMap, texCoord1).rgb;
#endif
#endif
gl_FragColor = color;
}

@ -0,0 +1,70 @@
MaterialDef Unshaded {
MaterialParameters {
TextureArray ColorMap
Texture2D LightMap
Color Color (Color)
Boolean VertexColor
Boolean SeparateTexCoord
// Texture of the glowing parts of the material
Texture2D GlowMap
// The glow color of the object
Color GlowColor
}
Technique {
VertexShader GLSL100: jme3test/texture/UnshadedArray.vert
FragmentShader GLSL100: jme3test/texture/UnshadedArray.frag
WorldParameters {
WorldViewProjectionMatrix
}
Defines {
SEPARATE_TEXCOORD : SeparateTexCoord
HAS_COLORMAP : ColorMap
HAS_LIGHTMAP : LightMap
HAS_VERTEXCOLOR : VertexColor
HAS_COLOR : Color
}
}
Technique PreNormalPass {
VertexShader GLSL100 : Common/MatDefs/SSAO/normal.vert
FragmentShader GLSL100 : Common/MatDefs/SSAO/normal.frag
WorldParameters {
WorldViewProjectionMatrix
WorldViewMatrix
NormalMatrix
}
RenderState {
}
}
Technique Glow {
VertexShader GLSL100: Cjme3test/texture/UnshadedArray.vert
FragmentShader GLSL100: Common/MatDefs/Light/Glow.frag
WorldParameters {
WorldViewProjectionMatrix
}
Defines {
HAS_GLOWMAP : GlowMap
HAS_GLOWCOLOR : GlowColor
HAS_COLORMAP // Must be passed so that Unshaded.vert exports texCoord.
}
}
Technique FixedFunc {
}
}

@ -0,0 +1,38 @@
uniform mat4 g_WorldViewProjectionMatrix;
attribute vec3 inPosition;
#if defined(HAS_COLORMAP) || (defined(HAS_LIGHTMAP) && !defined(SEPARATE_TEXCOORD))
#define NEED_TEXCOORD1
#endif
#ifdef NEED_TEXCOORD1
attribute vec3 inTexCoord;
varying vec3 texCoord1;
#endif
#ifdef SEPARATE_TEXCOORD
attribute vec3 inTexCoord2;
varying vec3 texCoord2;
#endif
#ifdef HAS_VERTEXCOLOR
attribute vec4 inColor;
varying vec4 vertColor;
#endif
void main(){
#ifdef NEED_TEXCOORD1
texCoord1 = inTexCoord;
#endif
#ifdef SEPARATE_TEXCOORD
texCoord2 = inTexCoord2;
#endif
#ifdef HAS_VERTEXCOLOR
vertColor = inColor;
#endif
gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0);
}
Loading…
Cancel
Save