Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2005-12-04 23:43:41 +0300
committerTon Roosendaal <ton@blender.org>2005-12-04 23:43:41 +0300
commitdd1f6c649a42258c71a2234eeede0b16b3ef245f (patch)
treed4f1ebf816bcd4bdc9e86e424d1064bf55060b5e
parent386ac3877a83cb19f5c4134bd108afc93f6f994c (diff)
Orange bramch:
New diffuse shader, "Fresnel", which using existing fresnel formula. Since it hilights edges (away from lamp), nice to fill darker parts with the new layering system. Weird stuff though; http://www.blender.org/bf/0001_0040.avi (Movie disappears in a couple of days!) Note; for ray-shadow you need to use the Bias, to prevent 'terminator' problems. I made that option default now.
-rw-r--r--source/blender/blenkernel/BKE_bad_level_calls.h1
-rw-r--r--source/blender/blenkernel/bad_level_call_stubs/stubs.c1
-rw-r--r--source/blender/blenkernel/intern/displist.c1
-rw-r--r--source/blender/blenkernel/intern/material.c2
-rw-r--r--source/blender/makesdna/DNA_material_types.h1
-rw-r--r--source/blender/render/extern/include/render.h1
-rw-r--r--source/blender/render/intern/source/rendercore.c41
-rw-r--r--source/blender/src/buttons_shading.c6
-rw-r--r--source/blender/src/previewrender.c1
9 files changed, 35 insertions, 20 deletions
diff --git a/source/blender/blenkernel/BKE_bad_level_calls.h b/source/blender/blenkernel/BKE_bad_level_calls.h
index a8d9693f62f..8a86e88406f 100644
--- a/source/blender/blenkernel/BKE_bad_level_calls.h
+++ b/source/blender/blenkernel/BKE_bad_level_calls.h
@@ -88,6 +88,7 @@ float WardIso_Spec(float *n, float *l, float *v, float a, int);
float Toon_Diff(float *n, float *l, float *v, float a, float b);
float OrenNayar_Diff(float *n, float *l, float *v, float rough);
float Minnaert_Diff(float nl, float *n, float *v, float a);
+float Fresnel_Diff(float *vn, float *lv, float *view, float ior, float fac);
void add_to_diffuse(float *, ShadeInput *, float, float, float, float);
void ramp_diffuse_result(float *diff, ShadeInput *shi);
diff --git a/source/blender/blenkernel/bad_level_call_stubs/stubs.c b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
index 778cb71f99a..98ecc32ee3f 100644
--- a/source/blender/blenkernel/bad_level_call_stubs/stubs.c
+++ b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
@@ -116,6 +116,7 @@ float WardIso_Spec(float *n, float *l, float *v, float a, int tangent){return 0;
float Toon_Diff(float *n, float *l, float *v, float a, float b){return 0;}
float OrenNayar_Diff(float *n, float *l, float *v, float rough){return 0;}
float Minnaert_Diff(float nl, float *n, float *v, float a){return 0;}
+float Fresnel_Diff(float *vn, float *lv, float *view, float ior, float fac){return 0;}
void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, float b){}
void ramp_diffuse_result(float *diff, ShadeInput *shi){}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index b143def9f32..f7cf3d6d931 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -537,6 +537,7 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
if(ma->diff_shader==MA_DIFF_ORENNAYAR) is= OrenNayar_Diff(nor, lv, shi.view, ma->roughness);
else if(ma->diff_shader==MA_DIFF_TOON) is= Toon_Diff(nor, lv, shi.view, ma->param[0], ma->param[1]);
else if(ma->diff_shader==MA_DIFF_MINNAERT) is= Minnaert_Diff(is, nor, shi.view, ma->darkness);
+ else if(ma->diff_shader==MA_DIFF_FRESNEL) is= Fresnel_Diff(nor, lv, shi.view, ma->param[0], ma->param[1]);
}
back= 0;
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index ef5a29020d4..c9c1b4fa98d 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -124,7 +124,7 @@ void init_material(Material *ma)
ma->pr_lamp= 3; /* two lamps, is bits */
ma->ml_flag= ML_RENDER; /* default render base material for layers */
- ma->mode= MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RADIO|MA_TANGENT_STR;
+ ma->mode= MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RADIO|MA_RAYBIAS|MA_TANGENT_STR;
}
Material *add_material(char *name)
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 395c438c6e3..3f74370ac1f 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -173,6 +173,7 @@ typedef struct Material {
#define MA_DIFF_ORENNAYAR 1
#define MA_DIFF_TOON 2
#define MA_DIFF_MINNAERT 3
+#define MA_DIFF_FRESNEL 4
/* spec_shader */
#define MA_SPEC_COOKTORR 0
diff --git a/source/blender/render/extern/include/render.h b/source/blender/render/extern/include/render.h
index abde461a935..ec724b55846 100644
--- a/source/blender/render/extern/include/render.h
+++ b/source/blender/render/extern/include/render.h
@@ -182,6 +182,7 @@ float WardIso_Spec(float *n, float *l, float *v, float rms, int tangent);
float OrenNayar_Diff(float *n, float *l, float *v, float rough);
float Toon_Diff( float *n, float *l, float *v, float size, float smooth);
float Minnaert_Diff( float nl, float *n, float *v, float darkness);
+float Fresnel_Diff(float *vn, float *lv, float *view, float ior, float fac);
void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, float b);
void ramp_diffuse_result(float *diff, ShadeInput *shi);
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 28eca24856e..8b6c4118786 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -649,6 +649,23 @@ static double Normalise_d(double *n)
return d;
}
+/* mix of 'real' fresnel and allowing control. grad defines blending gradient */
+float fresnel_fac(float *view, float *vn, float grad, float fac)
+{
+ float t1, t2;
+
+ if(fac==0.0) return 1.0;
+
+ t1= (view[0]*vn[0] + view[1]*vn[1] + view[2]*vn[2]);
+ if(t1>0.0) t2= 1.0+t1;
+ else t2= 1.0-t1;
+
+ t2= grad + (1.0-grad)*pow(t2, fac);
+
+ if(t2<0.0) return 0.0;
+ else if(t2>1.0) return 1.0;
+ return t2;
+}
static double saacos_d(double fac)
{
@@ -1010,6 +1027,11 @@ float Minnaert_Diff(float nl, float *n, float *v, float darkness)
return i;
}
+float Fresnel_Diff(float *vn, float *lv, float *view, float fac_i, float fac)
+{
+ return fresnel_fac(lv, vn, fac_i, fac);
+}
+
/* --------------------------------------------- */
/* also called from texture.c */
void calc_R_ref(ShadeInput *shi)
@@ -1059,24 +1081,6 @@ void calc_R_ref(ShadeInput *shi)
}
-/* mix of 'real' fresnel and allowing control. grad defines blending gradient */
-float fresnel_fac(float *view, float *vn, float grad, float fac)
-{
- float t1, t2;
-
- if(fac==0.0) return 1.0;
-
- t1= (view[0]*vn[0] + view[1]*vn[1] + view[2]*vn[2]);
- if(t1>0.0) t2= 1.0+t1;
- else t2= 1.0-t1;
-
- t2= grad + (1.0-grad)*pow(t2, fac);
-
- if(t2<0.0) return 0.0;
- else if(t2>1.0) return 1.0;
- return t2;
-}
-
void shade_color(ShadeInput *shi, ShadeResult *shr)
{
Material *ma= shi->mat;
@@ -1657,6 +1661,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if(ma->diff_shader==MA_DIFF_ORENNAYAR) is= OrenNayar_Diff_i(inp, vn, lv, view, ma->roughness);
else if(ma->diff_shader==MA_DIFF_TOON) is= Toon_Diff(vn, lv, view, ma->param[0], ma->param[1]);
else if(ma->diff_shader==MA_DIFF_MINNAERT) is= Minnaert_Diff(inp, vn, view, ma->darkness);
+ else if(ma->diff_shader==MA_DIFF_FRESNEL) is= Fresnel_Diff(vn, lv, view, ma->param[0], ma->param[1]);
else is= inp; // Lambert
}
diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c
index b6f600118de..3b31009858f 100644
--- a/source/blender/src/buttons_shading.c
+++ b/source/blender/src/buttons_shading.c
@@ -3125,7 +3125,7 @@ static void material_panel_shading(Material *ma)
uiBlockEndAlign(block);
}
else {
- char *str1= "Diffuse Shader%t|Lambert %x0|Oren-Nayar %x1|Toon %x2|Minnaert %x3";
+ char *str1= "Diffuse Shader%t|Lambert %x0|Oren-Nayar %x1|Toon %x2|Minnaert %x3|Fresnel %x4";
char *str2= "Specular Shader%t|CookTorr %x0|Phong %x1|Blinn %x2|Toon %x3|WardIso %x4";
/* diff shader buttons */
@@ -3141,6 +3141,10 @@ static void material_panel_shading(Material *ma)
}
else if(ma->diff_shader==MA_DIFF_MINNAERT)
uiDefButF(block, NUMSLI, B_MATPRV, "Dark:",90,160, 150,19, &(ma->darkness), 0.0, 2.0, 0, 0, "Sets Minnaert darkness");
+ else if(ma->diff_shader==MA_DIFF_FRESNEL) {
+ uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel:", 90, 160,150,19, &(ma->param[1]), 0.0, 5.0, 0, 0, "Power of Fresnel");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Fac:",90,140,150,19, &(ma->param[0]), 1.0, 5.0, 0, 0, "Blending factor");
+ }
uiBlockEndAlign(block);
/* spec shader buttons */
diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c
index 759baa72e5c..8604219387f 100644
--- a/source/blender/src/previewrender.c
+++ b/source/blender/src/previewrender.c
@@ -818,6 +818,7 @@ static void shade_lamp_loop_preview(ShadeInput *shi, ShadeResult *shr, int pr_la
if(mat->diff_shader==MA_DIFF_ORENNAYAR) is= OrenNayar_Diff(shi->vn, lv, shi->view, mat->roughness);
else if(mat->diff_shader==MA_DIFF_TOON) is= Toon_Diff(shi->vn, lv, shi->view, mat->param[0], mat->param[1]);
else if(mat->diff_shader==MA_DIFF_MINNAERT) is= Minnaert_Diff(is, shi->vn, shi->view, mat->darkness);
+ else if(mat->diff_shader==MA_DIFF_FRESNEL) is= Fresnel_Diff(shi->vn, lv, shi->view, mat->param[0], mat->param[1]);
// else Lambert
inp= (shi->refl*is + shi->emit);