paysages : Layer sorting (WIP).
git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@378 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
parent
d3718bde00
commit
50226f0000
10 changed files with 98 additions and 41 deletions
|
@ -29,6 +29,7 @@ GUI :
|
|||
* Added grid and axis labels to curve editor.
|
||||
* Added camera location to previews.
|
||||
* Added toggles and choices to configure some previews.
|
||||
* Added layer sorting.
|
||||
|
||||
Misc :
|
||||
* Version handling in saved files.
|
||||
|
|
2
TODO
2
TODO
|
@ -6,7 +6,7 @@ Technology Preview 2 :
|
|||
- Keep skydome lights in cache for a render.
|
||||
- Add buttons to restore "auto" default values in tabs and dialogs.
|
||||
- Add "hardness to light" and shadow control ("minimum lighting") to material.
|
||||
- Add layer sorting/naming.
|
||||
- Add layer naming.
|
||||
- Add logarithmic sliders for some float values.
|
||||
- Improve previews.
|
||||
=> Add user markers on OSD
|
||||
|
|
|
@ -201,6 +201,14 @@ void FormClouds::layerAddedEvent()
|
|||
}
|
||||
}
|
||||
|
||||
void FormClouds::layerMovedEvent(int layer, int new_position)
|
||||
{
|
||||
cloudsMoveLayer(&_definition, layer, new_position);
|
||||
setLayerCount(cloudsGetLayerCount(&_definition));
|
||||
|
||||
BaseForm::layerMovedEvent(layer, new_position);
|
||||
}
|
||||
|
||||
void FormClouds::layerDeletedEvent(int layer)
|
||||
{
|
||||
cloudsDeleteLayer(&_definition, layer);
|
||||
|
|
|
@ -22,6 +22,7 @@ protected slots:
|
|||
protected:
|
||||
virtual void layerAddedEvent();
|
||||
virtual void layerDeletedEvent(int layer);
|
||||
virtual void layerMovedEvent(int layer, int new_position);
|
||||
virtual void layerSelectedEvent(int layer);
|
||||
|
||||
private:
|
||||
|
|
|
@ -198,6 +198,14 @@ void FormTextures::layerDeletedEvent(int layer)
|
|||
BaseForm::layerDeletedEvent(layer);
|
||||
}
|
||||
|
||||
void FormTextures::layerMovedEvent(int layer, int new_position)
|
||||
{
|
||||
texturesMoveLayer(&_definition, layer, new_position);
|
||||
setLayerCount(texturesGetLayerCount(&_definition));
|
||||
|
||||
BaseForm::layerMovedEvent(layer, new_position);
|
||||
}
|
||||
|
||||
void FormTextures::layerSelectedEvent(int layer)
|
||||
{
|
||||
texturesLayerCopyDefinition(texturesGetLayer(&_definition, layer), &_layer);
|
||||
|
|
|
@ -16,6 +16,7 @@ public:
|
|||
protected:
|
||||
virtual void layerAddedEvent();
|
||||
virtual void layerDeletedEvent(int layer);
|
||||
virtual void layerMovedEvent(int layer, int new_position);
|
||||
virtual void layerSelectedEvent(int layer);
|
||||
|
||||
public slots:
|
||||
|
|
|
@ -271,6 +271,24 @@ void cloudsDeleteLayer(CloudsDefinition* definition, int layer)
|
|||
}
|
||||
}
|
||||
|
||||
void cloudsMoveLayer(CloudsDefinition* definition, int layer, int new_position)
|
||||
{
|
||||
if (layer >= 0 && layer < definition->nblayers && new_position != layer && new_position >= 0 && new_position < definition->nblayers)
|
||||
{
|
||||
CloudsLayerDefinition temp;
|
||||
temp = definition->layers[layer];
|
||||
if (new_position > layer)
|
||||
{
|
||||
memmove(definition->layers + layer, definition->layers + layer + 1, sizeof(CloudsLayerDefinition) * (new_position - layer));
|
||||
}
|
||||
else
|
||||
{
|
||||
memmove(definition->layers + new_position, definition->layers + new_position + 1, sizeof(CloudsLayerDefinition) * (layer - new_position));
|
||||
}
|
||||
definition->layers[new_position] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
static inline double _getDistanceToBorder(CloudsLayerDefinition* layer, Vector3 position)
|
||||
{
|
||||
double density, coverage, val;
|
||||
|
|
|
@ -60,6 +60,7 @@ int cloudsGetLayerCount(CloudsDefinition* definition);
|
|||
CloudsLayerDefinition* cloudsGetLayer(CloudsDefinition* definition, int layer);
|
||||
int cloudsAddLayer(CloudsDefinition* definition);
|
||||
void cloudsDeleteLayer(CloudsDefinition* definition, int layer);
|
||||
void cloudsMoveLayer(CloudsDefinition* definition, int layer, int new_position);
|
||||
|
||||
Color cloudsApplyLayer(CloudsLayerDefinition* definition, Color base, Renderer* renderer, Vector3 start, Vector3 end);
|
||||
Color cloudsApply(CloudsDefinition* definition, Color base, Renderer* renderer, Vector3 start, Vector3 end);
|
||||
|
|
|
@ -36,17 +36,17 @@ void texturesSave(PackStream* stream, TexturesDefinition* definition)
|
|||
{
|
||||
int i;
|
||||
|
||||
packWriteInt(stream, &definition->nbtextures);
|
||||
for (i = 0; i < definition->nbtextures; i++)
|
||||
packWriteInt(stream, &definition->nblayers);
|
||||
for (i = 0; i < definition->nblayers; i++)
|
||||
{
|
||||
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);
|
||||
packWriteDouble(stream, &definition->textures[i].thickness);
|
||||
packWriteDouble(stream, &definition->textures[i].slope_range);
|
||||
packWriteDouble(stream, &definition->textures[i].thickness_transparency);
|
||||
zoneSave(stream, definition->layers[i].zone);
|
||||
noiseSaveGenerator(stream, definition->layers[i].bump_noise);
|
||||
packWriteDouble(stream, &definition->layers[i].bump_height);
|
||||
packWriteDouble(stream, &definition->layers[i].bump_scaling);
|
||||
materialSave(stream, &definition->layers[i].material);
|
||||
packWriteDouble(stream, &definition->layers[i].thickness);
|
||||
packWriteDouble(stream, &definition->layers[i].slope_range);
|
||||
packWriteDouble(stream, &definition->layers[i].thickness_transparency);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ void texturesLoad(PackStream* stream, TexturesDefinition* definition)
|
|||
TextureLayerDefinition* layer;
|
||||
int i, n;
|
||||
|
||||
while (definition->nbtextures > 0)
|
||||
while (definition->nblayers > 0)
|
||||
{
|
||||
texturesDeleteLayer(definition, 0);
|
||||
}
|
||||
|
@ -63,16 +63,16 @@ void texturesLoad(PackStream* stream, TexturesDefinition* definition)
|
|||
packReadInt(stream, &n);
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
layer = definition->textures + texturesAddLayer(definition);
|
||||
layer = definition->layers + texturesAddLayer(definition);
|
||||
|
||||
zoneLoad(stream, layer->zone);
|
||||
noiseLoadGenerator(stream, layer->bump_noise);
|
||||
packReadDouble(stream, &layer->bump_height);
|
||||
packReadDouble(stream, &layer->bump_scaling);
|
||||
materialLoad(stream, &layer->material);
|
||||
packReadDouble(stream, &definition->textures[i].thickness);
|
||||
packReadDouble(stream, &definition->textures[i].slope_range);
|
||||
packReadDouble(stream, &definition->textures[i].thickness_transparency);
|
||||
packReadDouble(stream, &definition->layers[i].thickness);
|
||||
packReadDouble(stream, &definition->layers[i].slope_range);
|
||||
packReadDouble(stream, &definition->layers[i].thickness_transparency);
|
||||
}
|
||||
|
||||
texturesValidateDefinition(definition);
|
||||
|
@ -82,14 +82,14 @@ TexturesDefinition texturesCreateDefinition()
|
|||
{
|
||||
TexturesDefinition result;
|
||||
|
||||
result.nbtextures = 0;
|
||||
result.nblayers = 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void texturesDeleteDefinition(TexturesDefinition* definition)
|
||||
{
|
||||
while (definition->nbtextures > 0)
|
||||
while (definition->nblayers > 0)
|
||||
{
|
||||
texturesDeleteLayer(definition, 0);
|
||||
}
|
||||
|
@ -100,23 +100,23 @@ void texturesCopyDefinition(TexturesDefinition* source, TexturesDefinition* dest
|
|||
TextureLayerDefinition* layer;
|
||||
int i;
|
||||
|
||||
while (destination->nbtextures > 0)
|
||||
while (destination->nblayers > 0)
|
||||
{
|
||||
texturesDeleteLayer(destination, 0);
|
||||
}
|
||||
for (i = 0; i < source->nbtextures; i++)
|
||||
for (i = 0; i < source->nblayers; i++)
|
||||
{
|
||||
layer = texturesGetLayer(destination, texturesAddLayer(destination));
|
||||
texturesLayerCopyDefinition(source->textures + i, layer);
|
||||
texturesLayerCopyDefinition(source->layers + i, layer);
|
||||
}
|
||||
}
|
||||
|
||||
void texturesValidateDefinition(TexturesDefinition* definition)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < definition->nbtextures; i++)
|
||||
for (i = 0; i < definition->nblayers; i++)
|
||||
{
|
||||
texturesLayerValidateDefinition(definition->textures + i);
|
||||
texturesLayerValidateDefinition(definition->layers + i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -172,14 +172,14 @@ void texturesLayerValidateDefinition(TextureLayerDefinition* definition)
|
|||
|
||||
int texturesGetLayerCount(TexturesDefinition* definition)
|
||||
{
|
||||
return definition->nbtextures;
|
||||
return definition->nblayers;
|
||||
}
|
||||
|
||||
TextureLayerDefinition* texturesGetLayer(TexturesDefinition* definition, int layer)
|
||||
{
|
||||
if (layer >= 0 && layer < definition->nbtextures)
|
||||
if (layer >= 0 && layer < definition->nblayers)
|
||||
{
|
||||
return definition->textures + layer;
|
||||
return definition->layers + layer;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -189,11 +189,11 @@ TextureLayerDefinition* texturesGetLayer(TexturesDefinition* definition, int lay
|
|||
|
||||
int texturesAddLayer(TexturesDefinition* definition)
|
||||
{
|
||||
if (definition->nbtextures < TEXTURES_MAX_LAYERS)
|
||||
if (definition->nblayers < TEXTURES_MAX_LAYERS)
|
||||
{
|
||||
definition->textures[definition->nbtextures] = texturesLayerCreateDefinition();
|
||||
definition->layers[definition->nblayers] = texturesLayerCreateDefinition();
|
||||
|
||||
return definition->nbtextures++;
|
||||
return definition->nblayers++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -203,14 +203,32 @@ int texturesAddLayer(TexturesDefinition* definition)
|
|||
|
||||
void texturesDeleteLayer(TexturesDefinition* definition, int layer)
|
||||
{
|
||||
if (layer >= 0 && layer < definition->nbtextures)
|
||||
if (layer >= 0 && layer < definition->nblayers)
|
||||
{
|
||||
texturesLayerDeleteDefinition(definition->textures + layer);
|
||||
if (definition->nbtextures > 1 && layer < definition->nbtextures - 1)
|
||||
texturesLayerDeleteDefinition(definition->layers + layer);
|
||||
if (definition->nblayers > 1 && layer < definition->nblayers - 1)
|
||||
{
|
||||
memmove(definition->textures + layer, definition->textures + layer + 1, sizeof(TextureLayerDefinition) * (definition->nbtextures - layer - 1));
|
||||
memmove(definition->layers + layer, definition->layers + layer + 1, sizeof(TextureLayerDefinition) * (definition->nblayers - layer - 1));
|
||||
}
|
||||
definition->nbtextures--;
|
||||
definition->nblayers--;
|
||||
}
|
||||
}
|
||||
|
||||
void texturesMoveLayer(TexturesDefinition* definition, int layer, int new_position)
|
||||
{
|
||||
if (layer >= 0 && layer < definition->nblayers && new_position != layer && new_position >= 0 && new_position < definition->nblayers)
|
||||
{
|
||||
TextureLayerDefinition temp;
|
||||
temp = definition->layers[layer];
|
||||
if (new_position > layer)
|
||||
{
|
||||
memmove(definition->layers + layer, definition->layers + layer + 1, sizeof(TextureLayerDefinition) * (new_position - layer));
|
||||
}
|
||||
else
|
||||
{
|
||||
memmove(definition->layers + new_position, definition->layers + new_position + 1, sizeof(TextureLayerDefinition) * (layer - new_position));
|
||||
}
|
||||
definition->layers[new_position] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -360,17 +378,17 @@ Color texturesGetColor(TexturesDefinition* definition, Renderer* renderer, doubl
|
|||
|
||||
results[0] = _getTerrainResult(renderer, x, z, detail);
|
||||
|
||||
for (i = 0; i < definition->nbtextures; i++)
|
||||
for (i = 0; i < definition->nblayers; i++)
|
||||
{
|
||||
results[i + 1] = _getLayerResult(definition->textures + i, renderer, x, z, detail);
|
||||
results[i + 1] = _getLayerResult(definition->layers + i, renderer, x, z, detail);
|
||||
}
|
||||
|
||||
qsort(results, definition->nbtextures + 1, sizeof(TextureResult), _cmpResults);
|
||||
qsort(results, definition->nblayers + 1, sizeof(TextureResult), _cmpResults);
|
||||
|
||||
/* Pre compute alpha channel */
|
||||
start = 0;
|
||||
last_height = results[0].thickness;
|
||||
for (i = 1; i <= definition->nbtextures; i++)
|
||||
for (i = 1; i <= definition->nblayers; i++)
|
||||
{
|
||||
thickness = results[i].thickness - last_height;
|
||||
last_height = results[i].thickness;
|
||||
|
@ -411,7 +429,7 @@ Color texturesGetColor(TexturesDefinition* definition, Renderer* renderer, doubl
|
|||
{
|
||||
result = COLOR_GREEN;
|
||||
}
|
||||
for (i = start; i <= definition->nbtextures; i++)
|
||||
for (i = start; i <= definition->nblayers; i++)
|
||||
{
|
||||
if (results[i].thickness)
|
||||
{
|
||||
|
|
|
@ -27,8 +27,8 @@ typedef struct
|
|||
|
||||
typedef struct
|
||||
{
|
||||
int nbtextures;
|
||||
TextureLayerDefinition textures[TEXTURES_MAX_LAYERS];
|
||||
int nblayers;
|
||||
TextureLayerDefinition layers[TEXTURES_MAX_LAYERS];
|
||||
} TexturesDefinition;
|
||||
|
||||
void texturesInit();
|
||||
|
@ -50,6 +50,7 @@ int texturesGetLayerCount(TexturesDefinition* definition);
|
|||
TextureLayerDefinition* texturesGetLayer(TexturesDefinition* definition, int layer);
|
||||
int texturesAddLayer(TexturesDefinition* definition);
|
||||
void texturesDeleteLayer(TexturesDefinition* definition, int layer);
|
||||
void texturesMoveLayer(TexturesDefinition* definition, int layer, int new_position);
|
||||
|
||||
double texturesGetLayerCoverage(TextureLayerDefinition* definition, Renderer* renderer, Vector3 location, double detail);
|
||||
Color texturesGetLayerColor(TextureLayerDefinition* definition, Renderer* renderer, Vector3 location, double detail);
|
||||
|
|
Loading…
Reference in a new issue