paysages : Started work for FSAA.

git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@346 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
Michaël Lemaire 2012-06-13 15:38:11 +00:00 committed by ThunderK
parent cb929bcd87
commit 7f1e20544f
12 changed files with 131 additions and 111 deletions

View file

@ -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;
}

View file

@ -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();

View file

@ -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;

View file

@ -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;
}

View file

@ -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;

View file

@ -250,7 +250,7 @@ Maintenir Ctrl : Plus lent</translation>
<context>
<name>DialogRender</name>
<message>
<location filename="../gui_qt/dialogrender.cpp" line="80"/>
<location filename="../gui_qt/dialogrender.cpp" line="76"/>
<source>Paysages 3D - Render</source>
<translation>Paysages 3D - Rendu</translation>
</message>
@ -511,57 +511,62 @@ Maintenir Ctrl : Plus rapide</translation>
<context>
<name>FormRender</name>
<message>
<location filename="../gui_qt/formrender.cpp" line="107"/>
<location filename="../gui_qt/formrender.cpp" line="108"/>
<source>Top-down preview</source>
<translation>Aperçu plongeant</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="109"/>
<location filename="../gui_qt/formrender.cpp" line="110"/>
<source>Camera</source>
<translation>Caméra</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="110"/>
<location filename="../gui_qt/formrender.cpp" line="111"/>
<source>Quality</source>
<translation>Qualité de rendu</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="111"/>
<location filename="../gui_qt/formrender.cpp" line="112"/>
<source>Image width</source>
<translation>Largeur de l&apos;image</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="112"/>
<location filename="../gui_qt/formrender.cpp" line="113"/>
<source>Image height</source>
<translation>Hauteur de l&apos;image</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="114"/>
<source>Anti aliasing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="116"/>
<source>Start new render</source>
<translation>Démarrer un rendu</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="116"/>
<location filename="../gui_qt/formrender.cpp" line="118"/>
<source>Show last render</source>
<translation>Voir le dernier rendu</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="118"/>
<location filename="../gui_qt/formrender.cpp" line="120"/>
<source>Save last render</source>
<translation>Sauvegarder le dernier rendu</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="197"/>
<location filename="../gui_qt/formrender.cpp" line="200"/>
<source>Paysages 3D - Choose a filename to save the last render</source>
<translation>Paysages 3D - Choisissez un nom de fichier pour le rendu</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="197"/>
<location filename="../gui_qt/formrender.cpp" line="200"/>
<source>Images (*.png *.jpg)</source>
<translation>Images (*.png *.jpg)</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="210"/>
<location filename="../gui_qt/formrender.cpp" line="213"/>
<source>Can&apos;t write to file : %1</source>
<translation type="unfinished"></translation>
</message>
@ -574,7 +579,7 @@ Maintenir Ctrl : Plus rapide</translation>
<translation type="obsolete">Choisissez un nom de fichier pour le rendu</translation>
</message>
<message>
<location filename="../gui_qt/formrender.cpp" line="206"/>
<location filename="../gui_qt/formrender.cpp" line="209"/>
<source>The picture %1 has been saved.</source>
<translation>L&apos;image %1 a é sauvegardée.</translation>
</message>

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -37,7 +37,9 @@ typedef struct
{
int width;
int height;
} RenderContext;
int antialias;
int quality;
} RenderParams;
typedef struct
{