📄 joglpipeline.java
字号:
else fclrs = (FloatBuffer) cdataBuffer; } else if (byteColorsDefined) { if (cbdata != null) bclrs = getColorArrayBuffer(cbdata); else bclrs = (ByteBuffer) cdataBuffer; } // get normal array if (normalsDefined) { norms = (FloatBuffer) ndata; } int[] sarray = null; int[] start_array = null; int strip_len = 0; 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; strip_len = sarray.length; start_array = ((GeometryStripArrayRetained) geo).stripStartOffsetIndices; } executeGeometryArrayVA(ctx, geo, geo_type, isNonUniformScale, ignoreVertexColors, vcount, vformat, vdefined, initialCoordIndex, fverts, dverts, initialColorIndex, fclrs, bclrs, initialNormalIndex, norms, vertexAttrCount, vertexAttrSizes, vertexAttrIndices, vertexAttrBufs, texCoordMapLength, texcoordoffset, numActiveTexUnitState, texIndex, texstride, texCoordBufs, cdirty, sarray, strip_len, start_array); } // used by GeometryArray by Reference in interleaved format with NIO buffer void executeInterleavedBuffer(Context ctx, GeometryArrayRetained geo, int geo_type, boolean isNonUniformScale, boolean useAlpha, boolean ignoreVertexColors, int startVIndex, int vcount, int vformat, int texCoordSetCount, int[] texCoordSetMap, int texCoordSetMapLen, int[] texUnitOffset, int numActiveTexUnit, Object varray, float[] cdata, int cdirty) { if (VERBOSE) System.err.println("JoglPipeline.executeInterleavedBuffer()"); executeGeometryArray(ctx, geo, geo_type, isNonUniformScale, useAlpha, ignoreVertexColors, startVIndex, vcount, vformat, texCoordSetCount, texCoordSetMap, texCoordSetMapLen, texUnitOffset, numActiveTexUnit, 0, null, null, (Buffer) varray, cdata, cdirty); } void setVertexFormat(Context ctx, GeometryArrayRetained geo, int vformat, boolean useAlpha, boolean ignoreVertexColors) { if (VERBOSE) System.err.println("JoglPipeline.setVertexFormat()"); GL gl = context(ctx).getGL(); // Enable and disable the appropriate pointers if ((vformat & GeometryArray.NORMALS) != 0) { gl.glEnableClientState(GL.GL_NORMAL_ARRAY); } else { gl.glDisableClientState(GL.GL_NORMAL_ARRAY); } if (!ignoreVertexColors && ((vformat & GeometryArray.COLOR) != 0)) { gl.glEnableClientState(GL.GL_COLOR_ARRAY); } else { gl.glDisableClientState(GL.GL_COLOR_ARRAY); } if (gl.isExtensionAvailable("GL_SUN_global_alpha")) { if (useAlpha) { gl.glEnable(GL.GL_GLOBAL_ALPHA_SUN); } else { gl.glDisable(GL.GL_GLOBAL_ALPHA_SUN); } } if ((vformat & GeometryArray.COORDINATES) != 0) { gl.glEnableClientState(GL.GL_VERTEX_ARRAY); } else { gl.glDisableClientState(GL.GL_VERTEX_ARRAY); } } void disableGlobalAlpha(Context ctx, GeometryArrayRetained geo, int vformat, boolean useAlpha, boolean ignoreVertexColors) { if (VERBOSE) System.err.println("JoglPipeline.disableGlobalAlpha()"); GL gl = context(ctx).getGL(); if (gl.isExtensionAvailable("GL_SUN_global_alpha")) { if (!ignoreVertexColors && ((vformat & GeometryArray.COLOR) != 0)) { if (useAlpha) { gl.glDisable(GL.GL_GLOBAL_ALPHA_SUN); } } } } // used for GeometryArrays void buildGA(Context ctx, GeometryArrayRetained geo, int geo_type, boolean isNonUniformScale, boolean updateAlpha, float alpha, boolean ignoreVertexColors, int startVIndex, int vcount, int vformat, int texCoordSetCount, int[] texCoordSetMap, int texCoordSetMapLen, int[] texCoordSetMapOffset, int vertexAttrCount, int[] vertexAttrSizes, double[] xform, double[] nxform, float[] varray) { if (VERBOSE) System.err.println("JoglPipeline.buildGA()"); JoglContext jctx = (JoglContext) ctx; GL gl = context(ctx).getGL(); FloatBuffer verts = null; int stride = 0, coordoff = 0, normoff = 0, coloroff = 0, texCoordoff = 0; int texStride = 0; int vAttrOff = 0; if ((vformat & GeometryArray.COORDINATES) != 0) { stride += 3; } if ((vformat & GeometryArray.NORMALS) != 0) { stride += 3; coordoff += 3; } if ((vformat & GeometryArray.COLOR) != 0) { if ((vformat & GeometryArray.BY_REFERENCE) != 0) { if ((vformat & GeometryArray.WITH_ALPHA) != 0) { stride += 4; normoff += 4; coordoff += 4; } else { stride += 3; normoff += 3; coordoff += 3; } } else { stride += 4; normoff += 4; coordoff += 4; } } if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) { if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) { texStride = 2 * texCoordSetCount; } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_3) != 0) { texStride = 3 * texCoordSetCount; } else if ((vformat & GeometryArray.TEXTURE_COORDINATE_4) != 0) { texStride = 4 * texCoordSetCount; } stride += texStride; normoff += texStride; coloroff += texStride; coordoff += texStride; } int vAttrStride = 0; 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; } int bstride = stride * BufferUtil.SIZEOF_FLOAT; // Start sending down from the startVIndex int initialOffset = startVIndex * stride; normoff += initialOffset; coloroff += initialOffset; coordoff += initialOffset; texCoordoff += initialOffset; vAttrOff += initialOffset; // process alpha for geometryArray without alpha boolean useAlpha = false; if (updateAlpha && !ignoreVertexColors) { useAlpha = true; } 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) { int[] sarray = ((GeometryStripArrayRetained) geo).stripVertexCounts; int primType = 0; 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 (ignoreVertexColors) { vformat &= ~GeometryArray.COLOR; } for (int i = 0; i < sarray.length; i++) { gl.glBegin(primType); for (int j = 0; j < sarray[i]; j++) { if ((vformat & GeometryArray.NORMALS) != 0) { if (nxform != null) { float nx = (float) (nxform[0] * varray[normoff] + nxform[1] * varray[normoff+1] + nxform[2] * varray[normoff+2]); float ny = (float) (nxform[4] * varray[normoff] + nxform[5] * varray[normoff+1] + nxform[6] * varray[normoff+2]); float nz = (float) (nxform[8] * varray[normoff] + nxform[9] * varray[normoff+1] + nxform[10] * varray[normoff+2]); gl.glNormal3f(nx, ny, nz); } else { gl.glNormal3f(varray[normoff], varray[normoff+1], varray[normoff+2]); } } if ((vformat & GeometryArray.COLOR) != 0) { if (useAlpha) { gl.glColor4f(varray[coloroff], varray[coloroff+1], varray[coloroff+2], varray[coloroff+3] * alpha); } else { if ((vformat & GeometryArray.WITH_ALPHA) != 0) { // alpha is present gl.glColor4f(varray[coloroff], varray[coloroff+1], varray[coloroff+2], varray[coloroff+3]); } else { gl.glColor3f(varray[coloroff], varray[coloroff+1], varray[coloroff+2]); } } } if ((vformat & GeometryArray.VERTEX_ATTRIBUTES) != 0) { int vaOff = vAttrOff; if (verts == null) { verts = FloatBuffer.wrap(varray); } for (int vaIdx = 0; vaIdx < vertexAttrCount; vaIdx++) { switch (vertexAttrSizes[vaIdx]) { case 1: verts.position(vaOff); jctx.vertexAttr1fv(gl, vaIdx, verts); break; case 2: verts.position(vaOff); jctx.vertexAttr2fv(gl, vaIdx, verts); break; case 3: verts.position(vaOff); jctx.vertexAttr3fv(gl, vaIdx, verts); break; case 4: verts.position(vaOff); jctx.vertexAttr4fv(gl, vaIdx, verts); break; } vaOff += vertexAttrSizes[vaIdx]; } } if ((vformat & GeometryArray.TEXTURE_COORDINATE) != 0) { if (texCoordSetMapLen > 0) { if (gl.isExtensionAvailable("GL_VERSION_1_3")) { if ((vformat & GeometryArray.TEXTURE_COORDINATE_2) != 0) { for (int k = 0; k < texCoordSetMapLen; k++) { if (texCoordSetMapOffset[k] != -1) { int off = texCoordoff + texCoordSetMapOffset[k]; gl.glMultiTexCoord2f(GL.GL_TEXTURE0 + k, varray[off], varray[off + 1]); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -