/** Indicates whether the given GLU routine is available to be called. */ public boolean isFunctionAvailable(String gluFunctionName) { return (gluProcAddressTable.getAddressFor(gluFunctionName) != 0); } private GLUProcAddressTable gluProcAddressTable; private GL gl; public GLUImpl(GLUProcAddressTable gluProcAddressTable) { this.gluProcAddressTable = gluProcAddressTable; this.project = new Project(); } // Used for pure-Java port of GLU public void setGL(GL gl) { this.gl = gl; } //---------------------------------------------------------------------- // Tesselator functionality // public GLUtesselator gluNewTess() { return GLUtesselatorImpl.gluNewTess(); } public void gluDeleteTess(GLUtesselator tesselator) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluDeleteTess(); } public void gluTessProperty(GLUtesselator tesselator, int which, double value) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluTessProperty(which, value); } public void gluGetTessProperty(GLUtesselator tesselator, int which, double[] value) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluGetTessProperty(which, value); } public void gluTessNormal(GLUtesselator tesselator, double x, double y, double z) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluTessNormal(x, y, z); } public void gluTessCallback(GLUtesselator tesselator, int which, GLUtesselatorCallback aCallback) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluTessCallback(which, aCallback); } public void gluTessVertex(GLUtesselator tesselator, double[] coords, Object data) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluTessVertex(coords, data); } public void gluTessBeginPolygon(GLUtesselator tesselator, Object data) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluTessBeginPolygon(data); } public void gluTessBeginContour(GLUtesselator tesselator) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluTessBeginContour(); } public void gluTessEndContour(GLUtesselator tesselator) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluTessEndContour(); } public void gluTessEndPolygon(GLUtesselator tesselator) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluTessEndPolygon(); } public void gluBeginPolygon(GLUtesselator tesselator) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluBeginPolygon(); } public void gluNextContour(GLUtesselator tesselator, int type) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluNextContour(type); } public void gluEndPolygon(GLUtesselator tesselator) { GLUtesselatorImpl tess = (GLUtesselatorImpl) tesselator; tess.gluEndPolygon(); } //---------------------------------------------------------------------- // Quadric functionality // /** Interface to C language function:
void gluCylinder(GLUquadric * quad, GLdouble base, GLdouble top, GLdouble height, GLint slices, GLint stacks); */ public void gluCylinder(GLUquadric quad, double base, double top, double height, int slices, int stacks) { ((GLUquadricImpl) quad).drawCylinder(gl, (float) base, (float) top, (float) height, slices, stacks); } /** Interface to C language function:
void gluDeleteQuadric(GLUquadric * quad); */ public void gluDeleteQuadric(GLUquadric quad) { } /** Interface to C language function:
void gluDisk(GLUquadric * quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops); */ public void gluDisk(GLUquadric quad, double inner, double outer, int slices, int loops) { ((GLUquadricImpl) quad).drawDisk(gl, (float) inner, (float) outer, slices, loops); } /** Interface to C language function:
GLUquadric * gluNewQuadric(void); */ public GLUquadric gluNewQuadric() { return new GLUquadricImpl(); } /** Interface to C language function:
void gluPartialDisk(GLUquadric * quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops, GLdouble start, GLdouble sweep); */ public void gluPartialDisk(GLUquadric quad, double inner, double outer, int slices, int loops, double start, double sweep) { ((GLUquadricImpl) quad).drawPartialDisk(gl, (float) inner, (float) outer, slices, loops, (float) start, (float) sweep); } /** Interface to C language function:
void gluQuadricDrawStyle(GLUquadric * quad, GLenum draw); */ public void gluQuadricDrawStyle(GLUquadric quad, int draw) { ((GLUquadricImpl) quad).setDrawStyle(draw); } /** Interface to C language function:
void gluQuadricNormals(GLUquadric * quad, GLenum normal); */ public void gluQuadricNormals(GLUquadric quad, int normal) { ((GLUquadricImpl) quad).setNormals(normal); } /** Interface to C language function:
void gluQuadricOrientation(GLUquadric * quad, GLenum orientation); */ public void gluQuadricOrientation(GLUquadric quad, int orientation) { ((GLUquadricImpl) quad).setOrientation(orientation); } /** Interface to C language function:
void gluQuadricTexture(GLUquadric * quad, GLboolean texture); */ public void gluQuadricTexture(GLUquadric quad, boolean texture) { ((GLUquadricImpl) quad).setTextureFlag(texture); } /** Interface to C language function:
void gluSphere(GLUquadric * quad, GLdouble radius, GLint slices, GLint stacks); */ public void gluSphere(GLUquadric quad, double radius, int slices, int stacks) { ((GLUquadricImpl) quad).drawSphere(gl, (float) radius, slices, stacks); } //---------------------------------------------------------------------- // Projection functionality // private Project project; public void gluOrtho2D(double left, double right, double bottom, double top) { project.gluOrtho2D(gl, left, right, bottom, top); } public void gluPerspective(double fovy, double aspect, double zNear, double zFar) { project.gluPerspective(gl, fovy, aspect, zNear, zFar); } public void gluLookAt(double eyeX, double eyeY, double eyeZ, double centerX, double centerY, double centerZ, double upX, double upY, double upZ) { project.gluLookAt(gl, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ); } public boolean gluProject(double objX, double objY, double objZ, double[] model, double[] proj, int[] view, double[] winX, double[] winY, double[] winZ) { double[] tmp = new double[3]; boolean res = project.gluProject(objX, objY, objZ, model, proj, view, tmp); winX[0] = tmp[0]; winY[0] = tmp[1]; winZ[0] = tmp[2]; return res; } public boolean gluProject(double objX, double objY, double objZ, double[] model, double[] proj, int[] view, double[] winPos) { return project.gluProject(objX, objY, objZ, model, proj, view, winPos); } public boolean gluUnProject(double winX, double winY, double winZ, double[] model, double[] proj, int[] view, double[] objX, double[] objY, double[] objZ) { double[] tmp = new double[3]; boolean res = project.gluUnProject(winX, winY, winZ, model, proj, view, tmp); objX[0] = tmp[0]; objY[0] = tmp[1]; objZ[0] = tmp[2]; return res; } public boolean gluUnProject(double winX, double winY, double winZ, double[] model, double[] proj, int[] view, double[] objPos) { return project.gluUnProject(winX, winY, winZ, model, proj, view, objPos); } public boolean gluUnProject4(double winX, double winY, double winZ, double clipW, double[] model, double[] proj, int[] view, double nearVal, double farVal, double[] objX, double[] objY, double[] objZ, double[] objW) { double[] tmp = new double[4]; boolean res = project.gluUnProject4(winX, winY, winZ, clipW, model, proj, view, nearVal, farVal, tmp); objX[0] = tmp[0]; objY[0] = tmp[1]; objZ[0] = tmp[2]; objW[0] = tmp[3]; return res; } public boolean gluUnProject4(double winX, double winY, double winZ, double clipW, double[] model, double[] proj, int[] view, double nearVal, double farVal, double[] objPos) { return project.gluUnProject4(winX, winY, winZ, clipW, model, proj, view, nearVal, farVal, objPos); } public void gluPickMatrix(double x, double y, double delX, double delY, int[] viewport) { project.gluPickMatrix(gl, x, y, delX, delY, viewport); } //---------------------------------------------------------------------- // Mimpmap and image scaling functionality // Boolean public static final int GLU_FALSE = 0; public static final int GLU_TRUE = 1; // String Name public static final int GLU_VERSION = 100800; public static final int GLU_EXTENSIONS = 100801; // Extensions public static final String versionString = "1.3"; public static final String extensionString = "GLU_EXT_nurbs_tessellator " + "GLU_EXT_object_space_tess "; // ErrorCode public static final int GLU_INVALID_ENUM = 100900; public static final int GLU_INVALID_VALUE = 100901; public static final int GLU_OUT_OF_MEMORY = 100902; public static final int GLU_INVALID_OPERATION = 100904; // NurbsDisplay // GLU_FILL public static final int GLU_OUTLINE_POLYGON = 100240; public static final int GLU_OUTLINE_PATCH = 100241; // NurbsCallback public static final int GLU_NURBS_ERROR = 100103; public static final int GLU_ERROR = 100103; public static final int GLU_NURBS_BEGIN = 100164; public static final int GLU_NURBS_BEGIN_EXT = 100164; public static final int GLU_NURBS_VERTEX = 100165; public static final int GLU_NURBS_VERTEX_EXT = 100165; public static final int GLU_NURBS_NORMAL = 100166; public static final int GLU_NURBS_NORMAL_EXT = 100166; public static final int GLU_NURBS_COLOR = 100167; public static final int GLU_NURBS_COLOR_EXT = 100167; public static final int GLU_NURBS_TEXTURE_COORD = 100168; public static final int GLU_NURBS_TEX_COORD_EXT = 100168; public static final int GLU_NURBS_END = 100169; public static final int GLU_NURBS_END_EXT = 100169; public static final int GLU_NURBS_BEGIN_DATA = 100170; public static final int GLU_NURBS_BEGIN_DATA_EXT = 100170; public static final int GLU_NURBS_VERTEX_DATA = 100171; public static final int GLU_NURBS_VERTEX_DATA_EXT = 100171; public static final int GLU_NURBS_NORMAL_DATA = 100172; public static final int GLU_NURBS_NORMAL_DATA_EXT = 100172; public static final int GLU_NURBS_COLOR_DATA = 100173; public static final int GLU_NURBS_COLOR_DATA_EXT = 100173; public static final int GLU_NURBS_TEXTURE_COORD_DATA = 100174; public static final int GLU_NURBS_TEX_COORD_DATA_EXT = 100174; public static final int GLU_NURBS_END_DATA = 100175; public static final int GLU_NURBS_END_DATA_EXT = 100175; // NurbsError public static final int GLU_NURBS_ERROR1 = 100251; public static final int GLU_NURBS_ERROR2 = 100252; public static final int GLU_NURBS_ERROR3 = 100253; public static final int GLU_NURBS_ERROR4 = 100254; public static final int GLU_NURBS_ERROR5 = 100255; public static final int GLU_NURBS_ERROR6 = 100256; public static final int GLU_NURBS_ERROR7 = 100257; public static final int GLU_NURBS_ERROR8 = 100258; public static final int GLU_NURBS_ERROR9 = 100259; public static final int GLU_NURBS_ERROR10 = 100260; public static final int GLU_NURBS_ERROR11 = 100261; public static final int GLU_NURBS_ERROR12 = 100262; public static final int GLU_NURBS_ERROR13 = 100263; public static final int GLU_NURBS_ERROR14 = 100264; public static final int GLU_NURBS_ERROR15 = 100265; public static final int GLU_NURBS_ERROR16 = 100266; public static final int GLU_NURBS_ERROR17 = 100267; public static final int GLU_NURBS_ERROR18 = 100268; public static final int GLU_NURBS_ERROR19 = 100269; public static final int GLU_NURBS_ERROR20 = 100270; public static final int GLU_NURBS_ERROR21 = 100271; public static final int GLU_NURBS_ERROR22 = 100272; public static final int GLU_NURBS_ERROR23 = 100273; public static final int GLU_NURBS_ERROR24 = 100274; public static final int GLU_NURBS_ERROR25 = 100275; public static final int GLU_NURBS_ERROR26 = 100276; public static final int GLU_NURBS_ERROR27 = 100277; public static final int GLU_NURBS_ERROR28 = 100278; public static final int GLU_NURBS_ERROR29 = 100279; public static final int GLU_NURBS_ERROR30 = 100280; public static final int GLU_NURBS_ERROR31 = 100281; public static final int GLU_NURBS_ERROR32 = 100282; public static final int GLU_NURBS_ERROR33 = 100283; public static final int GLU_NURBS_ERROR34 = 100284; public static final int GLU_NURBS_ERROR35 = 100285; public static final int GLU_NURBS_ERROR36 = 100286; public static final int GLU_NURBS_ERROR37 = 100287; // NurbsProperty public static final int GLU_AUTO_LOAD_MATRIX = 100200; public static final int GLU_CULLING = 100201; public static final int GLU_SAMPLING_TOLERANCE = 100203; public static final int GLU_DISPLAY_MODE = 100204; public static final int GLU_PARAMETRIC_TOLERANCE = 100202; public static final int GLU_SAMPLING_METHOD = 100205; public static final int GLU_U_STEP = 100206; public static final int GLU_V_STEP = 100207; public static final int GLU_NURBS_MODE = 100160; public static final int GLU_NURBS_MODE_EXT = 100160; public static final int GLU_NURBS_TESSELLATOR = 100161; public static final int GLU_NURBS_TESSELLATOR_EXT = 100161; public static final int GLU_NURBS_RENDERER = 100162; public static final int GLU_NURBS_RENDERER_EXT = 100162; // NurbsSampling public static final int GLU_OBJECT_PARAMETRIC_ERROR = 100208; public static final int GLU_OBJECT_PARAMETRIC_ERROR_EXT = 100208; public static final int GLU_OBJECT_PATH_LENGTH = 100209; public static final int GLU_OBJECT_PATH_LENGTH_EXT = 100209; public static final int GLU_PATH_LENGTH = 100215; public static final int GLU_PARAMETRIC_ERROR = 100216; public static final int GLU_DOMAIN_DISTANCE = 100217; // NurbsTrim public static final int GLU_MAP1_TRIM_2 = 100210; public static final int GLU_MAP1_TRIM_3 = 100211; // QuadricDrawStyle public static final int GLU_POINT = 100010; public static final int GLU_LINE = 100011; public static final int GLU_FILL = 100012; public static final int GLU_SILHOUETTE = 100013; // QuadricCallback // GLU_ERROR // QuadricNormal public static final int GLU_SMOOTH = 100000; public static final int GLU_FLAT = 100001; public static final int GLU_NONE = 100002; // QuadricOrientation public static final int GLU_OUTSIDE = 100020; public static final int GLU_INSIDE = 100021; // TessCallback public static final int GLU_TESS_BEGIN = 100100; public static final int GLU_BEGIN = 100100; public static final int GLU_TESS_VERTEX = 100101; public static final int GLU_VERTEX = 100101; public static final int GLU_TESS_END = 100102; public static final int GLU_END = 100102; public static final int GLU_TESS_ERROR = 100103; public static final int GLU_TESS_EDGE_FLAG = 100104; public static final int GLU_EDGE_FLAG = 100104; public static final int GLU_TESS_COMBINE = 100105; public static final int GLU_TESS_BEGIN_DATA = 100106; public static final int GLU_TESS_VERTEX_DATA = 100107; public static final int GLU_TESS_END_DATA = 100108; public static final int GLU_TESS_ERROR_DATA = 100109; public static final int GLU_TESS_EDGE_FLAG_DATA = 100110; public static final int GLU_TESS_COMBINE_DATA = 100111; // TessContour public static final int GLU_CW = 100120; public static final int GLU_CCW = 100121; public static final int GLU_INTERIOR = 100122; public static final int GLU_EXTERIOR = 100123; public static final int GLU_UNKNOWN = 100124; // TessProperty public static final int GLU_TESS_WINDING_RULE = 100140; public static final int GLU_TESS_BOUNDRY_ONLY = 100141; public static final int GLU_TESS_TOLERANCE = 100142; // TessError public static final int GLU_TESS_ERROR1 = 100151; public static final int GLU_TESS_ERROR2 = 100152; public static final int GLU_TESS_ERROR3 = 100153; public static final int GLU_TESS_ERROR4 = 100154; public static final int GLU_TESS_ERROR5 = 100155; public static final int GLU_TESS_ERROR6 = 100156; public static final int GLU_TESS_ERROR7 = 100157; public static final int GLU_TESS_ERROR8 = 100158; public static final int GLU_TESS_MISSING_BEGIN_POLYGON = 100151; public static final int GLU_TESS_MISSING_BEGIN_CONTOUR = 100152; public static final int GLU_TESS_MISSING_END_POLYGON = 100153; public static final int GLU_TESS_MISSING_END_CONTOUR = 100154; public static final int GLU_TESS_COORD_TOO_LARGE = 100155; public static final int GLU_TESS_NEED_COMBINE_CALLBACK = 100156; // TessWinding public static final int GLU_TESS_WINDING_ODD = 100130; public static final int GLU_TESS_WINDING_NONZERO = 100131; public static final int GLU_TESS_WINDING_POSITIVE = 100132; public static final int GLU_TESS_WINDING_NEGATIVE = 100133; public static final int GLU_TESS_WINDING_ABS_GEQ_TWO = 100134; public int gluScaleImageJava( int format, int widthin, int heightin, int typein, Object datain, int widthout, int heightout, int typeout, Object dataout ) { ByteBuffer in = null; ByteBuffer out = null; if( datain instanceof ByteBuffer ) { in = (ByteBuffer)datain; } else if( datain instanceof byte[] ) { in = ByteBuffer.allocateDirect( ((byte[])datain).length ).order( ByteOrder.nativeOrder() ); } else if( datain instanceof short[] ) { in = ByteBuffer.allocateDirect( ((byte[])datain).length * 2 ).order( ByteOrder.nativeOrder() ); } else if( datain instanceof int[] ) { in = ByteBuffer.allocateDirect( ((byte[])datain).length * 4 ).order( ByteOrder.nativeOrder() ); } else if( datain instanceof float[] ) { in = ByteBuffer.allocateDirect( ((byte[])datain).length * 4 ).order( ByteOrder.nativeOrder() ); } else { throw new IllegalArgumentException( "Input data must be a primitive array or a ByteBuffer" ); } if( datain instanceof ByteBuffer ) { out = (ByteBuffer)datain; } else if( datain instanceof byte[] ) { out = ByteBuffer.wrap( ((byte[])datain) ); } else if( datain instanceof short[] ) { out = ByteBuffer.allocate( ((short[])datain).length * 2 ); } else if( datain instanceof int[] ) { out = ByteBuffer.allocate( ((int[])datain).length * 4 ); } else if( datain instanceof float[] ) { out = ByteBuffer.allocate( ((float[])datain).length * 4 ); } else { throw new IllegalArgumentException( "Output data must be a primitive array or a ByteBuffer" ); } int errno = Mipmap.gluScaleImage( gl, format, widthin, heightin, typein, in, widthout, heightout, typeout, out ); if( errno == 0 ) { if( datain instanceof short[] ) { out.asShortBuffer().get( (short[])dataout ); } else if( datain instanceof int[] ) { out.asIntBuffer().get( (int[])dataout ); } else if( datain instanceof float[] ) { out.asFloatBuffer().get( (float[])dataout ); } } return( errno ); } public int gluBuild1DMipmapLevelsJava( int target, int internalFormat, int width, int format, int type, int userLevel, int baseLevel, int maxLevel, Object data ) { ByteBuffer buffer = null; if( data instanceof ByteBuffer ) { buffer = (ByteBuffer)data; } else if( data instanceof byte[] ) { buffer = ByteBuffer.allocateDirect( ((byte[])data).length ).order( ByteOrder.nativeOrder() ); buffer.put( (byte[])data ); } else if( data instanceof short[] ) { buffer = ByteBuffer.allocateDirect( ((short[])data).length * 2 ).order( ByteOrder.nativeOrder() ); buffer.asShortBuffer().put( (short[])data ); } else if( data instanceof int[] ) { buffer = ByteBuffer.allocateDirect( ((int[])data).length * 4 ).order( ByteOrder.nativeOrder() ); buffer.asIntBuffer().put( (int[])data ); } else if( data instanceof float[] ) { buffer = ByteBuffer.allocateDirect( ((float[])data).length * 4 ).order( ByteOrder.nativeOrder() ); buffer.asFloatBuffer().put( (float[])data ); } else { throw new IllegalArgumentException( "Input data must be a primitive array or a ByteBuffer" ); } return( Mipmap.gluBuild1DMipmapLevels( gl, target, internalFormat, width, format, type, userLevel, baseLevel, maxLevel, buffer ) ); } public int gluBuild1DMipmapsJava( int target, int internalFormat, int width, int format, int type, Object data ) { ByteBuffer buffer = null; if( data instanceof ByteBuffer ) { buffer = (ByteBuffer)data; } else if( data instanceof byte[] ) { buffer = ByteBuffer.allocateDirect( ((byte[])data).length ).order( ByteOrder.nativeOrder() ); buffer.put( (byte[])data ); } else if( data instanceof short[] ) { buffer = ByteBuffer.allocateDirect( ((short[])data).length * 2 ).order( ByteOrder.nativeOrder() ); buffer.asShortBuffer().put( (short[])data ); } else if( data instanceof int[] ) { buffer = ByteBuffer.allocateDirect( ((int[])data).length * 4 ).order( ByteOrder.nativeOrder() ); buffer.asIntBuffer().put( (int[])data ); } else if( data instanceof float[] ) { buffer = ByteBuffer.allocateDirect( ((float[])data).length * 4 ).order( ByteOrder.nativeOrder() ); buffer.asFloatBuffer().put( (float[])data ); } else { throw new IllegalArgumentException( "Input data must be a primitive array or a ByteBuffer" ); } return( Mipmap.gluBuild1DMipmaps( gl, target, internalFormat, width, format, type, buffer ) ); } public int gluBuild2DMipmapLevelsJava( int target, int internalFormat, int width, int height, int format, int type, int userLevel, int baseLevel, int maxLevel, Object data ) { return( Mipmap.gluBuild2DMipmapLevels( gl, target, internalFormat, width, height, format, type, userLevel, baseLevel, maxLevel, data ) ); } public int gluBuild2DMipmapsJava( int target, int internalFormat, int width, int height, int format, int type, Object data ) { return( Mipmap.gluBuild2DMipmaps( gl, target, internalFormat, width, height, format, type, data ) ); } public int gluBuild3DMipmapLevelsJava( int target, int internalFormat, int width, int height, int depth, int format, int type, int userLevel, int baseLevel, int maxLevel, Object data ) { ByteBuffer buffer = null; if( data instanceof ByteBuffer ) { buffer = (ByteBuffer)data; } else if( data instanceof byte[] ) { buffer = ByteBuffer.allocateDirect( ((byte[])data).length ).order( ByteOrder.nativeOrder() ); buffer.put( (byte[])data ); } else if( data instanceof short[] ) { buffer = ByteBuffer.allocateDirect( ((short[])data).length * 2 ).order( ByteOrder.nativeOrder() ); buffer.asShortBuffer().put( (short[])data ); } else if( data instanceof int[] ) { buffer = ByteBuffer.allocateDirect( ((int[])data).length * 4 ).order( ByteOrder.nativeOrder() ); buffer.asIntBuffer().put( (int[])data ); } else if( data instanceof float[] ) { buffer = ByteBuffer.allocateDirect( ((float[])data).length * 4 ).order( ByteOrder.nativeOrder() ); buffer.asFloatBuffer().put( (float[])data ); } else { throw new IllegalArgumentException( "Input data must be a primitive array or a ByteBuffer" ); } return( Mipmap.gluBuild3DMipmapLevels( gl, target, internalFormat, width, height, depth, format, type, userLevel, baseLevel, maxLevel, buffer ) ); } public int gluBuild3DMipmapsJava( int target, int internalFormat, int width, int height, int depth, int format, int type, Object data ) { ByteBuffer buffer = null; if( data instanceof ByteBuffer ) { buffer = (ByteBuffer)data; } else if( data instanceof byte[] ) { buffer = ByteBuffer.allocateDirect( ((byte[])data).length ).order( ByteOrder.nativeOrder() ); buffer.put( (byte[])data ); } else if( data instanceof short[] ) { buffer = ByteBuffer.allocateDirect( ((short[])data).length * 2 ).order( ByteOrder.nativeOrder() ); buffer.asShortBuffer().put( (short[])data ); } else if( data instanceof int[] ) { buffer = ByteBuffer.allocateDirect( ((int[])data).length * 4 ).order( ByteOrder.nativeOrder() ); buffer.asIntBuffer().put( (int[])data ); } else if( data instanceof float[] ) { buffer = ByteBuffer.allocateDirect( ((float[])data).length * 4 ).order( ByteOrder.nativeOrder() ); buffer.asFloatBuffer().put( (float[])data ); } else { throw new IllegalArgumentException( "Input data must be a primitive array or a ByteBuffer" ); } return( Mipmap.gluBuild3DMipmaps( gl, target, internalFormat, width, height, depth, format, type, buffer ) ); }