?? renderer.java
字號:
package demos.nehe.lesson24;
import demos.common.ResourceRetriever;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import java.io.IOException;
import java.util.StringTokenizer;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import com.sun.opengl.util.BufferUtil;
class Renderer implements GLEventListener {
private int base; // Base Display List For The Font
private int scroll; // Used For Scrolling The Screen
private int swidth; // Scissor Width
private int sheight; // Scissor Height
private int maxtokens; // Keeps Track Of The Number Of Extensions Supported
private TextureImage textures[] = new TextureImage[1]; // Storage For One Texture
private ByteBuffer stringBuffer = BufferUtil.newByteBuffer(256);
public int getScroll() {
return scroll;
}
public void setScroll(int scroll) {
this.scroll = Math.max(0, Math.min(32 * (maxtokens - 9), scroll));
}
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
textures[0] = new TextureImage();
try {
loadTGA(gl, textures[0], "demos/data/images/font.tga"); // Load The Font Texture
} catch (IOException e) {
throw new RuntimeException(e);
}
buildFont(gl); // Build The Font
gl.glShadeModel(GL.GL_SMOOTH); // Enable Smooth Shading
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
gl.glClearDepth(1.0f); // Depth Buffer Setup
gl.glBindTexture(GL.GL_TEXTURE_2D, textures[0].texID[0]); // Select Our Font Texture
}
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
int cnt = 0; // Local Counter Variable
gl.glColor3f(1.0f, 0.5f, 0.5f); // Set Color To Bright Red
glPrint(gl, 50, 16, 1, "Renderer"); // Display Renderer
glPrint(gl, 80, 48, 1, "Vendor"); // Display Vendor Name
glPrint(gl, 66, 80, 1, "Version"); // Display Version
gl.glColor3f(1.0f, 0.7f, 0.4f); // Set Color To Orange
glPrint(gl, 200, 16, 1, gl.glGetString(GL.GL_RENDERER)); // Display Renderer
glPrint(gl, 200, 48, 1, gl.glGetString(GL.GL_VENDOR)); // Display Vendor Name
glPrint(gl, 200, 80, 1, gl.glGetString(GL.GL_VERSION)); // Display Version
gl.glColor3f(0.5f, 0.5f, 1.0f); // Set Color To Bright Blue
glPrint(gl, 192, 432, 1, "NeHe Productions"); // Write NeHe Productions At The Bottom Of The Screen
gl.glLoadIdentity(); // Reset The ModelView Matrix
gl.glColor3f(1.0f, 1.0f, 1.0f); // Set The Color To White
gl.glBegin(GL.GL_LINE_STRIP); // Start Drawing Line Strips (Something New)
gl.glVertex2d(639, 417); // Top Right Of Bottom Box
gl.glVertex2d(0, 417); // Top Left Of Bottom Box
gl.glVertex2d(0, 480); // Lower Left Of Bottom Box
gl.glVertex2d(639, 480); // Lower Right Of Bottom Box
gl.glVertex2d(639, 128); // Up To Bottom Right Of Top Box
gl.glEnd(); // Done First Line Strip
gl.glBegin(GL.GL_LINE_STRIP); // Start Drawing Another Line Strip
gl.glVertex2d(0, 128); // Bottom Left Of Top Box
gl.glVertex2d(639, 128); // Bottom Right Of Top Box
gl.glVertex2d(639, 1); // Top Right Of Top Box
gl.glVertex2d(0, 1); // Top Left Of Top Box
gl.glVertex2d(0, 417); // Down To Top Left Of Bottom Box
gl.glEnd(); // Done Second Line Strip
gl.glScissor(1, (int) (0.135416f * sheight), swidth - 2, (int) (0.597916f * sheight)); // Define Scissor Region
gl.glEnable(GL.GL_SCISSOR_TEST); // Enable Scissor Testing
String text = gl.glGetString(GL.GL_EXTENSIONS); // Allocate Memory For Our Extension String
StringTokenizer tokenizer = new StringTokenizer(text);
while (tokenizer.hasMoreTokens()) { // While The Token Isn't NULL
cnt++; // Increase The Counter
if (cnt > maxtokens) { // Is 'maxtokens' Less Than 'cnt'
maxtokens = cnt; // If So, Set 'maxtokens' Equal To 'cnt'
}
gl.glColor3f(0.5f, 1.0f, 0.5f); // Set Color To Bright Green
glPrint(gl, 0, 96 + (cnt * 32) - scroll, 0, "" + cnt); // Print Current Extension Number
gl.glColor3f(1.0f, 1.0f, 0.5f); // Set Color To Yellow
glPrint(gl, 50, 96 + (cnt * 32) - scroll, 0, tokenizer.nextToken()); // Print The Current Token (Parsed Extension Name)
}
gl.glDisable(GL.GL_SCISSOR_TEST); // Disable Scissor Testing
gl.glFlush(); // Flush The Rendering Pipeline
}
public void reshape(GLAutoDrawable drawable,
int xstart,
int ystart,
int width,
int height) {
GL gl = drawable.getGL();
height = (height == 0) ? 1 : height;
swidth = width; // Set Scissor Width To Window Width
sheight = height; // Set Scissor Height To Window Height
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL.GL_PROJECTION); // Select The Projection Matrix
gl.glLoadIdentity(); // Reset The Projection Matrix
gl.glOrtho(0.0f, 640, 480, 0.0f, -1.0f, 1.0f); // Create Ortho 640x480 View (0,0 At Top Left)
gl.glMatrixMode(GL.GL_MODELVIEW); // Select The Modelview Matrix
gl.glLoadIdentity();
}
public void displayChanged(GLAutoDrawable drawable,
boolean modeChanged,
boolean deviceChanged) {
}
private void loadTGA(GL gl, TextureImage texture, String filename) throws IOException { // Loads A TGA File Into Memory
ByteBuffer TGAcompare = BufferUtil.newByteBuffer(12); // Used To Compare TGA Header
byte[] TGAheader = new byte[] {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Uncompressed TGA Header
ByteBuffer header = BufferUtil.newByteBuffer(6); // First 6 Useful Bytes From The Header
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -