Пример #1
0
 private void applyMovementAndRotation(final GL2 gl) {
   glu.gluLookAt(
       0.0 + cah.getCx(),
       0.0 + cah.getCy(),
       0.0 + cah.getCz(),
       5.0 * Math.sin(cah.getX()) + cah.getCx(),
       5.0 * Math.sin(cah.getY()) + cah.getCy(),
       5.0 * Math.cos(cah.getX()) + cah.getCz(),
       0.0,
       1.0,
       0.0);
 }
Пример #2
0
public class Renderer implements GLEventListener {

  public static final float FOV = 45.0f;
  public static DisplayMode dm, dm_old;
  private GLU glu = new GLU();

  private CameraAngleHandler cah = CameraAngleHandler.getInstance();

  private List<Shape> s = new ArrayList<>();
  private List<ModelShape> ms = new ArrayList<>();

  private Texture sky, ring;
  private Texture[] planets = new Texture[20];

  private Model[] models = new Model[40];

  GLUquadric quad;

  @Override
  public void display(GLAutoDrawable drawable) {
    final GL2 gl = drawable.getGL().getGL2();

    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    applyMovementAndRotation(gl);
    applyLight(gl);
    // enableTransparency(gl);

    for (Shape el : s) {
      el.draw(gl, glu);
    }

    for (ModelShape el : ms) {
      el.draw(gl);
    }

    gl.glFlush();
  }

  private void applyMovementAndRotation(final GL2 gl) {
    glu.gluLookAt(
        0.0 + cah.getCx(),
        0.0 + cah.getCy(),
        0.0 + cah.getCz(),
        5.0 * Math.sin(cah.getX()) + cah.getCx(),
        5.0 * Math.sin(cah.getY()) + cah.getCy(),
        5.0 * Math.cos(cah.getX()) + cah.getCz(),
        0.0,
        1.0,
        0.0);
  }

