[Bf-blender-cvs] [15927e0] master: Fix T37675: blender internal viewport render not updating properly with volumes.
Brecht Van Lommel
noreply at git.blender.org
Wed Dec 18 15:47:03 CET 2013
Commit: 15927e05e4f13eb4bb23e82c378a4d0de91456b4
Author: Brecht Van Lommel
Date: Wed Dec 18 15:41:28 2013 +0100
http://developer.blender.org/rB15927e05e4f13eb4bb23e82c378a4d0de91456b4
Fix T37675: blender internal viewport render not updating properly with volumes.
===================================================================
M source/blender/render/intern/include/renderdatabase.h
M source/blender/render/intern/source/convertblender.c
M source/blender/render/intern/source/rayshade.c
M source/blender/render/intern/source/renderdatabase.c
M source/blender/render/intern/source/volume_precache.c
M source/blender/render/intern/source/volumetric.c
===================================================================
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index 9e48299..891505d 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -47,6 +47,7 @@ struct StrandBuffer;
struct StrandRen;
struct ObjectInstanceRen;
struct RadFace;
+struct Isect;
#define RE_QUAD_MASK 0x7FFFFFF
#define RE_QUAD_OFFS 0x8000000
@@ -113,6 +114,11 @@ struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struc
struct ObjectInstanceRen *RE_addRenderInstance(struct Render *re, struct ObjectRen *obr, struct Object *ob, struct Object *par, int index, int psysindex, float mat[4][4], int lay);
void RE_makeRenderInstances(struct Render *re);
+void RE_instance_rotate_ray_start(struct ObjectInstanceRen *obi, struct Isect *is);
+void RE_instance_rotate_ray_dir(struct ObjectInstanceRen *obi, struct Isect *is);
+void RE_instance_rotate_ray(struct ObjectInstanceRen *obi, struct Isect *is);
+void RE_instance_rotate_ray_restore(struct ObjectInstanceRen *obi, struct Isect *is);
+
float *RE_vertren_get_stress(struct ObjectRen *obr, struct VertRen *ver, int verify);
float *RE_vertren_get_rad(struct ObjectRen *obr, struct VertRen *ver, int verify);
float *RE_vertren_get_strand(struct ObjectRen *obr, struct VertRen *ver, int verify);
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 52030fb..1f3e961 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -5268,6 +5268,8 @@ void RE_DataBase_IncrementalView(Render *re, float viewmat[4][4], int restore)
copy_m4_m4(re->viewmat, viewmat);
invert_m4_m4(re->viewinv, re->viewmat);
+ init_camera_inside_volumes(re);
+
env_rotate_scene(re, tmat, !restore);
/* SSS points distribution depends on view */
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 90ae39e..17e4385 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -499,36 +499,6 @@ static void shade_ray_set_derivative(ShadeInput *shi)
}
-/* four functions to facilitate envmap rotation for raytrace */
-static void ray_env_rotate_start(Isect *is, float imat[4][4])
-{
- copy_v3_v3(is->origstart, is->start);
- mul_m4_v3(imat, is->start);
-}
-
-static void ray_env_rotate_dir(Isect *is, float imat[4][4])
-{
- float end[3];
-
- copy_v3_v3(is->origdir, is->dir);
- add_v3_v3v3(end, is->origstart, is->dir);
-
- mul_m4_v3(imat, end);
- sub_v3_v3v3(is->dir, end, is->start);
-}
-
-static void ray_env_rotate(Isect *is, float imat[4][4])
-{
- ray_env_rotate_start(is, imat);
- ray_env_rotate_dir(is, imat);
-}
-
-static void ray_env_rotate_restore(Isect *is)
-{
- copy_v3_v3(is->start, is->origstart);
- copy_v3_v3(is->dir, is->origdir);
-}
-
/* main ray shader */
void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
{
@@ -757,15 +727,13 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, con
RE_RC_INIT(isec, shi);
/* database is in original view, obi->imat transforms current position back to original */
- if (origshi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate(&isec, origshi->obi->imat);
+ RE_instance_rotate_ray(origshi->obi, &isec);
if (RE_rayobject_raycast(R.raytree, &isec)) {
ShadeResult shr= {{0}};
float d= 1.0f;
- if (origshi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate_restore(&isec);
+ RE_instance_rotate_ray_restore(origshi->obi, &isec);
/* for as long we don't have proper dx/dy transform for rays we copy over original */
copy_v3_v3(shi.dxco, origshi->dxco);
@@ -1667,8 +1635,7 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
shi.lay= origshi->lay;
shi.nodes= origshi->nodes;
- if (origshi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate_restore(is);
+ RE_instance_rotate_ray_restore(origshi->obi, is);
shade_ray(is, &shi, &shr);
if (shi.mat->material_type == MA_TYPE_SURFACE) {
@@ -1887,8 +1854,7 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
copy_v3_v3(isec.start, shi->co);
- if (shi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate_start(&isec, shi->obi->imat);
+ RE_instance_rotate_ray_start(shi->obi, &isec);
RE_rayobject_hint_bb(R.raytree, &point_hint, isec.start, isec.start);
isec.hint = &point_hint;
@@ -1948,8 +1914,7 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
isec.dir[2] = -dir[2];
isec.dist = maxdist;
- if (shi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate_dir(&isec, shi->obi->imat);
+ RE_instance_rotate_ray_dir(shi->obi, &isec);
prev = fac;
@@ -2033,8 +1998,7 @@ static void ray_ao_spheresamp(ShadeInput *shi, float ao[3], float env[3])
isec.lay= -1;
copy_v3_v3(isec.start, shi->co);
- if (shi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate_start(&isec, shi->obi->imat);
+ RE_instance_rotate_ray_start(shi->obi, &isec);
RE_rayobject_hint_bb(R.raytree, &point_hint, isec.start, isec.start);
isec.hint = &point_hint;
@@ -2093,8 +2057,7 @@ static void ray_ao_spheresamp(ShadeInput *shi, float ao[3], float env[3])
isec.dir[2] = -vec[2];
isec.dist = maxdist;
- if (shi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate_dir(&isec, shi->obi->imat);
+ RE_instance_rotate_ray_dir(shi->obi, &isec);
/* do the trace */
if (RE_rayobject_raycast(R.raytree, &isec)) {
@@ -2320,8 +2283,7 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, const float lampco[3],
sub_v3_v3v3(isec->dir, end, start);
isec->dist = normalize_v3(isec->dir);
- if (shi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate(isec, shi->obi->imat);
+ RE_instance_rotate_ray(shi->obi, isec);
/* trace the ray */
if (isec->mode==RE_RAY_SHADOW_TRA) {
@@ -2399,8 +2361,7 @@ static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, const float lampco[
else if (a==9) mask |= (mask>>9);
copy_v3_v3(isec->start, shi->co);
- if (shi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate_start(isec, shi->obi->imat);
+ RE_instance_rotate_ray_start(shi->obi, isec);
isec->orig.ob = shi->obi;
isec->orig.face = shi->vlr;
@@ -2428,8 +2389,7 @@ static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, const float lampco[
isec->dir[1] = vec[1]+lampco[1]-isec->start[1];
isec->dir[2] = vec[2]+lampco[2]-isec->start[2];
- if (shi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate_dir(isec, shi->obi->imat);
+ RE_instance_rotate_ray_dir(shi->obi, isec);
isec->dist = 1.0f;
isec->check = RE_CHECK_VLR_RENDER;
@@ -2530,8 +2490,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float shadfac[4])
sub_v3_v3v3(isec.dir, lampco, isec.start);
isec.dist = normalize_v3(isec.dir);
- if (shi->obi->flag & R_ENV_TRANSFORMED)
- ray_env_rotate(&isec, shi->obi->imat);
+ RE_instance_rotate_ray(shi->obi, &isec);
if (isec.mode==RE_RAY_SHADOW_TRA) {
/* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index 8169250..9a1ee91 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -80,6 +80,7 @@
#include "RE_render_ext.h" /* externtex */
+#include "rayintersection.h"
#include "rayobject.h"
#include "renderpipeline.h"
#include "render_types.h"
@@ -1419,6 +1420,42 @@ void RE_makeRenderInstances(Render *re)
re->instancetable= newlist;
}
+/* four functions to facilitate envmap rotation for raytrace */
+void RE_instance_rotate_ray_start(ObjectInstanceRen *obi, Isect *is)
+{
+ if (obi && (obi->flag & R_ENV_TRANSFORMED)) {
+ copy_v3_v3(is->origstart, is->start);
+ mul_m4_v3(obi->imat, is->start);
+ }
+}
+
+void RE_instance_rotate_ray_dir(ObjectInstanceRen *obi, Isect *is)
+{
+ if (obi && (obi->flag & R_ENV_TRANSFORMED)) {
+ float end[3];
+
+ copy_v3_v3(is->origdir, is->dir);
+ add_v3_v3v3(end, is->origstart, is->dir);
+
+ mul_m4_v3(obi->imat, end);
+ sub_v3_v3v3(is->dir, end, is->start);
+ }
+}
+
+void RE_instance_rotate_ray(ObjectInstanceRen *obi, Isect *is)
+{
+ RE_instance_rotate_ray_start(obi, is);
+ RE_instance_rotate_ray_dir(obi, is);
+}
+
+void RE_instance_rotate_ray_restore(ObjectInstanceRen *obi, Isect *is)
+{
+ if (obi && (obi->flag & R_ENV_TRANSFORMED)) {
+ copy_v3_v3(is->start, is->origstart);
+ copy_v3_v3(is->dir, is->origdir);
+ }
+}
+
int clip_render_object(float boundbox[2][3], float bounds[4], float winmat[4][4])
{
float mat[4][4], vec[4];
diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c
index e5e3aff..6cf83d0 100644
--- a/source/blender/render/intern/source/volume_precache.c
+++ b/source/blender/render/intern/source/volume_precache.c
@@ -95,7 +95,7 @@ static int intersect_outside_volume(RayObject *tree, Isect *isect, float *offset
}
/* Uses ray tracing to check if a point is inside or outside an ObjectInstanceRen */
-static int point_inside_obi(RayObject *tree, ObjectInstanceRen *UNUSED(obi), const float co[3])
+static int point_inside_obi(RayObject *tree, ObjectInstanceRen *obi, const float co[3])
{
Isect isect= {{0}};
float dir[3] = {0.0f, 0.0f, 1.0f};
@@ -112,7 +112,9 @@ static int point_inside_obi(RayObject *tree, ObjectInstanceRen *UNUSED(obi), con
isect.orig.face= NULL;
isect.orig.ob = NULL;
+ RE_instance_rotate_ray(obi, &isect);
final_depth = intersect_outside_volume(tree, &isect, dir, limit, depth);
+ RE_instance_rotate_ray_restore(obi, &isect);
/* even number of intersections: point is outside
* odd number: point is inside */
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
index 3915d6b..e1f616e 100644
--- a/source/blender/render/intern/source/volumetric.c
+++ b/source/blender/render/intern/source/volumetric.c
@@ -56,6 +56,7 @@
#include "pixelshading.h"
#include
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list