static void display()
{
/* World-space positions for light and eye. */
float[] eyePosition = { 0, 0, 8, 1 };
float[] lightPosition = { 5*(float) Math.Sin(myLightAngle),
1.5f,
5*(float) Math.Cos(myLightAngle), 1 };
float[] translateMatrix = new float[16], rotateMatrix = new float[16],
modelMatrix = new float[16], invModelMatrix = new float[16], viewMatrix = new float[16],
modelViewMatrix = new float[16], modelViewProjMatrix = new float[16];
float[] objSpaceEyePosition = new float[4], objSpaceLightPosition = new float[4];
Cg.cgSetParameter1f(myCgVertexParam_time, myTime);
buildLookAtMatrix(eyePosition[0], eyePosition[1], eyePosition[2],
0, 0, 0,
0, 1, 0,
ref viewMatrix);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
CgGl.cgGLEnableProfile(myCgVertexProfile);
checkForCgError("enabling vertex profile");
CgGl.cgGLEnableProfile(myCgFragmentProfile);
checkForCgError("enabling fragment profile");
CgGl.cgGLBindProgram(myCgVertexProgram);
checkForCgError("binding vertex program");
CgGl.cgGLBindProgram(myCgFragmentProgram);
checkForCgError("binding fragment program");
/*** Render green solid bulging sphere ***/
/* modelView = rotateMatrix * translateMatrix */
makeRotateMatrix(70f, 1f, 1f, 1f, ref rotateMatrix);
makeTranslateMatrix(2.2f, 1f, 0.2f, ref translateMatrix);
multMatrix(ref modelMatrix, translateMatrix, rotateMatrix);
/* invModelMatrix = inverse(modelMatrix) */
invertMatrix(ref invModelMatrix, ref modelMatrix);
/* Transform world-space eye and light positions to sphere's object-space. */
transform(ref objSpaceEyePosition, invModelMatrix, eyePosition);
Cg.cgSetParameter3fv(myCgVertexParam_eyePosition, out objSpaceEyePosition[0]);
transform(ref objSpaceLightPosition, invModelMatrix, lightPosition);
Cg.cgSetParameter3fv(myCgVertexParam_lightPosition, out objSpaceLightPosition[0]);
/* modelViewMatrix = viewMatrix * modelMatrix */
multMatrix(ref modelViewMatrix, viewMatrix, modelMatrix);
/* modelViewProj = projectionMatrix * modelViewMatrix */
multMatrix(ref modelViewProjMatrix, myProjectionMatrix, modelViewMatrix);
/* Set matrix parameter with row-major matrix. */
Cg.cgSetMatrixParameterfr(myCgVertexParam_modelViewProj, out modelViewProjMatrix[0]);
Cg.cgSetParameter4f(myCgVertexParam_Kd, 0.1f, 0.7f, 0.1f, 1f); /* Green */
Glut.glutSolidSphere(1.0, 40, 40);
/*** Render red solid bulging torus ***/
/* modelView = viewMatrix * translateMatrix */
makeTranslateMatrix(-2f, -1.5f, 0f, ref translateMatrix);
makeRotateMatrix(55, 1, 0, 0, ref rotateMatrix);
multMatrix(ref modelMatrix, translateMatrix, rotateMatrix);
/* invModelMatrix = inverse(modelMatrix) */
invertMatrix(ref invModelMatrix, ref modelMatrix);
/* Transform world-space eye and light positions to sphere's object-space. */
transform(ref objSpaceEyePosition, invModelMatrix, eyePosition);
Cg.cgSetParameter3fv(myCgVertexParam_eyePosition, out objSpaceEyePosition[0]);
transform(ref objSpaceLightPosition, invModelMatrix, lightPosition);
Cg.cgSetParameter3fv(myCgVertexParam_lightPosition, out objSpaceLightPosition[0]);
/* modelViewMatrix = viewMatrix * modelMatrix */
multMatrix(ref modelViewMatrix, viewMatrix, modelMatrix);
/* modelViewProj = projectionMatrix * modelViewMatrix */
multMatrix(ref modelViewProjMatrix, myProjectionMatrix, modelViewMatrix);
/* Set matrix parameter with row-major matrix. */
Cg.cgSetMatrixParameterfr(myCgVertexParam_modelViewProj, out modelViewProjMatrix[0]);
Cg.cgSetParameter4f(myCgVertexParam_Kd, 0.8f, 0.1f, 0.1f, 1f); /* Red */
Glut.glutSolidTorus(0.15, 1.7, 40, 40);
/*** Render light as emissive yellow ball ***/
CgGl.cgGLBindProgram(myCgLightVertexProgram);
checkForCgError("binding light vertex program");
/* modelView = translateMatrix */
makeTranslateMatrix(lightPosition[0], lightPosition[1], lightPosition[2],
ref modelMatrix);
/* modelViewMatrix = viewMatrix * modelMatrix */
multMatrix(ref modelViewMatrix, viewMatrix, modelMatrix);
/* modelViewProj = projectionMatrix * modelViewMatrix */
multMatrix(ref modelViewProjMatrix, myProjectionMatrix, modelViewMatrix);
/* Set matrix parameter with row-major matrix. */
Cg.cgSetMatrixParameterfr(myCgLightVertexParam_modelViewProj,
out modelViewProjMatrix[0]);
Glut.glutSolidSphere(0.1, 12, 12);
CgGl.cgGLDisableProfile(myCgVertexProfile);
checkForCgError("disabling vertex profile");
CgGl.cgGLDisableProfile(myCgFragmentProfile);
checkForCgError("disabling fragment profile");
Glut.glutSwapBuffers();
}