/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2017 Sri Harsha Chilakapati
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.shc.silenceengine.backend.android;
import android.opengl.GLES30;
import com.shc.silenceengine.graphics.IGraphicsDevice;
import com.shc.silenceengine.io.DirectBuffer;
import com.shc.silenceengine.io.DirectFloatBuffer;
import java.nio.ByteBuffer;
/**
* @author Sri Harsha Chilakapti
*/
class AndroidGraphicsDevice implements IGraphicsDevice
{
@Override
public int glGenBuffers()
{
int[] buffer = new int[1];
GLES30.glGenBuffers(1, buffer, 0);
return buffer[0];
}
@Override
public boolean glIsBuffer(int buffer)
{
return GLES30.glIsBuffer(buffer);
}
@Override
public void glBufferData(int target, DirectBuffer data, int usage)
{
GLES30.glBufferData(target, data.sizeBytes(), (ByteBuffer) data.nativeBuffer(), usage);
}
@Override
public void glBufferSubData(int target, int offset, int size, DirectBuffer data)
{
GLES30.glBufferSubData(target, offset, size, (ByteBuffer) data.nativeBuffer());
}
@Override
public void glBindBuffer(int target, int buffer)
{
GLES30.glBindBuffer(target, buffer);
}
@Override
public void glBufferData(int target, int capacity, int usage)
{
GLES30.glBufferData(target, capacity, null, usage);
}
@Override
public void glBufferSubData(int target, int offset, DirectBuffer data)
{
GLES30.glBufferSubData(target, offset, data.sizeBytes(), (ByteBuffer) data.nativeBuffer());
}
@Override
public void glDeleteBuffers(int... buffer)
{
GLES30.glDeleteBuffers(buffer.length, buffer, 0);
}
@Override
public int glGenFramebuffers()
{
int[] fBuffer = new int[1];
GLES30.glGenFramebuffers(1, fBuffer, 0);
return fBuffer[0];
}
@Override
public boolean glIsFramebuffer(int framebuffer)
{
return GLES30.glIsFramebuffer(framebuffer);
}
@Override
public void glFramebufferTexture2D(int target, int attachment, int textureTarget, int texture, int level)
{
GLES30.glFramebufferTexture2D(target, attachment, textureTarget, texture, level);
}
@Override
public void glBindFramebuffer(int target, int framebuffer)
{
GLES30.glBindFramebuffer(target, framebuffer);
}
@Override
public void glViewport(int x, int y, int width, int height)
{
GLES30.glViewport(x, y, width, height);
}
@Override
public void glClear(int flags)
{
Data.renderCallsThisFrame = 0;
GLES30.glClear(flags);
}
@Override
public int glCheckFramebufferStatus(int target)
{
return GLES30.glCheckFramebufferStatus(target);
}
@Override
public void glDeleteFramebuffers(int... framebuffer)
{
GLES30.glDeleteFramebuffers(framebuffer.length, framebuffer, 0);
}
@Override
public void glDrawArrays(int primitive, int offset, int vertexCount)
{
Data.renderCallsThisFrame++;
Data.totalRenderCalls++;
GLES30.glDrawArrays(primitive, offset, vertexCount);
}
@Override
public void glDrawElements(int primitive, int vertexCount, int type, int offset)
{
Data.renderCallsThisFrame++;
Data.totalRenderCalls++;
GLES30.glDrawElements(primitive, vertexCount, type, offset);
}
@Override
public void glEnable(int capability)
{
GLES30.glEnable(capability);
}
@Override
public void glBlendFunc(int src, int dst)
{
GLES30.glBlendFunc(src, dst);
}
@Override
public void glDisable(int capability)
{
GLES30.glDisable(capability);
}
@Override
public void glClearColor(float r, float g, float b, float a)
{
GLES30.glClearColor(r, g, b, a);
}
@Override
public void glBindVertexArray(int vaoID)
{
GLES30.glBindVertexArray(vaoID);
}
@Override
public void glDepthMask(boolean value)
{
GLES30.glDepthMask(value);
}
@Override
public void glDepthFunc(int func)
{
GLES30.glDepthFunc(func);
}
@Override
public void glCullFace(int mode)
{
GLES30.glCullFace(mode);
}
@Override
public int glGetError()
{
return GLES30.glGetError();
}
@Override
public int glCreateProgram()
{
return GLES30.glCreateProgram();
}
@Override
public void glAttachShader(int program, int shader)
{
GLES30.glAttachShader(program, shader);
}
@Override
public void glLinkProgram(int program)
{
GLES30.glLinkProgram(program);
}
@Override
public int glGetProgrami(int program, int param)
{
int[] value = new int[1];
GLES30.glGetProgramiv(program, param, value, 0);
return value[0];
}
@Override
public String glGetProgramInfoLog(int program)
{
return GLES30.glGetProgramInfoLog(program);
}
@Override
public int glGetAttribLocation(int program, String name)
{
return GLES30.glGetAttribLocation(program, name);
}
@Override
public void glUseProgram(int program)
{
GLES30.glUseProgram(program);
}
@Override
public int glGetUniformLocation(int program, String name)
{
return GLES30.glGetUniformLocation(program, name);
}
@Override
public void glUniform1i(int location, int value)
{
GLES30.glUniform1i(location, value);
}
@Override
public void glUniform2i(int location, int v1, int v2)
{
GLES30.glUniform2i(location, v1, v2);
}
@Override
public void glUniform3i(int location, int v1, int v2, int v3)
{
GLES30.glUniform3i(location, v1, v2, v3);
}
@Override
public void glUniform4i(int location, int v1, int v2, int v3, int v4)
{
GLES30.glUniform4i(location, v1, v2, v3, v4);
}
@Override
public void glUniform1f(int location, float value)
{
GLES30.glUniform1f(location, value);
}
@Override
public void glUniform2f(int location, float v1, float v2)
{
GLES30.glUniform2f(location, v1, v2);
}
@Override
public void glUniform3f(int location, float v1, float v2, float v3)
{
GLES30.glUniform3f(location, v1, v2, v3);
}
@Override
public void glUniform4f(int location, float v1, float v2, float v3, float v4)
{
GLES30.glUniform4f(location, v1, v2, v3, v4);
}
@Override
public void glUniformMatrix3fv(int location, boolean transpose, DirectFloatBuffer matrix)
{
GLES30.glUniformMatrix3fv(location, 1, transpose, ((ByteBuffer) matrix.getDirectBuffer().nativeBuffer()).asFloatBuffer());
}
@Override
public void glUniformMatrix4fv(int location, boolean transpose, DirectFloatBuffer matrix)
{
GLES30.glUniformMatrix4fv(location, 1, transpose, ((ByteBuffer) matrix.getDirectBuffer().nativeBuffer()).asFloatBuffer());
}
@Override
public void glDeleteProgram(int... id)
{
for (int program : id)
GLES30.glDeleteProgram(program);
}
@Override
public int glCreateShader(int type)
{
return GLES30.glCreateShader(type);
}
@Override
public void glShaderSource(int shader, String... source)
{
String sources = "";
for (String src : source)
sources += src;
GLES30.glShaderSource(shader, sources);
}
@Override
public void glCompileShader(int shader)
{
GLES30.glCompileShader(shader);
}
@Override
public int glGetShaderi(int shader, int param)
{
int[] value = new int[1];
GLES30.glGetShaderiv(shader, param, value, 0);
return value[0];
}
@Override
public String glGetShaderInfoLog(int shader)
{
return GLES30.glGetShaderInfoLog(shader);
}
@Override
public void glDeleteShader(int... shaders)
{
for (int shader : shaders)
GLES30.glDeleteShader(shader);
}
@Override
public int glGenTextures()
{
int[] texture = new int[1];
GLES30.glGenTextures(1, texture, 0);
return texture[0];
}
@Override
public void glActiveTexture(int unit)
{
GLES30.glActiveTexture(unit);
}
@Override
public void glBindTexture(int target, int texture)
{
GLES30.glBindTexture(target, texture);
}
@Override
public void glTexParameteri(int target, int param, int value)
{
GLES30.glTexParameteri(target, param, value);
}
@Override
public void glTexImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, int type, DirectBuffer pixels)
{
GLES30.glTexImage2D(target, level, internalFormat, width, height, border, format, type, (ByteBuffer) pixels.nativeBuffer());
}
@Override
public void glGenerateMipmap(int target)
{
GLES30.glGenerateMipmap(target);
}
@Override
public void glDeleteTextures(int... texture)
{
GLES30.glDeleteTextures(texture.length, texture, 0);
}
@Override
public int glGenVertexArrays()
{
int[] va = new int[1];
GLES30.glGenVertexArrays(1, va, 0);
return va[0];
}
@Override
public boolean glIsVertexArray(int vertexArray)
{
return GLES30.glIsVertexArray(vertexArray);
}
@Override
public void glEnableVertexAttribArray(int index)
{
GLES30.glEnableVertexAttribArray(index);
}
@Override
public void glDisableVertexAttribArray(int index)
{
GLES30.glDisableVertexAttribArray(index);
}
@Override
public void glVertexAttribPointer(int index, int count, int type, boolean normalized, int stride, long offset)
{
GLES30.glVertexAttribPointer(index, count, type, normalized, stride, (int) offset);
}
@Override
public void glDeleteVertexArrays(int... vertexArray)
{
GLES30.glDeleteVertexArrays(vertexArray.length, vertexArray, 0);
}
@Override
public boolean glIsProgram(int id)
{
return GLES30.glIsProgram(id);
}
}