Fix T36165: blender internal HDR textures with negative values got clamped.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 23 Jan 2014 17:38:48 +0000 (18:38 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 23 Jan 2014 17:49:10 +0000 (18:49 +0100)
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.

release/scripts/startup/bl_ui/properties_texture.py
source/blender/makesdna/DNA_texture_types.h
source/blender/makesrna/intern/rna_texture.c
source/blender/render/intern/include/texture.h

index c03ea1c5422a4de1dcf0ca9481732bcffdfe40e0..009309479ec9efd269164046d605321a84e564c0 100644 (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 #
 
 
index fcd0575f1c5d3b3ff9f59621357f7a326616aa70..a3025a7fb3196a3bb2239abc2383650fbf4a4e2a 100644 (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
index b453965d21f9998753e4bfdb52a70bb8629e3ef6..37a0ee0da8e742d3389518e2d2f70b0e11983aee 100644 (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);
index b23d6b09524fefe4e7d59b54b68e3075f001bf1d..0e0337d6e0ed3a87ac57ed4c844f90998e9ad787 100644 (file)
 #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,                        \