paysages : Restored render interrupt + added LOD dynamic adaptation to framerate for wanderer.
git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@253 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
parent
878614e13c
commit
4f55c9e2a6
5 changed files with 34 additions and 8 deletions
3
TODO
3
TODO
|
@ -1,7 +1,8 @@
|
||||||
- Restore render interrupt and progress
|
- Restore render progress
|
||||||
- Clouds are lighted without filtering from ground (clouds lighted at night !)
|
- Clouds are lighted without filtering from ground (clouds lighted at night !)
|
||||||
- Camera should respect ratio aspect of render area.
|
- Camera should respect ratio aspect of render area.
|
||||||
- All noises should use the same entropy pool (saved separately), and avoid reallocs.
|
- All noises should use the same entropy pool (saved separately), and avoid reallocs.
|
||||||
- Implement light multi-sampling (mainly for skydome).
|
- Implement light multi-sampling (mainly for skydome).
|
||||||
- Implement scaling and scrolling on previews.
|
- Implement scaling and scrolling on previews.
|
||||||
- Water and terrain LOD moves with the camera, fix it like in the wanderer.
|
- Water and terrain LOD moves with the camera, fix it like in the wanderer.
|
||||||
|
- Find the random segfault at start (in PreviewTerrainColor::getColor).
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <QGLWidget>
|
#include <QGLWidget>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
|
#include <QTime>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "../lib_paysages/scenery.h"
|
#include "../lib_paysages/scenery.h"
|
||||||
|
|
||||||
|
@ -19,7 +20,9 @@ WidgetWanderer::WidgetWanderer(QWidget *parent, CameraDefinition* camera):
|
||||||
|
|
||||||
this->water = waterCreateDefinition();
|
this->water = waterCreateDefinition();
|
||||||
sceneryGetWater(&water);
|
sceneryGetWater(&water);
|
||||||
|
|
||||||
|
average_frame_time = 0.05;
|
||||||
|
quality = 3;
|
||||||
last_mouse_x = 0;
|
last_mouse_x = 0;
|
||||||
last_mouse_y = 0;
|
last_mouse_y = 0;
|
||||||
}
|
}
|
||||||
|
@ -266,8 +269,13 @@ static void _renderTerrain(TerrainDefinition* terrain, CameraDefinition* camera,
|
||||||
|
|
||||||
void WidgetWanderer::paintGL()
|
void WidgetWanderer::paintGL()
|
||||||
{
|
{
|
||||||
|
QTime start_time;
|
||||||
|
double frame_time;
|
||||||
|
|
||||||
cameraValidateDefinition(&_current_camera, 1);
|
cameraValidateDefinition(&_current_camera, 1);
|
||||||
|
|
||||||
|
start_time = QTime::currentTime();
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluLookAt(_current_camera.location.x, _current_camera.location.y, _current_camera.location.z, _current_camera.target.x, _current_camera.target.y, _current_camera.target.z, _current_camera.up.x, _current_camera.up.y, _current_camera.up.z);
|
gluLookAt(_current_camera.location.x, _current_camera.location.y, _current_camera.location.z, _current_camera.target.x, _current_camera.target.y, _current_camera.target.z, _current_camera.up.x, _current_camera.up.y, _current_camera.up.z);
|
||||||
|
@ -283,5 +291,19 @@ void WidgetWanderer::paintGL()
|
||||||
glVertex3f(500.0, water.height, -500.0);
|
glVertex3f(500.0, water.height, -500.0);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
_renderTerrain(&terrain, &_current_camera, 3);
|
_renderTerrain(&terrain, &_current_camera, quality);
|
||||||
|
|
||||||
|
frame_time = 0.001 * (double)start_time.msecsTo(QTime::currentTime());
|
||||||
|
|
||||||
|
average_frame_time = average_frame_time * 0.8 + frame_time * 0.2;
|
||||||
|
//printf("%d %f\n", quality, average_frame_time);
|
||||||
|
|
||||||
|
if (average_frame_time > 0.1 && quality > 1)
|
||||||
|
{
|
||||||
|
quality--;
|
||||||
|
}
|
||||||
|
if (average_frame_time < 0.04 && quality < 10)
|
||||||
|
{
|
||||||
|
quality++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,9 @@ private:
|
||||||
|
|
||||||
TerrainDefinition terrain;
|
TerrainDefinition terrain;
|
||||||
WaterDefinition water;
|
WaterDefinition water;
|
||||||
|
|
||||||
|
double average_frame_time;
|
||||||
|
int quality;
|
||||||
|
|
||||||
int last_mouse_x;
|
int last_mouse_x;
|
||||||
int last_mouse_y;
|
int last_mouse_y;
|
||||||
|
|
|
@ -634,7 +634,6 @@ void renderPostProcess(RenderArea* area, Renderer* renderer, int nbchunks)
|
||||||
int i;
|
int i;
|
||||||
int x, y, dx, dy, nx, ny;
|
int x, y, dx, dy, nx, ny;
|
||||||
int loops, running;
|
int loops, running;
|
||||||
int _interrupt = 0; /* TEMP */
|
|
||||||
|
|
||||||
if (nbchunks > MAX_CHUNKS)
|
if (nbchunks > MAX_CHUNKS)
|
||||||
{
|
{
|
||||||
|
@ -662,7 +661,7 @@ void renderPostProcess(RenderArea* area, Renderer* renderer, int nbchunks)
|
||||||
|
|
||||||
running = 0;
|
running = 0;
|
||||||
loops = 0;
|
loops = 0;
|
||||||
while ((y < ny && !_interrupt) || running > 0)
|
while ((y < ny && !renderer->render_interrupt) || running > 0)
|
||||||
{
|
{
|
||||||
timeSleepMs(100);
|
timeSleepMs(100);
|
||||||
|
|
||||||
|
@ -676,13 +675,13 @@ void renderPostProcess(RenderArea* area, Renderer* renderer, int nbchunks)
|
||||||
chunks[i].thread = NULL;
|
chunks[i].thread = NULL;
|
||||||
running--;
|
running--;
|
||||||
}
|
}
|
||||||
else if (_interrupt)
|
else if (renderer->render_interrupt)
|
||||||
{
|
{
|
||||||
chunks[i].interrupt = 1;
|
chunks[i].interrupt = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (y < ny && !chunks[i].thread && !_interrupt)
|
if (y < ny && !chunks[i].thread && !renderer->render_interrupt)
|
||||||
{
|
{
|
||||||
chunks[i].finished = 0;
|
chunks[i].finished = 0;
|
||||||
chunks[i].interrupt = 0;
|
chunks[i].interrupt = 0;
|
||||||
|
|
|
@ -19,7 +19,7 @@ static void* _renderFirstPass(void* data)
|
||||||
|
|
||||||
static int _addRenderProgress(Renderer* renderer, double progress)
|
static int _addRenderProgress(Renderer* renderer, double progress)
|
||||||
{
|
{
|
||||||
return 1;
|
return !renderer->render_interrupt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double _getPrecision(Renderer* renderer, Vector3 location)
|
static double _getPrecision(Renderer* renderer, Vector3 location)
|
||||||
|
@ -183,4 +183,5 @@ void rendererStart(Renderer* renderer, int width, int height, int quality)
|
||||||
|
|
||||||
void rendererInterrupt(Renderer* renderer)
|
void rendererInterrupt(Renderer* renderer)
|
||||||
{
|
{
|
||||||
|
renderer->render_interrupt = 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue