- Added a testcase and test materials to use them git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8551 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
83f3b2b1a3
commit
fafd79e5d3
@ -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; |
||||
} |
||||
} |
@ -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…
Reference in new issue