From 7f1e20544f4f103d13469524dc6642a409a5d895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Wed, 13 Jun 2012 15:38:11 +0000 Subject: [PATCH] paysages : Started work for FSAA. git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@346 b1fd45b6-86a6-48da-8261-f70d1f35bdcc --- cli/main.c | 24 +++++--- gui_qt/dialogrender.cpp | 18 +++--- gui_qt/dialogrender.h | 2 +- gui_qt/formrender.cpp | 19 +++--- gui_qt/formrender.h | 5 +- i18n/paysages_fr.ts | 29 ++++++---- lib_paysages/clouds.c | 4 +- lib_paysages/render.c | 112 +++++++++++++++++++----------------- lib_paysages/render.h | 4 +- lib_paysages/renderer.c | 19 +++--- lib_paysages/renderer.h | 2 +- lib_paysages/shared/types.h | 4 +- 12 files changed, 131 insertions(+), 111 deletions(-) diff --git a/cli/main.c b/cli/main.c index 82c6ddc..0fdbdb5 100644 --- a/cli/main.c +++ b/cli/main.c @@ -7,10 +7,10 @@ #include "../lib_paysages/render.h" #include "../lib_paysages/scenery.h" -void startRender(Renderer* renderer, char* outputpath, int width, int height, int quality) +void startRender(Renderer* renderer, char* outputpath, RenderParams params) { printf("\rRendering %s ... \n", outputpath); - rendererStart(renderer, width, height, quality); + rendererStart(renderer, params); printf("\rSaving %s ... \n", outputpath); remove(outputpath); renderSaveToFile(renderer->render_area, outputpath); @@ -26,6 +26,7 @@ void displayHelp() printf(" -rw x Render width (int)\n"); printf(" -rh x Render height (int)\n"); printf(" -rq x Render quality (int, 1 to 10)\n"); + printf(" -ra x Render anti-aliasing (int, 1 to 4)\n"); printf(" -di x Day start time (float, 0.0 to 1.0)\n"); printf(" -ds x Day step time (float)\n"); } @@ -40,9 +41,7 @@ int main(int argc, char** argv) { Renderer renderer; char* conf_file_path = NULL; - int conf_render_width = 800; - int conf_render_height = 600; - int conf_render_quality = 5; + RenderParams conf_render_params = {800, 600, 1, 5}; int conf_nb_pictures = 1; double conf_daytime_start = 0.4; double conf_daytime_step = 0.0; @@ -77,21 +76,28 @@ int main(int argc, char** argv) { if (argc--) { - conf_render_width = atoi(*(++argv)); + conf_render_params.width = atoi(*(++argv)); } } else if (strcmp(*argv, "-rh") == 0 || strcmp(*argv, "--height") == 0) { if (argc--) { - conf_render_height = atoi(*(++argv)); + conf_render_params.height = atoi(*(++argv)); } } else if (strcmp(*argv, "-rq") == 0 || strcmp(*argv, "--quality") == 0) { if (argc--) { - conf_render_quality = atoi(*(++argv)); + conf_render_params.quality = atoi(*(++argv)); + } + } + else if (strcmp(*argv, "-ra") == 0 || strcmp(*argv, "--antialias") == 0) + { + if (argc--) + { + conf_render_params.antialias = atoi(*(++argv)); } } else if (strcmp(*argv, "-di") == 0 || strcmp(*argv, "--daystart") == 0) @@ -128,7 +134,7 @@ int main(int argc, char** argv) autoSetDaytimeFraction(conf_daytime_start); sprintf(outputpath, "output/pic%05d.png", outputcount); - startRender(&renderer, outputpath, conf_render_width, conf_render_height, conf_render_quality); + startRender(&renderer, outputpath, conf_render_params); conf_daytime_start += conf_daytime_step; } diff --git a/gui_qt/dialogrender.cpp b/gui_qt/dialogrender.cpp index f5b26e1..6686de5 100644 --- a/gui_qt/dialogrender.cpp +++ b/gui_qt/dialogrender.cpp @@ -32,22 +32,18 @@ static void _renderUpdate(double progress) class RenderThread:public QThread { public: - RenderThread(Renderer* renderer, int width, int height, int quality):QThread() + RenderThread(Renderer* renderer, RenderParams params):QThread() { _renderer = renderer; - _width = width; - _height = height; - _quality = quality; + _params = params; } void run() { - rendererStart(_renderer, _width, _height, _quality); + rendererStart(_renderer, _params); } private: Renderer* _renderer; - int _width; - int _height; - int _quality; + RenderParams _params; }; class RenderArea:public QWidget @@ -109,12 +105,12 @@ DialogRender::~DialogRender() delete pixbuf; } -void DialogRender::startRender(int quality, int width, int height) +void DialogRender::startRender(RenderParams params) { - applyRenderSize(width, height); + applyRenderSize(params.width, params.height); rendererSetPreviewCallbacks(_renderer, _renderStart, _renderDraw, _renderUpdate); - render_thread = new RenderThread(_renderer, width, height, quality); + render_thread = new RenderThread(_renderer, params); render_thread->start(); exec(); diff --git a/gui_qt/dialogrender.h b/gui_qt/dialogrender.h index 77e49fd..2f2cf2b 100644 --- a/gui_qt/dialogrender.h +++ b/gui_qt/dialogrender.h @@ -14,7 +14,7 @@ public: explicit DialogRender(QWidget *parent, Renderer* renderer); ~DialogRender(); - void startRender(int quality, int width, int height); + void startRender(RenderParams params); void loadLastRender(); QImage* pixbuf; diff --git a/gui_qt/formrender.cpp b/gui_qt/formrender.cpp index 31840d9..29c385c 100644 --- a/gui_qt/formrender.cpp +++ b/gui_qt/formrender.cpp @@ -96,9 +96,10 @@ FormRender::FormRender(QWidget *parent) : { QPushButton* button; - _quality = 5; - _width = 800; - _height = 600; + _params.quality = 5; + _params.width = 800; + _params.height = 600; + _params.antialias = 1; _camera = cameraCreateDefinition(); _renderer_inited = false; @@ -107,9 +108,10 @@ FormRender::FormRender(QWidget *parent) : addPreview(_preview_landscape, QString(tr("Top-down preview"))); addInput(new InputCamera(this, tr("Camera"), &_camera)); - addInputInt(tr("Quality"), &_quality, 1, 10, 1, 1); - addInputInt(tr("Image width"), &_width, 100, 2000, 10, 100); - addInputInt(tr("Image height"), &_height, 100, 2000, 10, 100); + addInputInt(tr("Quality"), &_params.quality, 1, 10, 1, 1); + addInputInt(tr("Image width"), &_params.width, 100, 2000, 10, 100); + addInputInt(tr("Image height"), &_params.height, 100, 2000, 10, 100); + addInputInt(tr("Anti aliasing"), &_params.antialias, 1, 4, 1, 1); button = addButton(tr("Start new render")); connect(button, SIGNAL(clicked()), this, SLOT(startRender())); @@ -157,7 +159,8 @@ void FormRender::startQuickRender() _renderer_inited = true; DialogRender* dialog = new DialogRender(this, &_renderer); - dialog->startRender(3, 400, 300); + RenderParams params = {400, 300, 1, 3}; + dialog->startRender(params); delete dialog; } @@ -172,7 +175,7 @@ void FormRender::startRender() _renderer_inited = true; DialogRender* dialog = new DialogRender(this, &_renderer); - dialog->startRender(_quality, _width, _height); + dialog->startRender(_params); delete dialog; } diff --git a/gui_qt/formrender.h b/gui_qt/formrender.h index b801b47..eed7bd3 100644 --- a/gui_qt/formrender.h +++ b/gui_qt/formrender.h @@ -4,6 +4,7 @@ #include "baseform.h" #include "../lib_paysages/camera.h" #include "../lib_paysages/renderer.h" +#include "../lib_paysages/render.h" class FormRender : public BaseForm { @@ -27,9 +28,7 @@ private slots: void saveRender(); private: - int _quality; - int _width; - int _height; + RenderParams _params; CameraDefinition _camera; Renderer _renderer; bool _renderer_inited; diff --git a/i18n/paysages_fr.ts b/i18n/paysages_fr.ts index 362cce1..94229d5 100644 --- a/i18n/paysages_fr.ts +++ b/i18n/paysages_fr.ts @@ -250,7 +250,7 @@ Maintenir Ctrl : Plus lent DialogRender - + Paysages 3D - Render Paysages 3D - Rendu @@ -511,57 +511,62 @@ Maintenir Ctrl : Plus rapide FormRender - + Top-down preview Aperçu plongeant - + Camera Caméra - + Quality Qualité de rendu - + Image width Largeur de l'image - + Image height Hauteur de l'image + Anti aliasing + + + + Start new render Démarrer un rendu - + Show last render Voir le dernier rendu - + Save last render Sauvegarder le dernier rendu - + Paysages 3D - Choose a filename to save the last render Paysages 3D - Choisissez un nom de fichier pour le rendu - + Images (*.png *.jpg) Images (*.png *.jpg) - + Can't write to file : %1 @@ -574,7 +579,7 @@ Maintenir Ctrl : Plus rapide Choisissez un nom de fichier pour le rendu - + The picture %1 has been saved. L'image %1 a été sauvegardée. diff --git a/lib_paysages/clouds.c b/lib_paysages/clouds.c index fe97ab7..213a0ee 100644 --- a/lib_paysages/clouds.c +++ b/lib_paysages/clouds.c @@ -168,10 +168,10 @@ CloudsLayerDefinition cloudsLayerCreateDefinition() result.edge_length = 0.25; result.base_coverage = 0.35; result.shape_noise = noiseCreateGenerator(); - noiseGenerateBaseNoise(result.shape_noise, 20000); + noiseGenerateBaseNoise(result.shape_noise, 200000); noiseAddLevelsSimple(result.shape_noise, 4, 1.0, 1.0); result.edge_noise = noiseCreateGenerator(); - noiseGenerateBaseNoise(result.edge_noise, 20000); + noiseGenerateBaseNoise(result.edge_noise, 800000); noiseAddLevelsSimple(result.edge_noise, 8, 1.0, 1.0); result._custom_coverage = _standardCoverageFunc; diff --git a/lib_paysages/render.c b/lib_paysages/render.c index ac05d8f..f4cc3e2 100644 --- a/lib_paysages/render.c +++ b/lib_paysages/render.c @@ -13,8 +13,7 @@ struct RenderArea { - int width; - int height; + RenderParams params; int pixel_count; Array* pixels; RenderFragment* scanline_up; @@ -53,8 +52,10 @@ RenderArea* renderCreateArea() RenderArea* result; result = malloc(sizeof(RenderArea)); - result->width = 1; - result->height = 1; + result->params.width = 1; + result->params.height = 1; + result->params.antialias = 1; + result->params.quality = 5; result->pixel_count = 1; result->pixels = malloc(sizeof(Array)); arrayCreate(result->pixels, sizeof(RenderFragment)); @@ -81,11 +82,11 @@ void renderDeleteArea(RenderArea* area) int x; int y; - for (x = 0; x < area->width; x++) + for (x = 0; x < area->params.width * area->params.antialias; x++) { - for (y = 0; y < area->height; y++) + for (y = 0; y < area->params.height * area->params.antialias; y++) { - arrayDelete(area->pixels + (y * area->width + x)); + arrayDelete(area->pixels + (y * area->params.width * area->params.antialias + x)); } } @@ -96,21 +97,23 @@ void renderDeleteArea(RenderArea* area) free(area); } -void renderSetSize(RenderArea* area, int width, int height) +void renderSetParams(RenderArea* area, RenderParams params) { - int x; - int y; + int x, y; + int width, height; + + width = params.width * params.antialias; + height = params.height * params.antialias; - for (x = 0; x < area->width; x++) + for (x = 0; x < area->params.width * area->params.antialias; x++) { - for (y = 0; y < area->height; y++) + for (y = 0; y < area->params.height * area->params.antialias; y++) { - arrayDelete(area->pixels + (y * area->width + x)); + arrayDelete(area->pixels + (y * area->params.width * area->params.antialias + x)); } } - area->width = width; - area->height = height; + area->params = params; area->pixels = realloc(area->pixels, sizeof(Array) * width * height); area->pixel_count = width * height; @@ -144,22 +147,22 @@ void renderClear(RenderArea* area) int x; int y; - for (x = 0; x < area->width; x++) + for (x = 0; x < area->params.width * area->params.antialias; x++) { - for (y = 0; y < area->height; y++) + for (y = 0; y < area->params.height * area->params.antialias; y++) { - arrayClear(area->pixels + (y * area->width + x)); + arrayClear(area->pixels + (y * area->params.width * area->params.antialias + x)); } } area->scanline_left = 0; - area->scanline_right = area->width - 1; + area->scanline_right = area->params.width * area->params.antialias - 1; - area->callback_start(area->width, area->height, area->background_color); + area->callback_start(area->params.width, area->params.height, area->background_color); - area->dirty_left = area->width; + area->dirty_left = area->params.width * area->params.antialias; area->dirty_right = -1; - area->dirty_down = area->height; + area->dirty_down = area->params.height * area->params.antialias; area->dirty_up = -1; area->dirty_count = 0; } @@ -233,7 +236,7 @@ static void _processDirtyPixels(RenderArea* area) { for (x = area->dirty_left; x <= area->dirty_right; x++) { - pixel_data = area->pixels + y * area->width + x; + pixel_data = area->pixels + y * area->params.width * area->params.antialias + x; if (pixel_data->dirty) { col = _getPixelColor(area->background_color, pixel_data); @@ -245,9 +248,9 @@ static void _processDirtyPixels(RenderArea* area) area->callback_update(0.0); - area->dirty_left = area->width; + area->dirty_left = area->params.width * area->params.antialias; area->dirty_right = -1; - area->dirty_down = area->height; + area->dirty_down = area->params.height * area->params.antialias; area->dirty_up = -1; area->dirty_count = 0; } @@ -264,15 +267,15 @@ static void _setAllDirty(RenderArea* area) int x, y; area->dirty_left = 0; - area->dirty_right = area->width - 1; + area->dirty_right = area->params.width - 1; area->dirty_down = 0; - area->dirty_up = area->height - 1; + area->dirty_up = area->params.height - 1; for (y = area->dirty_down; y <= area->dirty_up; y++) { for (x = area->dirty_left; x <= area->dirty_right; x++) { - (area->pixels + y * area->width + x)->dirty = 1; + (area->pixels + y * area->params.width * area->params.antialias + x)->dirty = 1; } } } @@ -289,9 +292,9 @@ void renderAddFragment(RenderArea* area, RenderFragment* fragment) RenderFragment* fragments; dirty = 0; - if (x >= 0 && x < area->width && y >= 0 && y < area->height && z > 1.0) + if (x >= 0 && x < area->params.width * area->params.antialias && y >= 0 && y < area->params.height * area->params.antialias && z > 1.0) { - pixel_data = area->pixels + (y * area->width + x); + pixel_data = area->pixels + (y * area->params.width * area->params.antialias + x); fragments = (RenderFragment*)pixel_data->data; fragments_count = pixel_data->length; @@ -389,7 +392,7 @@ static void __vertexInterpolate(Vertex* v1, Vertex* diff, double value, Vertex* static void __pushScanLinePoint(RenderArea* area, RenderFragment point) { - if (point.x < 0 || point.x >= area->width) + if (point.x < 0 || point.x >= area->params.width * area->params.antialias) { return; } @@ -436,7 +439,7 @@ static void __pushScanLineEdge(RenderArea* area, Vector3 v1, Vector3 v2, Vertex* { __pushScanLineEdge(area, v2, v1, vertex2, vertex1); } - else if (endx < 0 || startx >= area->width) + else if (endx < 0 || startx >= area->params.width * area->params.antialias) { return; } @@ -462,9 +465,9 @@ static void __pushScanLineEdge(RenderArea* area, Vector3 v1, Vector3 v2, Vertex* { startx = 0; } - if (endx >= area->width) + if (endx >= area->params.width * area->params.antialias) { - endx = area->width - 1; + endx = area->params.width * area->params.antialias - 1; } dx = v2.x - v1.x; @@ -499,9 +502,9 @@ static void __clearScanLines(RenderArea* area) for (x = area->scanline_left; x <= area->scanline_right; x++) { area->scanline_up[x].y = -1; - area->scanline_down[x].y = area->height; + area->scanline_down[x].y = area->params.height * area->params.antialias; } - area->scanline_left = area->width; + area->scanline_left = area->params.width * area->params.antialias; area->scanline_right = -1; } @@ -522,7 +525,7 @@ static void __renderScanLines(RenderArea* area) starty = down.y; endy = up.y; - if (endy < 0 || starty >= area->height) + if (endy < 0 || starty >= area->params.height * area->params.antialias) { continue; } @@ -531,9 +534,9 @@ static void __renderScanLines(RenderArea* area) { starty = 0; } - if (endy >= area->height) + if (endy >= area->params.height * area->params.antialias) { - endy = area->height - 1; + endy = area->params.height * area->params.antialias - 1; } dy = (double)(up.y - down.y); @@ -564,8 +567,8 @@ static void __renderScanLines(RenderArea* area) void renderPushTriangle(RenderArea* area, Vertex* v1, Vertex* v2, Vertex* v3, Vector3 p1, Vector3 p2, Vector3 p3) { - double limit_width = (double)(area->width - 1); - double limit_height = (double)(area->height - 1); + double limit_width = (double)(area->params.width * area->params.antialias - 1); + double limit_height = (double)(area->params.height * area->params.antialias - 1); /* Filter if outside screen */ if (p1.z < 1.0 || p2.z < 1.0 || p3.z < 1.0 || (p1.x < 0.0 && p2.x < 0.0 && p3.x < 0.0) || (p1.y < 0.0 && p2.y < 0.0 && p3.y < 0.0) || (p1.x > limit_width && p2.x > limit_width && p3.x > limit_width) || (p1.y > limit_height && p2.y > limit_height && p3.y > limit_height)) @@ -603,14 +606,14 @@ void* _renderPostProcessChunk(void* data) RenderChunk* chunk = (RenderChunk*)data; #ifdef RENDER_INVERSE - for (y = chunk->area->height - 1 - chunk->starty; y >= chunk->area->height - 1 - chunk->endy; y--) + for (y = chunk->area->params.height * chunk->area->params.antialias - 1 - chunk->starty; y >= chunk->area->params.height * chunk->area->params.antialias - 1 - chunk->endy; y--) #else for (y = chunk->starty; y <= chunk->endy; y++) #endif { for (x = chunk->startx; x <= chunk->endx; x++) { - pixel_data = chunk->area->pixels + (y * chunk->area->width + x); + pixel_data = chunk->area->pixels + (y * chunk->area->params.width * chunk->area->params.antialias + x); fragments = (RenderFragment*)pixel_data->data; dirty = 0; for (i = 0; i < pixel_data->length; i++) @@ -661,8 +664,8 @@ void renderPostProcess(RenderArea* area, Renderer* renderer, int nbchunks) nx = 10; ny = 10; - dx = area->width / nx; - dy = area->height / ny; + dx = area->params.width * area->params.antialias / nx; + dy = area->params.height * area->params.antialias / ny; x = 0; y = 0; /*_progress_pixels = 0;*/ @@ -703,7 +706,7 @@ void renderPostProcess(RenderArea* area, Renderer* renderer, int nbchunks) chunks[i].startx = x * dx; if (x == nx - 1) { - chunks[i].endx = area->width - 1; + chunks[i].endx = area->params.width * area->params.antialias - 1; } else { @@ -712,7 +715,7 @@ void renderPostProcess(RenderArea* area, Renderer* renderer, int nbchunks) chunks[i].starty = y * dy; if (y == ny - 1) { - chunks[i].endy = area->height - 1; + chunks[i].endy = area->params.height * area->params.antialias - 1; } else { @@ -753,23 +756,24 @@ int renderSaveToFile(RenderArea* area, const char* path) Color result; ILuint x, y; ILuint rgba; - ILuint data[area->height * area->width]; + ILuint data[area->params.height * area->params.width]; ILenum error; Array* pixel_data; int error_count; - for (y = 0; y < area->height; y++) + for (y = 0; y < area->params.height; y++) { - for (x = 0; x < area->width; x++) + for (x = 0; x < area->params.width; x++) { - pixel_data = area->pixels + (y * area->width + x); + /* TODO Anti-alias */ + pixel_data = area->pixels + (y * area->params.width + x); result = _getPixelColor(area->background_color, pixel_data); rgba = colorTo32BitRGBA(&result); - data[y * area->width + x] = rgba; + data[y * area->params.width + x] = rgba; } } - ilTexImage((ILuint)area->width, (ILuint)area->height, 1, 4, IL_RGBA, IL_UNSIGNED_BYTE, data); + ilTexImage((ILuint)area->params.width, (ILuint)area->params.height, 1, 4, IL_RGBA, IL_UNSIGNED_BYTE, data); remove(path); ilSaveImage(path); @@ -790,7 +794,7 @@ void renderSetPreviewCallbacks(RenderArea* area, RenderCallbackStart start, Rend area->callback_draw = draw ? draw : _callbackDraw; area->callback_update = update ? update : _callbackUpdate; - area->callback_start(area->width, area->height, area->background_color); + area->callback_start(area->params.width, area->params.height, area->background_color); _setAllDirty(area); _processDirtyPixels(area); diff --git a/lib_paysages/render.h b/lib_paysages/render.h index ea27706..1ee4f3b 100644 --- a/lib_paysages/render.h +++ b/lib_paysages/render.h @@ -8,14 +8,14 @@ #ifdef __cplusplus extern "C" { #endif - + void renderInit(); void renderQuit(); RenderArea* renderCreateArea(); void renderDeleteArea(RenderArea* area); -void renderSetSize(RenderArea* area, int width, int height); +void renderSetParams(RenderArea* area, RenderParams params); void renderSetBackgroundColor(RenderArea* area, Color* col); void renderClear(RenderArea* area); void renderUpdate(RenderArea* area); diff --git a/lib_paysages/renderer.c b/lib_paysages/renderer.c index 1a776df..3a0275f 100644 --- a/lib_paysages/renderer.c +++ b/lib_paysages/renderer.c @@ -101,6 +101,7 @@ static Color _applyClouds(Renderer* renderer, Color base, Vector3 start, Vector3 Renderer rendererCreate() { Renderer result; + RenderParams params = {1, 1, 1, 5}; result.render_quality = 5; result.render_width = 1; @@ -111,7 +112,8 @@ Renderer rendererCreate() result.render_camera = cameraCreateDefinition(); result.camera_location = result.render_camera.location; result.render_area = renderCreateArea(); - renderSetSize(result.render_area, 1, 1); + + renderSetParams(result.render_area, params); result.addRenderProgress = _addRenderProgress; result.getPrecision = _getPrecision; @@ -144,23 +146,26 @@ void rendererSetPreviewCallbacks(Renderer* renderer, RenderCallbackStart start, renderSetPreviewCallbacks(renderer->render_area, start, draw, update); } -void rendererStart(Renderer* renderer, int width, int height, int quality) +void rendererStart(Renderer* renderer, RenderParams params) { Thread* thread; int loops; int core_count = systemGetCoreCount(); - renderer->render_quality = quality; - renderer->render_width = width; - renderer->render_height = height; + params.antialias = (params.antialias < 1) ? 1 : params.antialias; + params.antialias = (params.antialias > 4) ? 4 : params.antialias; + + renderer->render_quality = params.quality; + renderer->render_width = params.width * params.antialias; + renderer->render_height = params.height * params.antialias; renderer->render_interrupt = 0; renderer->render_progress = 0.0; - cameraSetRenderSize(&renderer->render_camera, width, height); + cameraSetRenderSize(&renderer->render_camera, renderer->render_width, renderer->render_height); renderer->camera_location = renderer->render_camera.location; renderSetBackgroundColor(renderer->render_area, &COLOR_BLACK); - renderSetSize(renderer->render_area, width, height); + renderSetParams(renderer->render_area, params); renderClear(renderer->render_area); renderer->is_rendering = 1; diff --git a/lib_paysages/renderer.h b/lib_paysages/renderer.h index 5e91b97..7b871c3 100644 --- a/lib_paysages/renderer.h +++ b/lib_paysages/renderer.h @@ -50,7 +50,7 @@ struct Renderer Renderer rendererCreate(); void rendererDelete(Renderer* renderer); void rendererSetPreviewCallbacks(Renderer* renderer, RenderCallbackStart start, RenderCallbackDraw draw, RenderCallbackUpdate update); -void rendererStart(Renderer* renderer, int width, int height, int quality); +void rendererStart(Renderer* renderer, RenderParams params); void rendererInterrupt(Renderer* renderer); #ifdef __cplusplus diff --git a/lib_paysages/shared/types.h b/lib_paysages/shared/types.h index bcaae20..c8857a8 100644 --- a/lib_paysages/shared/types.h +++ b/lib_paysages/shared/types.h @@ -37,7 +37,9 @@ typedef struct { int width; int height; -} RenderContext; + int antialias; + int quality; +} RenderParams; typedef struct {