package org.engine;
import org.lwjgl.LWJGLException;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.opengl.*;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import java.io.File;
import java.io.*;
public class GLEngine {
private int width; // ширина окна
private int height; // высота окна
private String title; // заголовок окна
private Texture texture;
private float rotateX = 0.0f;
private void loadTexture() throws FileNotFoundException, IOException {
texture = TextureLoader.getTexture("JPG",
new FileInputStream(
new File("/Users/nikita/IdeaProjects/OpenGLLab1/stones.jpg")));
}
public GLEngine(String title, int width, int height) { // конструктор класса
this.width = width;
this.height = height;
this.title = title;
}
private void initGL() throws LWJGLException {
Display.setDisplayMode(new DisplayMode(width, height)); // задаём размер экрана
Display.setTitle(title); // задаём заголовок экрана
Display.setInitialBackground(0x40, 0x40, 0x40); // бжкграунд
Display.create(); // создаём окно с заданным форматом пикселей
GL11.glClearDepth(1.0); // включаем очистку глубокого буфера
GL11.glDepthFunc(GL11.GL_LESS); // устанавливаем тип буфера
GL11.glEnable(GL11.GL_DEPTH_TEST); // устанавливаем глубину теста
GL11.glShadeModel(GL11.GL_SMOOTH); // устанавливаем сглаживания шейдеров
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity(); // сбрасываем настройки проекции
GLU.gluPerspective(45.0f, (float) width / (float) height, 0.1f, 100.0f); // устанавливаем позицию камеры
GL11.glEnable(GL11.GL_TEXTURE_2D); // устанавливаем текстурирование
GL11.glMatrixMode(GL11.GL_MODELVIEW);
try {
loadTexture();
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() throws LWJGLException {
initGL();
while (!Display.isCloseRequested()) { // пока окно не закрыто
render(); // рисуем
Display.update(); // обновляем экран
}
texture.release();
Display.destroy(); // уничтожаем окно
}
public void render() {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); // устанавливаем буферизацию для окна
GL11.glLoadIdentity(); // Reset The View
GL11.glTranslatef(0f, 0.0f, -5f);
GL11.glRotatef(rotateX, -5.0f, 1.0f, 0.0f);
texture.bind();
GL11.glBegin(GL11.GL_QUADS);
// Перед
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f(-1.0f, -1.0f, 1.0f);
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f( 1.0f, -1.0f, 1.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f( 1.0f, 1.0f, 1.0f);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f(-1.0f, 1.0f, 1.0f);
// Зад
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f(-1.0f, -1.0f, -1.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f(-1.0f, 1.0f, -1.0f);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f( 1.0f, 1.0f, -1.0f);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f( 1.0f, -1.0f, -1.0f);
// Верх
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f(-1.0f, 1.0f, -1.0f);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f(-1.0f, 1.0f, 1.0f);
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f( 1.0f, 1.0f, 1.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f( 1.0f, 1.0f, -1.0f);
// Низ
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f(-1.0f, -1.0f, -1.0f);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f( 1.0f, -1.0f, -1.0f);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f( 1.0f, -1.0f, 1.0f);
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f(-1.0f, -1.0f, 1.0f);
// Право
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f( 1.0f, -1.0f, -1.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f( 1.0f, 1.0f, 1.0f);
GL11.glVertex3f( 1.0f, 1.0f, -1.0f);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f( 1.0f, -1.0f, 1.0f);
// Лево
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f(-1.0f, -1.0f, -1.0f);
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f(-1.0f, -1.0f, 1.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f(-1.0f, 1.0f, 1.0f);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f(-1.0f, 1.0f, -1.0f);
GL11.glEnd();
rotateX += 1.0f;
}
}