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; } }