public void draw() { // Clear GL state gl.glDisable(GL_LIGHTING); gl.glDisable(GL_DEPTH); gl.glMatrixMode(GL_MODELVIEW); gl.glPushMatrix(); gl.glLoadIdentity(); gl.glMatrixMode(GL_PROJECTION); gl.glPushMatrix(); gl.glLoadIdentity(); gl.glClearColor(0.8f, 0.2f, 0.2f, 1.0f); gl.glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); gl.glPointSize(1.0f); // Set the viewport glu.gluOrtho2D(xMin, xMax, yMin, yMax); gl.glBegin(GL_POINTS); for (int x = (int) (xMin); x < xMax; x++) for (int y = (int) (yMin); y < yMax; y++) { gl.glColor3d(viewPort[x][y].r, viewPort[x][y].g, viewPort[x][y].b); gl.glVertex2d(x + 0.5, y + 0.5); } gl.glEnd(); // Restore state gl.glMatrixMode(GL_MODELVIEW); gl.glPopMatrix(); gl.glMatrixMode(GL_PROJECTION); gl.glPopMatrix(); gl.glEnable(GL_LIGHTING); gl.glEnable(GL_DEPTH); }
/** Called back by the animator to perform rendering. */ @Override public void display(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); // get the OpenGL 2 graphics context gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear color and depth buffers for (int i = 0; i < stars.length; i++) { // Reset the view (x, y, z axes back to normal) gl.glLoadIdentity(); gl.glTranslatef(0.0f, 0.0f, z); // The stars are texture quad square drawn on x-y plane and // distributed on on x-z plane around the y-axis // Initial 90 degree tile in the x-axis, y-axis pointing out of screen gl.glRotatef(tilt, 1.0f, 0.0f, 0.0f); // Rotate about y-axis (pointing out of screen), initial angle is 0 gl.glRotatef(stars[i].angle, 0.0f, 1.0f, 0.0f); // Translate about the x-axis (pointing right) to its current distance gl.glTranslatef(stars[i].distance, 0.0f, 0.0f); // The stars have initial angle of 0, and initial distance linearly // distributed between 0 and 5.0f // Rotate the axes back, so that z-axis is again facing us, to ensure that // the quad (with texture) on x-y plane is facing us gl.glRotatef(-stars[i].angle, 0.0f, 1.0f, 0.0f); gl.glRotatef(-tilt, 1.0f, 0.0f, 0.0f); // Take note that without the two rotations and undo, there is only one // translation along the x-axis // Matrix operation is non-commutative. That is, AB != BA. // Hence, ABCB'A' != C // Draw the star, which spins on the z axis (pointing out of the screen) gl.glRotatef(starSpinAngle, 0.0f, 0.0f, 1.0f); // Set the star's color using bytes (why bytes? not float or int?) gl.glColor4ub(stars[i].r, stars[i].g, stars[i].b, (byte) 255); gl.glBegin(GL_QUADS); // draw a square on x-y plane gl.glTexCoord2f(textureCoordLeft, textureCoordBottom); gl.glVertex3f(-1.0f, -1.0f, 0.0f); gl.glTexCoord2f(textureCoordRight, textureCoordBottom); gl.glVertex3f(1.0f, -1.0f, 0.0f); gl.glTexCoord2f(textureCoordRight, textureCoordTop); gl.glVertex3f(1.0f, 1.0f, 0.0f); gl.glTexCoord2f(textureCoordLeft, textureCoordTop); gl.glVertex3f(-1.0f, 1.0f, 0.0f); gl.glEnd(); // If twinkling, overlay with another drawing of an arbitrary color if (twinkleOn) { // Assign a color using bytes gl.glColor4ub( stars[(numStars - i) - 1].r, stars[(numStars - i) - 1].g, stars[(numStars - i) - 1].b, (byte) 255); gl.glBegin(GL_QUADS); // draw a square on x-y plane gl.glTexCoord2f(textureCoordLeft, textureCoordBottom); gl.glVertex3f(-1.0f, -1.0f, 0.0f); gl.glTexCoord2f(textureCoordRight, textureCoordBottom); gl.glVertex3f(1.0f, -1.0f, 0.0f); gl.glTexCoord2f(textureCoordRight, textureCoordTop); gl.glVertex3f(1.0f, 1.0f, 0.0f); gl.glTexCoord2f(textureCoordLeft, textureCoordTop); gl.glVertex3f(-1.0f, 1.0f, 0.0f); gl.glEnd(); } // Update for the next refresh // The star spins about the z-axis (pointing out of the screen), and spiral // inwards and collapse towards the center, by increasing the angle on x-y // plane and reducing the distance. starSpinAngle += 0.01f; // used to spin the stars about the z-axis // spiral pattern stars[i].angle += (float) i / numStars; // changes the angle of a star // collapsing the star to the center stars[i].distance -= 0.01f; // changes the distance of a star // re-bone at the edge if (stars[i].distance < 0.0f) { // Is the star collapsed to the center? stars[i].distance += 5.0f; // move to the outer ring stars[i].setRandomRGB(); // choose a random color for the star } } }