void APIENTRY FWGLExtension::initPrimitiveRestartIndexNV(GLuint index) { spPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNV)FW_GETGLPROC("glPrimitiveRestartIndexNV"); if(!spPrimitiveRestartIndexNV) reportError("glPrimitiveRestartIndexNV"); glPrimitiveRestartIndexNV(index); }
void SS3OPiece::DrawForList() const { if (!HasGeometryData()) return; BindVertexAttribVBOs(); vboIndices.Bind(GL_ELEMENT_ARRAY_BUFFER); switch (primType) { case S3O_PRIMTYPE_TRIANGLES: { glDrawRangeElements(GL_TRIANGLES, 0, vertices.size() - 1, indices.size(), GL_UNSIGNED_INT, vboIndices.GetPtr()); } break; case S3O_PRIMTYPE_TRIANGLE_STRIP: { #ifdef GLEW_NV_primitive_restart if (globalRendering->supportRestartPrimitive) { // this is not compiled into display lists, but executed immediately glPrimitiveRestartIndexNV(-1U); glEnableClientState(GL_PRIMITIVE_RESTART_NV); } #endif glDrawRangeElements(GL_TRIANGLE_STRIP, 0, vertices.size() - 1, indices.size(), GL_UNSIGNED_INT, vboIndices.GetPtr()); #ifdef GLEW_NV_primitive_restart if (globalRendering->supportRestartPrimitive) { glDisableClientState(GL_PRIMITIVE_RESTART_NV); } #endif } break; case S3O_PRIMTYPE_QUADS: { glDrawRangeElements(GL_QUADS, 0, vertices.size() - 1, indices.size(), GL_UNSIGNED_INT, vboIndices.GetPtr()); } break; } vboIndices.Unbind(); UnbindVertexAttribVBOs(); }
virtual void render(bool use_vbo) const { VL_CHECK(GLEW_VERSION_1_4); VL_CHECK(!use_vbo || (use_vbo && (GLEW_ARB_vertex_buffer_object||GLEW_VERSION_1_5||GLEW_VERSION_3_0))) use_vbo &= GLEW_ARB_vertex_buffer_object||GLEW_VERSION_1_5||GLEW_VERSION_3_0; // && indices()->gpuBuffer()->handle() && indices()->sizeGPU(); if ( !use_vbo && !indices()->size() ) return; // apply patch parameters if any and if using PT_PATCHES applyPatchParameters(); // primitive restart enable if(primitiveRestartEnabled()) { if(GLEW_VERSION_3_1) { glEnable(GL_PRIMITIVE_RESTART); glPrimitiveRestartIndex(primitiveRestartIndex()); } else if(GLEW_NV_primitive_restart) { glEnable(GL_PRIMITIVE_RESTART_NV); glPrimitiveRestartIndexNV(primitiveRestartIndex()); } else { vl::Log::error("MultiDrawElements error: primitive restart not supported by this OpenGL implementation!\n"); VL_TRAP(); return; } } GLvoid **indices_ptr = (GLvoid**)&mPointerVector[0]; if (use_vbo && indices()->gpuBuffer()->handle()) { VL_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices()->gpuBuffer()->handle()); indices_ptr = (GLvoid**)&mNULLPointerVector[0]; } else VL_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); if (baseVertices().size()) { VL_CHECK( baseVertices().size() == pointerVector().size() ) VL_CHECK( baseVertices().size() == countVector().size() ) if (GLEW_ARB_draw_elements_base_vertex || GLEW_VERSION_3_1) glMultiDrawElementsBaseVertex( primitiveType(), (GLsizei*)&mCountVector[0], indices()->glType(), indices_ptr, (GLsizei)mCountVector.size(), (GLint*)&mBaseVertices[0] ); else { vl::Log::error("MultiDrawElements::render(): glMultiDrawElementsBaseVertex() not supported!\n" "OpenGL 3.1 or GL_ARB_draw_elements_base_vertex extension required.\n" ); } }
static void enable_restart(GLuint restart_index) { if (TestGL31) { glEnable(GL_PRIMITIVE_RESTART); glPrimitiveRestartIndex(restart_index); } else { glEnableClientState(GL_PRIMITIVE_RESTART_NV); glPrimitiveRestartIndexNV(restart_index); } }
static void draw_pattern(int restart_pos, bool use_primitive_restart) { /* Draw test pattern in blue */ glUniform4f(color_loc, 0.25, 0.25, 1.0, 1.0); if (use_primitive_restart) { GLubyte index_buffer[NUM_VERTICES + 1]; int i; for (i = 0; i < restart_pos; i++) { index_buffer[i] = i; } index_buffer[restart_pos] = 0xff; for (i = restart_pos + 1; i < ARRAY_SIZE(index_buffer); i++) { index_buffer[i] = i - 1; } if (piglit_get_gl_version() >= 31) { glEnable(GL_PRIMITIVE_RESTART); glPrimitiveRestartIndex(0xff); } else { glEnableClientState(GL_PRIMITIVE_RESTART_NV); glPrimitiveRestartIndexNV(0xff); } glDrawElements(test->prim_type, ARRAY_SIZE(index_buffer), GL_UNSIGNED_BYTE, index_buffer); if (piglit_get_gl_version() >= 31) glDisable(GL_PRIMITIVE_RESTART); else glDisableClientState(GL_PRIMITIVE_RESTART_NV); } else { glDrawArrays(test->prim_type, 0, restart_pos); glDrawArrays(test->prim_type, restart_pos, NUM_VERTICES - restart_pos); } if (test->prim_type != GL_POINTS) { /* Draw vertices in white */ glUniform4f(color_loc, 1.0, 1.0, 1.0, 1.0); glDrawArrays(GL_POINTS, 0, NUM_VERTICES); } }
void SS3OPiece::DrawForList() const { if (isEmpty) { return; } const SS3OVertex* s3ov = &vertices[0]; // pass the tangents as 3D texture coordinates // (array elements are float3's, which are 12 // bytes in size and each represent a single // xyz triple) if (!sTangents.empty()) { glClientActiveTexture(GL_TEXTURE5); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(3, GL_FLOAT, sizeof(float3), &sTangents[0].x); glClientActiveTexture(GL_TEXTURE6); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(3, GL_FLOAT, sizeof(float3), &tTangents[0].x); } glClientActiveTextureARB(GL_TEXTURE1_ARB); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(SS3OVertex), &s3ov->textureX); glClientActiveTexture(GL_TEXTURE0); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(SS3OVertex), &s3ov->textureX); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, sizeof(SS3OVertex), &s3ov->pos.x); glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, sizeof(SS3OVertex), &s3ov->normal.x); switch (primitiveType) { case S3O_PRIMTYPE_TRIANGLES: { glDrawElements(GL_TRIANGLES, vertexDrawOrder.size(), GL_UNSIGNED_INT, &vertexDrawOrder[0]); } break; case S3O_PRIMTYPE_TRIANGLE_STRIP: { #ifdef GLEW_NV_primitive_restart if (globalRendering->supportRestartPrimitive) { glPrimitiveRestartIndexNV(-1U); // GL_NV_primitive_restart: "PrimitiveRestartIndexNV is not compiled into display lists, but is executed immediately." glEnableClientState(GL_PRIMITIVE_RESTART_NV); } #endif glDrawElements(GL_TRIANGLE_STRIP, vertexDrawOrder.size(), GL_UNSIGNED_INT, &vertexDrawOrder[0]); #ifdef GLEW_NV_primitive_restart if (globalRendering->supportRestartPrimitive) { glDisableClientState(GL_PRIMITIVE_RESTART_NV); } #endif } break; case S3O_PRIMTYPE_QUADS: { glDrawElements(GL_QUADS, vertexDrawOrder.size(), GL_UNSIGNED_INT, &vertexDrawOrder[0]); } break; } if (!sTangents.empty()) { glClientActiveTexture(GL_TEXTURE6); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTexture(GL_TEXTURE5); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } glClientActiveTextureARB(GL_TEXTURE1_ARB); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTexture(GL_TEXTURE0); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPrimitiveRestart_nglPrimitiveRestartIndexNV(JNIEnv *env, jclass clazz, jint index, jlong function_pointer) { glPrimitiveRestartIndexNVPROC glPrimitiveRestartIndexNV = (glPrimitiveRestartIndexNVPROC)((intptr_t)function_pointer); glPrimitiveRestartIndexNV(index); }
void SS3OPiece::DrawForList() const { if (!hasGeometryData) return; vboAttributes.Bind(GL_ARRAY_BUFFER); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, sizeof(SS3OVertex), vboAttributes.GetPtr(offsetof(SS3OVertex, pos))); glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, sizeof(SS3OVertex), vboAttributes.GetPtr(offsetof(SS3OVertex, normal))); glClientActiveTexture(GL_TEXTURE0); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(SS3OVertex), vboAttributes.GetPtr(offsetof(SS3OVertex, texCoord))); glClientActiveTexture(GL_TEXTURE1); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(SS3OVertex), vboAttributes.GetPtr(offsetof(SS3OVertex, texCoord))); glClientActiveTexture(GL_TEXTURE5); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(3, GL_FLOAT, sizeof(SS3OVertex), vboAttributes.GetPtr(offsetof(SS3OVertex, sTangent))); glClientActiveTexture(GL_TEXTURE6); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(3, GL_FLOAT, sizeof(SS3OVertex), vboAttributes.GetPtr(offsetof(SS3OVertex, tTangent))); vboAttributes.Unbind(); vboIndices.Bind(GL_ELEMENT_ARRAY_BUFFER); switch (primType) { case S3O_PRIMTYPE_TRIANGLES: { glDrawRangeElements(GL_TRIANGLES, 0, vertices.size() - 1, vertexDrawIndices.size(), GL_UNSIGNED_INT, vboIndices.GetPtr()); } break; case S3O_PRIMTYPE_TRIANGLE_STRIP: { #ifdef GLEW_NV_primitive_restart if (globalRendering->supportRestartPrimitive) { // this is not compiled into display lists, but executed immediately glPrimitiveRestartIndexNV(-1U); glEnableClientState(GL_PRIMITIVE_RESTART_NV); } #endif glDrawRangeElements(GL_TRIANGLE_STRIP, 0, vertices.size() - 1, vertexDrawIndices.size(), GL_UNSIGNED_INT, vboIndices.GetPtr()); #ifdef GLEW_NV_primitive_restart if (globalRendering->supportRestartPrimitive) { glDisableClientState(GL_PRIMITIVE_RESTART_NV); } #endif } break; case S3O_PRIMTYPE_QUADS: { glDrawRangeElements(GL_QUADS, 0, vertices.size() - 1, vertexDrawIndices.size(), GL_UNSIGNED_INT, vboIndices.GetPtr()); } break; } vboIndices.Unbind(); glClientActiveTexture(GL_TEXTURE6); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTexture(GL_TEXTURE5); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTexture(GL_TEXTURE1); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTexture(GL_TEXTURE0); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVPrimitiveRestart_glPrimitiveRestartIndexNV(JNIEnv *__env, jclass clazz, jint index) { glPrimitiveRestartIndexNVPROC glPrimitiveRestartIndexNV = (glPrimitiveRestartIndexNVPROC)tlsGetFunction(2091); UNUSED_PARAM(clazz) glPrimitiveRestartIndexNV(index); }