58
56
#include "DNA_scene_types.h"
59
57
#include "DNA_texture_types.h"
61
#include "BIF_space.h"
62
#include "BIF_toolbox.h"
64
59
#include "BKE_library.h"
65
60
#include "BKE_main.h"
66
61
#include "BKE_global.h"
67
62
#include "BKE_world.h" // init_render_world
68
63
#include "BKE_image.h" // BKE_write_ibuf
65
#include "MTC_matrixops.h"
67
#include "SDL_thread.h"
69
#define main main /* stupid SDL_main redefines main as SDL_main */
72
72
#include "RE_callbacks.h"
73
73
#include "render.h"
74
#include "render_intern.h"
75
74
#include "envmap.h"
76
75
#include "mydevice.h"
77
#include "rendercore.h" /* calls zbufShade(DA).... I want to replace this with my own :)*/
76
#include "rendercore.h"
78
77
#include "renderHelp.h"
79
#include "MTC_matrixops.h"
82
/* ------------------------------------------------------------------------- */
84
void envmap_split_ima(EnvMap *env);
85
void envmap_renderdata(EnvMap *env);
86
void envmap_transmatrix(float mat[][4], int part);
87
void env_rotate_scene(float mat[][4], int mode);
88
void env_layerflags(unsigned int notlay);
89
void env_set_imats(void);
90
void render_envmap(EnvMap *env);
91
int envcube_isect(float *vec, float *answ);
92
static void set_dxtdyt(float *dxts, float *dyts, float *dxt, float *dyt, int face);
94
82
/* ------------------------------------------------------------------------- */
640
637
/* ------------------------------------------------------------------------- */
642
extern float Tin, Ta, Tr, Tg, Tb; /* texture.c */
643
int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex)
639
int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexResult *texres)
641
extern SDL_mutex *load_ibuf_lock; // initrender.c
645
642
/* texvec should be the already reflected normal */
647
float fac, vec[3], sco[3], col[20], dxts[3], dyts[3];
645
float fac, vec[3], sco[3], dxts[3], dyts[3];
651
if(env==0 || env->object==0) return 0;
649
if(env==NULL || (env->stype!=ENV_LOAD && env->object==NULL)) {
653
653
if(env->stype==ENV_LOAD) {
654
654
env->ima= tex->ima;
655
655
if(env->ima && env->ima->ok) {
656
if(env->ima->ibuf==0) ima_ibuf_is_nul(tex);
657
if(load_ibuf_lock) SDL_mutexP(load_ibuf_lock);
658
if(env->ima->ibuf==NULL) ima_ibuf_is_nul(tex, tex->ima);
659
if(load_ibuf_lock) SDL_mutexV(load_ibuf_lock);
657
660
if(env->ima->ok && env->ok==0) envmap_split_ima(env);
667
/* rotate to envmap space */
670
/* rotate to envmap space, if object is set */
668
671
VECCOPY(vec, texvec);
669
MTC_Mat4Mul3Vecfl(env->object->imat, vec);
672
if(env->object) MTC_Mat4Mul3Vecfl(env->object->imat, vec);
673
else MTC_Mat4Mul3Vecfl(R.viewinv, vec);
671
675
face= envcube_isect(vec, sco);
672
tex->ima= env->cube[face];
676
ima= env->cube[face];
675
MTC_Mat4Mul3Vecfl(env->object->imat, dxt);
676
MTC_Mat4Mul3Vecfl(env->object->imat, dyt);
680
MTC_Mat4Mul3Vecfl(env->object->imat, dxt);
681
MTC_Mat4Mul3Vecfl(env->object->imat, dyt);
684
MTC_Mat4Mul3Vecfl(R.viewinv, dxt);
685
MTC_Mat4Mul3Vecfl(R.viewinv, dyt);
678
687
set_dxtdyt(dxts, dyts, dxt, dyt, face);
679
imagewraposa(tex, sco, dxts, dyts);
688
imagewraposa(tex, ima, sco, dxts, dyts, texres);
684
col[0]= Ta; col[1]= Tr; col[2]= Tg; col[3]= Tb;
693
TexResult texr1, texr2;
695
texr1.nor= texr2.nor= NULL;
686
697
VecAddf(vec, vec, dxt);
687
698
face1= envcube_isect(vec, sco);
688
699
VecSubf(vec, vec, dxt);
690
701
if(face!=face1) {
691
tex->ima= env->cube[face1];
702
ima= env->cube[face1];
692
703
set_dxtdyt(dxts, dyts, dxt, dyt, face1);
693
imagewraposa(tex, sco, dxts, dyts);
694
col[4]= Ta; col[5]= Tr; col[6]= Tg; col[7]= Tb;
704
imagewraposa(tex, ima, sco, dxts, dyts, &texr1);
696
else col[4]= col[5]= col[6]= col[7]= 0.0;
706
else texr1.tr= texr1.tg= texr1.tb= texr1.ta= 0.0;
698
/* here was the nasty bug! col[5,6,7] were not zero-ed. FPE! */
708
/* here was the nasty bug! results were not zero-ed. FPE! */
700
710
VecAddf(vec, vec, dyt);
701
711
face1= envcube_isect(vec, sco);
702
712
VecSubf(vec, vec, dyt);
704
714
if(face!=face1) {
705
tex->ima= env->cube[face1];
715
ima= env->cube[face1];
706
716
set_dxtdyt(dxts, dyts, dxt, dyt, face1);
707
imagewraposa(tex, sco, dxts, dyts);
708
col[8]= Ta; col[9]= Tr; col[10]= Tg; col[11]= Tb;
710
else col[8]= col[9]= col[10]= col[11]= 0.0;
712
fac= (col[0]+col[4]+col[8]);
715
Tr= fac*(col[0]*col[1] + col[4]*col[5] + col[8]*col[9] );
716
Tg= fac*(col[0]*col[2] + col[4]*col[6] + col[8]*col[10] );
717
Tb= fac*(col[0]*col[3] + col[4]*col[7] + col[8]*col[11] );
717
imagewraposa(tex, ima, sco, dxts, dyts, &texr2);
719
else texr2.tr= texr2.tg= texr2.tb= texr2.ta= 0.0;
721
fac= (texres->ta+texr1.ta+texr2.ta);
725
texres->tr= fac*(texres->ta*texres->tr + texr1.ta*texr1.tr + texr2.ta*texr2.tr );
726
texres->tg= fac*(texres->ta*texres->tg + texr1.ta*texr1.tg + texr2.ta*texr2.tg );
727
texres->tb= fac*(texres->ta*texres->tb + texr1.ta*texr1.tb + texr2.ta*texr2.tb );
733
imagewrap(tex, ima, sco, texres);