package fraioveio.palline3d;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.util.glu.Sphere;
public class Palline3D {
public static final int width = 800, height = 600;
public boolean close = false;
public float rotx = 0;
public float roty = 0;
public float posx = 0;
public float posy = 0.5f;
public float posz = 0;
public float vx = 0.05f;
public float vy = 0.08f;
public float vz = -0.07f;
public static void main
(String[] args
) {
System.
setProperty("org.lwjgl.librarypath",
System.
getProperty("user.dir") + "/natives/");
Palline3D p = new Palline3D();
p.run();
}
public void run() {
initDisplay();
initGL();
while(!close) {
input();
render();
Display.update();
Display.sync(70);
}
Display.destroy();
}
public void initGL() {
GL11.glViewport(0, 0, width, height);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45.0f, ((float) width / (float) height), 0.1f, 100.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GL11.glClearDepth(1.0f);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
GL11.glEnable(GL11.GL_COLOR_MATERIAL);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_LIGHT1);
GL11.glLoadIdentity();
GL11.glTranslatef(0, 0, 0);
float lightAmbient[] = { 0.0f, 0.0f, 0.0f, 0.0f };
float lightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
float lightPosition[] = { 0.0f, 0.0f, 0.0f, 10.0f };
ByteBuffer temp = ByteBuffer.allocateDirect(16);
temp.order(ByteOrder.nativeOrder());
GL11.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, (FloatBuffer)temp.asFloatBuffer().put(lightAmbient).flip());
GL11.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, (FloatBuffer)temp.asFloatBuffer().put(lightDiffuse).flip());
GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION,(FloatBuffer)temp.asFloatBuffer().put(lightPosition).flip());
Mouse.setGrabbed(true);
}
private void initDisplay() {
try {
Display.setDisplayMode(new DisplayMode(width, height));
Display.setTitle("Palline 3D by FraioVeio");
Display.create();
} catch (LWJGLException ex) {
ex.printStackTrace();
}
}
private void input() {
close = Display.isCloseRequested();
if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
close = true;
int rx = Mouse.getDX(), ry = Mouse.getDY();
if(roty - ry / 2f <= 90 && roty - ry / 2f >= -90) {
roty -= ry / 2f;
}
rotx += rx / 2f;
}
private Sphere s = new Sphere();
private void render() {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glLoadIdentity();
GL11.glRotatef(roty, 1, 0, 0);
GL11.glRotatef(rotx, 0, 1, 0);
GL11.glTranslatef(0, -10, 0);
GL11.glBegin(GL11.GL_QUADS);
// Basso
GL11.glColor3f(0, 0, 1);
GL11.glVertex3f(-10, 0, 10);
GL11.glVertex3f(10, 0, 10);
GL11.glVertex3f(10, 0, -10);
GL11.glVertex3f(-10, 0, -10);
// Davanti
GL11.glColor3f(1, 0, 0);
GL11.glVertex3f(-10, 0, 10);
GL11.glVertex3f(10, 0, 10);
GL11.glVertex3f(10, 20, 10);
GL11.glVertex3f(-10, 20, 10);
// Dietro
GL11.glColor3f(0, 1, 0);
GL11.glVertex3f(-10, 0, -10);
GL11.glVertex3f(10, 0, -10);
GL11.glVertex3f(10, 20, -10);
GL11.glVertex3f(-10, 20, -10);
// Destra
GL11.glColor3f(1, 1, 0);
GL11.glVertex3f(10, 0, 10);
GL11.glVertex3f(10, 0, -10);
GL11.glVertex3f(10, 20, -10);
GL11.glVertex3f(10, 20, 10);
// Sinistra
GL11.glColor3f(0, 1, 1);
GL11.glVertex3f(-10, 0, 10);
GL11.glVertex3f(-10, 0, -10);
GL11.glVertex3f(-10, 20, -10);
GL11.glVertex3f(-10, 20, 10);
// Alto
GL11.glColor3f(1, 0, 1);
GL11.glVertex3f(-10, 20, 10);
GL11.glVertex3f(10, 20, 10);
GL11.glVertex3f(10, 20, -10);
GL11.glVertex3f(-10, 20, -10);
GL11.glEnd();
/* Sfera */
GL11.glLoadIdentity();
GL11.glRotatef(roty, 1, 0, 0);
GL11.glRotatef(rotx, 0, 1, 0);
GL11.glTranslatef(posx, posy - 10, posz);
GL11.glColor3f(1, 1, 1);
s.draw(0.5f, 20, 20);
posx += vx;
posy += vy;
posz += vz;
if(posx - 0.5f <= -10 || posx + 0.5f >= 10) {
vx = -vx;
}
if(posy - 0.5f <= 0 || posy + 0.5f >= 20) {
vy = -vy;
}
if(posz - 0.5f <= -10 || posz + 0.5f >= 10) {
vz = -vz;
}
}
}