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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2010-03-30 16:01:17 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2010-03-30 16:01:17 +0400
commit253de0ed86f273d0032acbbd0b8237a358b35cbd (patch)
treec75b539afcc64851d3b0a13de21e5dd02c41bb4c /source/blender/render/intern
parent052cb2afd22b9f54fdb1528066e6e3cba6db6e99 (diff)
* Assign weight from bones in weight paint mode now respects paint face
mask, also avoid making vertex groups if they will not be filled. * Add back image pin option in image editor header. * Fix deep shadow not respecting Cast Buffer Shadows option. * Tangent space normal map baking should work again now. * Fix a problem with particle duplis, due to own bugfix for #20350, the problem for that seems to be in dupliverts, not particles. * Fix external multires data link getting lost on exiting editmode. (commits 27776,27777,27830,27840,27841,27862 by Brecht from render25 branch)
Diffstat (limited to 'source/blender/render/intern')
-rw-r--r--source/blender/render/intern/raytrace/rayobject.cpp16
-rw-r--r--source/blender/render/intern/source/rayshade.c2
-rw-r--r--source/blender/render/intern/source/rendercore.c22
-rw-r--r--source/blender/render/intern/source/zbuf.c5
4 files changed, 22 insertions, 23 deletions
diff --git a/source/blender/render/intern/raytrace/rayobject.cpp b/source/blender/render/intern/raytrace/rayobject.cpp
index 19e41b0f92a..024577e9f1f 100644
--- a/source/blender/render/intern/raytrace/rayobject.cpp
+++ b/source/blender/render/intern/raytrace/rayobject.cpp
@@ -165,6 +165,11 @@ static inline int vlr_check_intersect_solid(Isect *is, ObjectInstanceRen* obi, V
return 0;
}
+static inline int vlr_check_bake(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
+{
+ return (obi->obr->ob != is->userdata);
+}
+
static inline int rayface_check_cullface(RayFace *face, Isect *is)
{
float nor[3];
@@ -189,17 +194,24 @@ static int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
if(is->orig.ob == face->ob && is->orig.face == face->face)
return 0;
-
+ /* check if we should intersect this face */
if(is->skip & RE_SKIP_VLR_RENDER_CHECK)
{
if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
return 0;
}
- if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL)
+ else if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL)
{
+ if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
+ return 0;
if(vlr_check_intersect_solid(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
return 0;
}
+ else if(is->skip & RE_SKIP_VLR_BAKE_CHECK) {
+ if(vlr_check_bake(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
+ return 0;
+ }
+
if(is->skip & RE_SKIP_CULLFACE)
{
if(rayface_check_cullface(face, is) == 0)
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 9c589ee1b64..015922216f9 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -1856,7 +1856,7 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env)
RE_RC_INIT(isec, *shi);
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
- isec.skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK | RE_SKIP_VLR_NON_SOLID_MATERIAL;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_NON_SOLID_MATERIAL;
isec.hint = 0;
isec.hit.ob = 0;
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 7375ea0f863..d9521bc892f 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -2266,21 +2266,8 @@ static void bake_displacement(void *handle, ShadeInput *shi, float dist, int x,
}
}
-#if 0
-static int bake_check_intersect(Isect *is, int ob, RayFace *face)
-{
- BakeShade *bs = (BakeShade*)is->userdata;
-
- /* no direction checking for now, doesn't always improve the result
- * (INPR(shi->facenor, bs->dir) > 0.0f); */
-
- return (R.objectinstance[ob & ~RE_RAY_TRANSFORM_OFFS].obr->ob != bs->actob);
-}
-#endif
-
static int bake_intersect_tree(RayObject* raytree, Isect* isect, float *start, float *dir, float sign, float *hitco, float *dist)
{
- //TODO, validate against blender 2.4x, results may have changed.
float maxdist;
int hit;
@@ -2288,7 +2275,7 @@ static int bake_intersect_tree(RayObject* raytree, Isect* isect, float *start, f
if(R.r.bake_maxdist > 0.0f)
maxdist= R.r.bake_maxdist;
else
- maxdist= FLT_MAX + R.r.bake_biasdist;
+ maxdist= RE_RAYTRACE_MAXDIST + R.r.bake_biasdist;
/* 'dir' is always normalized */
VECADDFAC(isect->start, start, dir, -R.r.bake_biasdist);
@@ -2299,10 +2286,6 @@ static int bake_intersect_tree(RayObject* raytree, Isect* isect, float *start, f
isect->labda = maxdist;
- /* TODO, 2.4x had this...
- hit = RE_ray_tree_intersect_check(R.raytree, isect, bake_check_intersect);
- ...the active object may NOT be ignored in some cases.
- */
hit = RE_rayobject_raycast(raytree, isect);
if(hit) {
hitco[0] = isect->start[0] + isect->labda*isect->vec[0];
@@ -2432,7 +2415,8 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
isec.orig.ob = obi;
isec.orig.face = vlr;
- isec.userdata= bs;
+ isec.userdata= bs->actob;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_BAKE_CHECK;
if(bake_intersect_tree(R.raytree, &isec, shi->co, shi->vn, sign, co, &dist)) {
if(!hit || len_v3v3(shi->co, co) < len_v3v3(shi->co, minco)) {
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 2e6892cbc1c..4f872a238cd 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -3312,7 +3312,10 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
if(vlr->mat!=ma) {
ma= vlr->mat;
- dofill= shadow || (((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP)) && !(ma->mode & MA_ONLYCAST));
+ if(shadow)
+ dofill= (ma->mode & MA_SHADBUF);
+ else
+ dofill= (((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP)) && !(ma->mode & MA_ONLYCAST));
}
if(dofill) {