- 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
This commit is contained in:
parent
83f3b2b1a3
commit
fafd79e5d3
113
engine/src/core/com/jme3/texture/TextureArray.java
Normal file
113
engine/src/core/com/jme3/texture/TextureArray.java
Normal file
@ -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
|
||||
|
87
engine/src/test/jme3test/texture/TestTextureArray.java
Normal file
87
engine/src/test/jme3test/texture/TestTextureArray.java
Normal file
@ -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();
|
||||
}
|
||||
|
||||
}
|
50
engine/src/test/jme3test/texture/UnshadedArray.frag
Normal file
50
engine/src/test/jme3test/texture/UnshadedArray.frag
Normal file
@ -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;
|
||||
}
|
70
engine/src/test/jme3test/texture/UnshadedArray.j3md
Normal file
70
engine/src/test/jme3test/texture/UnshadedArray.j3md
Normal file
@ -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 {
|
||||
}
|
||||
|
||||
}
|
38
engine/src/test/jme3test/texture/UnshadedArray.vert
Normal file
38
engine/src/test/jme3test/texture/UnshadedArray.vert
Normal file
@ -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…
x
Reference in New Issue
Block a user