static void Test3( void ) { static const GLfloat p[4] = {0, 0, 0, 0}; GLfloat q[4]; /* normalize vector */ static const char *prog = "!!VSP1.0\n" "# c[0] = (nx,ny,nz)\n" "# R0.xyz = normalize(R1)\n" "# R0.w = 1/sqrt(nx*nx + ny*ny + nz*nz)\n" "# c[2] = R0\n" "DP3 R0.w, c[0], c[0];\n" "RSQ R0.w, R0.w;\n" "MUL R0.xyz, c[0], R0.w;\n" "MOV c[2], R0;\n" "END\n"; glLoadProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, strlen(prog), (const GLubyte *) prog); assert(glIsProgramNV(1)); glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 0, 0, 10, 0, 0); glExecuteProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, p); glGetProgramParameterfvNV(GL_VERTEX_PROGRAM_NV, 2, GL_PROGRAM_PARAMETER_NV, q); printf("Result c[2] = %g %g %g %g (should be 0, 1, 0, 0.1)\n", q[0], q[1], q[2], q[3]); }
static void Test2( void ) { static const GLfloat p[4] = {9, 8, 7, 6}; GLfloat q[4]; /* test swizzling */ static const char *prog = "!!VSP1.0\n" "MOV R0, c[0].wzyx;\n" "MOV R1, c[1].wzyx;\n" "ADD c[2], R0, R1;\n" "END\n"; glLoadProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, strlen(prog), (const GLubyte *) prog); assert(glIsProgramNV(1)); glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 0, 1, 2, 3, 4); glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 1, 10, 20, 30, 40); glExecuteProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, p); glGetProgramParameterfvNV(GL_VERTEX_PROGRAM_NV, 2, GL_PROGRAM_PARAMETER_NV, q); printf("Result c[2] = %g %g %g %g (should be 44 33 22 11)\n", q[0], q[1], q[2], q[3]); }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexProgram_nglGetProgramParameterfvNV(JNIEnv *env, jclass clazz, jint target, jint index, jint parameterName, jobject params, jint params_position, jlong function_pointer) { GLfloat *params_address = ((GLfloat *)(*env)->GetDirectBufferAddress(env, params)) + params_position; glGetProgramParameterfvNVPROC glGetProgramParameterfvNV = (glGetProgramParameterfvNVPROC)((intptr_t)function_pointer); glGetProgramParameterfvNV(target, index, parameterName, params_address); }