/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.badlogic.gdx.graphics.g3d.attributes;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g3d.Attribute;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.utils.GdxRuntimeException;
import com.badlogic.gdx.utils.NumberUtils;
public class DepthTestAttribute extends Attribute {
public final static String Alias = "depthStencil";
public final static long Type = register(Alias);
protected static long Mask = Type;
public final static boolean is (final long mask) {
return (mask & Mask) != 0;
}
/** The depth test function, or 0 to disable depth test (default: GL10.GL_LEQUAL) */
public int depthFunc;
/** Mapping of near clipping plane to window coordinates (default: 0) */
public float depthRangeNear;
/** Mapping of far clipping plane to window coordinates (default: 1) */
public float depthRangeFar;
/** Whether to write to the depth buffer (default: true) */
public boolean depthMask;
public DepthTestAttribute () {
this(GL20.GL_LEQUAL);
}
public DepthTestAttribute (boolean depthMask) {
this(GL20.GL_LEQUAL, depthMask);
}
public DepthTestAttribute (final int depthFunc) {
this(depthFunc, true);
}
public DepthTestAttribute (int depthFunc, boolean depthMask) {
this(depthFunc, 0, 1, depthMask);
}
public DepthTestAttribute (int depthFunc, float depthRangeNear, float depthRangeFar) {
this(depthFunc, depthRangeNear, depthRangeFar, true);
}
public DepthTestAttribute (int depthFunc, float depthRangeNear, float depthRangeFar, boolean depthMask) {
this(Type, depthFunc, depthRangeNear, depthRangeFar, depthMask);
}
public DepthTestAttribute (final long type, int depthFunc, float depthRangeNear, float depthRangeFar, boolean depthMask) {
super(type);
if (!is(type)) throw new GdxRuntimeException("Invalid type specified");
this.depthFunc = depthFunc;
this.depthRangeNear = depthRangeNear;
this.depthRangeFar = depthRangeFar;
this.depthMask = depthMask;
}
public DepthTestAttribute (final DepthTestAttribute rhs) {
this(rhs.type, rhs.depthFunc, rhs.depthRangeNear, rhs.depthRangeFar, rhs.depthMask);
}
@Override
public Attribute copy () {
return new DepthTestAttribute(this);
}
@Override
public int hashCode () {
int result = super.hashCode();
result = 971 * result + depthFunc;
result = 971 * result + NumberUtils.floatToRawIntBits(depthRangeNear);
result = 971 * result + NumberUtils.floatToRawIntBits(depthRangeFar);
result = 971 * result + (depthMask ? 1 : 0);
return result;
}
@Override
public int compareTo (Attribute o) {
if (type != o.type) return (int)(type - o.type);
DepthTestAttribute other = (DepthTestAttribute)o;
if (depthFunc != other.depthFunc) return depthFunc - other.depthFunc;
if (depthMask != other.depthMask) return depthMask ? -1 : 1;
if (!MathUtils.isEqual(depthRangeNear, other.depthRangeNear))
return depthRangeNear < other.depthRangeNear ? -1 : 1;
if (!MathUtils.isEqual(depthRangeFar, other.depthRangeFar))
return depthRangeFar < other.depthRangeFar ? -1 : 1;
return 0;
}
}