Use better prng algo and fix randomness UI

This commit is contained in:
Luca Rood 2017-05-15 17:18:13 +02:00
parent 392b5b8212
commit 9035aa9cee
6 changed files with 30 additions and 30 deletions

View File

@ -68,7 +68,7 @@ class COLLECTION_PT_clay_settings(CollectionButtonsPanel, Panel):
col.template_override_property(collection_props, scene_props, "ssao_factor_edge")
col.template_override_property(collection_props, scene_props, "ssao_distance")
col.template_override_property(collection_props, scene_props, "ssao_attenuation")
col.template_override_property(collection_props, scene_props, "color_randomicity")
col.template_override_property(collection_props, scene_props, "hair_brightness_randomness")
class COLLECTION_PT_object_mode_settings(CollectionButtonsPanel, Panel):

View File

@ -614,7 +614,7 @@ class RENDER_PT_clay_collection_settings(RenderButtonsPanel, Panel):
col.prop(props, "ssao_factor_edge")
col.prop(props, "ssao_distance")
col.prop(props, "ssao_attenuation")
col.prop(props, "color_randomicity")
col.prop(props, "hair_brightness_randomness")
class RENDER_PT_eevee_poststack_settings(RenderButtonsPanel, Panel):
bl_label = "Post Process Stack"

View File

