Separated texture layer results for previews
This commit is contained in:
parent
7cd74b2c8a
commit
05c0a58875
5 changed files with 74 additions and 41 deletions
|
@ -147,22 +147,6 @@ void FreeFormHelper::setPresetButton(QPushButton* button)
|
|||
connect(button, SIGNAL(clicked()), this, SLOT(processPresetClicked()));
|
||||
}
|
||||
|
||||
void FreeFormHelper::processPresetClicked()
|
||||
{
|
||||
bool ok;
|
||||
QString item = QInputDialog::getItem(_form_widget, tr("Choose a preset"), tr("Preset settings : "), _presets, 0, false, &ok);
|
||||
|
||||
if (ok && !item.isEmpty())
|
||||
{
|
||||
int preset = _presets.indexOf(item);
|
||||
if (preset >= 0)
|
||||
{
|
||||
emit presetSelected(preset);
|
||||
emit needLocalRefreshing();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FreeFormHelper::openDialog(QDialog* dialog)
|
||||
{
|
||||
if (dialog->exec())
|
||||
|
@ -296,3 +280,19 @@ void FreeFormHelper::processDecimalChange(double value)
|
|||
processDataChange();
|
||||
}
|
||||
}
|
||||
|
||||
void FreeFormHelper::processPresetClicked()
|
||||
{
|
||||
bool ok;
|
||||
QString item = QInputDialog::getItem(_form_widget, tr("Choose a preset"), tr("Preset settings : "), _presets, 0, false, &ok);
|
||||
|
||||
if (ok && !item.isEmpty())
|
||||
{
|
||||
int preset = _presets.indexOf(item);
|
||||
if (preset >= 0)
|
||||
{
|
||||
emit presetSelected(preset);
|
||||
processDataChange();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -106,6 +106,7 @@ void MainTexturesForm::selectLayer(int layer)
|
|||
ui->preview_texture->setEnabled(true);
|
||||
|
||||
preview_layer_coverage->setLayer(layer);
|
||||
preview_layer_look->setLayer(layer);
|
||||
|
||||
ui->preview_coverage->redraw();
|
||||
ui->preview_texture->redraw();
|
||||
|
|
|
@ -56,27 +56,25 @@ typedef struct
|
|||
Layers* layers;
|
||||
} TexturesDefinition;
|
||||
|
||||
/*typedef struct
|
||||
typedef struct
|
||||
{
|
||||
double global_presence;
|
||||
double local_presence;
|
||||
Vector3 displaced_location;
|
||||
Vector3 displaced_normal;
|
||||
TexturesLayerDefinition* layer;
|
||||
double presence;
|
||||
Color color;
|
||||
Color cancelled_color;
|
||||
} TexturesLayerResult;*/
|
||||
} TexturesLayerResult;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Vector3 base_location;
|
||||
Vector3 base_normal;
|
||||
/*int layer_count;
|
||||
TexturesLayerResult layers[TEXTURES_MAX_LAYERS];*/
|
||||
int layer_count;
|
||||
TexturesLayerResult layers[TEXTURES_MAX_LAYERS];
|
||||
Vector3 final_location;
|
||||
Color final_color;
|
||||
} TexturesResult;
|
||||
|
||||
typedef Vector3 (*FuncTexturesDisplaceTerrain)(Renderer* renderer, TerrainResult terrain);
|
||||
typedef double (*FuncTexturesGetBasePresence)(Renderer* renderer, int layer, TerrainResult terrain);
|
||||
typedef TexturesResult (*FuncTexturesApplyToTerrain)(Renderer* renderer, double x, double z);
|
||||
|
||||
typedef struct
|
||||
|
@ -84,6 +82,7 @@ typedef struct
|
|||
TexturesDefinition* definition;
|
||||
|
||||
FuncTexturesDisplaceTerrain displaceTerrain;
|
||||
FuncTexturesGetBasePresence getBasePresence;
|
||||
FuncTexturesApplyToTerrain applyToTerrain;
|
||||
} TexturesRenderer;
|
||||
|
||||
|
|
|
@ -40,9 +40,19 @@ Color TexturesPreviewLayerCoverage_getColor(Renderer* renderer, double x, double
|
|||
return result;
|
||||
}
|
||||
|
||||
static double _getPresenceFull(Renderer* renderer, int layer, TerrainResult terrain)
|
||||
{
|
||||
UNUSED(renderer);
|
||||
UNUSED(layer);
|
||||
UNUSED(terrain);
|
||||
|
||||
return 1.0;
|
||||
}
|
||||
|
||||
void TexturesPreviewLayerLook_bind(Renderer* renderer, TexturesDefinition* definition)
|
||||
{
|
||||
TexturesRendererClass.bind(renderer, definition);
|
||||
renderer->textures->getBasePresence = _getPresenceFull;
|
||||
}
|
||||
|
||||
Color TexturesPreviewLayerLook_getColor(Renderer* renderer, double x, double y, double scaling, int layer)
|
||||
|
@ -50,7 +60,15 @@ Color TexturesPreviewLayerLook_getColor(Renderer* renderer, double x, double y,
|
|||
UNUSED(scaling);
|
||||
UNUSED(layer);
|
||||
|
||||
return renderer->textures->applyToTerrain(renderer, x, y).final_color;
|
||||
TexturesResult result = renderer->textures->applyToTerrain(renderer, x, y);
|
||||
if (layer >= 0 && layer < result.layer_count)
|
||||
{
|
||||
return result.layers[layer].color;
|
||||
}
|
||||
else
|
||||
{
|
||||
return COLOR_BLACK;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -104,12 +104,11 @@ static Vector3 _realDisplaceTerrain(Renderer* renderer, TerrainResult terrain)
|
|||
return v3Add(terrain.location, v3Scale(v3Normalize(terrain.normal), offset));
|
||||
}
|
||||
|
||||
typedef struct
|
||||
static double _realGetBasePresence(Renderer* renderer, int layer, TerrainResult terrain)
|
||||
{
|
||||
TexturesLayerDefinition* layer;
|
||||
double presence;
|
||||
Color color;
|
||||
} TexturesIntermediaryResult;
|
||||
TexturesLayerDefinition* layerdef = layersGetLayer(renderer->textures->definition->layers, layer);
|
||||
return texturesGetLayerBasePresence(layerdef, terrain);
|
||||
}
|
||||
|
||||
static TexturesResult _realApplyToTerrain(Renderer* renderer, double x, double z)
|
||||
{
|
||||
|
@ -122,19 +121,24 @@ static TexturesResult _realApplyToTerrain(Renderer* renderer, double x, double z
|
|||
/* TODO Displaced textures had their presence already computed before, store that result and use it */
|
||||
|
||||
/* Find presence of each layer */
|
||||
TexturesIntermediaryResult layers_info[TEXTURES_MAX_LAYERS];
|
||||
int i, n;
|
||||
n = layersCount(textures->layers);
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
layers_info[i].layer = layersGetLayer(textures->layers, i);
|
||||
layers_info[i].presence = texturesGetLayerBasePresence(layers_info[i].layer, terrain);
|
||||
if (layers_info[i].presence > 0.0)
|
||||
TexturesLayerResult* info = result.layers + i;
|
||||
info->layer = layersGetLayer(textures->layers, i);
|
||||
info->presence = renderer->textures->getBasePresence(renderer, i, terrain);
|
||||
if (info->presence > 0.0)
|
||||
{
|
||||
Vector3 normal = _getDetailNormal(renderer, terrain.location, terrain.normal, layers_info[i].layer);
|
||||
layers_info[i].color = renderer->applyLightingToSurface(renderer, terrain.location, normal, &layers_info[i].layer->material);
|
||||
Vector3 normal = _getDetailNormal(renderer, terrain.location, terrain.normal, info->layer);
|
||||
info->color = renderer->applyLightingToSurface(renderer, terrain.location, normal, &info->layer->material);
|
||||
}
|
||||
else
|
||||
{
|
||||
info->color = COLOR_TRANSPARENT;
|
||||
}
|
||||
}
|
||||
result.layer_count = n;
|
||||
|
||||
result.base_location = terrain.location;
|
||||
result.base_normal = terrain.normal;
|
||||
|
@ -142,10 +146,10 @@ static TexturesResult _realApplyToTerrain(Renderer* renderer, double x, double z
|
|||
result.final_color = COLOR_GREEN;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
if (layers_info[i].presence > 0.0)
|
||||
if (result.layers[i].presence > 0.0)
|
||||
{
|
||||
layers_info[i].color.a = layers_info[i].presence;
|
||||
colorMask(&result.final_color, &layers_info[i].color);
|
||||
result.layers[i].color.a = result.layers[i].presence;
|
||||
colorMask(&result.final_color, &result.layers[i].color);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -160,6 +164,15 @@ static Vector3 _fakeDisplaceTerrain(Renderer* renderer, TerrainResult terrain)
|
|||
return terrain.location;
|
||||
}
|
||||
|
||||
static double _fakeGetBasePresence(Renderer* renderer, int layer, TerrainResult terrain)
|
||||
{
|
||||
UNUSED(renderer);
|
||||
UNUSED(layer);
|
||||
UNUSED(terrain);
|
||||
|
||||
return 1.0;
|
||||
}
|
||||
|
||||
static TexturesResult _fakeApplyToTerrain(Renderer* renderer, double x, double z)
|
||||
{
|
||||
UNUSED(renderer);
|
||||
|
@ -170,7 +183,7 @@ static TexturesResult _fakeApplyToTerrain(Renderer* renderer, double x, double z
|
|||
result.base_location.y = 0.0;
|
||||
result.base_location.z = z;
|
||||
result.base_normal = VECTOR_UP;
|
||||
/*result.layer_count = 0;*/
|
||||
result.layer_count = 0;
|
||||
result.final_location = result.base_location;
|
||||
result.final_color = COLOR_WHITE;
|
||||
|
||||
|
@ -186,6 +199,7 @@ static TexturesRenderer* _createRenderer()
|
|||
result->definition = TexturesDefinitionClass.create();
|
||||
|
||||
result->displaceTerrain = _fakeDisplaceTerrain;
|
||||
result->getBasePresence = _fakeGetBasePresence;
|
||||
result->applyToTerrain = _fakeApplyToTerrain;
|
||||
|
||||
return result;
|
||||
|
@ -202,6 +216,7 @@ static void _bindRenderer(Renderer* renderer, TexturesDefinition* definition)
|
|||
TexturesDefinitionClass.copy(definition, renderer->textures->definition);
|
||||
|
||||
renderer->textures->displaceTerrain = _realDisplaceTerrain;
|
||||
renderer->textures->getBasePresence = _realGetBasePresence;
|
||||
renderer->textures->applyToTerrain = _realApplyToTerrain;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue