📄 joglpipeline.java
字号:
System.err.println("Vertex format: " + getVertexDescription(vformat)); System.err.println("Geometry type: " + getGeometryDescription(geo_type)); if (carray != null) { System.err.println(" Separate color array"); } else { System.err.println(" Colors (if any) interleaved"); } } if ((vformat & GeometryArray.COORDINATES) != 0) { stride += 3; } if ((vformat & GeometryArray.NORMALS) != 0) { stride += 3; coordoff += 3; } if ((vformat & GeometryArray.COLOR) != 0) { if ((vformat & GeometryArray.WITH_ALPHA) != 0 ) { stride += 4; normoff += 4; coordoff += 4; } else { /* Handle the case of executeInterleaved 3f */ stride += 3; normoff += 3; coordoff += 3; } } if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) { if (EXTRA_DEBUGGING) { System.err.println(" Number of tex coord sets: " + texCoordSetCount); } if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) { texSize = 2; texStride = 2 * texCoordSetCount; } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) { texSize = 3; texStride = 3 * texCoordSetCount; } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_4) != 0) { texSize = 4; texStride = 4 * texCoordSetCount; } stride += texStride; normoff += texStride; coloroff += texStride; coordoff += texStride; } if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { for (int i = 0; i < vertexAttrCount; i++) { vAttrStride += vertexAttrSizes[i]; } stride += vAttrStride; normoff += vAttrStride; coloroff += vAttrStride; coordoff += vAttrStride; texCoordoff += vAttrStride; } bstride = stride * BufferUtil.SIZEOF_FLOAT; if (geo_type == GeometryRetained.GEO_TYPE_TRI_STRIP_SET || geo_type == GeometryRetained.GEO_TYPE_TRI_FAN_SET || geo_type == GeometryRetained.GEO_TYPE_LINE_STRIP_SET) { sarray = ((GeometryStripArrayRetained) geo).stripVertexCounts; start_array = ((GeometryStripArrayRetained) geo).stripStartOffsetIndices; } // We have to copy if the data isn't specified using NIO if (varray != null) { verts = getVertexArrayBuffer(varray); } else if (varrayBuffer != null) { verts = (FloatBuffer) varrayBuffer; } else { // This should never happen throw new AssertionError("Unable to get vertex pointer"); } // using byRef interleaved array and has a separate pointer, then .. int cstride = stride; if (carray != null) { clrs = getColorArrayBuffer(carray); cstride = 4; } else { // FIXME: need to "auto-slice" this buffer later clrs = verts; } cbstride = cstride * BufferUtil.SIZEOF_FLOAT; // Enable normalize for non-uniform scale (which rescale can't handle) if (isNonUniformScale) { gl.glEnable(GL.GL_NORMALIZE); } int startVertex = stride * startVIndex; int startClrs = cstride * startVIndex; if (clrs == verts) { startClrs += coloroff; } /*** Handle non-indexed strip GeometryArray first *******/ if (geo_type == GeometryRetained.GEO_TYPE_TRI_STRIP_SET || geo_type == GeometryRetained.GEO_TYPE_TRI_FAN_SET || geo_type == GeometryRetained.GEO_TYPE_LINE_STRIP_SET) { if (ignoreVertexColors || (carray != null) || ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0 && ((texCoordSetMapLen > 1) || (texCoordSetCount > 1)))) { useInterleavedArrays = false; } else { boolean[] tmp = new boolean[1]; int[] tmp2 = new int[1]; testForInterleavedArrays(vformat, tmp, tmp2); useInterleavedArrays = tmp[0]; iaFormat = tmp2[0]; } if (useInterleavedArrays) { verts.position(startVertex); gl.glInterleavedArrays(iaFormat, bstride, verts); } else { if ((vformat & GeometryArray.NORMALS) != 0) { verts.position(startVertex + normoff); gl.glNormalPointer(GL.GL_FLOAT, bstride, verts); } if (!ignoreVertexColors && (vformat & GeometryArray.COLOR) != 0) { if (EXTRA_DEBUGGING) { System.err.println(" Doing colors"); } clrs.position(startClrs); if ((vformat & GeometryArray.WITH_ALPHA) != 0 || useAlpha) { gl.glColorPointer(4, GL.GL_FLOAT, cbstride, clrs); } else { gl.glColorPointer(3, GL.GL_FLOAT, cbstride, clrs); } } if ((vformat & GeometryArray.COORDINATES) != 0) { verts.position(startVertex + coordoff); gl.glVertexPointer(3, GL.GL_FLOAT, bstride, verts); } if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) { executeTexture(texCoordSetMapLen, texSize, bstride, texCoordoff, texCoordSetMapOffset, numActiveTexUnitState, verts, gl); } if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { int vAttrOffset = startVertex + vAttrOff; for (int i = 0; i < vertexAttrCount; i++) { ctx.enableVertexAttrArray(gl, i); verts.position(vAttrOffset); ctx.vertexAttrPointer(gl, i, vertexAttrSizes[i], GL.GL_FLOAT, bstride, verts); vAttrOffset += vertexAttrSizes[i]; } } } switch (geo_type) { case GeometryRetained.GEO_TYPE_TRI_STRIP_SET: primType = GL.GL_TRIANGLE_STRIP; break; case GeometryRetained.GEO_TYPE_TRI_FAN_SET: primType = GL.GL_TRIANGLE_FAN; break; case GeometryRetained.GEO_TYPE_LINE_STRIP_SET: primType = GL.GL_LINE_STRIP; break; } if (gl.isExtensionAvailable("GL_EXT_multi_draw_arrays")) { gl.glMultiDrawArraysEXT(primType, start_array, 0, sarray, 0, sarray.length); } else { for (int i = 0; i < sarray.length; i++) { gl.glDrawArrays(primType, start_array[i], sarray[i]); } } } else if ((geo_type == GeometryRetained.GEO_TYPE_QUAD_SET) || (geo_type == GeometryRetained.GEO_TYPE_TRI_SET) || (geo_type == GeometryRetained.GEO_TYPE_POINT_SET) || (geo_type == GeometryRetained.GEO_TYPE_LINE_SET)) { /******* Handle non-indexed non-striped GeometryArray now *****/ if (ignoreVertexColors || (carray != null) || ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0 && ((texCoordSetMapLen > 1) || (texCoordSetCount > 1)))) { useInterleavedArrays = false; } else { boolean[] tmp = new boolean[1]; int[] tmp2 = new int[1]; testForInterleavedArrays(vformat, tmp, tmp2); useInterleavedArrays = tmp[0]; iaFormat = tmp2[0]; } if (useInterleavedArrays) { verts.position(startVertex); gl.glInterleavedArrays(iaFormat, bstride, verts); } else { if (EXTRA_DEBUGGING) { System.err.println(" startVertex: " + startVertex); System.err.println(" stride: " + stride); System.err.println(" bstride: " + bstride); System.err.println(" normoff: " + normoff); System.err.println(" coloroff: " + coloroff); System.err.println(" coordoff: " + coordoff); System.err.println(" texCoordoff: " + texCoordoff); } if ((vformat & GeometryArray.NORMALS) != 0) { verts.position(startVertex + normoff); gl.glNormalPointer(GL.GL_FLOAT, bstride, verts); } if (!ignoreVertexColors && (vformat & GeometryArray.COLOR) != 0) { clrs.position(startClrs); if ((vformat & GeometryArray.WITH_ALPHA) != 0 || useAlpha) { gl.glColorPointer(4, GL.GL_FLOAT, cbstride, clrs); } else { gl.glColorPointer(3, GL.GL_FLOAT, cbstride, clrs); } } if ((vformat & GeometryArray.COORDINATES) != 0) { verts.position(startVertex + coordoff); gl.glVertexPointer(3, GL.GL_FLOAT, bstride, verts); } if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) { executeTexture(texCoordSetMapLen, texSize, bstride, texCoordoff, texCoordSetMapOffset, numActiveTexUnitState, verts, gl); } if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { int vAttrOffset = startVertex + vAttrOff; for (int i = 0; i < vertexAttrCount; i++) { ctx.enableVertexAttrArray(gl, i); verts.position(vAttrOffset); ctx.vertexAttrPointer(gl, i, vertexAttrSizes[i], GL.GL_FLOAT, bstride, verts); vAttrOffset += vertexAttrSizes[i]; } } } switch (geo_type){ case GeometryRetained.GEO_TYPE_QUAD_SET : gl.glDrawArrays(GL.GL_QUADS, 0, vcount); break; case GeometryRetained.GEO_TYPE_TRI_SET : gl.glDrawArrays(GL.GL_TRIANGLES, 0, vcount); break; case GeometryRetained.GEO_TYPE_POINT_SET: gl.glDrawArrays(GL.GL_POINTS, 0, vcount); break; case GeometryRetained.GEO_TYPE_LINE_SET : gl.glDrawArrays(GL.GL_LINES, 0, vcount); break; } } /* clean up if we turned on normalize */ if (isNonUniformScale) { gl.glDisable(GL.GL_NORMALIZE); } if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { resetVertexAttrs(gl, ctx, vertexAttrCount); } if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) { resetTexture(gl, ctx); } } // glLockArrays() is invoked only for indexed geometry, and the // vertexCount is guarenteed to be >= 0. private void lockArray(GL gl, int vertexCount) { if (gl.isExtensionAvailable("GL_EXT_compiled_vertex_array")) { gl.glLockArraysEXT(0, vertexCount); } } private void unlockArray(GL gl) { if (gl.isExtensionAvailable("GL_EXT_compiled_vertex_array")) { gl.glUnlockArraysEXT(); } } private void executeGeometryArrayVA(Context absCtx, GeometryArrayRetained geo, int geo_type, boolean isNonUniformScale, boolean ignoreVertexColors, int vcount, int vformat, int vdefined, int initialCoordIndex, FloatBuffer fverts, DoubleBuffer dverts, int initialColorIndex, FloatBuffer fclrs, ByteBuffer bclrs, int initialNormalIndex, FloatBuffer norms, int vertexAttrCount, int[] vertexAttrSizes, int[] vertex
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -