lwjglblendstate.java

来自「java 3d game jme 工程开发源代码」· Java 代码 · 共 424 行 · 第 1/2 页

JAVA
424
字号
                int glDstRGB = getGLDstValue(getDestinationFunctionRGB());
                if (supportsSeparateFunctions()) {
                    int glSrcAlpha = getGLSrcValue(getSourceFunctionAlpha());
                    int glDstAlpha = getGLDstValue(getDestinationFunctionAlpha());
                    if (record.srcFactorRGB != glSrcRGB
                            || record.dstFactorRGB != glDstRGB
                            || record.srcFactorAlpha != glSrcAlpha
                            || record.dstFactorAlpha != glDstAlpha) {
                        EXTBlendFuncSeparate.glBlendFuncSeparateEXT(glSrcRGB,
                                glDstRGB, glSrcAlpha, glDstAlpha);
                        record.srcFactorRGB = glSrcRGB;
                        record.dstFactorRGB = glDstRGB;
                        record.srcFactorAlpha = glSrcAlpha;
                        record.dstFactorAlpha = glDstAlpha;
                    }
                } else if (record.srcFactorRGB != glSrcRGB
                        || record.dstFactorRGB != glDstRGB) {
                    GL11.glBlendFunc(glSrcRGB, glDstRGB);
                    record.srcFactorRGB = glSrcRGB;
                    record.dstFactorRGB = glDstRGB;
                }
            }
        } else {
            if (enabled) {
                int glSrcRGB = getGLSrcValue(getSourceFunctionRGB());
                int glDstRGB = getGLDstValue(getDestinationFunctionRGB());
                if (supportsSeparateFunctions()) {
                    int glSrcAlpha = getGLSrcValue(getSourceFunctionAlpha());
                    int glDstAlpha = getGLDstValue(getDestinationFunctionAlpha());
                    EXTBlendFuncSeparate.glBlendFuncSeparateEXT(glSrcRGB,
                            glDstRGB, glSrcAlpha, glDstAlpha);
                    record.srcFactorRGB = glSrcRGB;
                    record.dstFactorRGB = glDstRGB;
                    record.srcFactorAlpha = glSrcAlpha;
                    record.dstFactorAlpha = glDstAlpha;
                } else {
                    GL11.glBlendFunc(glSrcRGB, glDstRGB);
                    record.srcFactorRGB = glSrcRGB;
                    record.dstFactorRGB = glDstRGB;
                }
            }
        }
    }

    private int getGLSrcValue(SourceFunction function) {
        switch (function) {
            case Zero:
                return GL11.GL_ZERO;
            case DestinationColor:
                return GL11.GL_DST_COLOR;
            case OneMinusDestinationColor:
                return GL11.GL_ONE_MINUS_DST_COLOR;
            case SourceAlpha:
                return GL11.GL_SRC_ALPHA;
            case OneMinusSourceAlpha:
                return GL11.GL_ONE_MINUS_SRC_ALPHA;
            case DestinationAlpha:
                return GL11.GL_DST_ALPHA;
            case OneMinusDestinationAlpha:
                return GL11.GL_ONE_MINUS_DST_ALPHA;
            case SourceAlphaSaturate:
                return GL11.GL_SRC_ALPHA_SATURATE;
            case ConstantColor:
                if (supportsConstantColor())
                    return EXTBlendColor.GL_CONSTANT_COLOR_EXT;
                // FALLS THROUGH
            case OneMinusConstantColor:
                if (supportsConstantColor())
                    return EXTBlendColor.GL_ONE_MINUS_CONSTANT_COLOR_EXT;
                // FALLS THROUGH
            case ConstantAlpha:
                if (supportsConstantColor())
                    return EXTBlendColor.GL_CONSTANT_ALPHA_EXT;
                // FALLS THROUGH
            case OneMinusConstantAlpha:
                if (supportsConstantColor())
                    return EXTBlendColor.GL_ONE_MINUS_CONSTANT_ALPHA_EXT;
                // FALLS THROUGH
            case One:
                return GL11.GL_ONE;
        }
        throw new IllegalArgumentException("Invalid source function type: "
                + function);
    }

    private int getGLDstValue(DestinationFunction function) {
        switch (function) {
            case Zero:
                return GL11.GL_ZERO;
            case SourceColor:
                return GL11.GL_SRC_COLOR;
            case OneMinusSourceColor:
                return GL11.GL_ONE_MINUS_SRC_COLOR;
            case SourceAlpha:
                return GL11.GL_SRC_ALPHA;
            case OneMinusSourceAlpha:
                return GL11.GL_ONE_MINUS_SRC_ALPHA;
            case DestinationAlpha:
                return GL11.GL_DST_ALPHA;
            case OneMinusDestinationAlpha:
                return GL11.GL_ONE_MINUS_DST_ALPHA;
            case ConstantColor:
                if (supportsConstantColor())
                    return EXTBlendColor.GL_CONSTANT_COLOR_EXT;
                // FALLS THROUGH
            case OneMinusConstantColor:
                if (supportsConstantColor())
                    return EXTBlendColor.GL_ONE_MINUS_CONSTANT_COLOR_EXT;
                // FALLS THROUGH
            case ConstantAlpha:
                if (supportsConstantColor())
                    return EXTBlendColor.GL_CONSTANT_ALPHA_EXT;
                // FALLS THROUGH
            case OneMinusConstantAlpha:
                if (supportsConstantColor())
                    return EXTBlendColor.GL_ONE_MINUS_CONSTANT_ALPHA_EXT;
                // FALLS THROUGH
            case One:
                return GL11.GL_ONE;
        }
        throw new IllegalArgumentException(
                "Invalid destination function type: " + function);
    }

    private int getGLEquationValue(BlendEquation eq) {
        switch (eq) {
            case Min:
                if (supportsMinMax)
                    return EXTBlendMinmax.GL_MIN_EXT;
                // FALLS THROUGH
            case Max:
                if (supportsMinMax)
                    return EXTBlendMinmax.GL_MAX_EXT;
                else
                    return ARBImaging.GL_FUNC_ADD;
            case Subtract:
                if (supportsSubtract)
                    return EXTBlendSubtract.GL_FUNC_SUBTRACT_EXT;
                // FALLS THROUGH
            case ReverseSubtract:
                if (supportsSubtract)
                    return EXTBlendSubtract.GL_FUNC_REVERSE_SUBTRACT_EXT;
                // FALLS THROUGH
            case Add:
                return ARBImaging.GL_FUNC_ADD;
        }
        throw new IllegalArgumentException("Invalid blend equation: " + eq);
    }

    private void applyTest(boolean enabled, BlendStateRecord record) {
        if (record.isValid()) {
            if (enabled) {
                if (!record.testEnabled) {
                    GL11.glEnable(GL11.GL_ALPHA_TEST);
                    record.testEnabled = true;
                }
                int glFunc = getGLFuncValue(getTestFunction());
                if (record.alphaFunc != glFunc
                        || record.alphaRef != getReference()) {
                    GL11.glAlphaFunc(glFunc, getReference());
                    record.alphaFunc = glFunc;
                    record.alphaRef = getReference();
                }
            } else if (record.testEnabled) {
                GL11.glDisable(GL11.GL_ALPHA_TEST);
                record.testEnabled = false;
            }

        } else {
            if (enabled) {
                GL11.glEnable(GL11.GL_ALPHA_TEST);
                record.testEnabled = true;
                int glFunc = getGLFuncValue(getTestFunction());
                GL11.glAlphaFunc(glFunc, getReference());
                record.alphaFunc = glFunc;
                record.alphaRef = getReference();
            } else {
                GL11.glDisable(GL11.GL_ALPHA_TEST);
                record.testEnabled = false;
            }
        }
    }

    private int getGLFuncValue(TestFunction function) {
        switch (function) {
            case Never:
                return GL11.GL_NEVER;
            case LessThan:
                return GL11.GL_LESS;
            case EqualTo:
                return GL11.GL_EQUAL;
            case LessThanOrEqualTo:
                return GL11.GL_LEQUAL;
            case GreaterThan:
                return GL11.GL_GREATER;
            case NotEqualTo:
                return GL11.GL_NOTEQUAL;
            case GreaterThanOrEqualTo:
                return GL11.GL_GEQUAL;
            case Always:
                return GL11.GL_ALWAYS;
        }
        throw new IllegalArgumentException("Invalid test function type: "
                + function);
    }

    @Override
    public BlendStateRecord createStateRecord() {
        return new BlendStateRecord();
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?