/* Copyright (C) 2011 Copyright 2010 Google Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package com.googlecode.gwtquake.shared.render; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; import java.util.ArrayList; import java.util.List; /** * Wrapper for a Gl1Context that logs most calls. */ public class Gl1DebugWrapper extends Gl1Context { final Gl1Context gl; public Gl1DebugWrapper(Gl1Context gl) { this.gl = gl; } public void big(String s) { System.out.println("***********************************************************************"); System.out.println(s); System.out.println("***********************************************************************"); } public static String c(int c) { switch (c) { case GL_BYTE: return "GL_BYTE"; case GL_BLEND: return "GL_BLEND"; case GL_COLOR_ARRAY: return "GL_COLOR_ARRAY"; case GL_DITHER: return "GL_DITHER"; case GL_FIXED: return "GL_FIXED"; case GL_FLOAT: return "GL_FLOAT"; case GL_LINES: return "GL_LINES"; case GL_LINE_LOOP: return "GL_LINE_LOOP"; case GL_LINE_SMOOTH: return "GL_LINE_SMOOTH"; case GL_LINE_SMOOTH_HINT: return "GL_LINE_SMOOTH_HINT"; case GL_LINE_STRIP: return "GL_LINE_STRIP"; case GL_MODELVIEW: return "GL_MODELVIWEW"; case GL_NO_ERROR: return "GL_NO_ERROR"; case GL_PROJECTION: return "GL_PROJECTION"; case GL_SHORT: return "GL_SHORT"; case GL_TRIANGLE_FAN: return "GL_TRIANGLE_FAN"; case GL_TRIANGLE_STRIP: return "GL_TRIANGLE_STRIP"; case GL_TRIANGLES: return "GL_TRIANGLES"; case GL_TEXTURE: return "GL_TEXTURE"; case GL_TEXTURE_COORD_ARRAY: return "GL_TEXTURE_COORD_ARRAY"; case GL_TEXTURE_2D: return "GL_TEXTURE_2D"; case GL_UNSIGNED_BYTE: return "GL_UNISGNED_BYTE"; case GL_UNSIGNED_SHORT: return "GL_UNSIGNED_SHORT"; default: return "GL_0x" + Integer.toHexString(c); } } private void print(String label, Object... param) { int err = gl.glGetError(); if (err != gl.GL_NO_ERROR) { System.out.println("glGetError(): " + c(err)); } System.out.print(label); // printObjectArr(param); System.out.println(); } private void printObj(Object o) { if (o instanceof float[]) { printFloatArr((float[]) o); } else if (o instanceof Object[]) { printObjectArr((Object[]) o); } else if (o instanceof double[]) { printDoubleArr((double[]) o); } else { System.out.print("" + o); } } private void printFloatArr(float[] a) { ArrayList<Float> l = new ArrayList<Float>(); for (float e : a) { l.add(e); } printList(l); } private void printDoubleArr(double[] a) { ArrayList<Double> l = new ArrayList<Double>(); for (double e : a) { l.add(e); } printList(l); } private void printObjectArr(Object[] a) { ArrayList<Object> l = new ArrayList<Object>(); for (Object e : a) { l.add(e); } printList(l); } private void printList(List<?> l) { System.out.print("["); for (int i = 0; i < l.size(); i++) { if (i != 0) { System.out.print(", "); } if (i > 20) { System.out.print("..."); break; } printObj(l.get(i)); } System.out.print("]"); } public final void glBindTexture(int t, int i) { print("glBindTexture", t, i); gl.glBindTexture(t, i); } public final void glBlendFunc(int a, int b) { print("glBlendFunc", a, b); gl.glBlendFunc(a, b); } public final void glClear(int mask) { print("Clear", mask); gl.glClear(mask); } public final void glColor4f(float red, float green, float blue, float alpha) { print("Color4f", red, green, blue, alpha); gl.glColor4f(red, green, blue, alpha); } public final void glColorPointer(int size, int stride, FloatBuffer buf) { print("ColorPointer", size, stride, buf); gl.glColorPointer(size, stride, buf); } public final void glDrawElements(int mode, ShortBuffer indices) { print("DrawElements", c(mode), indices); gl.glDrawElements(mode, indices); } public final void glEnable(int i) { print("Enable", c(i)); gl.glEnable(i); } public final int glGetError() { print("GetError"); return gl.glGetError(); } public final void glClearColor(float f, float g, float h, float i) { print("ClearColor", f, g, h, i); gl.glClearColor(f, g, h, i); } public void glDrawArrays(int mode, int first, int count) { print("DrawArrays", c(mode), first, count); // mv-matrix gl.glDrawArrays(mode, first, count); } public final void glLoadIdentity() { print("LoadIdentity"); gl.glLoadIdentity(); } public final void glMatrixMode(int mm) { print("MatrixMode", c(mm)); gl.glMatrixMode(mm); } public final void glPushMatrix() { print("PushMatrix"); gl.glPushMatrix(); } public final void glPopMatrix() { print("PopMatrix"); gl.glPopMatrix(); } public final void glRotatef(float angle, float x, float y, float z) { print("Rotatef", angle, x, y, z); gl.glRotatef(angle, x, y, z); } public final void glScalef(float x, float y, float z) { print("Scalef", x, y, z); gl.glScalef(x, y, z); } public final void glScissor(int x, int y, int width, int height) { print("Scissor", x, y, width, height); gl.glScissor(x, y, width, height); } public final void glTexEnvi(int target, int pname, int param) { print("TexEnvi", target, pname, param); gl.glTexEnvi(target, pname, param); } public final void glTranslatef(float tx, float ty, float tz) { print("Translatef", tx, ty, tz); gl.glTranslatef(tx, ty, tz); } public final void glVertexPointer(int size, int stride, FloatBuffer data) { print("VertexPointer", size, stride, data); gl.glVertexPointer(size, stride, data); } @Override public void glTexParameterf(int target, int pname, float param) { print("TexParameter", c(target), c(pname), param); gl.glTexParameterf(target, pname, param); } public final void glDeleteTextures(IntBuffer indices) { print("DeleteTextures", indices); gl.glDeleteTextures(indices); } public final void glEnableClientState(int i) { print("EnableClientState", c(i)); gl.glEnableClientState(i); } public final void glDisableClientState(int i) { print("DisableClientState", c(i)); gl.glDisableClientState(i); } public final void glDisable(int i) { print("Disable", c(i)); gl.glDisable(i); } public final void glCullFace(int c) { print("CullFace", c(c)); gl.glCullFace(c); } public final void glShadeModel(int s) { print("ShadeMode", c(s)); gl.glShadeModel(s); } public final void glViewport(int x, int y, int w, int h) { print("Viewport", x, y, w, h); gl.glViewport(x, y, w, h); } public final void glTexCoordPointer(int size, int stride, FloatBuffer buf) { print("TexCoordPointer", size, stride, buf); gl.glTexCoordPointer(size, stride, buf); } @Override public void glAlphaFunc(int i, float j) { print("glAlphaFunc", i, j); gl.glAlphaFunc(i, j); } @Override public void glColorPointer(int i, boolean b, int j, ByteBuffer colorAsByteBuffer) { print("glColorPointer", i, b, j, colorAsByteBuffer); gl.glColorPointer(i, b, j, colorAsByteBuffer); } @Override public void glDepthFunc(int func) { print("glDepthFunc", func); gl.glDepthFunc(func); } @Override public void glDepthMask(boolean b) { print("glDepthMask", b); gl.glDepthMask(b); } @Override public void glDepthRange(float gldepthmin, float gldepthmax) { print("glDepthRange", gldepthmin, gldepthmax); gl.glDepthRange(gldepthmin, gldepthmax); } @Override public void glDrawBuffer(int buf) { print("glDrawBuffer", buf); gl.glDrawBuffer(buf); } @Override public void glFinish() { print("glFinish"); gl.glFinish(); } @Override public void swapBuffers() { print("glFlush"); gl.swapBuffers(); } @Override public void glFrustum(double xmin, double xmax, double ymin, double ymax, double zNear, double zFar) { print("glFrustum", xmin, xmax, ymin, ymax, zNear, zFar); gl.glFrustum(xmin, xmax, ymin, ymax, zNear, zFar); } @Override public void glGetFloat(int name, FloatBuffer result) { gl.glGetFloat(name, result); print("glGetFloat", name, result); } @Override public String glGetString(int glVendor) { print("glGetString", glVendor); String result = gl.glGetString(glVendor); return result; } @Override public void glLoadMatrix(FloatBuffer m) { print("glLoadMatrix", m); gl.glLoadMatrix(m); } @Override public void glOrtho(int i, int width, int height, int j, int k, int l) { print("glOrtho", i, width, height, j, k, l); gl.glOrtho(i, width, height, j, k, l); } @Override public void glPixelStorei(int i, int j) { print("glPixelStorei", i, j); gl.glPixelStorei(i, j); } @Override public void glPointSize(float value) { print("glPointSize", value); gl.glPointSize(value); } @Override public void glPolygonMode(int i, int j) { print("glPolygonMode", i, j); gl.glPolygonMode(i, j); } @Override public void glReadPixels(int x, int y, int width, int height, int glBgr, int glUnsignedByte, ByteBuffer image) { print("glReadPixels", x, y, width, height, glBgr, glUnsignedByte, image); gl.glReadPixels(x, y, width, height, glBgr, glUnsignedByte, image); } @Override public void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) { print("glTexImage2D", target, level, internalformat, width, height, border, format, type, pixels); gl.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); } @Override public void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) { print("glTexImage2D", target, level, internalformat, width, height, border, format, type, pixels); gl.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); } @Override public void glTexParameteri(int glTexture2d, int glTextureMinFilter, int glFilterMin) { print("glTexParameteri", glTexture2d, glTextureMinFilter, glFilterMin); gl.glTexParameteri(glTexture2d, glTextureMinFilter, glFilterMin); } @Override public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) { print("glTexSubImage2D", target, level, xoffset, yoffset, width, height, format, type, pixels); gl.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); } @Override public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) { print("glTexSubImage2D", target, level, xoffset, yoffset, width, height, format, type, pixels); gl.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); } @Override public void shutdow() { print("shudown"); gl.shutdow(); } @Override public void glActiveTexture(int texture) { print("glActiveTexture", texture); gl.glActiveTexture(texture); } @Override public void glClientActiveTexture(int texture) { print("glClientActiveTexture"); gl.glClientActiveTexture(texture); } @Override public void glPointParameterf(int id, float value) { print("glPointParameterf", id, value); } @Override public void glGetInteger(int what, IntBuffer params) { // TODO Auto-generated method stub } }