diff --git a/Makefile b/Makefile index 817cd95..44b7fde 100644 --- a/Makefile +++ b/Makefile @@ -23,4 +23,13 @@ run_cli: run_qt: LD_LIBRARY_PATH=${BUILDPATH} ${BUILDPATH}/paysages-qt +profile: + sudo opcontrol --setup --no-vmlinux --event=CPU_CLK_UNHALTED:3000000:0:1:1 --buffer-size=65536 --callgraph=5 --separate=none + sudo opcontrol --reset + sudo opcontrol --start + LD_LIBRARY_PATH=${BUILDPATH} ${BUILDPATH}/paysages-qt || true + sudo opcontrol --shutdown + opannotate --source --output-dir=annotated ${BUILDPATH}/libpaysages.so --base-dirs=. --search-dirs=lib_paysages + opreport -l ${BUILDPATH}/libpaysages.so -c -g | less + .PHONY:all clean release diff --git a/TODO b/TODO index d7093c8..3c0ec2c 100644 --- a/TODO +++ b/TODO @@ -1,14 +1,13 @@ -Technology Preview 1 : -- Find a licence and apply it. - Technology Preview 2 : +- Render tab previews should not rerender when changing render options. +- Compute shadows only once for all textures at a same location. +- Add antialiasing option (pay attention to memory usage). - Add an OSD ability on previews and use it for camera location and user landmarks. - Add a material editor dialog. - Add a zone editor dialog for localized textures. - Add a terrain modifier dialog with zones. - Add a noise filler (and maybe noise intervals ?). - Improve curve editor. -- Replace FILE* by a custom type for Save and Load. - Water and terrain LOD moves with the camera, fix it like in the wanderer. - Implement a file header/versioning. diff --git a/gui_qt/dialogwanderer.cpp b/gui_qt/dialogwanderer.cpp index 2e0b7e5..b707b31 100644 --- a/gui_qt/dialogwanderer.cpp +++ b/gui_qt/dialogwanderer.cpp @@ -22,7 +22,7 @@ DialogWanderer::DialogWanderer(QWidget* parent, CameraDefinition* camera, bool c panel->setLayout(new QVBoxLayout()); panel->setMaximumWidth(230); - panel->layout()->addWidget(new QLabel(tr("COMMANDS\n\nLeft click : Look around\nRight click : Pan (adjust framing)\nWheel : Move forward/backward\nHold SHIFT : Slower\nHold CTRL : Faster"), panel)); + panel->layout()->addWidget(new QLabel(tr("COMMANDS\n\nLeft click : Look around\nRight click : Pan (adjust framing)\nWheel : Move forward/backward\nHold SHIFT : Faster\nHold CTRL : Slower"), panel)); button = new QPushButton(tr("Reset camera"), panel); panel->layout()->addWidget(button); diff --git a/gui_qt/paysages-qt.pro b/gui_qt/paysages-qt.pro index 0c9da2c..ab6e567 100644 --- a/gui_qt/paysages-qt.pro +++ b/gui_qt/paysages-qt.pro @@ -8,9 +8,6 @@ MOC_DIR = ./moc/$$BUILDMODE/ DESTDIR = ../build/$$BUILDMODE/ CONFIG += $$BUILDMODE -QMAKE_CXXFLAGS_DEBUG += -pg -QMAKE_LFLAGS_DEBUG += -pg - unix:LIBS += -L$$DESTDIR -lpaysages win32:LIBS += ../libpaysages.a -lDevIL -lILU -lILUT -lglib-2.0 -lgthread-2.0 diff --git a/gui_qt/widgetwanderer.cpp b/gui_qt/widgetwanderer.cpp index 337ad54..144a223 100644 --- a/gui_qt/widgetwanderer.cpp +++ b/gui_qt/widgetwanderer.cpp @@ -42,11 +42,11 @@ void WidgetWanderer::keyPressEvent(QKeyEvent* event) { double factor; - if (event->modifiers() & Qt::ShiftModifier) + if (event->modifiers() & Qt::ControlModifier) { factor = 0.1; } - else if (event->modifiers() & Qt::ControlModifier) + else if (event->modifiers() & Qt::ShiftModifier) { factor = 10.0; } @@ -104,11 +104,11 @@ void WidgetWanderer::mouseMoveEvent(QMouseEvent* event) { double factor; - if (event->modifiers() & Qt::ShiftModifier) + if (event->modifiers() & Qt::ControlModifier) { factor = 0.01; } - else if (event->modifiers() & Qt::ControlModifier) + else if (event->modifiers() & Qt::ShiftModifier) { factor = 1.0; } @@ -145,11 +145,11 @@ void WidgetWanderer::wheelEvent(QWheelEvent* event) { double factor; - if (event->modifiers() & Qt::ShiftModifier) + if (event->modifiers() & Qt::ControlModifier) { factor = 0.01; } - else if (event->modifiers() & Qt::ControlModifier) + else if (event->modifiers() & Qt::ShiftModifier) { factor = 1.0; } diff --git a/i18n/paysages_fr.ts b/i18n/paysages_fr.ts index d07f8c1..cc33e1f 100644 --- a/i18n/paysages_fr.ts +++ b/i18n/paysages_fr.ts @@ -169,6 +169,7 @@ Cliquez avec le bouton droit sur un point pour le supprimer. Paysages 3D - Exploration + COMMANDS Left click : Look around @@ -176,16 +177,15 @@ Right click : Pan (adjust framing) Wheel : Move forward/backward Hold SHIFT : Faster Hold CTRL : Slower - COMMANDES + COMMANDES Clic gauche : Regarder autour Clic droit : Déplacer le cadrage Molette : Avancer/reculer -Maintenir MAJ : Plus rapide +Maintenir Maj : Plus rapide Maintenir Ctrl : Plus lent - COMMANDS Left click : Look around @@ -193,7 +193,7 @@ Right click : Pan (adjust framing) Wheel : Move forward/backward Hold SHIFT : Slower Hold CTRL : Faster - COMMANDES + COMMANDES Clic gauche : Regarder autour Clic droit : Déplacer le cadrage diff --git a/lib_paysages/atmosphere.c b/lib_paysages/atmosphere.c index 7bd18d8..22f9fe9 100644 --- a/lib_paysages/atmosphere.c +++ b/lib_paysages/atmosphere.c @@ -14,22 +14,22 @@ void atmosphereQuit() { } -void atmosphereSave(FILE* f, AtmosphereDefinition* definition) +void atmosphereSave(PackStream* stream, AtmosphereDefinition* definition) { - toolsSaveDouble(f, &definition->distance_near); - toolsSaveDouble(f, &definition->distance_far); - toolsSaveDouble(f, &definition->full_mask); - toolsSaveInt(f, &definition->auto_lock_on_haze); - colorSave(f, &definition->color); + packWriteDouble(stream, &definition->distance_near); + packWriteDouble(stream, &definition->distance_far); + packWriteDouble(stream, &definition->full_mask); + packWriteInt(stream, &definition->auto_lock_on_haze); + colorSave(stream, &definition->color); } -void atmosphereLoad(FILE* f, AtmosphereDefinition* definition) +void atmosphereLoad(PackStream* stream, AtmosphereDefinition* definition) { - toolsLoadDouble(f, &definition->distance_near); - toolsLoadDouble(f, &definition->distance_far); - toolsLoadDouble(f, &definition->full_mask); - toolsLoadInt(f, &definition->auto_lock_on_haze); - colorLoad(f, &definition->color); + packReadDouble(stream, &definition->distance_near); + packReadDouble(stream, &definition->distance_far); + packReadDouble(stream, &definition->full_mask); + packReadInt(stream, &definition->auto_lock_on_haze); + colorLoad(stream, &definition->color); atmosphereValidateDefinition(definition); } diff --git a/lib_paysages/atmosphere.h b/lib_paysages/atmosphere.h index a7541ef..ad1d2b7 100644 --- a/lib_paysages/atmosphere.h +++ b/lib_paysages/atmosphere.h @@ -2,6 +2,7 @@ #define _PAYSAGES_ATMOSPHERE_H_ #include "shared/types.h" +#include "pack.h" #include "lighting.h" #include @@ -20,8 +21,8 @@ typedef struct void atmosphereInit(); void atmosphereQuit(); -void atmosphereSave(FILE* f, AtmosphereDefinition* definition); -void atmosphereLoad(FILE* f, AtmosphereDefinition* definition); +void atmosphereSave(PackStream* stream, AtmosphereDefinition* definition); +void atmosphereLoad(PackStream* stream, AtmosphereDefinition* definition); AtmosphereDefinition atmosphereCreateDefinition(); void atmosphereDeleteDefinition(AtmosphereDefinition* definition); diff --git a/lib_paysages/camera.c b/lib_paysages/camera.c index 9df71aa..f33aa16 100644 --- a/lib_paysages/camera.c +++ b/lib_paysages/camera.c @@ -17,20 +17,20 @@ void cameraQuit() { } -void cameraSave(FILE* f, CameraDefinition* camera) +void cameraSave(PackStream* stream, CameraDefinition* camera) { - v3Save(f, &camera->location); - toolsSaveDouble(f, &camera->yaw); - toolsSaveDouble(f, &camera->pitch); - toolsSaveDouble(f, &camera->roll); + v3Save(stream, &camera->location); + packWriteDouble(stream, &camera->yaw); + packWriteDouble(stream, &camera->pitch); + packWriteDouble(stream, &camera->roll); } -void cameraLoad(FILE* f, CameraDefinition* camera) +void cameraLoad(PackStream* stream, CameraDefinition* camera) { - v3Load(f, &camera->location); - toolsLoadDouble(f, &camera->yaw); - toolsLoadDouble(f, &camera->pitch); - toolsLoadDouble(f, &camera->roll); + v3Load(stream, &camera->location); + packReadDouble(stream, &camera->yaw); + packReadDouble(stream, &camera->pitch); + packReadDouble(stream, &camera->roll); cameraValidateDefinition(camera, 0); } diff --git a/lib_paysages/camera.h b/lib_paysages/camera.h index fb25775..86ff0a0 100644 --- a/lib_paysages/camera.h +++ b/lib_paysages/camera.h @@ -1,9 +1,9 @@ #ifndef _PAYSAGES_CAMERA_H_ #define _PAYSAGES_CAMERA_H_ -#include #include "shared/types.h" #include "renderer.h" +#include "pack.h" #ifdef __cplusplus extern "C" { @@ -11,8 +11,8 @@ extern "C" { void cameraInit(); void cameraQuit(); -void cameraSave(FILE* f, CameraDefinition* camera); -void cameraLoad(FILE* f, CameraDefinition* camera); +void cameraSave(PackStream* stream, CameraDefinition* camera); +void cameraLoad(PackStream* stream, CameraDefinition* camera); CameraDefinition cameraCreateDefinition(); void cameraDeleteDefinition(CameraDefinition* definition); diff --git a/lib_paysages/clouds.c b/lib_paysages/clouds.c index e1d8ebf..c6b9b7f 100644 --- a/lib_paysages/clouds.c +++ b/lib_paysages/clouds.c @@ -32,30 +32,30 @@ void cloudsQuit() cloudsLayerDeleteDefinition(&NULL_LAYER); } -void cloudsSave(FILE* f, CloudsDefinition* definition) +void cloudsSave(PackStream* stream, CloudsDefinition* definition) { int i; CloudsLayerDefinition* layer; - toolsSaveInt(f, &definition->nblayers); + packWriteInt(stream, &definition->nblayers); for (i = 0; i < definition->nblayers; i++) { layer = definition->layers + i; - toolsSaveDouble(f, &layer->ycenter); - toolsSaveDouble(f, &layer->ymin); - toolsSaveDouble(f, &layer->ymax); - noiseSaveGenerator(f, layer->noise); - materialSave(f, &layer->material); - toolsSaveDouble(f, &layer->transparencydepth); - toolsSaveDouble(f, &layer->lighttraversal); - toolsSaveDouble(f, &layer->minimumlight); - toolsSaveDouble(f, &layer->scaling); - toolsSaveDouble(f, &layer->coverage); + packWriteDouble(stream, &layer->ycenter); + packWriteDouble(stream, &layer->ymin); + packWriteDouble(stream, &layer->ymax); + noiseSaveGenerator(stream, layer->noise); + materialSave(stream, &layer->material); + packWriteDouble(stream, &layer->transparencydepth); + packWriteDouble(stream, &layer->lighttraversal); + packWriteDouble(stream, &layer->minimumlight); + packWriteDouble(stream, &layer->scaling); + packWriteDouble(stream, &layer->coverage); } } -void cloudsLoad(FILE* f, CloudsDefinition* definition) +void cloudsLoad(PackStream* stream, CloudsDefinition* definition) { int i, n; CloudsLayerDefinition* layer; @@ -65,21 +65,21 @@ void cloudsLoad(FILE* f, CloudsDefinition* definition) cloudsDeleteLayer(definition, 0); } - toolsLoadInt(f, &n); + packReadInt(stream, &n); for (i = 0; i < n; i++) { layer = definition->layers + cloudsAddLayer(definition); - toolsLoadDouble(f, &layer->ycenter); - toolsLoadDouble(f, &layer->ymin); - toolsLoadDouble(f, &layer->ymax); - noiseLoadGenerator(f, layer->noise); - materialLoad(f, &layer->material); - toolsLoadDouble(f, &layer->transparencydepth); - toolsLoadDouble(f, &layer->lighttraversal); - toolsLoadDouble(f, &layer->minimumlight); - toolsLoadDouble(f, &layer->scaling); - toolsLoadDouble(f, &layer->coverage); + packReadDouble(stream, &layer->ycenter); + packReadDouble(stream, &layer->ymin); + packReadDouble(stream, &layer->ymax); + noiseLoadGenerator(stream, layer->noise); + materialLoad(stream, &layer->material); + packReadDouble(stream, &layer->transparencydepth); + packReadDouble(stream, &layer->lighttraversal); + packReadDouble(stream, &layer->minimumlight); + packReadDouble(stream, &layer->scaling); + packReadDouble(stream, &layer->coverage); } } diff --git a/lib_paysages/clouds.h b/lib_paysages/clouds.h index 69faf75..a58d0ff 100644 --- a/lib_paysages/clouds.h +++ b/lib_paysages/clouds.h @@ -39,8 +39,8 @@ typedef struct void cloudsInit(); void cloudsQuit(); -void cloudsSave(FILE* f, CloudsDefinition* definition); -void cloudsLoad(FILE* f, CloudsDefinition* definition); +void cloudsSave(PackStream* stream, CloudsDefinition* definition); +void cloudsLoad(PackStream* stream, CloudsDefinition* definition); CloudsDefinition cloudsCreateDefinition(); void cloudsDeleteDefinition(CloudsDefinition* definition); diff --git a/lib_paysages/color.c b/lib_paysages/color.c index af3740a..8fd0b8e 100644 --- a/lib_paysages/color.c +++ b/lib_paysages/color.c @@ -22,20 +22,20 @@ struct ColorGradation Curve* blue; }; -void colorSave(FILE* f, Color* col) +void colorSave(PackStream* stream, Color* col) { - toolsSaveDouble(f, &col->r); - toolsSaveDouble(f, &col->g); - toolsSaveDouble(f, &col->b); - toolsSaveDouble(f, &col->a); + packWriteDouble(stream, &col->r); + packWriteDouble(stream, &col->g); + packWriteDouble(stream, &col->b); + packWriteDouble(stream, &col->a); } -void colorLoad(FILE* f, Color* col) +void colorLoad(PackStream* stream, Color* col) { - toolsLoadDouble(f, &col->r); - toolsLoadDouble(f, &col->g); - toolsLoadDouble(f, &col->b); - toolsLoadDouble(f, &col->a); + packReadDouble(stream, &col->r); + packReadDouble(stream, &col->g); + packReadDouble(stream, &col->b); + packReadDouble(stream, &col->a); } unsigned int colorTo32BitRGBA(Color* col) @@ -137,18 +137,18 @@ void colorGradationCopy(ColorGradation* source, ColorGradation* destination) curveCopy(source->blue, destination->blue); } -void colorGradationSave(FILE* f, ColorGradation* gradation) +void colorGradationSave(PackStream* stream, ColorGradation* gradation) { - curveSave(f, gradation->red); - curveSave(f, gradation->green); - curveSave(f, gradation->blue); + curveSave(stream, gradation->red); + curveSave(stream, gradation->green); + curveSave(stream, gradation->blue); } -void colorGradationLoad(FILE* f, ColorGradation* gradation) +void colorGradationLoad(PackStream* stream, ColorGradation* gradation) { - curveLoad(f, gradation->red); - curveLoad(f, gradation->green); - curveLoad(f, gradation->blue); + curveLoad(stream, gradation->red); + curveLoad(stream, gradation->green); + curveLoad(stream, gradation->blue); } void colorGradationGetRedCurve(ColorGradation* gradation, Curve* curve) diff --git a/lib_paysages/color.h b/lib_paysages/color.h index 416467a..1bce1d2 100644 --- a/lib_paysages/color.h +++ b/lib_paysages/color.h @@ -10,8 +10,8 @@ extern "C" { #endif /* Color */ -void colorSave(FILE* f, Color* col); -void colorLoad(FILE* f, Color* col); +void colorSave(PackStream* stream, Color* col); +void colorLoad(PackStream* stream, Color* col); unsigned int colorTo32BitRGBA(Color* col); unsigned int colorTo32BitBGRA(Color* col); @@ -29,8 +29,8 @@ ColorGradation* colorGradationCreate(); void colorGradationDelete(ColorGradation* gradation); void colorGradationCopy(ColorGradation* source, ColorGradation* destination); -void colorGradationSave(FILE* f, ColorGradation* gradation); -void colorGradationLoad(FILE* f, ColorGradation* gradation); +void colorGradationSave(PackStream* stream, ColorGradation* gradation); +void colorGradationLoad(PackStream* stream, ColorGradation* gradation); void colorGradationGetRedCurve(ColorGradation* gradation, Curve* curve); void colorGradationGetGreenCurve(ColorGradation* gradation, Curve* curve); diff --git a/lib_paysages/curve.c b/lib_paysages/curve.c index fd25197..c719531 100644 --- a/lib_paysages/curve.c +++ b/lib_paysages/curve.c @@ -32,27 +32,27 @@ void curveCopy(Curve* source, Curve* destination) *destination = *source; } -void curveSave(FILE* f, Curve* curve) +void curveSave(PackStream* stream, Curve* curve) { int i; - toolsSaveInt(f, &curve->nbpoints); + packWriteInt(stream, &curve->nbpoints); for (i = 0; i < curve->nbpoints; i++) { - toolsSaveDouble(f, &curve->points[i].position); - toolsSaveDouble(f, &curve->points[i].value); + packWriteDouble(stream, &curve->points[i].position); + packWriteDouble(stream, &curve->points[i].value); } } -void curveLoad(FILE* f, Curve* curve) +void curveLoad(PackStream* stream, Curve* curve) { int i; - toolsLoadInt(f, &curve->nbpoints); + packReadInt(stream, &curve->nbpoints); for (i = 0; i < curve->nbpoints; i++) { - toolsLoadDouble(f, &curve->points[i].position); - toolsLoadDouble(f, &curve->points[i].value); + packReadDouble(stream, &curve->points[i].position); + packReadDouble(stream, &curve->points[i].value); } } diff --git a/lib_paysages/curve.h b/lib_paysages/curve.h index c4836fc..b5fd38d 100644 --- a/lib_paysages/curve.h +++ b/lib_paysages/curve.h @@ -1,7 +1,7 @@ #ifndef _PAYSAGES_CURVE_H_ #define _PAYSAGES_CURVE_H_ -#include +#include "pack.h" #ifdef __cplusplus extern "C" { @@ -17,8 +17,8 @@ Curve* curveCreate(); void curveDelete(Curve* curve); void curveCopy(Curve* source, Curve* destination); -void curveSave(FILE* f, Curve* curve); -void curveLoad(FILE* f, Curve* curve); +void curveSave(PackStream* stream, Curve* curve); +void curveLoad(PackStream* stream, Curve* curve); void curveClear(Curve* curve); int curveAddPoint(Curve* curve, CurvePoint* point); diff --git a/lib_paysages/euclid.c b/lib_paysages/euclid.c index e2fb997..e3e121c 100644 --- a/lib_paysages/euclid.c +++ b/lib_paysages/euclid.c @@ -6,18 +6,18 @@ Vector3 VECTOR_ZERO = {0.0, 0.0, 0.0}; -void v3Save(FILE* f, Vector3* v) +void v3Save(PackStream* stream, Vector3* v) { - toolsSaveDouble(f, &v->x); - toolsSaveDouble(f, &v->y); - toolsSaveDouble(f, &v->z); + packWriteDouble(stream, &v->x); + packWriteDouble(stream, &v->y); + packWriteDouble(stream, &v->z); } -void v3Load(FILE* f, Vector3* v) +void v3Load(PackStream* stream, Vector3* v) { - toolsLoadDouble(f, &v->x); - toolsLoadDouble(f, &v->y); - toolsLoadDouble(f, &v->z); + packReadDouble(stream, &v->x); + packReadDouble(stream, &v->y); + packReadDouble(stream, &v->z); } Vector3 v3Translate(Vector3 v1, double x, double y, double z) @@ -97,44 +97,44 @@ Vector3 v3Cross(Vector3 v1, Vector3 v2) return result; } -void m4Save(FILE* f, Matrix4* m) +void m4Save(PackStream* stream, Matrix4* m) { - toolsSaveDouble(f, &m->a); - toolsSaveDouble(f, &m->b); - toolsSaveDouble(f, &m->c); - toolsSaveDouble(f, &m->d); - toolsSaveDouble(f, &m->e); - toolsSaveDouble(f, &m->f); - toolsSaveDouble(f, &m->g); - toolsSaveDouble(f, &m->h); - toolsSaveDouble(f, &m->i); - toolsSaveDouble(f, &m->j); - toolsSaveDouble(f, &m->k); - toolsSaveDouble(f, &m->l); - toolsSaveDouble(f, &m->m); - toolsSaveDouble(f, &m->n); - toolsSaveDouble(f, &m->o); - toolsSaveDouble(f, &m->p); + packWriteDouble(stream, &m->a); + packWriteDouble(stream, &m->b); + packWriteDouble(stream, &m->c); + packWriteDouble(stream, &m->d); + packWriteDouble(stream, &m->e); + packWriteDouble(stream, &m->f); + packWriteDouble(stream, &m->g); + packWriteDouble(stream, &m->h); + packWriteDouble(stream, &m->i); + packWriteDouble(stream, &m->j); + packWriteDouble(stream, &m->k); + packWriteDouble(stream, &m->l); + packWriteDouble(stream, &m->m); + packWriteDouble(stream, &m->n); + packWriteDouble(stream, &m->o); + packWriteDouble(stream, &m->p); } -void m4Load(FILE* f, Matrix4* m) +void m4Load(PackStream* stream, Matrix4* m) { - toolsLoadDouble(f, &m->a); - toolsLoadDouble(f, &m->b); - toolsLoadDouble(f, &m->c); - toolsLoadDouble(f, &m->d); - toolsLoadDouble(f, &m->e); - toolsLoadDouble(f, &m->f); - toolsLoadDouble(f, &m->g); - toolsLoadDouble(f, &m->h); - toolsLoadDouble(f, &m->i); - toolsLoadDouble(f, &m->j); - toolsLoadDouble(f, &m->k); - toolsLoadDouble(f, &m->l); - toolsLoadDouble(f, &m->m); - toolsLoadDouble(f, &m->n); - toolsLoadDouble(f, &m->o); - toolsLoadDouble(f, &m->p); + packReadDouble(stream, &m->a); + packReadDouble(stream, &m->b); + packReadDouble(stream, &m->c); + packReadDouble(stream, &m->d); + packReadDouble(stream, &m->e); + packReadDouble(stream, &m->f); + packReadDouble(stream, &m->g); + packReadDouble(stream, &m->h); + packReadDouble(stream, &m->i); + packReadDouble(stream, &m->j); + packReadDouble(stream, &m->k); + packReadDouble(stream, &m->l); + packReadDouble(stream, &m->m); + packReadDouble(stream, &m->n); + packReadDouble(stream, &m->o); + packReadDouble(stream, &m->p); } Matrix4 m4NewIdentity() diff --git a/lib_paysages/euclid.h b/lib_paysages/euclid.h index 3328433..d3e4c65 100644 --- a/lib_paysages/euclid.h +++ b/lib_paysages/euclid.h @@ -2,13 +2,14 @@ #define _PAYSAGES_EUCLID_H_ #include "shared/types.h" +#include "pack.h" #ifdef __cplusplus extern "C" { #endif -void v3Save(FILE* f, Vector3* v); -void v3Load(FILE* f, Vector3* v); +void v3Save(PackStream* stream, Vector3* v); +void v3Load(PackStream* stream, Vector3* v); Vector3 v3Translate(Vector3 v1, double x, double y, double z); Vector3 v3Add(Vector3 v1, Vector3 v2); Vector3 v3Sub(Vector3 v1, Vector3 v2); @@ -19,8 +20,8 @@ Vector3 v3Normalize(Vector3 v); double v3Dot(Vector3 v1, Vector3 v2); Vector3 v3Cross(Vector3 v1, Vector3 v2); -void m4Save(FILE* f, Matrix4* m); -void m4Load(FILE* f, Matrix4* m); +void m4Save(PackStream* stream, Matrix4* m); +void m4Load(PackStream* stream, Matrix4* m); Matrix4 m4NewIdentity(); Matrix4 m4Mult(Matrix4 m1, Matrix4 m2); Vector3 m4MultPoint(Matrix4 m, Vector3 v); diff --git a/lib_paysages/lighting.c b/lib_paysages/lighting.c index 003fb14..80b5337 100644 --- a/lib_paysages/lighting.c +++ b/lib_paysages/lighting.c @@ -34,37 +34,37 @@ void lightingQuit() { } -void lightingSave(FILE* f, LightingDefinition* definition) +void lightingSave(PackStream* stream, LightingDefinition* definition) { int i; - toolsSaveInt(f, &definition->autosetfromsky); - toolsSaveInt(f, &definition->nblights); + packWriteInt(stream, &definition->autosetfromsky); + packWriteInt(stream, &definition->nblights); for (i = 0; i < definition->nblights; i++) { - v3Save(f, &definition->lights[i].direction); - colorSave(f, &definition->lights[i].color); - toolsSaveDouble(f, &definition->lights[i].reflection); - toolsSaveInt(f, &definition->lights[i].filtered); - toolsSaveInt(f, &definition->lights[i].masked); - toolsSaveDouble(f, &definition->lights[i].amplitude); + v3Save(stream, &definition->lights[i].direction); + colorSave(stream, &definition->lights[i].color); + packWriteDouble(stream, &definition->lights[i].reflection); + packWriteInt(stream, &definition->lights[i].filtered); + packWriteInt(stream, &definition->lights[i].masked); + packWriteDouble(stream, &definition->lights[i].amplitude); } } -void lightingLoad(FILE* f, LightingDefinition* definition) +void lightingLoad(PackStream* stream, LightingDefinition* definition) { int i; - toolsLoadInt(f, &definition->autosetfromsky); - toolsLoadInt(f, &definition->nblights); + packReadInt(stream, &definition->autosetfromsky); + packReadInt(stream, &definition->nblights); for (i = 0; i < definition->nblights; i++) { - v3Load(f, &definition->lights[i].direction); - colorLoad(f, &definition->lights[i].color); - toolsLoadDouble(f, &definition->lights[i].reflection); - toolsLoadInt(f, &definition->lights[i].filtered); - toolsLoadInt(f, &definition->lights[i].masked); - toolsLoadDouble(f, &definition->lights[i].amplitude); + v3Load(stream, &definition->lights[i].direction); + colorLoad(stream, &definition->lights[i].color); + packReadDouble(stream, &definition->lights[i].reflection); + packReadInt(stream, &definition->lights[i].filtered); + packReadInt(stream, &definition->lights[i].masked); + packReadDouble(stream, &definition->lights[i].amplitude); } lightingValidateDefinition(definition); diff --git a/lib_paysages/lighting.h b/lib_paysages/lighting.h index 47c8604..310165c 100644 --- a/lib_paysages/lighting.h +++ b/lib_paysages/lighting.h @@ -3,7 +3,7 @@ #include "shared/types.h" #include "renderer.h" -#include +#include "pack.h" #ifdef __cplusplus extern "C" { @@ -32,8 +32,8 @@ typedef struct void lightingInit(); void lightingQuit(); -void lightingSave(FILE* f, LightingDefinition* definition); -void lightingLoad(FILE* f, LightingDefinition* definition); +void lightingSave(PackStream* stream, LightingDefinition* definition); +void lightingLoad(PackStream* stream, LightingDefinition* definition); LightingDefinition lightingCreateDefinition(); void lightingDeleteDefinition(LightingDefinition* definition); diff --git a/lib_paysages/modifiers.c b/lib_paysages/modifiers.c index 599a6bf..8cb4511 100644 --- a/lib_paysages/modifiers.c +++ b/lib_paysages/modifiers.c @@ -46,18 +46,18 @@ void modifierDelete(HeightModifier* modifier) free(modifier); } -void modifierSave(FILE* f, HeightModifier* modifier) +void modifierSave(PackStream* stream, HeightModifier* modifier) { - toolsSaveInt(f, &modifier->mode); - toolsSaveDouble(f, &modifier->value); - zoneSave(f, modifier->zone); + packWriteInt(stream, &modifier->mode); + packWriteDouble(stream, &modifier->value); + zoneSave(stream, modifier->zone); } -void modifierLoad(FILE* f, HeightModifier* modifier) +void modifierLoad(PackStream* stream, HeightModifier* modifier) { - toolsLoadInt(f, &modifier->mode); - toolsLoadDouble(f, &modifier->value); - zoneLoad(f, modifier->zone); + packReadInt(stream, &modifier->mode); + packReadDouble(stream, &modifier->value); + zoneLoad(stream, modifier->zone); } Zone* modifierGetZone(HeightModifier* modifier) diff --git a/lib_paysages/modifiers.h b/lib_paysages/modifiers.h index d63d42c..829ada7 100644 --- a/lib_paysages/modifiers.h +++ b/lib_paysages/modifiers.h @@ -1,7 +1,7 @@ #ifndef _PAYSAGES_MODIFIERS_H_ #define _PAYSAGES_MODIFIERS_H_ -#include +#include "pack.h" #include "zone.h" #ifdef __cplusplus @@ -13,8 +13,8 @@ typedef struct HeightModifier HeightModifier; HeightModifier* modifierCreate(); HeightModifier* modifierCreateCopy(HeightModifier* source); void modifierDelete(HeightModifier* modifier); -void modifierSave(FILE* f, HeightModifier* modifier); -void modifierLoad(FILE* f, HeightModifier* modifier); +void modifierSave(PackStream* stream, HeightModifier* modifier); +void modifierLoad(PackStream* stream, HeightModifier* modifier); Zone* modifierGetZone(HeightModifier* modifier); void modifierActionAddValue(HeightModifier* modifier, double value); void modifierActionFixValue(HeightModifier* modifier, double value); diff --git a/lib_paysages/noise.c b/lib_paysages/noise.c index 327612b..d03ded9 100644 --- a/lib_paysages/noise.c +++ b/lib_paysages/noise.c @@ -46,26 +46,26 @@ void noiseQuit() free(_noise_pool); } -void noiseSave(FILE* f) +void noiseSave(PackStream* stream) { int i; - toolsSaveInt(f, &_noise_pool_size); + packWriteInt(stream, &_noise_pool_size); for (i = 0; i < _noise_pool_size; i++) { - toolsSaveDouble(f, _noise_pool + i); + packWriteDouble(stream, _noise_pool + i); } } -void noiseLoad(FILE* f) +void noiseLoad(PackStream* stream) { int i; - toolsLoadInt(f, &_noise_pool_size); + packReadInt(stream, &_noise_pool_size); _noise_pool = realloc(_noise_pool, sizeof(double) * _noise_pool_size); for (i = 0; i < _noise_pool_size; i++) { - toolsLoadDouble(f, _noise_pool + i); + packReadDouble(stream, _noise_pool + i); } } @@ -89,47 +89,47 @@ void noiseDeleteGenerator(NoiseGenerator* generator) free(generator); } -void noiseSaveGenerator(FILE* f, NoiseGenerator* perlin) +void noiseSaveGenerator(PackStream* stream, NoiseGenerator* perlin) { int x; - toolsSaveInt(f, &perlin->size1); - toolsSaveInt(f, &perlin->size2); - toolsSaveInt(f, &perlin->size3); - toolsSaveDouble(f, &perlin->height_offset); - toolsSaveInt(f, &perlin->level_count); + packWriteInt(stream, &perlin->size1); + packWriteInt(stream, &perlin->size2); + packWriteInt(stream, &perlin->size3); + packWriteDouble(stream, &perlin->height_offset); + packWriteInt(stream, &perlin->level_count); for (x = 0; x < perlin->level_count; x++) { NoiseLevel* level = perlin->levels + x; - toolsSaveDouble(f, &level->scaling); - toolsSaveDouble(f, &level->height); - toolsSaveDouble(f, &level->xoffset); - toolsSaveDouble(f, &level->yoffset); - toolsSaveDouble(f, &level->zoffset); + packWriteDouble(stream, &level->scaling); + packWriteDouble(stream, &level->height); + packWriteDouble(stream, &level->xoffset); + packWriteDouble(stream, &level->yoffset); + packWriteDouble(stream, &level->zoffset); } } -void noiseLoadGenerator(FILE* f, NoiseGenerator* perlin) +void noiseLoadGenerator(PackStream* stream, NoiseGenerator* perlin) { int x; - toolsLoadInt(f, &perlin->size1); - toolsLoadInt(f, &perlin->size2); - toolsLoadInt(f, &perlin->size3); - toolsLoadDouble(f, &perlin->height_offset); - toolsLoadInt(f, &perlin->level_count); + packReadInt(stream, &perlin->size1); + packReadInt(stream, &perlin->size2); + packReadInt(stream, &perlin->size3); + packReadDouble(stream, &perlin->height_offset); + packReadInt(stream, &perlin->level_count); for (x = 0; x < perlin->level_count; x++) { NoiseLevel* level = perlin->levels + x; - toolsLoadDouble(f, &level->scaling); - toolsLoadDouble(f, &level->height); - toolsLoadDouble(f, &level->xoffset); - toolsLoadDouble(f, &level->yoffset); - toolsLoadDouble(f, &level->zoffset); + packReadDouble(stream, &level->scaling); + packReadDouble(stream, &level->height); + packReadDouble(stream, &level->xoffset); + packReadDouble(stream, &level->yoffset); + packReadDouble(stream, &level->zoffset); } } diff --git a/lib_paysages/noise.h b/lib_paysages/noise.h index d80e722..4c6dec9 100644 --- a/lib_paysages/noise.h +++ b/lib_paysages/noise.h @@ -1,7 +1,7 @@ #ifndef _PAYSAGES_NOISE_H_ #define _PAYSAGES_NOISE_H_ -#include +#include "pack.h" #ifdef __cplusplus extern "C" { @@ -20,13 +20,13 @@ typedef struct NoiseGenerator NoiseGenerator; void noiseInit(); void noiseQuit(); -void noiseSave(FILE* f); -void noiseLoad(FILE* f); +void noiseSave(PackStream* stream); +void noiseLoad(PackStream* stream); NoiseGenerator* noiseCreateGenerator(); void noiseDeleteGenerator(NoiseGenerator* generator); -void noiseSaveGenerator(FILE* f, NoiseGenerator* perlin); -void noiseLoadGenerator(FILE* f, NoiseGenerator* perlin); +void noiseSaveGenerator(PackStream* stream, NoiseGenerator* perlin); +void noiseLoadGenerator(PackStream* stream, NoiseGenerator* perlin); void noiseCopy(NoiseGenerator* source, NoiseGenerator* destination); void noiseGenerateBaseNoise(NoiseGenerator* generator, int size); int noiseGetBaseSize(NoiseGenerator* generator); diff --git a/lib_paysages/pack.c b/lib_paysages/pack.c new file mode 100644 index 0000000..775e3b3 --- /dev/null +++ b/lib_paysages/pack.c @@ -0,0 +1,139 @@ +#include "pack.h" + +#include +#include +#include +#include + +#include "color.h" +#include "euclid.h" + +struct PackStream +{ + FILE* fd; + int write; +}; + +#define pack754_32(f) (pack754((f), 32, 8)) +#define pack754_64(f) (pack754((f), 64, 11)) +#define unpack754_32(i) (unpack754((i), 32, 8)) +#define unpack754_64(i) (unpack754((i), 64, 11)) + +static uint64_t pack754(double f, unsigned bits, unsigned expbits) +{ + double fnorm; + int shift; + long long sign, exp, significand; + unsigned significandbits = bits - expbits - 1; // -1 for sign bit + + if (f == 0.0) return 0; // get this special case out of the way + + // check sign and begin normalization + if (f < 0) { sign = 1; fnorm = -f; } + else { sign = 0; fnorm = f; } + + // get the normalized form of f and track the exponent + shift = 0; + while(fnorm >= 2.0) { fnorm /= 2.0; shift++; } + while(fnorm < 1.0) { fnorm *= 2.0; shift--; } + fnorm = fnorm - 1.0; + + // calculate the binary form (non-float) of the significand data + significand = fnorm * ((1LL<>significandbits)&((1LL< 0) { result *= 2.0; shift--; } + while(shift < 0) { result /= 2.0; shift++; } + + // sign it + result *= (i>>(bits-1))&1? -1.0: 1.0; + + return result; +} + +PackStream* packReadFile(char* filepath) +{ + PackStream* result; + + result = malloc(sizeof(PackStream)); + result->fd = fopen(filepath, "rb"); + result->write = 0; + + return result; +} + +PackStream* packWriteFile(char* filepath) +{ + PackStream* result; + + result = malloc(sizeof(PackStream)); + result->fd = fopen(filepath, "wb"); + result->write = 1; + + return result; +} + +void packCloseStream(PackStream* stream) +{ + if (stream->write) + { + fflush(stream->fd); + } + fclose(stream->fd); + free(stream); +} + +void packWriteDouble(PackStream* stream, double* value) +{ + uint64_t servalue; + + servalue = pack754_64(*value); + fwrite(&servalue, sizeof(uint64_t), 1, stream->fd); +} + +void packReadDouble(PackStream* stream, double* value) +{ + int read; + uint64_t servalue; + + read = fread(&servalue, sizeof(uint64_t), 1, stream->fd); + assert(read == 1); + + *value = unpack754_64(servalue); +} + +void packWriteInt(PackStream* stream, int* value) +{ + fprintf(stream->fd, "%d;", *value); +} + +void packReadInt(PackStream* stream, int* value) +{ + int read; + + read = fscanf(stream->fd, "%d;", value); + assert(read == 1); +} diff --git a/lib_paysages/pack.h b/lib_paysages/pack.h new file mode 100644 index 0000000..0075dea --- /dev/null +++ b/lib_paysages/pack.h @@ -0,0 +1,26 @@ +#ifndef _PAYSAGES_PACK_H_ +#define _PAYSAGES_PACK_H_ + +#include +#include "shared/types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct PackStream PackStream; + +PackStream* packReadFile(char* filepath); +PackStream* packWriteFile(char* filepath); +void packCloseStream(PackStream* stream); + +void packWriteDouble(PackStream* stream, double* value); +void packReadDouble(PackStream* stream, double* value); +void packWriteInt(PackStream* stream, int* value); +void packReadInt(PackStream* stream, int* value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib_paysages/scenery.c b/lib_paysages/scenery.c index bdfb848..5a20707 100644 --- a/lib_paysages/scenery.c +++ b/lib_paysages/scenery.c @@ -67,39 +67,38 @@ void sceneryQuit() void scenerySaveToFile(char* filepath) { - FILE* f = fopen(filepath, "wb"); + PackStream* stream = packWriteFile(filepath); - noiseSave(f); - atmosphereSave(f, &_atmosphere); - cameraSave(f, &_camera); - cloudsSave(f, &_clouds); - lightingSave(f, &_lighting); - skySave(f, &_sky); - terrainSave(f, &_terrain); - texturesSave(f, &_textures); - vegetationSave(f, _vegetation); - waterSave(f, &_water); + noiseSave(stream); + atmosphereSave(stream, &_atmosphere); + cameraSave(stream, &_camera); + cloudsSave(stream, &_clouds); + lightingSave(stream, &_lighting); + skySave(stream, &_sky); + terrainSave(stream, &_terrain); + texturesSave(stream, &_textures); + vegetationSave(stream, _vegetation); + waterSave(stream, &_water); - fflush(f); - fclose(f); + packCloseStream(stream); } void sceneryLoadFromFile(char* filepath) { - FILE* f = fopen(filepath, "rb"); + PackStream* stream = packReadFile(filepath); /* TODO Use intermediary definitions ? */ - noiseLoad(f); - atmosphereLoad(f, &_atmosphere); - cameraLoad(f, &_camera); - cloudsLoad(f, &_clouds); - lightingLoad(f, &_lighting); - skyLoad(f, &_sky); - terrainLoad(f, &_terrain); - texturesLoad(f, &_textures); - vegetationLoad(f, _vegetation); - waterLoad(f, &_water); + noiseLoad(stream); + atmosphereLoad(stream, &_atmosphere); + cameraLoad(stream, &_camera); + cloudsLoad(stream, &_clouds); + lightingLoad(stream, &_lighting); + skyLoad(stream, &_sky); + terrainLoad(stream, &_terrain); + texturesLoad(stream, &_textures); + vegetationLoad(stream, _vegetation); + waterLoad(stream, &_water); atmosphereValidateDefinition(&_atmosphere); cameraValidateDefinition(&_camera, 0); @@ -111,7 +110,7 @@ void sceneryLoadFromFile(char* filepath) vegetationValidateDefinition(_vegetation); waterValidateDefinition(&_water); - fclose(f); + packCloseStream(stream); } void scenerySetAtmosphere(AtmosphereDefinition* atmosphere) diff --git a/lib_paysages/sky.c b/lib_paysages/sky.c index 4f8a17a..7f1c140 100644 --- a/lib_paysages/sky.c +++ b/lib_paysages/sky.c @@ -22,26 +22,26 @@ void skyQuit() { } -void skySave(FILE* f, SkyDefinition* definition) +void skySave(PackStream* stream, SkyDefinition* definition) { - toolsSaveDouble(f, &definition->daytime); - colorGradationSave(f, definition->sun_color); - toolsSaveDouble(f, &definition->sun_radius); - colorGradationSave(f, definition->zenith_color); - colorGradationSave(f, definition->haze_color); - toolsSaveDouble(f, &definition->haze_height); - toolsSaveDouble(f, &definition->haze_smoothing); + packWriteDouble(stream, &definition->daytime); + colorGradationSave(stream, definition->sun_color); + packWriteDouble(stream, &definition->sun_radius); + colorGradationSave(stream, definition->zenith_color); + colorGradationSave(stream, definition->haze_color); + packWriteDouble(stream, &definition->haze_height); + packWriteDouble(stream, &definition->haze_smoothing); } -void skyLoad(FILE* f, SkyDefinition* definition) +void skyLoad(PackStream* stream, SkyDefinition* definition) { - toolsLoadDouble(f, &definition->daytime); - colorGradationLoad(f, definition->sun_color); - toolsLoadDouble(f, &definition->sun_radius); - colorGradationLoad(f, definition->zenith_color); - colorGradationLoad(f, definition->haze_color); - toolsLoadDouble(f, &definition->haze_height); - toolsLoadDouble(f, &definition->haze_smoothing); + packReadDouble(stream, &definition->daytime); + colorGradationLoad(stream, definition->sun_color); + packReadDouble(stream, &definition->sun_radius); + colorGradationLoad(stream, definition->zenith_color); + colorGradationLoad(stream, definition->haze_color); + packReadDouble(stream, &definition->haze_height); + packReadDouble(stream, &definition->haze_smoothing); skyValidateDefinition(definition); } diff --git a/lib_paysages/sky.h b/lib_paysages/sky.h index 86079f6..299f3b3 100644 --- a/lib_paysages/sky.h +++ b/lib_paysages/sky.h @@ -4,7 +4,7 @@ #include "shared/types.h" #include "color.h" #include "lighting.h" -#include +#include "pack.h" #ifdef __cplusplus extern "C" { @@ -24,8 +24,8 @@ typedef struct void skyInit(); void skyQuit(); -void skySave(FILE* f, SkyDefinition* definition); -void skyLoad(FILE* f, SkyDefinition* definition); +void skySave(PackStream* stream, SkyDefinition* definition); +void skyLoad(PackStream* stream, SkyDefinition* definition); SkyDefinition skyCreateDefinition(); void skyDeleteDefinition(SkyDefinition* definition); diff --git a/lib_paysages/terrain.c b/lib_paysages/terrain.c index 87f7206..cc6e125 100644 --- a/lib_paysages/terrain.c +++ b/lib_paysages/terrain.c @@ -21,39 +21,39 @@ void terrainQuit() { } -void terrainSave(FILE* f, TerrainDefinition* definition) +void terrainSave(PackStream* stream, TerrainDefinition* definition) { int i; - noiseSaveGenerator(f, definition->height_noise); - toolsSaveDouble(f, &definition->height_factor); - toolsSaveDouble(f, &definition->scaling); + noiseSaveGenerator(stream, definition->height_noise); + packWriteDouble(stream, &definition->height_factor); + packWriteDouble(stream, &definition->scaling); - toolsSaveInt(f, &definition->height_modifiers_count); + packWriteInt(stream, &definition->height_modifiers_count); for (i = 0; i < definition->height_modifiers_count; i++) { - modifierSave(f, definition->height_modifiers[i]); + modifierSave(stream, definition->height_modifiers[i]); } } -void terrainLoad(FILE* f, TerrainDefinition* definition) +void terrainLoad(PackStream* stream, TerrainDefinition* definition) { int i, n; HeightModifier* modifier; - noiseLoadGenerator(f, definition->height_noise); - toolsLoadDouble(f, &definition->height_factor); - toolsLoadDouble(f, &definition->scaling); + noiseLoadGenerator(stream, definition->height_noise); + packReadDouble(stream, &definition->height_factor); + packReadDouble(stream, &definition->scaling); while (definition->height_modifiers_count > 0) { terrainDelModifier(definition, 0); } - toolsLoadInt(f, &n); + packReadInt(stream, &n); for (i = 0; i < n; i++) { modifier = modifierCreate(); - modifierLoad(f, modifier); + modifierLoad(stream, modifier); terrainAddModifier(definition, modifier); modifierDelete(modifier); } diff --git a/lib_paysages/terrain.h b/lib_paysages/terrain.h index 123df98..04cca63 100644 --- a/lib_paysages/terrain.h +++ b/lib_paysages/terrain.h @@ -5,7 +5,7 @@ #include "modifiers.h" #include "noise.h" #include "lighting.h" -#include +#include "pack.h" #ifdef __cplusplus extern "C" { @@ -26,8 +26,8 @@ typedef struct void terrainInit(); void terrainQuit(); -void terrainSave(FILE* f, TerrainDefinition* definition); -void terrainLoad(FILE* f, TerrainDefinition* definition); +void terrainSave(PackStream* stream, TerrainDefinition* definition); +void terrainLoad(PackStream* stream, TerrainDefinition* definition); TerrainDefinition terrainCreateDefinition(); void terrainDeleteDefinition(TerrainDefinition* definition); diff --git a/lib_paysages/textures.c b/lib_paysages/textures.c index 892f1e1..00ef187 100644 --- a/lib_paysages/textures.c +++ b/lib_paysages/textures.c @@ -25,22 +25,22 @@ void texturesQuit() texturesLayerDeleteDefinition(&_NULL_LAYER); } -void texturesSave(FILE* f, TexturesDefinition* definition) +void texturesSave(PackStream* stream, TexturesDefinition* definition) { int i; - toolsSaveInt(f, &definition->nbtextures); + packWriteInt(stream, &definition->nbtextures); for (i = 0; i < definition->nbtextures; i++) { - zoneSave(f, definition->textures[i].zone); - noiseSaveGenerator(f, definition->textures[i].bump_noise); - toolsSaveDouble(f, &definition->textures[i].bump_height); - toolsSaveDouble(f, &definition->textures[i].bump_scaling); - materialSave(f, &definition->textures[i].material); + zoneSave(stream, definition->textures[i].zone); + noiseSaveGenerator(stream, definition->textures[i].bump_noise); + packWriteDouble(stream, &definition->textures[i].bump_height); + packWriteDouble(stream, &definition->textures[i].bump_scaling); + materialSave(stream, &definition->textures[i].material); } } -void texturesLoad(FILE* f, TexturesDefinition* definition) +void texturesLoad(PackStream* stream, TexturesDefinition* definition) { TextureLayerDefinition* layer; int i, n; @@ -50,16 +50,16 @@ void texturesLoad(FILE* f, TexturesDefinition* definition) texturesDeleteLayer(definition, 0); } - toolsLoadInt(f, &n); + packReadInt(stream, &n); for (i = 0; i < n; i++) { layer = definition->textures + texturesAddLayer(definition); - zoneLoad(f, layer->zone); - noiseLoadGenerator(f, layer->bump_noise); - toolsLoadDouble(f, &layer->bump_height); - toolsLoadDouble(f, &layer->bump_scaling); - materialLoad(f, &layer->material); + zoneLoad(stream, layer->zone); + noiseLoadGenerator(stream, layer->bump_noise); + packReadDouble(stream, &layer->bump_height); + packReadDouble(stream, &layer->bump_scaling); + materialLoad(stream, &layer->material); } texturesValidateDefinition(definition); diff --git a/lib_paysages/textures.h b/lib_paysages/textures.h index 44b632d..07feb73 100644 --- a/lib_paysages/textures.h +++ b/lib_paysages/textures.h @@ -4,7 +4,7 @@ #include "shared/types.h" #include "noise.h" #include "lighting.h" -#include +#include "pack.h" #ifdef __cplusplus extern "C" { @@ -29,8 +29,8 @@ typedef struct void texturesInit(); void texturesQuit(); -void texturesSave(FILE* f, TexturesDefinition* definition); -void texturesLoad(FILE* f, TexturesDefinition* definition); +void texturesSave(PackStream* stream, TexturesDefinition* definition); +void texturesLoad(PackStream* stream, TexturesDefinition* definition); TexturesDefinition texturesCreateDefinition(); void texturesDeleteDefinition(TexturesDefinition* definition); diff --git a/lib_paysages/tools.c b/lib_paysages/tools.c index 6c7d2d2..f480894 100644 --- a/lib_paysages/tools.c +++ b/lib_paysages/tools.c @@ -8,66 +8,6 @@ #include "color.h" #include "euclid.h" -#define pack754_32(f) (pack754((f), 32, 8)) -#define pack754_64(f) (pack754((f), 64, 11)) -#define unpack754_32(i) (unpack754((i), 32, 8)) -#define unpack754_64(i) (unpack754((i), 64, 11)) - -static uint64_t pack754(double f, unsigned bits, unsigned expbits) -{ - double fnorm; - int shift; - long long sign, exp, significand; - unsigned significandbits = bits - expbits - 1; // -1 for sign bit - - if (f == 0.0) return 0; // get this special case out of the way - - // check sign and begin normalization - if (f < 0) { sign = 1; fnorm = -f; } - else { sign = 0; fnorm = f; } - - // get the normalized form of f and track the exponent - shift = 0; - while(fnorm >= 2.0) { fnorm /= 2.0; shift++; } - while(fnorm < 1.0) { fnorm *= 2.0; shift--; } - fnorm = fnorm - 1.0; - - // calculate the binary form (non-float) of the significand data - significand = fnorm * ((1LL<>significandbits)&((1LL< 0) { result *= 2.0; shift--; } - while(shift < 0) { result /= 2.0; shift++; } - - // sign it - result *= (i>>(bits-1))&1? -1.0: 1.0; - - return result; -} - double toolsRandom() { return (double)rand() / (double)RAND_MAX; @@ -127,48 +67,16 @@ double toolsGetDistance2D(double x1, double y1, double x2, double y2) return sqrt(dx * dx + dy * dy); } -void toolsSaveDouble(FILE* f, double* value) +void materialSave(PackStream* stream, SurfaceMaterial* material) { - uint64_t servalue; - - servalue = pack754_64(*value); - fwrite(&servalue, sizeof(uint64_t), 1, f); + colorSave(stream, &material->base); + packWriteDouble(stream, &material->reflection); + packWriteDouble(stream, &material->shininess); } -void toolsLoadDouble(FILE* f, double* value) +void materialLoad(PackStream* stream, SurfaceMaterial* material) { - int read; - uint64_t servalue; - - read = fread(&servalue, sizeof(uint64_t), 1, f); - assert(read == 1); - - *value = unpack754_64(servalue); -} - -void toolsSaveInt(FILE* f, int* value) -{ - fprintf(f, "%d;", *value); -} - -void toolsLoadInt(FILE* f, int* value) -{ - int read; - - read = fscanf(f, "%d;", value); - assert(read == 1); -} - -void materialSave(FILE* f, SurfaceMaterial* material) -{ - colorSave(f, &material->base); - toolsSaveDouble(f, &material->reflection); - toolsSaveDouble(f, &material->shininess); -} - -void materialLoad(FILE* f, SurfaceMaterial* material) -{ - colorLoad(f, &material->base); - toolsLoadDouble(f, &material->reflection); - toolsLoadDouble(f, &material->shininess); + colorLoad(stream, &material->base); + packReadDouble(stream, &material->reflection); + packReadDouble(stream, &material->shininess); } diff --git a/lib_paysages/tools.h b/lib_paysages/tools.h index b6b747f..012192e 100644 --- a/lib_paysages/tools.h +++ b/lib_paysages/tools.h @@ -1,7 +1,7 @@ #ifndef _PAYSAGES_TOOLS_H_ #define _PAYSAGES_TOOLS_H_ -#include +#include "pack.h" #include "shared/types.h" #ifdef __cplusplus @@ -13,12 +13,8 @@ double toolsBicubicInterpolate(double stencil[16], double x, double y); void toolsFloat2DMapCopy(double* src, double* dest, int src_xstart, int src_ystart, int dest_xstart, int dest_ystart, int xsize, int ysize, int src_xstep, int src_ystep, int dest_xstep, int dest_ystep); Vector3 toolsGetNormalFromTriangle(Vector3 center, Vector3 bottom, Vector3 right); double toolsGetDistance2D(double x1, double y1, double x2, double y2); -void toolsSaveDouble(FILE* f, double* value); -void toolsLoadDouble(FILE* f, double* value); -void toolsSaveInt(FILE* f, int* value); -void toolsLoadInt(FILE* f, int* value); -void materialSave(FILE* f, SurfaceMaterial* material); -void materialLoad(FILE* f, SurfaceMaterial* material); +void materialSave(PackStream* stream, SurfaceMaterial* material); +void materialLoad(PackStream* stream, SurfaceMaterial* material); #ifdef __cplusplus } diff --git a/lib_paysages/vegetation.c b/lib_paysages/vegetation.c index 0607e0a..b529fd5 100644 --- a/lib_paysages/vegetation.c +++ b/lib_paysages/vegetation.c @@ -15,11 +15,11 @@ void vegetationQuit() { } -void vegetationSave(FILE* f, VegetationDefinition* definition) +void vegetationSave(PackStream* stream, VegetationDefinition* definition) { } -void vegetationLoad(FILE* f, VegetationDefinition* definition) +void vegetationLoad(PackStream* stream, VegetationDefinition* definition) { } diff --git a/lib_paysages/vegetation.h b/lib_paysages/vegetation.h index 76d99ba..12077c6 100644 --- a/lib_paysages/vegetation.h +++ b/lib_paysages/vegetation.h @@ -1,7 +1,7 @@ #ifndef _PAYSAGES_VEGETATION_H_ #define _PAYSAGES_VEGETATION_H_ -#include +#include "pack.h" #include "zone.h" #ifdef __cplusplus @@ -20,8 +20,8 @@ typedef struct VegetationDefinition VegetationDefinition; void vegetationInit(); void vegetationQuit(); -void vegetationSave(FILE* f, VegetationDefinition* definition); -void vegetationLoad(FILE* f, VegetationDefinition* definition); +void vegetationSave(PackStream* stream, VegetationDefinition* definition); +void vegetationLoad(PackStream* stream, VegetationDefinition* definition); VegetationDefinition* vegetationCreateDefinition(); void vegetationDeleteDefinition(VegetationDefinition* definition); diff --git a/lib_paysages/water.c b/lib_paysages/water.c index 5db69fa..8bddeac 100644 --- a/lib_paysages/water.c +++ b/lib_paysages/water.c @@ -19,32 +19,32 @@ void waterQuit() { } -void waterSave(FILE* f, WaterDefinition* definition) +void waterSave(PackStream* stream, WaterDefinition* definition) { - toolsSaveDouble(f, &definition->height); - materialSave(f, &definition->material); - colorSave(f, &definition->depth_color); - toolsSaveDouble(f, &definition->transparency_depth); - toolsSaveDouble(f, &definition->transparency); - toolsSaveDouble(f, &definition->reflection); - toolsSaveDouble(f, &definition->lighting_depth); - noiseSaveGenerator(f, definition->waves_noise); - toolsSaveDouble(f, &definition->waves_noise_height); - toolsSaveDouble(f, &definition->waves_noise_scale); + packWriteDouble(stream, &definition->height); + materialSave(stream, &definition->material); + colorSave(stream, &definition->depth_color); + packWriteDouble(stream, &definition->transparency_depth); + packWriteDouble(stream, &definition->transparency); + packWriteDouble(stream, &definition->reflection); + packWriteDouble(stream, &definition->lighting_depth); + noiseSaveGenerator(stream, definition->waves_noise); + packWriteDouble(stream, &definition->waves_noise_height); + packWriteDouble(stream, &definition->waves_noise_scale); } -void waterLoad(FILE* f, WaterDefinition* definition) +void waterLoad(PackStream* stream, WaterDefinition* definition) { - toolsLoadDouble(f, &definition->height); - materialLoad(f, &definition->material); - colorLoad(f, &definition->depth_color); - toolsLoadDouble(f, &definition->transparency_depth); - toolsLoadDouble(f, &definition->transparency); - toolsLoadDouble(f, &definition->reflection); - toolsLoadDouble(f, &definition->lighting_depth); - noiseLoadGenerator(f, definition->waves_noise); - toolsLoadDouble(f, &definition->waves_noise_height); - toolsLoadDouble(f, &definition->waves_noise_scale); + packReadDouble(stream, &definition->height); + materialLoad(stream, &definition->material); + colorLoad(stream, &definition->depth_color); + packReadDouble(stream, &definition->transparency_depth); + packReadDouble(stream, &definition->transparency); + packReadDouble(stream, &definition->reflection); + packReadDouble(stream, &definition->lighting_depth); + noiseLoadGenerator(stream, definition->waves_noise); + packReadDouble(stream, &definition->waves_noise_height); + packReadDouble(stream, &definition->waves_noise_scale); waterValidateDefinition(definition); } diff --git a/lib_paysages/water.h b/lib_paysages/water.h index 5a5ccdf..ed1a071 100644 --- a/lib_paysages/water.h +++ b/lib_paysages/water.h @@ -5,7 +5,7 @@ #include "renderer.h" #include "lighting.h" #include "noise.h" -#include +#include "pack.h" #ifdef __cplusplus extern "C" { @@ -36,8 +36,8 @@ typedef struct void waterInit(); void waterQuit(); -void waterSave(FILE* f, WaterDefinition* definition); -void waterLoad(FILE* f, WaterDefinition* definition); +void waterSave(PackStream* stream, WaterDefinition* definition); +void waterLoad(PackStream* stream, WaterDefinition* definition); WaterDefinition waterCreateDefinition(); void waterDeleteDefinition(WaterDefinition* definition); diff --git a/lib_paysages/zone.c b/lib_paysages/zone.c index af14a63..9f30f6f 100644 --- a/lib_paysages/zone.c +++ b/lib_paysages/zone.c @@ -48,93 +48,93 @@ void zoneDelete(Zone* zone) free(zone); } -void zoneSave(FILE* f, Zone* zone) +void zoneSave(PackStream* stream, Zone* zone) { int i; - toolsSaveInt(f, &zone->height_ranges_count); + packWriteInt(stream, &zone->height_ranges_count); for (i = 0; i < zone->height_ranges_count; i++) { - toolsSaveDouble(f, &zone->height_ranges[i].value); - toolsSaveDouble(f, &zone->height_ranges[i].hardmin); - toolsSaveDouble(f, &zone->height_ranges[i].softmin); - toolsSaveDouble(f, &zone->height_ranges[i].softmax); - toolsSaveDouble(f, &zone->height_ranges[i].hardmax); + packWriteDouble(stream, &zone->height_ranges[i].value); + packWriteDouble(stream, &zone->height_ranges[i].hardmin); + packWriteDouble(stream, &zone->height_ranges[i].softmin); + packWriteDouble(stream, &zone->height_ranges[i].softmax); + packWriteDouble(stream, &zone->height_ranges[i].hardmax); } - toolsSaveInt(f, &zone->slope_ranges_count); + packWriteInt(stream, &zone->slope_ranges_count); for (i = 0; i < zone->slope_ranges_count; i++) { - toolsSaveDouble(f, &zone->slope_ranges[i].value); - toolsSaveDouble(f, &zone->slope_ranges[i].hardmin); - toolsSaveDouble(f, &zone->slope_ranges[i].softmin); - toolsSaveDouble(f, &zone->slope_ranges[i].softmax); - toolsSaveDouble(f, &zone->slope_ranges[i].hardmax); + packWriteDouble(stream, &zone->slope_ranges[i].value); + packWriteDouble(stream, &zone->slope_ranges[i].hardmin); + packWriteDouble(stream, &zone->slope_ranges[i].softmin); + packWriteDouble(stream, &zone->slope_ranges[i].softmax); + packWriteDouble(stream, &zone->slope_ranges[i].hardmax); } - toolsSaveInt(f, &zone->circles_included_count); + packWriteInt(stream, &zone->circles_included_count); for (i = 0; i < zone->circles_included_count; i++) { - toolsSaveDouble(f, &zone->circles_included[i].value); - toolsSaveDouble(f, &zone->circles_included[i].centerx); - toolsSaveDouble(f, &zone->circles_included[i].centerz); - toolsSaveDouble(f, &zone->circles_included[i].softradius); - toolsSaveDouble(f, &zone->circles_included[i].hardradius); + packWriteDouble(stream, &zone->circles_included[i].value); + packWriteDouble(stream, &zone->circles_included[i].centerx); + packWriteDouble(stream, &zone->circles_included[i].centerz); + packWriteDouble(stream, &zone->circles_included[i].softradius); + packWriteDouble(stream, &zone->circles_included[i].hardradius); } - toolsSaveInt(f, &zone->circles_excluded_count); + packWriteInt(stream, &zone->circles_excluded_count); for (i = 0; i < zone->circles_excluded_count; i++) { - toolsSaveDouble(f, &zone->circles_excluded[i].value); - toolsSaveDouble(f, &zone->circles_excluded[i].centerx); - toolsSaveDouble(f, &zone->circles_excluded[i].centerz); - toolsSaveDouble(f, &zone->circles_excluded[i].softradius); - toolsSaveDouble(f, &zone->circles_excluded[i].hardradius); + packWriteDouble(stream, &zone->circles_excluded[i].value); + packWriteDouble(stream, &zone->circles_excluded[i].centerx); + packWriteDouble(stream, &zone->circles_excluded[i].centerz); + packWriteDouble(stream, &zone->circles_excluded[i].softradius); + packWriteDouble(stream, &zone->circles_excluded[i].hardradius); } } -void zoneLoad(FILE* f, Zone* zone) +void zoneLoad(PackStream* stream, Zone* zone) { int i; - toolsLoadInt(f, &zone->height_ranges_count); + packReadInt(stream, &zone->height_ranges_count); for (i = 0; i < zone->height_ranges_count; i++) { - toolsLoadDouble(f, &zone->height_ranges[i].value); - toolsLoadDouble(f, &zone->height_ranges[i].hardmin); - toolsLoadDouble(f, &zone->height_ranges[i].softmin); - toolsLoadDouble(f, &zone->height_ranges[i].softmax); - toolsLoadDouble(f, &zone->height_ranges[i].hardmax); + packReadDouble(stream, &zone->height_ranges[i].value); + packReadDouble(stream, &zone->height_ranges[i].hardmin); + packReadDouble(stream, &zone->height_ranges[i].softmin); + packReadDouble(stream, &zone->height_ranges[i].softmax); + packReadDouble(stream, &zone->height_ranges[i].hardmax); } - toolsLoadInt(f, &zone->slope_ranges_count); + packReadInt(stream, &zone->slope_ranges_count); for (i = 0; i < zone->slope_ranges_count; i++) { - toolsLoadDouble(f, &zone->slope_ranges[i].value); - toolsLoadDouble(f, &zone->slope_ranges[i].hardmin); - toolsLoadDouble(f, &zone->slope_ranges[i].softmin); - toolsLoadDouble(f, &zone->slope_ranges[i].softmax); - toolsLoadDouble(f, &zone->slope_ranges[i].hardmax); + packReadDouble(stream, &zone->slope_ranges[i].value); + packReadDouble(stream, &zone->slope_ranges[i].hardmin); + packReadDouble(stream, &zone->slope_ranges[i].softmin); + packReadDouble(stream, &zone->slope_ranges[i].softmax); + packReadDouble(stream, &zone->slope_ranges[i].hardmax); } - toolsLoadInt(f, &zone->circles_included_count); + packReadInt(stream, &zone->circles_included_count); for (i = 0; i < zone->circles_included_count; i++) { - toolsLoadDouble(f, &zone->circles_included[i].value); - toolsLoadDouble(f, &zone->circles_included[i].centerx); - toolsLoadDouble(f, &zone->circles_included[i].centerz); - toolsLoadDouble(f, &zone->circles_included[i].softradius); - toolsLoadDouble(f, &zone->circles_included[i].hardradius); + packReadDouble(stream, &zone->circles_included[i].value); + packReadDouble(stream, &zone->circles_included[i].centerx); + packReadDouble(stream, &zone->circles_included[i].centerz); + packReadDouble(stream, &zone->circles_included[i].softradius); + packReadDouble(stream, &zone->circles_included[i].hardradius); } - toolsLoadInt(f, &zone->circles_excluded_count); + packReadInt(stream, &zone->circles_excluded_count); for (i = 0; i < zone->circles_excluded_count; i++) { - toolsLoadDouble(f, &zone->circles_excluded[i].value); - toolsLoadDouble(f, &zone->circles_excluded[i].centerx); - toolsLoadDouble(f, &zone->circles_excluded[i].centerz); - toolsLoadDouble(f, &zone->circles_excluded[i].softradius); - toolsLoadDouble(f, &zone->circles_excluded[i].hardradius); + packReadDouble(stream, &zone->circles_excluded[i].value); + packReadDouble(stream, &zone->circles_excluded[i].centerx); + packReadDouble(stream, &zone->circles_excluded[i].centerz); + packReadDouble(stream, &zone->circles_excluded[i].softradius); + packReadDouble(stream, &zone->circles_excluded[i].hardradius); } } diff --git a/lib_paysages/zone.h b/lib_paysages/zone.h index 12c9e8e..45a31d0 100644 --- a/lib_paysages/zone.h +++ b/lib_paysages/zone.h @@ -2,6 +2,7 @@ #define _PAYSAGES_ZONE_H_ #include "shared/types.h" +#include "pack.h" #ifdef __cplusplus extern "C" { @@ -18,8 +19,8 @@ typedef struct Zone* zoneCreate(); void zoneDelete(Zone* zone); -void zoneSave(FILE* f, Zone* zone); -void zoneLoad(FILE* f, Zone* zone); +void zoneSave(PackStream* stream, Zone* zone); +void zoneLoad(PackStream* stream, Zone* zone); void zoneCopy(Zone* source, Zone* destination); void zoneIncludeCircleArea(Zone* zone, double value, double centerx, double centerz, double softradius, double hardradius); void zoneExcludeCircleArea(Zone* zone, double centerx, double centerz, double softradius, double hardradius);