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
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-08-14 17:41:22 +0400
committerTon Roosendaal <ton@blender.org>2006-08-14 17:41:22 +0400
commit582f56d9c430d33464923bda3b81740d90aa401a (patch)
treefe8beb406dfd9daeefff660d0218ff819cb3a337 /source
parent800ae7cf466dd50c15c3ecf655f68e0d43de12f2 (diff)
Bugfix #4798
Envmap type "Load" didn't work when a new envmap was created for this type. Seemed to be a very old issue... Todo still: previews skip envmap...
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c4
-rw-r--r--source/blender/render/intern/source/envmap.c60
2 files changed, 43 insertions, 21 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 3b0c7bf0e42..063185f456a 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1951,9 +1951,11 @@ void makeDispListMesh(Object *ob)
mesh_build_data(ob);
- if(paf)
+ if(paf) {
+ printf("ob %s %d\n", ob->id.name, ob->recalc);
if((paf->flag & PAF_STATIC) || (ob->recalc & OB_RECALC_TIME)==0)
build_particle_system(ob);
+ }
}
}
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 2daea588fab..d313bc3c360 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -102,8 +102,9 @@ static void envmap_split_ima(EnvMap *env)
0, 0, dx, dx, dx, dx);
IMB_rectcpy(env->cube[5]->ibuf, env->ima->ibuf,
0, 0, 2*dx, dx, dx, dx);
- env->ok= 2;
+ env->ok= ENV_OSA;
}
+ printf("split\n");
}
/* ------------------------------------------------------------------------- */
@@ -476,33 +477,47 @@ void make_envmaps(Render *re)
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) {
+ EnvMap *env= tex->env;
+
+ if(env->object->lay & G.scene->lay) {
+ if(env->stype==ENV_LOAD) {
+ float orthmat[4][4], mat[4][4], tmat[4][4];
+
+ /* precalc orthmat for object */
+ MTC_Mat4CpyMat4(orthmat, env->object->obmat);
+ MTC_Mat4Ortho(orthmat);
+
+ /* need imat later for texture imat */
+ MTC_Mat4MulMat4(mat, orthmat, re->viewmat);
+ MTC_Mat4Invert(tmat, mat);
+ MTC_Mat3CpyMat4(env->obimat, tmat);
+ }
+ else {
/* decide if to render an envmap (again) */
- if(tex->env->depth >= depth) {
+ if(env->depth >= depth) {
/* set 'recalc' to make sure it does an entire loop of recalcs */
- if(tex->env->ok) {
+ if(env->ok) {
/* free when OSA, and old one isn't OSA */
- if((re->r.mode & R_OSA) && tex->env->ok==ENV_NORMAL)
- BKE_free_envmapdata(tex->env);
+ if((re->r.mode & R_OSA) && env->ok==ENV_NORMAL)
+ BKE_free_envmapdata(env);
/* free when size larger */
- else if(tex->env->lastsize < re->r.size)
- BKE_free_envmapdata(tex->env);
+ else if(env->lastsize < re->r.size)
+ BKE_free_envmapdata(env);
/* free when env is in recalcmode */
- else if(tex->env->recalc)
- BKE_free_envmapdata(tex->env);
+ else if(env->recalc)
+ BKE_free_envmapdata(env);
}
- if(tex->env->ok==0 && depth==0) tex->env->recalc= 1;
+ if(env->ok==0 && depth==0) env->recalc= 1;
- if(tex->env->ok==0) {
+ if(env->ok==0) {
do_init= 1;
- render_envmap(re, tex->env);
+ render_envmap(re, env);
- if(depth==tex->env->depth) tex->env->recalc= 0;
+ if(depth==env->depth) env->recalc= 0;
}
}
}
@@ -618,6 +633,9 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe
float fac, vec[3], sco[3], dxts[3], dyts[3];
int face, face1;
+ if((R.r.mode & R_ENVMAP)==0)
+ return 0;
+
env= tex->env;
if(env==NULL || (env->stype!=ENV_LOAD && env->object==NULL)) {
texres->tin= 0.0;
@@ -626,11 +644,13 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe
if(env->stype==ENV_LOAD) {
env->ima= tex->ima;
if(env->ima && env->ima->ok) {
- // Now thread safe
- BLI_lock_thread(LOCK_MALLOC);
- if(env->ima->ibuf==NULL) ima_ibuf_is_nul(tex, tex->ima);
- if(env->ima->ok && env->ok==0) envmap_split_ima(env);
- BLI_unlock_thread(LOCK_MALLOC);
+ if(env->ima->ibuf==NULL) {
+ printf("load ibuf\n");
+ BLI_lock_thread(LOCK_MALLOC);
+ ima_ibuf_is_nul(tex, tex->ima);
+ if(env->ima->ok && env->ok==0) envmap_split_ima(env);
+ BLI_unlock_thread(LOCK_MALLOC);
+ }
}
}