Fix T36165: blender internal HDR textures with negative values got clamped.

For example for vector displacement, you may have an EXR texture that has
negative colors values. Blender clamps these by default, now the Colors panel
for textures has a Clamp option to disable this clamping.

This option affects all texture types and is enabled by default, you need
to disable it if you want negative values to have an influence.

Patch by Fredrik Hansson with modifications by me.
This commit is contained in:
2014-01-23 18:38:48 +01:00
parent b119f471f4
commit 9f903208e8
4 changed files with 20 additions and 7 deletions

View File

@@ -269,6 +269,9 @@ class TEXTURE_PT_colors(TextureButtonsPanel, Panel):
col.prop(tex, "contrast")
col.prop(tex, "saturation")
col = layout.column()
col.prop(tex, "use_clamp", text="Clamp")
# Texture Slot Panels #

View File

@@ -382,6 +382,7 @@ typedef struct ColorMapping {
#define TEX_REPEAT_YMIR 256
#define TEX_FLAG_MASK ( TEX_COLORBAND | TEX_FLIPBLEND | TEX_NEGALPHA | TEX_CHECKER_ODD | TEX_CHECKER_EVEN | TEX_PRV_ALPHA | TEX_PRV_NOR | TEX_REPEAT_XMIR | TEX_REPEAT_YMIR )
#define TEX_DS_EXPAND 512
#define TEX_NO_CLAMP 1024
/* extend (starts with 1 because of backward comp.) */
#define TEX_EXTEND 1

View File

@@ -2010,6 +2010,11 @@ static void rna_def_texture(BlenderRNA *brna)
RNA_def_property_enum_funcs(prop, NULL, "rna_Texture_type_set", NULL);
RNA_def_property_ui_text(prop, "Type", "");
RNA_def_property_update(prop, 0, "rna_Texture_update");
prop = RNA_def_property(srna, "use_clamp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", TEX_NO_CLAMP);
RNA_def_property_ui_text(prop, "Clamp", "Set negative texture RGB and intensity values to zero, for some uses like displacement this option can be disabled to get the full range");
RNA_def_property_update(prop, 0, "rna_Texture_update");
prop = RNA_def_property(srna, "use_color_ramp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_COLORBAND);

View File

@@ -33,18 +33,22 @@
#ifndef __TEXTURE_H__
#define __TEXTURE_H__
#define BRICONT \
texres->tin= (texres->tin-0.5f) * tex->contrast+tex->bright-0.5f; \
if (texres->tin < 0.0f) texres->tin= 0.0f; \
else if (texres->tin > 1.0f) texres->tin= 1.0f; \
#define BRICONT \
texres->tin= (texres->tin-0.5f) * tex->contrast+tex->bright-0.5f; \
if(!(tex->flag & TEX_NO_CLAMP)) { \
if (texres->tin < 0.0f) texres->tin= 0.0f; \
else if (texres->tin > 1.0f) texres->tin= 1.0f; \
} \
#define BRICONTRGB \
texres->tr= tex->rfac*((texres->tr-0.5f)*tex->contrast+tex->bright-0.5f); \
if (texres->tr<0.0f) texres->tr= 0.0f; \
texres->tg= tex->gfac*((texres->tg-0.5f)*tex->contrast+tex->bright-0.5f); \
if (texres->tg<0.0f) texres->tg= 0.0f; \
texres->tb= tex->bfac*((texres->tb-0.5f)*tex->contrast+tex->bright-0.5f); \
if (texres->tb<0.0f) texres->tb= 0.0f; \
if(!(tex->flag & TEX_NO_CLAMP)) { \
if (texres->tr < 0.0f) texres->tr= 0.0f; \
if (texres->tg < 0.0f) texres->tg= 0.0f; \
if (texres->tb < 0.0f) texres->tb= 0.0f; \
} \
if (tex->saturation != 1.0f) { \
float _hsv[3]; \
rgb_to_hsv(texres->tr, texres->tg, texres->tb, \