Exemple #1
0
int Map::Worker::run(void *data)
{
  Worker *instance = (Worker*)(data);

  int exitCode = -1;

  for (;;)
  {
    exitCode = instance->getExitCode();
    if (exitCode != -1)
      break;

    WorkerTask task = instance->getScheduledTask();

    if (!task.valid)
      continue;

    Quad* neighbors[4] = { NULL };
    neighbors[0] = task.map->findQuad(task.x  , task.z-1);
    neighbors[1] = task.map->findQuad(task.x+1, task.z  );
    neighbors[2] = task.map->findQuad(task.x  , task.z+1);
    neighbors[3] = task.map->findQuad(task.x-1, task.z  );

    task.quad->generate(neighbors, task.scale, task.fractal);
    task.quad->calculateNormals(neighbors, task.scale);

    for (int i = 0; i < 4; ++i)
    {
      if (neighbors[i] != NULL)
      {
        Quad* nNeighbors[4] = { NULL };
        nNeighbors[0] = task.map->findQuad(neighbors[i]->x()  , neighbors[i]->z()-1);
        nNeighbors[1] = task.map->findQuad(neighbors[i]->x()+1, neighbors[i]->z()  );
        nNeighbors[2] = task.map->findQuad(neighbors[i]->x()  , neighbors[i]->z()+1);
        nNeighbors[3] = task.map->findQuad(neighbors[i]->x()-1, neighbors[i]->z()  );
        neighbors[i]->calculateNormals(nNeighbors, task.scale);
      }
    }

    instance->addFinishedTask(task);
  }

  return exitCode;
}