GLRenderer: cleanup to shadow compare mode
Store compare mode in LastTextureState instead of on Texture object
This commit is contained in:
parent
efe600c38d
commit
aa54947ff3
@ -44,7 +44,7 @@ public interface GL2 extends GL {
|
|||||||
public static final int GL_ALPHA_TEST = 0xBC0;
|
public static final int GL_ALPHA_TEST = 0xBC0;
|
||||||
public static final int GL_BGR = 0x80E0;
|
public static final int GL_BGR = 0x80E0;
|
||||||
public static final int GL_BGRA = 0x80E1;
|
public static final int GL_BGRA = 0x80E1;
|
||||||
public static final int GL_COMPARE_R_TO_TEXTURE = 0x884E;
|
public static final int GL_COMPARE_REF_TO_TEXTURE = 0x884E;
|
||||||
public static final int GL_DEPTH_COMPONENT24 = 0x81A6;
|
public static final int GL_DEPTH_COMPONENT24 = 0x81A6;
|
||||||
public static final int GL_DEPTH_COMPONENT32 = 0x81A7;
|
public static final int GL_DEPTH_COMPONENT32 = 0x81A7;
|
||||||
public static final int GL_DEPTH_TEXTURE_MODE = 0x884B;
|
public static final int GL_DEPTH_TEXTURE_MODE = 0x884B;
|
||||||
|
@ -51,7 +51,9 @@ import com.jme3.texture.FrameBuffer;
|
|||||||
import com.jme3.texture.FrameBuffer.RenderBuffer;
|
import com.jme3.texture.FrameBuffer.RenderBuffer;
|
||||||
import com.jme3.texture.Image;
|
import com.jme3.texture.Image;
|
||||||
import com.jme3.texture.Texture;
|
import com.jme3.texture.Texture;
|
||||||
|
import com.jme3.texture.Texture.ShadowCompareMode;
|
||||||
import com.jme3.texture.Texture.WrapAxis;
|
import com.jme3.texture.Texture.WrapAxis;
|
||||||
|
import com.jme3.texture.image.LastTextureState;
|
||||||
import com.jme3.util.BufferUtils;
|
import com.jme3.util.BufferUtils;
|
||||||
import com.jme3.util.ListMap;
|
import com.jme3.util.ListMap;
|
||||||
import com.jme3.util.MipMapGenerator;
|
import com.jme3.util.MipMapGenerator;
|
||||||
@ -1842,77 +1844,71 @@ public class GLRenderer implements Renderer {
|
|||||||
int target = convertTextureType(tex.getType(), image != null ? image.getMultiSamples() : 1, -1);
|
int target = convertTextureType(tex.getType(), image != null ? image.getMultiSamples() : 1, -1);
|
||||||
|
|
||||||
boolean haveMips = true;
|
boolean haveMips = true;
|
||||||
|
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
haveMips = image.isGeneratedMipmapsRequired() || image.hasMipmaps();
|
haveMips = image.isGeneratedMipmapsRequired() || image.hasMipmaps();
|
||||||
}
|
}
|
||||||
|
|
||||||
// filter things
|
LastTextureState curState = image.getLastTextureState();
|
||||||
if (image.getLastTextureState().magFilter != tex.getMagFilter()) {
|
|
||||||
int magFilter = convertMagFilter(tex.getMagFilter());
|
if (curState.magFilter != tex.getMagFilter()) {
|
||||||
bindTextureAndUnit(target, image, unit);
|
bindTextureAndUnit(target, image, unit);
|
||||||
gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, magFilter);
|
gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, convertMagFilter(tex.getMagFilter()));
|
||||||
image.getLastTextureState().magFilter = tex.getMagFilter();
|
curState.magFilter = tex.getMagFilter();
|
||||||
}
|
}
|
||||||
if (image.getLastTextureState().minFilter != tex.getMinFilter()) {
|
if (curState.minFilter != tex.getMinFilter()) {
|
||||||
int minFilter = convertMinFilter(tex.getMinFilter(), haveMips);
|
|
||||||
bindTextureAndUnit(target, image, unit);
|
bindTextureAndUnit(target, image, unit);
|
||||||
gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, minFilter);
|
gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, convertMinFilter(tex.getMinFilter(), haveMips));
|
||||||
image.getLastTextureState().minFilter = tex.getMinFilter();
|
curState.minFilter = tex.getMinFilter();
|
||||||
}
|
}
|
||||||
if (caps.contains(Caps.TextureFilterAnisotropic)
|
if (caps.contains(Caps.TextureFilterAnisotropic)
|
||||||
&& image.getLastTextureState().anisoFilter != tex.getAnisotropicFilter()) {
|
&& curState.anisoFilter != tex.getAnisotropicFilter()) {
|
||||||
bindTextureAndUnit(target, image, unit);
|
bindTextureAndUnit(target, image, unit);
|
||||||
gl.glTexParameterf(target,
|
gl.glTexParameterf(target,
|
||||||
GLExt.GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
GLExt.GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||||
tex.getAnisotropicFilter());
|
tex.getAnisotropicFilter());
|
||||||
image.getLastTextureState().anisoFilter = tex.getAnisotropicFilter();
|
curState.anisoFilter = tex.getAnisotropicFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
// repeat modes
|
|
||||||
switch (tex.getType()) {
|
switch (tex.getType()) {
|
||||||
case ThreeDimensional:
|
case ThreeDimensional:
|
||||||
case CubeMap: // cubemaps use 3D coords
|
case CubeMap: // cubemaps use 3D coords
|
||||||
if (gl2 != null && image.getLastTextureState().rWrap != tex.getWrap(WrapAxis.R)) {
|
if (gl2 != null && curState.rWrap != tex.getWrap(WrapAxis.R)) {
|
||||||
bindTextureAndUnit(target, image, unit);
|
bindTextureAndUnit(target, image, unit);
|
||||||
gl2.glTexParameteri(target, GL2.GL_TEXTURE_WRAP_R, convertWrapMode(tex.getWrap(WrapAxis.R)));
|
gl2.glTexParameteri(target, GL2.GL_TEXTURE_WRAP_R, convertWrapMode(tex.getWrap(WrapAxis.R)));
|
||||||
image.getLastTextureState().rWrap = tex.getWrap(WrapAxis.R);
|
curState.rWrap = tex.getWrap(WrapAxis.R);
|
||||||
}
|
}
|
||||||
//There is no break statement on purpose here
|
//There is no break statement on purpose here
|
||||||
case TwoDimensional:
|
case TwoDimensional:
|
||||||
case TwoDimensionalArray:
|
case TwoDimensionalArray:
|
||||||
if (image.getLastTextureState().tWrap != tex.getWrap(WrapAxis.T)) {
|
if (curState.tWrap != tex.getWrap(WrapAxis.T)) {
|
||||||
bindTextureAndUnit(target, image, unit);
|
bindTextureAndUnit(target, image, unit);
|
||||||
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, convertWrapMode(tex.getWrap(WrapAxis.T)));
|
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, convertWrapMode(tex.getWrap(WrapAxis.T)));
|
||||||
image.getLastTextureState().tWrap = tex.getWrap(WrapAxis.T);
|
image.getLastTextureState().tWrap = tex.getWrap(WrapAxis.T);
|
||||||
}
|
}
|
||||||
if (image.getLastTextureState().sWrap != tex.getWrap(WrapAxis.S)) {
|
if (curState.sWrap != tex.getWrap(WrapAxis.S)) {
|
||||||
bindTextureAndUnit(target, image, unit);
|
bindTextureAndUnit(target, image, unit);
|
||||||
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, convertWrapMode(tex.getWrap(WrapAxis.S)));
|
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, convertWrapMode(tex.getWrap(WrapAxis.S)));
|
||||||
image.getLastTextureState().sWrap = tex.getWrap(WrapAxis.S);
|
curState.sWrap = tex.getWrap(WrapAxis.S);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException("Unknown texture type: " + tex.getType());
|
throw new UnsupportedOperationException("Unknown texture type: " + tex.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tex.isNeedCompareModeUpdate() && gl2 != null) {
|
ShadowCompareMode texCompareMode = tex.getShadowCompareMode();
|
||||||
// R to Texture compare mode
|
if (gl2 != null && curState.shadowCompareMode != texCompareMode) {
|
||||||
if (tex.getShadowCompareMode() != Texture.ShadowCompareMode.Off) {
|
|
||||||
bindTextureAndUnit(target, image, unit);
|
bindTextureAndUnit(target, image, unit);
|
||||||
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL2.GL_COMPARE_R_TO_TEXTURE);
|
if (texCompareMode != ShadowCompareMode.Off) {
|
||||||
gl2.glTexParameteri(target, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY);
|
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL2.GL_COMPARE_REF_TO_TEXTURE);
|
||||||
if (tex.getShadowCompareMode() == Texture.ShadowCompareMode.GreaterOrEqual) {
|
if (texCompareMode == ShadowCompareMode.GreaterOrEqual) {
|
||||||
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_GEQUAL);
|
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_GEQUAL);
|
||||||
} else {
|
} else {
|
||||||
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_LEQUAL);
|
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_LEQUAL);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bindTextureAndUnit(target, image, unit);
|
|
||||||
//restoring default value
|
|
||||||
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL.GL_NONE);
|
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL.GL_NONE);
|
||||||
}
|
}
|
||||||
tex.compareModeUpdated();
|
curState.shadowCompareMode = texCompareMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If at this point we didn't bind the texture, bind it now
|
// If at this point we didn't bind the texture, bind it now
|
||||||
|
@ -316,7 +316,6 @@ public abstract class Texture implements CloneableSmartAsset, Savable, Cloneable
|
|||||||
private MinFilter minificationFilter = MinFilter.BilinearNoMipMaps;
|
private MinFilter minificationFilter = MinFilter.BilinearNoMipMaps;
|
||||||
private MagFilter magnificationFilter = MagFilter.Bilinear;
|
private MagFilter magnificationFilter = MagFilter.Bilinear;
|
||||||
private ShadowCompareMode shadowCompareMode = ShadowCompareMode.Off;
|
private ShadowCompareMode shadowCompareMode = ShadowCompareMode.Off;
|
||||||
private boolean needCompareModeUpdate = false;
|
|
||||||
private int anisotropicFilter;
|
private int anisotropicFilter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -404,7 +403,6 @@ public abstract class Texture implements CloneableSmartAsset, Savable, Cloneable
|
|||||||
"compareMode can not be null.");
|
"compareMode can not be null.");
|
||||||
}
|
}
|
||||||
this.shadowCompareMode = compareMode;
|
this.shadowCompareMode = compareMode;
|
||||||
needCompareModeUpdate = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -489,7 +487,7 @@ public abstract class Texture implements CloneableSmartAsset, Savable, Cloneable
|
|||||||
/**
|
/**
|
||||||
* @return the anisotropic filtering level for this texture. Default value
|
* @return the anisotropic filtering level for this texture. Default value
|
||||||
* is 0 (use value from config),
|
* is 0 (use value from config),
|
||||||
* 1 means 1x (no anisotrophy), 2 means x2, 4 is x4, etc.
|
* 1 means 1x (no anisotropy), 2 means x2, 4 is x4, etc.
|
||||||
*/
|
*/
|
||||||
public int getAnisotropicFilter() {
|
public int getAnisotropicFilter() {
|
||||||
return anisotropicFilter;
|
return anisotropicFilter;
|
||||||
@ -636,14 +634,4 @@ public abstract class Texture implements CloneableSmartAsset, Savable, Cloneable
|
|||||||
magnificationFilter = capsule.readEnum("magnificationFilter",
|
magnificationFilter = capsule.readEnum("magnificationFilter",
|
||||||
MagFilter.class, MagFilter.Bilinear);
|
MagFilter.class, MagFilter.Bilinear);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isNeedCompareModeUpdate() {
|
|
||||||
return needCompareModeUpdate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void compareModeUpdated() {
|
|
||||||
this.needCompareModeUpdate = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -45,10 +45,11 @@ public final class LastTextureState {
|
|||||||
public Texture.WrapMode sWrap, tWrap, rWrap;
|
public Texture.WrapMode sWrap, tWrap, rWrap;
|
||||||
public Texture.MagFilter magFilter;
|
public Texture.MagFilter magFilter;
|
||||||
public Texture.MinFilter minFilter;
|
public Texture.MinFilter minFilter;
|
||||||
public int anisoFilter = 0;
|
public int anisoFilter;
|
||||||
|
public Texture.ShadowCompareMode shadowCompareMode;
|
||||||
|
|
||||||
public LastTextureState() {
|
public LastTextureState() {
|
||||||
// All parameters initialized to null (meaning unset).
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reset() {
|
public void reset() {
|
||||||
@ -58,5 +59,9 @@ public final class LastTextureState {
|
|||||||
magFilter = null;
|
magFilter = null;
|
||||||
minFilter = null;
|
minFilter = null;
|
||||||
anisoFilter = 0;
|
anisoFilter = 0;
|
||||||
|
|
||||||
|
// The default in OpenGL is OFF, so we avoid setting this per texture
|
||||||
|
// if its not used.
|
||||||
|
shadowCompareMode = Texture.ShadowCompareMode.Off;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user