Package Engine.World

Source Code of Engine.World.Chunk$Render

package Engine.World;

import java.util.Random;

import org.lwjgl.opengl.GL11;

import Engine.Blocks.Air;
import Engine.Blocks.Bedrock;
import Engine.Blocks.DefaultBlock;
import Engine.Blocks.Dirt;
import Engine.Blocks.DrawInfos;
import Engine.Blocks.Gras;
import Engine.Blocks.Nothing;
import Engine.Blocks.Stone;
import Engine.Blocks.Water;

/**
* @author vbdetlevvb
*
*/
public class Chunk {

  byte TerrainHeight = 127;
  byte TerrainWidth = 16;
  int seed;
  DefaultBlock blocks[][];
  boolean IsGenerated = false;

  public Chunk() {
    blocks = new DefaultBlock[TerrainHeight][TerrainWidth];
  }

  public void Generate(int seed, int cx, Random random) {
    this.seed = seed;
    for (int y = 0; y < TerrainHeight; y++) {
      // XReihe Durchgehen
      for (int x = 0; x < TerrainWidth; x++) {
        blocks[y][x] = new Air();
        if (y == TerrainHeight)
          blocks[y][x] = new Bedrock();
      }
    }
    // for (int y = 0; y < TerrainHeight; y++) {
    // XReihe Durchgehen
    for (int x = 0; x < TerrainWidth; x++) {
      // Sys.alert("Pos", "X:"+x+" Y: "+y +
      // " BLocks: "+blocks.length);
      /*
       * if (y > TerrainHeight - 10+(5*Math.sin(x/seed))) { blocks[y][x] =
       * new Dirt(); } if (y == (int)(TerrainHeight
       * -10+(5*Math.sin(x/seed)))) {
       *
       * }
       */
      for (int y = TerrainHeight - 2; y > GetTerrainHeight(x + (cx * 16)); y--) {
        blocks[y][x] = new Dirt();
      }
      for (int y = TerrainHeight - 2; y > GetTerrainHeight(x + (cx * 16))
          + 4 + random.nextInt(2); y--) {
        if (y >= 0)
          blocks[y][x] = new Stone();
      }
      for (int y = TerrainHeight - 2; y > TerrainHeight - 15; y--) {
        if (y >= 0)
          if (blocks[y][x].ID() == (new Air()).ID())
            blocks[y][x] = new Water();
      }
      blocks[GetTerrainHeight(x + (cx * 16))][x] = new Gras();

    }
    IsGenerated = true;
  }

  double r1, r2 = 0;

  public class Render extends Thread {
    DrawInfos di;
    int X;

    public Render(DrawInfos di, int X) {
      this.X = X;
      this.di = di;
    }

    public void run() {
      try {
        if (IsGenerated) {

          GL11.glPushMatrix();
          GL11.glTranslatef(X * 16 * 16, 0, 0);
          for (int y = TerrainHeight - 1; y >= 0; y--) {
            // XReihe Durchgehen
            for (int x = 0; x < TerrainWidth; x++) {

              blocks[y][x].Draw(di, x, y);
            }
          }
          GL11.glPopMatrix();

        } else {
          System.out.println(X);
        }
      } catch (Exception ex) {

      }
    }
  }

  private int GetTerrainHeight(int x) {
    int Chunk = (int) (x / 16);

    r1 = RandomYHeight((Chunk - 1) * seed) * 5;
    r2 = RandomYHeight((Chunk) * seed) * 5;

    while (x >= 16)
      x -= 16;
    // System.out.println("Chunk: "+Chunk+" R1: "+r1+" R2: "+r2+ " X: "+((x
    // / 1.0)));
    return TerrainHeight - 15
        - (int) (Cosine_Interpolate(r1, r2, (x / 16.0)));

  }

  private double RandomYHeight(int x) {

    return 1.0 - ((x * (x * x * 15731 + 789221) + 1376312589) * 0x7fffffff) / 1073741824.0;
  }

  public double Cosine_Interpolate(double a, double b, double x) {
    double ft = x * 3.1415927;
    double f = (1 - Math.cos(ft)) * .5;

    return a * (1 - f) + b * f;
  }

  public DefaultBlock getBlockAt(int X, int Y) {
    try {
      // System.out.println(blocks[Y][X].ID());
      return blocks[Y][X];

    } catch (Exception ex) {
      // System.out.println("No in Terrain Physic: X: " + X + " Y: " + Y);
      return new Air();
    }

  }

  public Thread Draw(int X, DrawInfos di) {
    Render render = new Render(di, X);
    render.run();
    return render;
  }

}
TOP

Related Classes of Engine.World.Chunk$Render

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.