#include #include #include #include #include "point_aux.h" using namespace std; namespace Graphics { namespace { const string prg_str = "!!ARBvp1.0\n" "\n" "# Per-vertex inputs\n" "ATTRIB iPos = vertex.position;\n" "ATTRIB iNormal = vertex.normal;\n" "\n" "# Constant Parameters\n" "PARAM mvinv[4] = { state.matrix.modelview.invtrans };\n" "PARAM mvp[4] = { state.matrix.mvp };\n" "PARAM pt_sz_sc = program.env[0]; \n" "PARAM lightDir = state.light[0].position;\n" "PARAM halfDir = state.light[0].half;\n" "PARAM specExp = state.material.shininess;\n" "PARAM ambientCol = state.lightprod[0].ambient;\n" "PARAM diffuseCol = state.lightprod[0].diffuse;\n" "PARAM specularCol = state.lightprod[0].specular;\n" "\n" "# Per-vertex outputs\n" "OUTPUT oPos = result.position;\n" "OUTPUT oPointSize = result.pointsize;\n" "OUTPUT oColor = result.color;\n" "\n" "# Temp variables\n" "TEMP inv_z, z;\n" "TEMP xfNormal, temp, dots;\n" "\n" "# Transform Vertex to clip coords\n" "DP4 oPos.x, mvp[0], iPos;\n" "DP4 oPos.y, mvp[1], iPos;\n" "DP4 oPos.z, mvp[2], iPos;\n" "DP4 oPos.w, mvp[3], iPos;\n" "\n" "# Transform the normal to eye coordinates.\n" "DP3 xfNormal.x, mvinv[0], iNormal;\n" "DP3 xfNormal.y, mvinv[1], iNormal;\n" "DP3 xfNormal.z, mvinv[2], iNormal;\n" "\n" "# Normalize normal\n" "DP3 xfNormal.w, xfNormal, xfNormal;\n" "RSQ xfNormal.w, xfNormal.w;\n" "MUL xfNormal.xyz, xfNormal.w, xfNormal;" "\n" "# Compute diffuse and specular dot products and use LIT to compute\n" "# lighting coefficients.\n" "DP3 dots.x, xfNormal, lightDir;\n" "DP3 dots.y, xfNormal, halfDir;\n" "MOV dots.w, specExp.x;\n" "LIT dots, dots;\n" "\n" "# Accumulate color contributions.\n" "MAD temp, dots.y, diffuseCol, ambientCol;\n" "MAD oColor.xyz, dots.z, specularCol, temp;\n" "MOV oColor.w, diffuseCol.w;\n" "\n" "#Compute point size\n" "DP4 z, mvp[2], iPos;\n" "RCP inv_z, z.x; \n" "MUL oPointSize, inv_z.x, pt_sz_sc.x;\n" "\n" "END\n"; } void set_point_size() { int viewport[4]; float mat[16]; glGetFloatv(GL_PROJECTION_MATRIX, mat); glGetIntegerv(GL_VIEWPORT, viewport); #ifdef USE_POINT_SCALING const float H = viewport[2]; const float h = 2.0f/mat[0]; const float D0 = sqrt(2.0f)*H/h; const float k = 1.0f/(1.0f + 2*CMN::sqr(1/mat[0])); const float atten[3] = {0,0,CMN::sqr(1/D0)*k}; glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT,atten); glPointSize(1.0f); #endif glEnable(GL_POINT_SMOOTH); glEnable(GL_VERTEX_PROGRAM_ARB); unsigned int vtxpgmID=0; glGenProgramsARB(1, &vtxpgmID); glBindProgramARB(GL_VERTEX_PROGRAM_ARB, vtxpgmID); glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_ARB); glProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, prg_str.length(), prg_str.data()); const float D = mat[0]*viewport[2]/sqrt(2.0f); glProgramEnvParameter4fARB( GL_VERTEX_PROGRAM_ARB, 0, D, 0.0f, 0.0f, 0.0f ); cout << D << " " << glGetString(GL_PROGRAM_ERROR_STRING_ARB) << endl; } }