texturestaterecord.java
来自「java 3d game jme 工程开发源代码」· Java 代码 · 共 577 行 · 第 1/2 页
JAVA
577 行
/*
* Copyright (c) 2003-2009 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme.scene.state.jogl.records;
import java.nio.FloatBuffer;
import java.util.Collection;
import java.util.HashMap;
import javax.media.opengl.GL;
import com.jme.image.Texture;
import com.jme.image.Image.Format;
import com.jme.image.Texture.ApplyMode;
import com.jme.image.Texture.CombinerFunctionAlpha;
import com.jme.image.Texture.CombinerFunctionRGB;
import com.jme.image.Texture.CombinerOperandAlpha;
import com.jme.image.Texture.CombinerOperandRGB;
import com.jme.image.Texture.CombinerSource;
import com.jme.image.Texture.MagnificationFilter;
import com.jme.image.Texture.MinificationFilter;
import com.jme.image.Texture.WrapMode;
import com.jme.math.Vector3f;
import com.jme.renderer.jogl.JOGLContextCapabilities;
import com.jme.scene.state.StateRecord;
import com.jme.scene.state.TextureState.CorrectionType;
import com.jme.util.geom.BufferUtils;
public class TextureStateRecord extends StateRecord {
public FloatBuffer eyePlaneS = BufferUtils.createFloatBuffer(4);
public FloatBuffer eyePlaneT = BufferUtils.createFloatBuffer(4);
public FloatBuffer eyePlaneR = BufferUtils.createFloatBuffer(4);
public FloatBuffer eyePlaneQ = BufferUtils.createFloatBuffer(4);
public HashMap<Integer, TextureRecord> textures;
public TextureUnitRecord[] units;
public int hint = -1;
public int currentUnit = -1;
private boolean supportsMirroredRepeat;
private boolean supportsMirrorClamp;
private boolean supportsBorderClamp;
private boolean supportsEdgeClamp;
/**
* temporary rotation axis vector to flatline memory usage.
*/
public final Vector3f tmp_rotation1 = new Vector3f();
/**
* temporary matrix buffer to flatline memory usage.
*/
public final FloatBuffer tmp_matrixBuffer = BufferUtils.createFloatBuffer(16);
public TextureStateRecord(JOGLContextCapabilities caps, int maxUnits) {
textures = new HashMap<Integer, TextureRecord>();
units = new TextureUnitRecord[maxUnits];
for (int i = 0; i < maxUnits; i++) {
units[i] = new TextureUnitRecord();
}
eyePlaneS.put(1.0f).put(0.0f).put(0.0f).put(0.0f);
eyePlaneT.put(0.0f).put(1.0f).put(0.0f).put(0.0f);
eyePlaneR.put(0.0f).put(0.0f).put(1.0f).put(0.0f);
eyePlaneQ.put(0.0f).put(0.0f).put(0.0f).put(1.0f);
supportsMirroredRepeat = caps.GL_ARB_texture_mirrored_repeat;
supportsMirrorClamp = caps.GL_EXT_texture_mirror_clamp;
supportsBorderClamp = caps.GL_ARB_texture_border_clamp;
supportsEdgeClamp = caps.GL_VERSION_1_2;
}
public TextureRecord getTextureRecord(int textureId, Texture.Type type) {
TextureRecord tr = textures.get(textureId);
if (tr == null) {
tr = new TextureRecord();
textures.put(textureId, tr);
}
return tr;
}
public void removeTextureRecord(int textureId) {
textures.remove(textureId);
for (int i = 0; i < units.length; i++) {
if (units[i].boundTexture == textureId)
units[i].boundTexture = -1;
}
}
@Override
public void invalidate() {
super.invalidate();
currentUnit = -1;
hint = -1;
Collection<TextureRecord> texs = textures.values();
for (TextureRecord tr : texs) {
tr.invalidate();
}
for (int i = 0; i < units.length; i++) {
units[i].invalidate();
}
}
@Override
public void validate() {
super.validate();
Collection<TextureRecord> texs = textures.values();
for (TextureRecord tr : texs) {
tr.validate();
}
for (int i = 0; i < units.length; i++) {
units[i].validate();
}
}
// None static because of the support booleans
public int getGLWrap(WrapMode wrap) {
switch (wrap) {
case Repeat:
return GL.GL_REPEAT;
case MirroredRepeat:
if (supportsMirroredRepeat)
return GL.GL_MIRRORED_REPEAT_ARB;
else
return GL.GL_REPEAT;
case MirrorClamp:
if (supportsMirrorClamp)
return GL.GL_MIRROR_CLAMP_EXT;
// FALLS THROUGH
case Clamp:
return GL.GL_CLAMP;
case MirrorBorderClamp:
if (supportsMirrorClamp)
return GL.GL_MIRRORED_REPEAT_ARB;
// FALLS THROUGH
case BorderClamp:
if (supportsBorderClamp)
return GL.GL_CLAMP_TO_BORDER;
else
return GL.GL_CLAMP;
case MirrorEdgeClamp:
if (supportsMirrorClamp)
return GL.GL_MIRRORED_REPEAT_ARB;
// FALLS THROUGH
case EdgeClamp:
if (supportsEdgeClamp)
return GL.GL_CLAMP_TO_EDGE;
else
return GL.GL_CLAMP;
}
throw new IllegalArgumentException("invalid WrapMode type: "+wrap);
}
public static boolean isCompressedType(Format format) {
switch (format) {
case NativeDXT1:
case NativeDXT1A:
case NativeDXT3:
case NativeDXT5:
return true;
default:
return false;
}
}
public static int getGLDataFormat(Format format) {
switch (format) {
// first some frequently used formats
case RGBA8:
return GL.GL_RGBA8;
case RGB8:
return GL.GL_RGB8;
case Alpha8:
return GL.GL_ALPHA8;
case RGB_TO_DXT1:
case NativeDXT1:
return GL.GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
case RGBA_TO_DXT1:
case NativeDXT1A:
return GL.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
case RGBA_TO_DXT3:
case NativeDXT3:
return GL.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
case RGBA_TO_DXT5:
case NativeDXT5:
return GL.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
// The rest...
case Alpha4:
return GL.GL_ALPHA4;
case Alpha12:
return GL.GL_ALPHA12;
case Alpha16:
return GL.GL_ALPHA16;
case Luminance4:
return GL.GL_LUMINANCE4;
case Luminance8:
return GL.GL_LUMINANCE8;
case Luminance12:
return GL.GL_LUMINANCE12;
case Luminance16:
return GL.GL_LUMINANCE16;
case Intensity4:
return GL.GL_INTENSITY4;
case Intensity8:
return GL.GL_INTENSITY8;
case Intensity12:
return GL.GL_INTENSITY12;
case Intensity16:
return GL.GL_INTENSITY16;
case Luminance4Alpha4:
return GL.GL_LUMINANCE4_ALPHA4;
case Luminance6Alpha2:
return GL.GL_LUMINANCE6_ALPHA2;
case Luminance8Alpha8:
return GL.GL_LUMINANCE8_ALPHA8;
case Luminance12Alpha4:
return GL.GL_LUMINANCE12_ALPHA4;
case Luminance12Alpha12:
return GL.GL_LUMINANCE12_ALPHA12;
case Luminance16Alpha16:
return GL.GL_LUMINANCE16_ALPHA16;
case R3G3B2:
return GL.GL_R3_G3_B2;
case RGB4:
return GL.GL_RGB4;
case RGB5:
return GL.GL_RGB5;
case RGB10:
return GL.GL_RGB10;
case RGB12:
return GL.GL_RGB12;
case RGB16:
return GL.GL_RGB16;
case RGBA2:
return GL.GL_RGBA2;
case RGBA4:
return GL.GL_RGBA4;
case RGB5A1:
return GL.GL_RGB5_A1;
case RGB10A2:
return GL.GL_RGB10_A2;
case RGBA12:
return GL.GL_RGBA12;
case RGBA16:
return GL.GL_RGBA16;
case Depth16:
return GL.GL_DEPTH_COMPONENT16_ARB;
case Depth24:
return GL.GL_DEPTH_COMPONENT24_ARB;
case Depth32:
return GL.GL_DEPTH_COMPONENT32_ARB;
case RGB16F:
return GL.GL_RGB16F_ARB;
case RGB32F:
return GL.GL_RGB32F_ARB;
case RGBA16F:
return GL.GL_RGBA16F_ARB;
case RGBA32F:
return GL.GL_RGBA32F_ARB;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?