/* * 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.gwt; import com.google.gwt.typedarrays.client.Float32ArrayNative; import com.google.gwt.typedarrays.client.Uint8ArrayNative; import com.google.gwt.typedarrays.shared.ArrayBufferView; import com.shc.silenceengine.graphics.IGraphicsDevice; import com.shc.silenceengine.io.DirectBuffer; import com.shc.silenceengine.io.DirectFloatBuffer; import com.shc.webgl4j.client.WebGL10; import static com.shc.silenceengine.graphics.IGraphicsDevice.Constants.*; /** * @author Sri Harsha Chilakapati */ class GwtGraphicsDevice implements IGraphicsDevice { @Override public int glGenBuffers() { return WebGL10.glCreateBuffer(); } @Override public boolean glIsBuffer(int buffer) { return WebGL10.glIsBuffer(buffer); } @Override public void glBufferData(int value, DirectBuffer data, int usage) { WebGL10.glBufferData(value, (ArrayBufferView) data.nativeBuffer(), usage); } @Override public void glBufferSubData(int target, int offset, int size, DirectBuffer data) { WebGL10.glBufferSubData(target, offset, size, (ArrayBufferView) data.nativeBuffer()); } @Override public void glBindBuffer(int target, int buffer) { WebGL10.glBindBuffer(target, buffer); } @Override public void glBufferData(int target, int capacity, int usage) { WebGL10.glBufferData(target, capacity, usage); } @Override public void glBufferSubData(int target, int offset, DirectBuffer data) { WebGL10.glBufferSubData(target, offset, data.sizeBytes(), (ArrayBufferView) data.nativeBuffer()); } @Override public void glDeleteBuffers(int... buffer) { for (int bufferID : buffer) WebGL10.glDeleteBuffer(bufferID); } @Override public int glGenFramebuffers() { return WebGL10.glCreateFramebuffer(); } @Override public boolean glIsFramebuffer(int framebuffer) { return WebGL10.glIsFramebuffer(framebuffer); } @Override public void glFramebufferTexture2D(int target, int attachment, int textureTarget, int texture, int level) { WebGL10.glFramebufferTexture2D(target, attachment, textureTarget, texture, level); } @Override public void glBindFramebuffer(int target, int framebuffer) { WebGL10.glBindFramebuffer(target, framebuffer); } @Override public void glViewport(int x, int y, int width, int height) { WebGL10.glViewport(x, y, width, height); } @Override public void glClear(int flags) { IGraphicsDevice.super.glClear(flags); WebGL10.glClear(flags); } @Override public int glCheckFramebufferStatus(int target) { return WebGL10.glCheckFramebufferStatus(target); } @Override public void glDeleteFramebuffers(int... framebuffer) { for (int framebufferID : framebuffer) WebGL10.glDeleteFramebuffer(framebufferID); } @Override public void glDrawArrays(int primitive, int offset, int vertexCount) { IGraphicsDevice.super.glDrawArrays(primitive, offset, vertexCount); WebGL10.glDrawArrays(primitive, offset, vertexCount); } @Override public void glDrawElements(int primitive, int vertexCount, int type, int offset) { IGraphicsDevice.super.glDrawElements(primitive, vertexCount, type, offset); WebGL10.glDrawElements(primitive, vertexCount, type, offset); } @Override public void glEnable(int capability) { WebGL10.glEnable(capability); } @Override public void glBlendFunc(int src, int dst) { WebGL10.glBlendFunc(src, dst); } @Override public void glDisable(int capability) { WebGL10.glDisable(capability); } @Override public void glClearColor(float r, float g, float b, float a) { WebGL10.glClearColor(r, g, b, a); } @Override public void glBindVertexArray(int vaoID) { VAOImpl.get().glBindVertexArray(vaoID); } @Override public void glDepthMask(boolean value) { WebGL10.glDepthMask(value); } @Override public void glDepthFunc(int func) { WebGL10.glDepthFunc(func); } @Override public void glCullFace(int mode) { WebGL10.glCullFace(mode); } @Override public int glGetError() { return WebGL10.glGetError(); } @Override public int glCreateProgram() { return WebGL10.glCreateProgram(); } @Override public void glAttachShader(int program, int shader) { WebGL10.glAttachShader(program, shader); } @Override public void glLinkProgram(int program) { WebGL10.glLinkProgram(program); } @Override public int glGetProgrami(int program, int param) { if (param == GL_LINK_STATUS || param == GL_DELETE_STATUS || param == GL_VALIDATE_STATUS) return WebGL10.<Boolean>glGetProgramParameter(program, param) ? GL_TRUE : GL_FALSE; return WebGL10.<Integer>glGetProgramParameter(program, param); } @Override public String glGetProgramInfoLog(int program) { return WebGL10.glGetProgramInfoLog(program); } @Override public int glGetAttribLocation(int program, String name) { return WebGL10.glGetAttribLocation(program, name); } @Override public void glUseProgram(int program) { WebGL10.glUseProgram(program); } @Override public int glGetUniformLocation(int program, String name) { return WebGL10.glGetUniformLocation(program, name); } @Override public void glUniform1i(int location, int value) { WebGL10.glUniform1i(location, value); } @Override public void glUniform2i(int location, int v1, int v2) { WebGL10.glUniform2i(location, v1, v2); } @Override public void glUniform3i(int location, int v1, int v2, int v3) { WebGL10.glUniform3i(location, v1, v2, v3); } @Override public void glUniform4i(int location, int v1, int v2, int v3, int v4) { WebGL10.glUniform4i(location, v1, v2, v3, v4); } @Override public void glUniform1f(int location, float value) { WebGL10.glUniform1f(location, value); } @Override public void glUniform2f(int location, float v1, float v2) { WebGL10.glUniform2f(location, v1, v2); } @Override public void glUniform3f(int location, float v1, float v2, float v3) { WebGL10.glUniform3f(location, v1, v2, v3); } @Override public void glUniform4f(int location, float v1, float v2, float v3, float v4) { WebGL10.glUniform4f(location, v1, v2, v3, v4); } @Override public void glUniformMatrix3fv(int location, boolean transpose, DirectFloatBuffer matrix) { WebGL10.glUniformMatrix3fv(location, transpose, Float32ArrayNative.create(((ArrayBufferView) matrix.getDirectBuffer().nativeBuffer()).buffer())); } @Override public void glUniformMatrix4fv(int location, boolean transpose, DirectFloatBuffer matrix) { WebGL10.glUniformMatrix4fv(location, transpose, Float32ArrayNative.create(((ArrayBufferView) matrix.getDirectBuffer().nativeBuffer()).buffer())); } @Override public void glDeleteProgram(int... id) { for (int program : id) WebGL10.glDeleteProgram(program); } @Override public int glCreateShader(int type) { return WebGL10.glCreateShader(type); } @Override public void glShaderSource(int shader, String... source) { String sources = ""; for (String line : source) sources += line + "\n"; WebGL10.glShaderSource(shader, sources); } @Override public void glCompileShader(int shader) { WebGL10.glCompileShader(shader); } @Override public int glGetShaderi(int shader, int param) { if (param == GL_SHADER_TYPE) return WebGL10.<Integer>glGetShaderParameter(shader, param); else return WebGL10.<Boolean>glGetShaderParameter(shader, param) ? Constants.GL_TRUE : Constants.GL_FALSE; } @Override public String glGetShaderInfoLog(int shader) { return WebGL10.glGetShaderInfoLog(shader); } @Override public void glDeleteShader(int... shader) { for (int id : shader) WebGL10.glDeleteShader(id); } @Override public int glGenTextures() { return WebGL10.glCreateTexture(); } @Override public void glActiveTexture(int unit) { WebGL10.glActiveTexture(unit); } @Override public void glBindTexture(int target, int texture) { WebGL10.glBindTexture(target, texture); } @Override public void glTexParameteri(int target, int param, int value) { WebGL10.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) { ArrayBufferView arrayBufferView = null; switch (type) { case GL_FLOAT: arrayBufferView = Float32ArrayNative.create(((ArrayBufferView) pixels.nativeBuffer()).buffer()); break; case GL_UNSIGNED_BYTE: arrayBufferView = Uint8ArrayNative.create(((ArrayBufferView) pixels.nativeBuffer()).buffer()); break; } WebGL10.glTexImage2D(target, level, internalFormat, width, height, border, format, type, arrayBufferView); } @Override public void glGenerateMipmap(int target) { WebGL10.glGenerateMipmap(target); } @Override public void glDeleteTextures(int... texture) { for (int id : texture) WebGL10.glDeleteTexture(id); } @Override public int glGenVertexArrays() { return VAOImpl.get().glGenVertexArrays(); } @Override public boolean glIsVertexArray(int vertexArray) { return VAOImpl.get().glIsVertexArray(vertexArray); } @Override public void glEnableVertexAttribArray(int index) { VAOImpl.get().glEnableVertexAttribArray(index); } @Override public void glDisableVertexAttribArray(int index) { VAOImpl.get().glDisableVertexAttribArray(index); } @Override public void glVertexAttribPointer(int index, int count, int type, boolean normalized, int stride, long offset) { VAOImpl.get().glVertexAttribPointer(index, count, type, normalized, stride, offset); } @Override public void glDeleteVertexArrays(int... vertexArray) { for (int id : vertexArray) VAOImpl.get().glDeleteVertexArray(id); } @Override public boolean glIsProgram(int id) { return WebGL10.glIsProgram(id); } }