Blame projects/forest/main.c

Ivan Mahonin dab153
Ivan Mahonin 3395b9
#include <math.h>
Ivan Mahonin 3395b9
#include <time.h>
Ivan Mahonin 3395b9
#include <string.h>
Ivan Mahonin 3395b9
#include <stdlib.h>
Ivan Mahonin 3395b9
Ivan Mahonin dab153
#include <helianthus.h>
Ivan Mahonin dab153
Ivan Mahonin 3395b9
#include "chunk.h"
Ivan Mahonin 3395b9
Ivan Mahonin 3395b9
Ivan Mahonin 3395b9
#define COUNT 100
Ivan Mahonin 3395b9
Ivan Mahonin 3395b9
double t;
Ivan Mahonin 3395b9
double x, y;
Ivan Mahonin 815578
double vx = 10, vy = 0;
Ivan Mahonin 3395b9
Ivan Mahonin 3395b9
int rootSeed;
Ivan Mahonin 3395b9
Ivan Mahonin 3395b9
Chunk chunks[COUNT];
Ivan Mahonin 3395b9
Ivan Mahonin 3395b9
Ivan Mahonin 3395b9
void initChunks() {
Ivan Mahonin 3395b9
  srand(time(NULL));
Ivan Mahonin 3395b9
  rootSeed = rand();
Ivan Mahonin 3395b9
  Chunk *c = &chunks[0];
Ivan Mahonin 3395b9
  chunkGenerate(c, rootSeed, NULL, -COUNT/2);
Ivan Mahonin 3395b9
  for(int i = 1; i < COUNT; ++i, ++c)
Ivan Mahonin 3395b9
    chunkGenerate(c+1, rootSeed, c, 1);
Ivan Mahonin 3395b9
}
Ivan Mahonin 3395b9
Ivan Mahonin dab153
Ivan Mahonin 3395b9
void prepareChunks(double x) {
Ivan Mahonin 3395b9
  Chunk *first = chunks, *last = first + COUNT - 1;
Ivan Mahonin 3395b9
  int i0 = (int)floor(x/CHUNK_WIDTH) - COUNT/2;
Ivan Mahonin 3395b9
  int offset = i0 - chunks[0].index;
Ivan Mahonin 3395b9
  
Ivan Mahonin 3395b9
  if (offset < 0) {
Ivan Mahonin 3395b9
    Chunk *next = last, *prev = first;
Ivan Mahonin 3395b9
    if (offset > -COUNT) {
Ivan Mahonin 3395b9
      memmove(first - offset, first, sizeof(*chunks)*(COUNT + offset));
Ivan Mahonin 3395b9
      prev = first - offset;
Ivan Mahonin 3395b9
      next = prev - 1;
Ivan Mahonin 3395b9
      offset = 1;
Ivan Mahonin 3395b9
    }
Ivan Mahonin 3395b9
    while(next >= first)
Ivan Mahonin 3395b9
      { chunkGenerate(next, rootSeed, prev, offset); prev = next--; offset = -1; }
Ivan Mahonin 3395b9
  } else
Ivan Mahonin 3395b9
  if (offset > 0) {
Ivan Mahonin 3395b9
    Chunk *next = first, *prev = last;
Ivan Mahonin 3395b9
    if (offset < COUNT) {
Ivan Mahonin 3395b9
      memmove(first, first + offset, sizeof(*chunks)*(COUNT - offset));
Ivan Mahonin 3395b9
      prev = last - offset;
Ivan Mahonin 3395b9
      next = prev + 1;
Ivan Mahonin 3395b9
      offset = 1;
Ivan Mahonin 3395b9
    } else {
Ivan Mahonin 3395b9
      offset -= COUNT - 1;
Ivan Mahonin 3395b9
    }
Ivan Mahonin 3395b9
    while(next <= last)
Ivan Mahonin 3395b9
      { chunkGenerate(next, rootSeed, prev, offset); prev = next++; offset = 1; }
Ivan Mahonin 3395b9
  }
Ivan Mahonin 3395b9
}
Ivan Mahonin dab153
Ivan Mahonin dab153
Ivan Mahonin 3395b9
void drawChunks(double x, double range, double t) {
Ivan Mahonin 3395b9
  range += 5*2;
Ivan Mahonin 3395b9
  int i0 = (int)floor((x - 0.5*range)/CHUNK_WIDTH) - chunks->index;
Ivan Mahonin 3395b9
  int i1 = (int)floor((x + 0.5*range)/CHUNK_WIDTH) - chunks->index + 1;
Ivan Mahonin 3395b9
  if (i0 < 0) i0 = 0;
Ivan Mahonin 3395b9
  if (i1 > COUNT) i1 = COUNT;
Ivan Mahonin 3395b9
  
Ivan Mahonin 3395b9
  for(int i = i0; i < i1; ++i) chunkDraw(&chunks[i], t, FLAG_GROUND);
Ivan Mahonin 3395b9
  //for(int i = i0; i < i1; ++i) chunkDraw(&chunks[i], t, FLAG_LEAVES);
Ivan Mahonin 3395b9
  for(int i = i0; i < i1; ++i) chunkDraw(&chunks[i], t, FLAG_BRANCHES);
Ivan Mahonin 3395b9
}
Ivan Mahonin dab153
Ivan Mahonin dab153
Ivan Mahonin 3395b9
double groundLevel(double x) {
Ivan Mahonin 3395b9
  int i = (int)floor(x/CHUNK_WIDTH) - chunks->index;
Ivan Mahonin 3395b9
  if (i < 0) return chunks->y;
Ivan Mahonin 3395b9
  if (i > COUNT-1) return chunks[COUNT-1].y + chunks[COUNT-1].dy;
Ivan Mahonin 3395b9
  return chunkGroundLevel(&chunks[i], x);
Ivan Mahonin dab153
}
Ivan Mahonin dab153
Ivan Mahonin dab153
Ivan Mahonin dab153
void init() {
Ivan Mahonin 3395b9
  initChunks();
Ivan Mahonin dab153
}
Ivan Mahonin dab153
Ivan Mahonin dab153
Ivan Mahonin dab153
void draw() {
Ivan Mahonin de7236
  double dt = windowGetFrameTime();
Ivan Mahonin 3395b9
  t += dt;
Ivan Mahonin de7236
  int w = windowGetWidth();
Ivan Mahonin de7236
  int h = windowGetHeight();
Ivan Mahonin 3395b9
  double range = w;
Ivan Mahonin 3395b9
  
Ivan Mahonin 3395b9
  double gy = groundLevel(x);
Ivan Mahonin 3395b9
  vy = 0.5*(gy - y + 20);
Ivan Mahonin 3395b9
  x += dt*vx;
Ivan Mahonin 3395b9
  y += dt*vy;
Ivan Mahonin 3395b9
  
Ivan Mahonin dab153
  
Ivan Mahonin 3395b9
  if (keyWentDown("space")) initChunks();
Ivan Mahonin 3395b9
  if (keyWentDown("right")) x += 10;
Ivan Mahonin 3395b9
  if (keyWentDown("left")) x -= 10;
Ivan Mahonin 3395b9
  if (keyWentDown("up")) y += 10;
Ivan Mahonin 3395b9
  if (keyWentDown("down")) y -= 10;
Ivan Mahonin dab153
  
Ivan Mahonin dab153
  saveState();
Ivan Mahonin dab153
  translate(0.5*w, 0.5*h);
Ivan Mahonin dab153
  zoom(10);
Ivan Mahonin dab153
  scale(1, -1);
Ivan Mahonin 3395b9
  translate(-x, -y);
Ivan Mahonin 3395b9
  range /= 10;
Ivan Mahonin dab153
  
Ivan Mahonin 3395b9
  prepareChunks(x);
Ivan Mahonin 3395b9
  drawChunks(x, range, t);
Ivan Mahonin dab153
  
Ivan Mahonin dab153
  restoreState();
Ivan Mahonin dab153
}
Ivan Mahonin dab153
Ivan Mahonin dab153
Ivan Mahonin dab153
int main() {
Ivan Mahonin de7236
  windowSetVariableFrameRate();
Ivan Mahonin de7236
  windowSetResizable(TRUE);
Ivan Mahonin de7236
  windowSetInit(&init);
Ivan Mahonin de7236
  windowSetDraw(&draw);
Ivan Mahonin de7236
  windowRun();
Ivan Mahonin dab153
  return 0;
Ivan Mahonin dab153
}
Ivan Mahonin dab153