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 + -
显示快捷键?