void CModel::RenderMesh() { //for each face send the four vertices to gpu (very slow) //however, its not important if compiled into display list glBegin(GL_TRIANGLES); for (glm::uint i = 0; i < mFaces.size(); ++i) { face_type& face = mFaces[i]; glNormal3fv(&mNormals[face.n[0]].x); glTexCoord2fv(&mTexcoords[face.t[0]].x); glMultiTexCoord4fv(GL_TEXTURE1, &mTangents[face.n[0]].x); glVertex3fv(&mPositions[face.p[0]].x); glNormal3fv(&mNormals[face.n[1]].x); glTexCoord2fv(&mTexcoords[face.t[1]].x); glMultiTexCoord4fv(GL_TEXTURE1, &mTangents[face.n[1]].x); glVertex3fv(&mPositions[face.p[1]].x); glNormal3fv(&mNormals[face.n[2]].x); glTexCoord2fv(&mTexcoords[face.t[2]].x); glMultiTexCoord4fv(GL_TEXTURE1, &mTangents[face.n[2]].x); glVertex3fv(&mPositions[face.p[2]].x); } glEnd(); }
enum piglit_result piglit_display(void) { GLboolean pass = GL_TRUE; GLuint tex0, tex1, fb; GLenum status; const GLenum attachments[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, }; piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE); glGenFramebuffersEXT(1, &fb); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); tex0 = attach_texture(0); tex1 = attach_texture(1); glDrawBuffersARB(2, attachments); status = glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT); if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { fprintf(stderr, "fbo incomplete (status = 0x%04x)\n", status); piglit_report_result(PIGLIT_SKIP); } /* Clear render targets (textures) to red */ glClearColor(1.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glMultiTexCoord4fv(GL_TEXTURE0, result0); glMultiTexCoord4fv(GL_TEXTURE1, result1); glEnable(GL_FRAGMENT_PROGRAM_ARB); piglit_draw_rect(0, 0, piglit_width, piglit_height); glDisable(GL_FRAGMENT_PROGRAM_ARB); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); /* Draw the two green textures to halves of the window. */ glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glBindTexture(GL_TEXTURE_2D, tex0); piglit_draw_rect_tex(0, 0, piglit_width / 2, piglit_height, 0, 0, 1, 1); glBindTexture(GL_TEXTURE_2D, tex1); piglit_draw_rect_tex(piglit_width / 2, 0, piglit_width / 2, piglit_height, 0, 0, 1, 1); glDisable(GL_TEXTURE_2D); glDeleteTextures(1, &tex0); glDeleteTextures(1, &tex1); glDeleteFramebuffersEXT(1, &fb); pass = pass && piglit_probe_rect_rgba(0, 0, piglit_width / 2, piglit_height, result0); pass = pass && piglit_probe_rect_rgba(piglit_width / 2, 0, piglit_width / 2, piglit_height, result1); glutSwapBuffers(); return pass ? PIGLIT_PASS : PIGLIT_FAIL; }
static GLboolean test_rasterpos(void) { int i; clear_errors(); /* set current texcoords */ for (i = 0; i < MaxTextureCoordUnits; i++) { glMultiTexCoord4fv(GL_TEXTURE0 + i, Random[i]); } /* query current texcoords */ for (i = 0; i < MaxTextureCoordUnits; i++) { GLfloat v[4]; glActiveTexture(GL_TEXTURE0 + i); glGetFloatv(GL_CURRENT_TEXTURE_COORDS, v); if (!equal4v(Random[i], v)) { printf("Get GL_CURRENT_TEXTURE_COORDS, unit %d failed\n", i); report4v(Random[i], v); return GL_FALSE; } } /* set raster pos to update raster tex coords */ glRasterPos2i(0, 0); for (i = 0; i < MaxTextureCoordUnits; i++) { GLfloat v[4]; glActiveTexture(GL_TEXTURE0 + i); glGetFloatv(GL_CURRENT_RASTER_TEXTURE_COORDS, v); if (!equal4v(Random[i], v)) { printf("Get GL_CURRENT_RASTER_TEXTURE_COORDS, unit %d failed\n", i); report4v(Random[i], v); return GL_FALSE; } } /* there should be no errors at this point */ if (!piglit_check_gl_error(GL_NO_ERROR)) { return GL_FALSE; } /* this should generate an error */ { GLfloat v[4]; glActiveTexture(GL_TEXTURE0 + MaxTextureCoordUnits); if (MaxTextureCoordUnits == MaxTextureCombinedUnits) { /* INVALID_ENUM is expected */ if (!piglit_check_gl_error(GL_INVALID_ENUM)) { return GL_FALSE; } } else { /* INVALID_OPERATION is expected */ glGetFloatv(GL_CURRENT_RASTER_TEXTURE_COORDS, v); if (!piglit_check_gl_error(GL_INVALID_OPERATION)) { return GL_FALSE; } } } return GL_TRUE; }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL13_nglMultiTexCoord4fv(JNIEnv *__env, jclass clazz, jint texture, jlong vAddress, jlong __functionAddress) { const GLfloat *v = (const GLfloat *)(intptr_t)vAddress; glMultiTexCoord4fvPROC glMultiTexCoord4fv = (glMultiTexCoord4fvPROC)(intptr_t)__functionAddress; UNUSED_PARAMS(__env, clazz) glMultiTexCoord4fv(texture, v); }