diff options
author | Ton Roosendaal <ton@blender.org> | 2003-09-24 01:05:51 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2003-09-24 01:05:51 +0400 |
commit | d8955d1b33e8a5bfc17fc4a61721ca144702be81 (patch) | |
tree | 1c8ae3856c9eea6f5e1be563632a4788a17d68d1 /source/blender/render | |
parent | 63e7c3e07719a25307f738861fc9bc66268d3bd4 (diff) |
- Recursive environment map render
Multiple environments now can be rendered in one pass. Previously the other objects with environment maps didn't show up in a reflection. Like this:
http://www.blender.org/bf/dep.jpg
By default, Blender renders now this result:
http://www.blender.org/bf/dep0.jpg
For a further 'recursive ray-tracing effect' you can give each EnvMap texture a higher "Depth" value. Here is a result with depth set at '2':
http://www.blender.org/bf/dep2.jpg
Related new options:
- in (F10) DisplayButtons, environment map rendering can be turned on and off.
- in EnvMap texture buttons you can free all environment maps
- Environment map sizes are also reduced with the (F10) 'percentage' option.
Tech note: with this commit the VlakRen struct has on *ob pointer!
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/extern/include/render_types.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/envmap.c | 80 |
2 files changed, 62 insertions, 20 deletions
diff --git a/source/blender/render/extern/include/render_types.h b/source/blender/render/extern/include/render_types.h index 6b790c66936..9777393685c 100644 --- a/source/blender/render/extern/include/render_types.h +++ b/source/blender/render/extern/include/render_types.h @@ -35,6 +35,7 @@ #include "DNA_scene_types.h" #include "DNA_world_types.h" +#include "DNA_object_types.h" /* Definitely weird: this equals 1<<21... so wtf?*/ #define MAXVERT (2<<20) @@ -190,6 +191,7 @@ typedef struct VlakRen char flag, ec; unsigned int lay; RadFace *radface; + Object *ob; } VlakRen; diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index 58d6fcce56c..be52592aa87 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -203,13 +203,16 @@ void envmap_renderdata(EnvMap *env) { static RE_Render envR; static Object *camera; + int cuberes; if(env) { envR= R; camera= G.scene->camera; - env->cuberes &= 0xFFFC; - R.rectx= R.r.xsch= R.recty= R.r.ysch= env->cuberes; + cuberes = (env->cuberes * R.r.size) / 100; + cuberes &= 0xFFFC; + env->lastsize= R.r.size; + R.rectx= R.r.xsch= R.recty= R.r.ysch= cuberes; R.afmx= R.afmy= R.r.xsch/2; R.xstart= R.ystart= -R.afmx; R.xend= R.yend= R.xstart+R.rectx-1; @@ -381,6 +384,18 @@ void env_layerflags(unsigned int notlay) } } +void env_hideobject(Object *ob) +{ + VlakRen *vlr = NULL; + int a; + + for(a=0; a<R.totvlak; a++) { + if((a & 255)==0) vlr= R.blovl[a>>8]; + else vlr++; + if(vlr->ob == ob) vlr->flag &= ~R_VISIBLE; + } +} + /* ------------------------------------------------------------------------- */ void env_set_imats() @@ -443,6 +458,7 @@ void render_envmap(EnvMap *env) init_render_world(); setzbufvlaggen(RE_projectverto); env_layerflags(env->notlay); + env_hideobject(env->object); env_set_imats(); if(RE_local_test_break()==0) { @@ -492,29 +508,53 @@ void render_envmap(EnvMap *env) void make_envmaps() { Tex *tex; - int do_init= 0; - - tex= G.main->tex.first; - while(tex) { - if(tex->id.us && tex->type==TEX_ENVMAP) { - if(tex->env && tex->env->object) { - if(tex->env->object->lay & G.scene->lay) { - if(tex->env->stype!=ENV_LOAD) { - - if(tex->env->ok==0) { - do_init= 1; - render_envmap(tex->env); - } - else if((R.r.mode & R_OSA) && tex->env->ok==ENV_NORMAL) { - do_init= 1; - RE_free_envmapdata(tex->env); - render_envmap(tex->env); + int do_init= 0, depth= 0; + + if (!(R.r.mode & R_ENVMAP)) return; + + + /* 5 = hardcoded max recursion level */ + while(depth<5) { + tex= G.main->tex.first; + while(tex) { + if(tex->id.us && tex->type==TEX_ENVMAP) { + if(tex->env && tex->env->object) { + if(tex->env->object->lay & G.scene->lay) { + if(tex->env->stype!=ENV_LOAD) { + + /* decide if to render an envmap (again) */ + if(tex->env->depth >= depth) { + + /* set 'recalc' to make sure it does an entire loop of recalcs */ + + if(tex->env->ok) { + /* free when OSA, and old one isn't OSA */ + if((R.r.mode & R_OSA) && tex->env->ok==ENV_NORMAL) + RE_free_envmapdata(tex->env); + /* free when size larger */ + else if(tex->env->lastsize < R.r.size) + RE_free_envmapdata(tex->env); + /* free when env is in recalcmode */ + else if(tex->env->recalc) + RE_free_envmapdata(tex->env); + } + + if(tex->env->ok==0 && depth==0) tex->env->recalc= 1; + + if(tex->env->ok==0) { + do_init= 1; + render_envmap(tex->env); + + if(depth==tex->env->depth) tex->env->recalc= 0; + } + } } } } } + tex= tex->id.next; } - tex= tex->id.next; + depth++; } if(do_init) { |