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>2003-09-24 01:05:51 +0400
committerTon Roosendaal <ton@blender.org>2003-09-24 01:05:51 +0400
commitd8955d1b33e8a5bfc17fc4a61721ca144702be81 (patch)
tree1c8ae3856c9eea6f5e1be563632a4788a17d68d1 /source/blender/render
parent63e7c3e07719a25307f738861fc9bc66268d3bd4 (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.h2
-rw-r--r--source/blender/render/intern/source/envmap.c80
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) {