Back to photostream

aurorae2

Now with randomized variations on the horizon palette and procedural terrain.

 

class TerrainGen {

static final int maxDepth = 6;

static final float spreadX = 0.75f;

static final float spreadY = 0.35f;

static private void gen(float[] xs,

float[] ys,

float leftX,

float rightX,

float leftY,

float rightY,

int idx,

int depth) {

if(depth > 0) {

float fracX = (1-spreadX)*0.5f + spreadX*(float)Math.random();

float midX = (1-fracX)*leftX + fracX*rightX;

float midY = (1-fracX)*leftY + fracX*rightY;

float midYPrime = midY + spreadY*(float)Math.random()/(1<<depth);

gen(xs, ys, leftX, midX, leftY, midYPrime, idx, depth-1);

gen(xs, ys, midX, rightX, midYPrime, rightY, idx+(1<<(depth-1)), depth-1);

} else {

xs[idx] = (leftX+rightX)/2;

ys[idx] = (leftY+rightY)/2;

}

}

 

static public float[] gen() {

int terms = 1 << maxDepth;

float[] xs = new float[terms];

float[] ys = new float[terms];

gen(xs, ys, 0f, 1f, 0.5f, 0.5f, 0, maxDepth);

float[] result = new float[4*terms+4+4];

result[0] = 0.0f;

result[1] = transfer(0.5f, 0);

result[2] = 0.0f;

result[3] = 0.0f;

for(int i = 0; i < terms; i++) {

result[4*i+4 + 0] = xs[i];

result[4*i+4 + 1] = transfer(ys[i], (float)(i+0.5)/terms);

result[4*i+4 + 2] = xs[i];

result[4*i+4 + 3] = 0;

}

result[4*terms + 0] = 1.0f;

result[4*terms + 1] = transfer(0.5f, 1f);

result[4*terms + 2] = 1.0f;

result[4*terms + 3] = 0.0f;

return result;

}

 

static float transfer(float h, float d) {

return 0.2f*(float)Math.pow(h,5) + 0.2f*(d-0.5f)*(d-0.5f);

}

}

420 views
0 faves
0 comments
Uploaded on November 15, 2009