From 595ac664c4ccfda57c104aa5a33ffd10d39decad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Sun, 7 Jul 2013 00:45:43 +0200 Subject: [PATCH] Water raster now uses ParallelQueue --- src/rendering/water/wat_raster.c | 56 +++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/src/rendering/water/wat_raster.c b/src/rendering/water/wat_raster.c index 45baf82..81bbf9c 100644 --- a/src/rendering/water/wat_raster.c +++ b/src/rendering/water/wat_raster.c @@ -2,8 +2,10 @@ #include "private.h" #include +#include #include "../renderer.h" #include "../tools.h" +#include "../tools/parallel.h" static Color _postProcessFragment(Renderer* renderer, Vector3 location, void* data) { @@ -34,8 +36,41 @@ static void _renderQuad(Renderer* renderer, double x, double z, double size) renderer->pushQuad(renderer, v1, v2, v3, v4, _postProcessFragment, NULL); } +typedef struct +{ + Renderer* renderer; + int i; + double cx; + double cz; + double radius_int; + double chunk_size; + double radius_ext; +} ParallelRasterInfo; + +static int _parallelJobCallback(ParallelQueue* queue, int job_id, void* data, int stopping) +{ + ParallelRasterInfo* info = (ParallelRasterInfo*)data; + UNUSED(queue); + UNUSED(job_id); + + if (!stopping) + { + _renderQuad(info->renderer, info->cx - info->radius_ext + info->chunk_size * info->i, info->cz - info->radius_ext, info->chunk_size); + _renderQuad(info->renderer, info->cx + info->radius_int, info->cz - info->radius_ext + info->chunk_size * info->i, info->chunk_size); + _renderQuad(info->renderer, info->cx + info->radius_int - info->chunk_size * info->i, info->cz + info->radius_int, info->chunk_size); + _renderQuad(info->renderer, info->cx - info->radius_ext, info->cz + info->radius_int - info->chunk_size * info->i, info->chunk_size); + } + + free(data); + return 0; +} + void waterRenderSurface(Renderer* renderer) { + ParallelRasterInfo* info; + ParallelQueue* queue; + queue = parallelQueueCreate(0); + int chunk_factor, chunk_count, i; Vector3 cam = renderer->getCameraLocation(renderer, VECTOR_ZERO); double radius_int, radius_ext, base_chunk_size, chunk_size; @@ -64,10 +99,20 @@ void waterRenderSurface(Renderer* renderer) for (i = 0; i < chunk_count - 1; i++) { - _renderQuad(renderer, cx - radius_ext + chunk_size * i, cz - radius_ext, chunk_size); - _renderQuad(renderer, cx + radius_int, cz - radius_ext + chunk_size * i, chunk_size); - _renderQuad(renderer, cx + radius_int - chunk_size * i, cz + radius_int, chunk_size); - _renderQuad(renderer, cx - radius_ext, cz + radius_int - chunk_size * i, chunk_size); + info = malloc(sizeof(ParallelRasterInfo)); + + info->renderer = renderer; + info->cx = cx; + info->cz = cz; + info->i = i; + info->radius_int = radius_int; + info->radius_ext = radius_ext; + info->chunk_size = chunk_size; + + if (!parallelQueueAddJob(queue, _parallelJobCallback, info)) + { + free(info); + } } if (radius_int > 20.0 && chunk_count % 64 == 0 && (double)chunk_factor < radius_int / 20.0) @@ -80,4 +125,7 @@ void waterRenderSurface(Renderer* renderer) radius_int = radius_ext; radius_ext += chunk_size; } + + parallelQueueWait(queue); + parallelQueueDelete(queue); }