package com.glview.hwui;
import com.glview.libgdx.graphics.opengl.GL20;
class RenderState {
public static final float OPAQUE_ALPHA = 0.95f;
GL20 mGL;
private int mTextureTarget = GL20.GL_TEXTURE_2D;
private boolean mBlendEnabled = false;
private boolean mDepthEnabled = false;
private boolean mDepthMask = true;
private float mLineWidth = 1.0f;
GLPaint mDefaultPaint = new GLPaint();
int mViewportWidth, mViewportHeight;
public RenderState(GL20 gl) {
mGL = gl;
// 设置屏幕背景色RGBA
mGL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
mGL.glClearStencil(0);
// Enable used features
mGL.glEnable(GL20.GL_DITHER);
// 关闭深度测试
mGL.glDisable(GL20.GL_DEPTH_TEST);
mGL.glDepthFunc(GL20.GL_LEQUAL);
mGL.glEnable(GL20.GL_BLEND);
mGL.glBlendFunc(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);
// We use 565 or 8888 format, so set the alignment to 2 bytes/pixel.
mGL.glPixelStorei(GL20.GL_UNPACK_ALIGNMENT, 2);
}
public void setViewport(int width, int height) {
mViewportWidth = width;
mViewportHeight = height;
mGL.glViewport(0, 0, mViewportWidth, mViewportHeight);
}
public GLPaint getDefaultPaint() {
return mDefaultPaint;
}
int mFrameBuffer = 0;
public int getFrameBuffer() {
return mFrameBuffer;
}
public void bindFrameBuffer(int buffer) {
if (mFrameBuffer != buffer) {
mFrameBuffer = buffer;
mGL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, mFrameBuffer);
}
}
public void setLineWidth(float width) {
if (mLineWidth == width) return;
mLineWidth = width;
mGL.glLineWidth(width);
}
public void setColorMode(float alpha) {
setBlendEnabled(alpha < OPAQUE_ALPHA);
}
// target is a value like GL_TEXTURE_2D. If target = 0, texturing is disabled.
public void setTextureTarget(int target) {
if (mTextureTarget == target) return;
if (mTextureTarget != 0) {
mGL.glDisable(mTextureTarget);
}
mTextureTarget = target;
if (mTextureTarget != 0) {
mGL.glEnable(mTextureTarget);
}
}
public void setBlendEnabled(boolean enabled) {
if (mBlendEnabled == enabled) {
return;
}
setDepthMask(!enabled);
mBlendEnabled = enabled;
// if (enabled) {
// mGL.glEnable(GL20.GL_BLEND);
// } else {
// mGL.glDisable(GL20.GL_BLEND);
// }
}
public void setDepthEnabled(boolean enabled) {
if (mDepthEnabled == enabled) {
return;
}
mDepthEnabled = enabled;
if (enabled) {
mGL.glEnable(GL20.GL_DEPTH_TEST);
} else {
mGL.glDisable(GL20.GL_DEPTH_TEST);
}
}
public void setDepthMask(boolean mask) {
if (mDepthMask == mask) {
return;
}
mDepthMask = mask;
mGL.glDepthMask(mask);
}
}