@ -65,7 +65,7 @@ typedef struct CLAY_UBO_Material {
BLI_STATIC_ASSERT_ALIGN(CLAY_UBO_Material, 16);
typedef struct CLAY_HAIR_UBO_Material {
float hair_randomicity;
float hair_randomness;
float matcap_id;
float matcap_rot[2];
float matcap_hsv[3];
@ -508,7 +508,7 @@ static int search_mat_to_ubo(
}
static int search_hair_mat_to_ubo(CLAY_Storage *storage, float matcap_rot, float matcap_hue, float matcap_sat,
float matcap_val, float hair_randomicity, int matcap_icon)
float matcap_val, float hair_randomness, int matcap_icon)
{
/* For now just use a linear search and test all parameters */
/* TODO make a hash table */
@ -519,7 +519,7 @@ static int search_hair_mat_to_ubo(CLAY_Storage *storage, float matcap_rot, float
(ubo->matcap_hsv[0] == matcap_hue + 0.5f) &&
(ubo->matcap_hsv[1] == matcap_sat * 2.0f) &&
(ubo->matcap_hsv[2] == matcap_val * 2.0f) &&
(ubo->hair_randomicity == hair_randomicity) &&
(ubo->hair_randomness == hair_randomness) &&
(ubo->matcap_id == matcap_to_index(matcap_icon)))
{
return i;
@ -557,7 +557,7 @@ static int push_mat_to_ubo(CLAY_Storage *storage, float matcap_rot, float matcap
}
static int push_hair_mat_to_ubo(CLAY_Storage *storage, float matcap_rot, float matcap_hue, float matcap_sat,
float matcap_val, float hair_randomicity, int matcap_icon)
float matcap_val, float hair_randomness, int matcap_icon)
{
int id = storage->hair_ubo_current_id;
CLAY_HAIR_UBO_Material *ubo = &storage->hair_mat_storage.materials[id];
@ -569,7 +569,7 @@ static int push_hair_mat_to_ubo(CLAY_Storage *storage, float matcap_rot, float m
ubo->matcap_hsv[1] = matcap_sat * 2.0f;
ubo->matcap_hsv[2] = matcap_val * 2.0f;
ubo->hair_randomicity = hair_randomicity;
ubo->hair_randomness = hair_randomness;
ubo->matcap_id = matcap_to_index(matcap_icon);
@ -598,16 +598,16 @@ static int mat_in_ubo(CLAY_Storage *storage, float matcap_rot, float matcap_hue,
}
static int hair_mat_in_ubo(CLAY_Storage *storage, float matcap_rot, float matcap_hue, float matcap_sat,
float matcap_val, float hair_randomicity, int matcap_icon)
float matcap_val, float hair_randomness, int matcap_icon)
{
/* Search material in UBO */
int id = search_hair_mat_to_ubo(storage, matcap_rot, matcap_hue, matcap_sat,
matcap_val, hair_randomicity, matcap_icon);
matcap_val, hair_randomness, matcap_icon);
/* if not found create it */
if (id == -1) {
id = push_hair_mat_to_ubo(storage, matcap_rot, matcap_hue, matcap_sat,
matcap_val, hair_randomicity, matcap_icon);
matcap_val, hair_randomness, matcap_icon);
}
return id;
@ -654,11 +654,11 @@ static DRWShadingGroup *CLAY_hair_shgrp_get(Object *ob, CLAY_StorageList *stl, C
float matcap_hue = BKE_collection_engine_property_value_get_float(props, "matcap_hue");
float matcap_sat = BKE_collection_engine_property_value_get_float(props, "matcap_saturation");
float matcap_val = BKE_collection_engine_property_value_get_float(props, "matcap_value");
float hair_randomicity = BKE_collection_engine_property_value_get_float(props, "color_randomicity");
float hair_randomness = BKE_collection_engine_property_value_get_float(props, "hair_brightness_randomness");
int matcap_icon = BKE_collection_engine_property_value_get_int(props, "matcap_icon");
int hair_id = hair_mat_in_ubo(stl->storage, matcap_rot, matcap_hue, matcap_sat,
matcap_val, hair_randomicity, matcap_icon);
matcap_val, hair_randomness, matcap_icon);
if (hair_shgrps[hair_id] == NULL) {
hair_shgrps[hair_id] = CLAY_hair_shgroup_create(psl->hair_pass, &e_data.hair_ubo_mat_idxs[hair_id]);
@ -818,7 +818,7 @@ static void CLAY_layer_collection_settings_create(RenderEngine *UNUSED(engine),
BKE_collection_engine_property_add_float(props, "ssao_distance", 0.2f);
BKE_collection_engine_property_add_float(props, "ssao_attenuation", 1.0f);
BKE_collection_engine_property_add_float(props, "ssao_factor_cavity", 1.0f);
BKE_collection_engine_property_add_float(props, "color_randomicity", 0.0f);
BKE_collection_engine_property_add_float(props, "hair_brightness_randomness", 0.0f);
}
static void CLAY_scene_layer_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)

View File

@ -12,7 +12,7 @@ layout(std140) uniform material_block {
uniform sampler2DArray matcaps;
uniform int mat_id;
#define randomicity shader_param[mat_id].one.x
#define randomness shader_param[mat_id].one.x
#define matcap_index shader_param[mat_id].one.y
#define matcap_rotation shader_param[mat_id].one.zw
#define matcap_hsv shader_param[mat_id].two.xyz
@ -136,7 +136,7 @@ void main()
float maxChan = max(max(col.r, col.g), col.b);
col += (colRand * maxChan * randomicity * 2.0) - (maxChan * randomicity);
col += (colRand * maxChan * randomness * 1.5) - (maxChan * randomness * 0.75);
fragColor.rgb = col;
fragColor.a = 1.0;

View File

@ -10,19 +10,19 @@ out vec3 tangent;
out vec3 viewPosition;
flat out float colRand;
/* TODO: This function yields great distribution, but might be a bit inefficient because of the 4 trig ops.
* Something more efficient would be nice */
float rand(int seed)
float rand(int s)
{
vec4 nums = vec4(0.0);
nums.x = mod(tan(mod(float(seed + 1) * 238965.0, 342.0)), 1.0) + 0.01;
nums.y = mod(tan(mod(float(seed + 1) * 34435643.0, 756.0)), 1.0) + 0.01;
nums.z = mod(tan(mod(float(seed + 1) * 4356757.0, 456.0)), 1.0) + 0.01;
nums.w = mod(tan(mod(float(seed + 1) * 778679.0, 987.0)), 1.0) + 0.01;
int seed = s * 1023423;
float num = mod((nums.x / nums.y) + 1 - (nums.z / nums.w), 1.0);
num += 0.5;
return mod(num, 1.0);
seed = (seed ^ 61) ^ (seed >> 16);
seed *= 9;
seed = seed ^ (seed >> 4);
seed *= 0x27d4eb2d;
seed = seed ^ (seed >> 15);
float value = float(seed);
value *= 1.0 / 42596.0;
return fract(value);
}
void main()

View File

@ -2578,7 +2578,7 @@ RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(ssao_factor_cavity)
RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(ssao_factor_edge)
RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(ssao_distance)
RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(ssao_attenuation)
RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(color_randomicity)
RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(hair_brightness_randomness)
#endif /* WITH_CLAY_ENGINE */
/* eevee engine */
@ -6378,9 +6378,9 @@ static void rna_def_layer_collection_engine_settings_clay(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update");
prop = RNA_def_property(srna, "color_randomicity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_color_randomicity_get", "rna_LayerEngineSettings_Clay_color_randomicity_set", NULL);
RNA_def_property_ui_text(prop, "Hair Brightness Randomicity", "Brightness randomicity for hair");
prop = RNA_def_property(srna, "hair_brightness_randomness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Clay_hair_brightness_randomness_get", "rna_LayerEngineSettings_Clay_hair_brightness_randomness_set", NULL);
RNA_def_property_ui_text(prop, "Hair Brightness Randomness", "Brightness randomness for hair");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollectionEngineSettings_update");