  private void applyLight(GL2 gl) {
    // Prepare light parameters.
    float SHINE_ALL_DIRECTIONS = 1;
    float[] lightPos = {0, 40, -100, SHINE_ALL_DIRECTIONS};
    float[] lightColorAmbient = {0.2f, 0.2f, 0.2f, 0.5f};
    float[] lightColorDiffuse = {1f, 1f, 1f, 0.5f};
    float[] lightColorSpecular = {0.8f, 0.8f, 0.8f, 0.5f};

    // Set light parameters.
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_POSITION, lightPos, 0);
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_AMBIENT, lightColorAmbient, 0);
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_SPECULAR, lightColorSpecular, 0);
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_DIFFUSE, lightColorDiffuse, 0);

    gl.glLightfv(GL2.GL_LIGHT2, GL2.GL_POSITION, new float[] {0, 15, -40, SHINE_ALL_DIRECTIONS}, 0);
    gl.glLightfv(GL2.GL_LIGHT2, GL2.GL_AMBIENT, lightColorAmbient, 0);
    gl.glLightfv(GL2.GL_LIGHT2, GL2.GL_SPECULAR, lightColorSpecular, 0);
    gl.glLightfv(GL2.GL_LIGHT2, GL2.GL_DIFFUSE, lightColorDiffuse, 0);

    // Enable lighting in GL.
    gl.glEnable(GL2.GL_LIGHT1);
    // gl.glEnable(GL2.GL_LIGHT2);
    gl.glEnable(GL2.GL_LIGHTING);

    // Set material properties.
    //        float[] rgba = {0.3f, 0.5f, 1f};
    float[] rgba = {0.8f, 0.8f, 1f, 1f};
    gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_AMBIENT, rgba, 0);
    gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_SPECULAR, rgba, 0);
    gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_DIFFUSE, rgba, 0);
    gl.glMaterialf(GL2.GL_FRONT, GL2.GL_SHININESS, 20f);
  }

  private void enableTransparency(final GL2 gl) {
    gl.glEnable(GL2.GL_BLEND);
    gl.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA);
  }

  @Override
  public void dispose(GLAutoDrawable drawable) {}

  @Override
  public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
    final GL2 gl = drawable.getGL().getGL2();
    if (height <= 0) height = 1;

    final float h = (float) width / (float) height;
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL2.GL_PROJECTION);
    gl.glLoadIdentity();

    glu.gluPerspective(FOV, h, 1.0, 4000.0);
    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
  }

  @Override
  public void init(GLAutoDrawable drawable) {
    final GL2 gl = drawable.getGL().getGL2();
    gl.glClearColor(0f, 0f, 0f, 0f);
    gl.glClearDepth(1.0f);

    gl.glShadeModel(GL2.GL_SMOOTH);
    gl.glEnable(GL2.GL_DEPTH_TEST);

    // gl.glEnable(GL2.GL_CULL_FACE); // don't render face backside of triangles
    // gl.glCullFace(GL2.GL_BACK); // backside

    gl.glDepthFunc(GL2.GL_LEQUAL);
    gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);

    loadTextures();
    loadModels();
    setQuadParams();

    addTestListData();
    PassiveObjectMovement.getInstance().startThread(s);
  }

  private void setQuadParams() {
    quad = glu.gluNewQuadric();
    glu.gluQuadricDrawStyle(quad, GLU.GLU_FILL);
    glu.gluQuadricNormals(quad, GLU.GLU_FLAT);
    glu.gluQuadricOrientation(quad, GLU.GLU_OUTSIDE);
    glu.gluQuadricTexture(quad, true);
  }

  private void addTestListData() {

    // s.add(new Cylinder(quad, grass, 100, 2, 0, 0, 0, -90, 0, 0));
    s.add(new Sphere(quad, sky, 1000, 0, 0, 0, -90, 0, 0));

    //		s.add(new Sphere(quad, planets[0], 3.8f, 50, 40, -50, -90, 0, 0));
    //		s.add(new Sphere(quad, planets[1], 9.5f, 40, 40, -20, -90, 0, 0));
    //		s.add(new Sphere(quad, planets[2], 10.f, 0, 40, -20, -90, 0, 0));
    //		s.add(new Sphere(quad, planets[3], 5.3f,-20, 40, -50, -90, 0, 0));
    //
    //		s.add(new Sphere(quad, planets[4], 112f,  410, 120, 100, -90, 0, 0));
    //		s.add(new Sphere(quad, planets[5], 94.5f, 100, 120, 260, -90, 0, 0));
    //		s.add(new Sphere(quad, planets[6], 40f,   -170, 100, 240, -90, 0, 0));
    //		s.add(new Sphere(quad, planets[7], 38.8f, -270, 100, 200, -90, 0, 0));
    //
    //		s.add(new Sphere(quad, planets[8], 5, -110, 50, 50, -90, 0, 0));
    //		s.add(new Sphere(quad, planets[9], 2.5f, 0, 40, -40, -90, 0, 0));
    //
    //		s.add(new Disc(quad, ring, 225, 100, 120, 260, -90, 0, 0));

    ms.add(new ModelShape(models[2], 12, 6, 12, 0, 0, 0, 0, 0, 0));
    //		ms.add(new ModelShape(models[3], 1, 1, 1, -50, 15, -50, 0, 0, 0));
    //		ms.add(new ModelShape(models[4], 1, 1, 1, 0, 15, -70, 0, 0, 0));
    //		ms.add(new ModelShape(models[5], 1, 1, 1, 0, 15, -70, 0, 0, 0));
    //		ms.add(new ModelShape(models[6], 1, 1, 1, 0, 15, -70, 0, 0, 0));
    //		ms.add(new ModelShape(models[7], 1, 1, 1, 0, 15, -70, 0, 0, 0));
    //		ms.add(new ModelShape(models[8], 3, 3, 3, 0, 20, -45, 0, 0, 0));
    //		ms.add(new ModelShape(models[9], 1, 1, 1, 30, 15, -40, 0, 0, 0));
    // ms.add(new ModelShape(models[10], 0.2f, 0.2f, 0.2f, 0, -30, -40, 0, 0, 0));
  }

  private void loadTextures() {
    planets[0] = loadTexture("mercury.jpg");
    planets[1] = loadTexture("venus.jpg");
    planets[2] = loadTexture("earth.jpg");
    planets[3] = loadTexture("mars.jpg");
    planets[4] = loadTexture("jupiter.jpg");
    planets[5] = loadTexture("saturn.jpg");
    planets[6] = loadTexture("uranus.jpg");
    planets[7] = loadTexture("neptune.jpg");
    planets[8] = loadTexture("pluto.jpg");
    planets[9] = loadTexture("moon.jpg");

    ring = loadTexture("saturnring2.png");
    sky = loadTexture("sky.jpg");
  }

  private void loadModels() {
    models[2] = loadModel("COD.obj");
    models[3] = loadModel("T-90fx.obj");
    models[4] = loadModel("crate2.obj");
    models[5] = loadModel("sack.obj");
    models[6] = loadModel("barrel.obj");
    models[7] = loadModel("coffin.obj");
    models[8] = loadModel("FuelTank.obj");
    models[9] = loadModel("Cargo.obj");
    // models[10] = loadModel("Island.obj");
  }

  private static Texture loadTexture(String str) {
    Texture temp = null;
    try {
      temp = TextureIO.newTexture(new File("res/tex/" + str), true);
    } catch (IOException e) {
      e.printStackTrace();
      System.out.println("Failed loading: " + str);
    }
    return temp;
  }

  private static Model loadModel(String str) {
    Model temp = null;
    try {
      temp = ModelIO.newModel("res/obj/" + str);
    } catch (IOException e) {
      e.printStackTrace();
      System.out.println("Failed loading: " + str);
    }
    return temp;
  }
}