diff options
-rw-r--r-- | source/blender/blenkernel/BKE_displist.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 429 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 4 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_shader_ext.h | 5 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 142 | ||||
-rw-r--r-- | source/blender/render/intern/source/initrender.c | 11 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 34 | ||||
-rw-r--r-- | source/blender/render/intern/source/texture.c | 3 | ||||
-rw-r--r-- | source/blender/src/buttons_shading.c | 2 | ||||
-rw-r--r-- | source/blender/src/usiblender.c | 4 | ||||
-rw-r--r-- | source/blender/src/vpaint.c | 5 |
12 files changed, 471 insertions, 178 deletions
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 05a1cfc5376..42e1576d137 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -146,12 +146,14 @@ extern void makeDispListSurf(struct Object *ob, struct ListBase *dispbase, int f extern void makeDispListCurveTypes(struct Object *ob, int forOrco); extern void makeDispListMBall(struct Object *ob); extern void shadeDispList(struct Base *base); -void freefastshade(void); + void imagestodisplist(void); void reshadeall_displist(void); void filldisplist(struct ListBase *dispbase, struct ListBase *to); -void mesh_create_shadedColors(struct Object *ob, int onlyForMesh, unsigned int **col1_r, unsigned int **col2_r); +void fastshade_free_render(void); + + void displistmesh_add_edges(DispListMesh *dlm); #endif diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 992139a5120..1625db1a1e3 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -227,8 +227,8 @@ static void clear_global(void) extern short winqueue_break; /* screen.c */ freeAllRad(); - free_main(G.main); /* free all lib data */ - freefastshade(); /* othwerwise old lamp settings stay active */ + fastshade_free_render(); /* lamps hang otherwise */ + free_main(G.main); /* free all lib data */ /* force all queues to be left */ winqueue_break= 1; diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 3201a8b945b..de383ee06b7 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -87,7 +87,8 @@ #include "BKE_subsurf.h" #include "BKE_modifier.h" -#include "nla.h" /* For __NLA: Please do not remove yet */ +#include "RE_pipeline.h" +#include "RE_shader_ext.h" static void boundbox_displist(Object *ob); @@ -265,20 +266,6 @@ void copy_displist(ListBase *lbn, ListBase *lb) } } -void initfastshade(void) -{ -} - - -void freefastshade() -{ -} - - -static void fastshade(float *co, float *nor, float *orco, Material *ma, char *col1, char *col2, char *vertcol) -{ -} - void addnormalsDispList(Object *ob, ListBase *lb) { DispList *dl = NULL; @@ -345,15 +332,191 @@ void addnormalsDispList(Object *ob, ListBase *lb) } } -static void init_fastshade_for_ob(Object *ob, int *need_orco_r, float mat[4][4], float *imat) +void count_displist(ListBase *lb, int *totvert, int *totface) +{ + DispList *dl; + + dl= lb->first; + while(dl) { + + switch(dl->type) { + case DL_SURF: + *totvert+= dl->nr*dl->parts; + *totface+= (dl->nr-1)*(dl->parts-1); + break; + case DL_INDEX3: + case DL_INDEX4: + *totvert+= dl->nr; + *totface+= dl->parts; + break; + case DL_POLY: + case DL_SEGM: + *totvert+= dl->nr*dl->parts; + } + + dl= dl->next; + } +} + + +/* ***************************** shade displist ******************** */ + +/* create default shade input... save cpu cycles with ugly global */ +static ShadeInput shi; +static void init_fastshade_shadeinput(void) +{ + + memset(&shi, 0, sizeof(ShadeInput)); + shi.lay= G.scene->lay; + shi.view[2]= -1.0f; +} + +static Render *fastshade_get_render(void) { - int x; + Render *re= RE_GetRender("_Shade View_"); + if(re==NULL) { + re= RE_NewRender("_Shade View_"); + + RE_Database_Shaded(re, G.scene); + } + return re; +} + +/* called on file reading */ +void fastshade_free_render(void) +{ + Render *re= RE_GetRender("_Shade View_"); + + if(re) { + RE_Database_Free(re); + RE_FreeRender(re); + } +} + +static void fastshade(float *co, float *nor, float *orco, Material *ma, char *col1, char *col2, char *vertcol) +{ + ShadeResult shr; + int a; + + if(ma->mode & MA_VERTEXCOLP) { + if(vertcol) { + shi.r= vertcol[3]/255.0f; + shi.g= vertcol[2]/255.0f; + shi.b= vertcol[1]/255.0f; + } + } + + VECCOPY(shi.co, co); + shi.vn[0]= -nor[0]; + shi.vn[1]= -nor[1]; + shi.vn[2]= -nor[2]; + VECCOPY(shi.vno, shi.vn); + + if(ma->texco) { + VECCOPY(shi.lo, orco); + + if(ma->texco & TEXCO_GLOB) { + VECCOPY(shi.gl, shi.lo); + } + if(ma->texco & TEXCO_WINDOW) { + VECCOPY(shi.winco, shi.lo); + } + if(ma->texco & TEXCO_STICKY) { + VECCOPY(shi.sticky, shi.lo); + } + if(ma->texco & TEXCO_UV) { + VECCOPY(shi.uv, shi.lo); + } + if(ma->texco & TEXCO_OBJECT) { + VECCOPY(shi.co, shi.lo); + } + if(ma->texco & TEXCO_NORM) { + VECCOPY(shi.orn, shi.vn); + } + if(ma->texco & TEXCO_REFL) { + float inp= 2.0*(shi.vn[2]); + shi.ref[0]= (inp*shi.vn[0]); + shi.ref[1]= (inp*shi.vn[1]); + shi.ref[2]= (-1.0+inp*shi.vn[2]); + } + } + + shi.mat= ma; /* set each time... node shaders change it */ + RE_shade_external(NULL, &shi, &shr); + + VECADD(shr.combined, shr.diff, shr.spec); + + a= 256.0f*(shr.combined[0]); + col1[3]= CLAMPIS(a, 0, 255); + a= 256.0f*(shr.combined[1]); + col1[2]= CLAMPIS(a, 0, 255); + a= 256.0f*(shr.combined[2]); + col1[1]= CLAMPIS(a, 0, 255); + + if(col2) { + shi.vn[0]= -shi.vn[0]; + shi.vn[1]= -shi.vn[1]; + shi.vn[2]= -shi.vn[2]; + + shi.mat= ma; /* set each time... node shaders change it */ + RE_shade_external(NULL, &shi, &shr); + + VECADD(shr.combined, shr.diff, shr.spec); + + a= 256.0f*(shr.combined[0]); + col2[3]= CLAMPIS(a, 0, 255); + a= 256.0f*(shr.combined[1]); + col2[2]= CLAMPIS(a, 0, 255); + a= 256.0f*(shr.combined[2]); + col2[1]= CLAMPIS(a, 0, 255); + } +} + +static void init_fastshade_for_ob(Render *re, Object *ob, int *need_orco_r, float mat[4][4], float imat[3][3]) +{ + float tmat[4][4]; + float amb[3]= {0.0f, 0.0f, 0.0f}; + int a; + + /* initialize globals in render */ + RE_shade_external(re, NULL, NULL); + + /* initialize global here */ + init_fastshade_shadeinput(); + + RE_DataBase_GetView(re, tmat); + Mat4MulMat4(mat, ob->obmat, tmat); + + Mat4Invert(tmat, mat); + Mat3CpyMat4(imat, tmat); + if(ob->transflag & OB_NEG_SCALE) Mat3MulFloat((float *)imat, -1.0); + + if (need_orco_r) *need_orco_r= 0; + for(a=0; a<ob->totcol; a++) { + Material *ma= give_current_material(ob, a+1); + if(ma) { + init_render_material(ma, 0, amb); + + if(ma->texco & TEXCO_ORCO) { + if (need_orco_r) *need_orco_r= 1; + } + } + } +} - for(x=0;x<9;x++) imat[x] = 0; - need_orco_r=0; +static void end_fastshade_for_ob(Object *ob) +{ + int a; + + for(a=0; a<ob->totcol; a++) { + Material *ma= give_current_material(ob, a+1); + if(ma) + end_render_material(ma); + } } -void mesh_create_shadedColors(Object *ob, int onlyForMesh, unsigned int **col1_r, unsigned int **col2_r) + +static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, unsigned int **col1_r, unsigned int **col2_r) { Mesh *me= ob->data; int dmNeedsFree; @@ -363,7 +526,7 @@ void mesh_create_shadedColors(Object *ob, int onlyForMesh, unsigned int **col1_r float *orco, *vnors, imat[3][3], mat[4][4], vec[3]; int a, i, need_orco; - init_fastshade_for_ob(ob, &need_orco, mat, *imat); + init_fastshade_for_ob(re, ob, &need_orco, mat, imat); if (need_orco) { orco = mesh_create_orco(ob); @@ -413,7 +576,7 @@ void mesh_create_shadedColors(Object *ob, int onlyForMesh, unsigned int **col1_r Material *ma= give_current_material(ob, mf->mat_nr+1); float nor[3], n1[3]; - if(ma==0) ma= &defmaterial; + if(ma==NULL) ma= &defmaterial; if (dlm->tface) { mcolbase = (unsigned char*) dlm->tface[i].col; @@ -463,20 +626,25 @@ void mesh_create_shadedColors(Object *ob, int onlyForMesh, unsigned int **col1_r if (dmNeedsFree) dm->release(dm); + end_fastshade_for_ob(ob); } /* has base pointer, to check for layer */ +/* called from drawobject.c */ void shadeDispList(Base *base) { Object *ob= base->object; DispList *dl, *dlob; Material *ma = NULL; Curve *cu; + Render *re; float imat[3][3], mat[4][4], vec[3]; float *fp, *nor, n1[3]; unsigned int *col1; int a, need_orco; - + + re= fastshade_get_render(); + dl = find_displist(&ob->disp, DL_VERTCOL); if (dl) { BLI_remlink(&ob->disp, dl); @@ -488,128 +656,131 @@ void shadeDispList(Base *base) BLI_addtail(&ob->disp, dl); dl->type= DL_VERTCOL; - mesh_create_shadedColors(ob, 0, &dl->col1, &dl->col2); - - return; + mesh_create_shadedColors(re, ob, 0, &dl->col1, &dl->col2); } + else { - init_fastshade_for_ob(ob, &need_orco, mat, *imat); - - if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) { - - /* now we need the normals */ - cu= ob->data; - dl= cu->disp.first; + init_fastshade_for_ob(re, ob, &need_orco, mat, imat); - while(dl) { - dlob= MEM_callocN(sizeof(DispList), "displistshade"); - BLI_addtail(&ob->disp, dlob); - dlob->type= DL_VERTCOL; - dlob->parts= dl->parts; - dlob->nr= dl->nr; + if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) { + + /* now we need the normals */ + cu= ob->data; + dl= cu->disp.first; - if(dl->type==DL_INDEX3) { - col1= dlob->col1= MEM_mallocN(sizeof(int)*dl->nr, "col1"); - } - else { - col1= dlob->col1= MEM_mallocN(sizeof(int)*dl->parts*dl->nr, "col1"); - } + while(dl) { + dlob= MEM_callocN(sizeof(DispList), "displistshade"); + BLI_addtail(&ob->disp, dlob); + dlob->type= DL_VERTCOL; + dlob->parts= dl->parts; + dlob->nr= dl->nr; + + if(dl->type==DL_INDEX3) { + col1= dlob->col1= MEM_mallocN(sizeof(int)*dl->nr, "col1"); + } + else { + col1= dlob->col1= MEM_mallocN(sizeof(int)*dl->parts*dl->nr, "col1"); + } + - - ma= give_current_material(ob, dl->col+1); - if(ma==0) ma= &defmaterial; - - if(dl->type==DL_INDEX3) { - if(dl->nors) { - /* there's just one normal */ - n1[0]= imat[0][0]*dl->nors[0]+imat[0][1]*dl->nors[1]+imat[0][2]*dl->nors[2]; - n1[1]= imat[1][0]*dl->nors[0]+imat[1][1]*dl->nors[1]+imat[1][2]*dl->nors[2]; - n1[2]= imat[2][0]*dl->nors[0]+imat[2][1]*dl->nors[1]+imat[2][2]*dl->nors[2]; - Normalise(n1); - - fp= dl->verts; - - a= dl->nr; - while(a--) { - VECCOPY(vec, fp); - Mat4MulVecfl(mat, vec); + ma= give_current_material(ob, dl->col+1); + if(ma==NULL) ma= &defmaterial; + + if(dl->type==DL_INDEX3) { + if(dl->nors) { + /* there's just one normal */ + n1[0]= imat[0][0]*dl->nors[0]+imat[0][1]*dl->nors[1]+imat[0][2]*dl->nors[2]; + n1[1]= imat[1][0]*dl->nors[0]+imat[1][1]*dl->nors[1]+imat[1][2]*dl->nors[2]; + n1[2]= imat[2][0]*dl->nors[0]+imat[2][1]*dl->nors[1]+imat[2][2]*dl->nors[2]; + Normalise(n1); - fastshade(vec, n1, fp, ma, (char *)col1, 0, 0); + fp= dl->verts; - fp+= 3; col1++; + a= dl->nr; + while(a--) { + VECCOPY(vec, fp); + Mat4MulVecfl(mat, vec); + + fastshade(vec, n1, fp, ma, (char *)col1, 0, 0); + + fp+= 3; col1++; + } } } - } - else if(dl->type==DL_SURF) { - if(dl->nors) { - a= dl->nr*dl->parts; - fp= dl->verts; - nor= dl->nors; - - while(a--) { - VECCOPY(vec, fp); - Mat4MulVecfl(mat, vec); + else if(dl->type==DL_SURF) { + if(dl->nors) { + a= dl->nr*dl->parts; + fp= dl->verts; + nor= dl->nors; - n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2]; - n1[1]= imat[1][0]*nor[0]+imat[1][1]*nor[1]+imat[1][2]*nor[2]; - n1[2]= imat[2][0]*nor[0]+imat[2][1]*nor[1]+imat[2][2]*nor[2]; - Normalise(n1); - - fastshade(vec, n1, fp, ma, (char *)col1, 0, 0); - - fp+= 3; nor+= 3; col1++; + while(a--) { + VECCOPY(vec, fp); + Mat4MulVecfl(mat, vec); + + n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2]; + n1[1]= imat[1][0]*nor[0]+imat[1][1]*nor[1]+imat[1][2]*nor[2]; + n1[2]= imat[2][0]*nor[0]+imat[2][1]*nor[1]+imat[2][2]*nor[2]; + Normalise(n1); + + fastshade(vec, n1, fp, ma, (char *)col1, 0, 0); + + fp+= 3; nor+= 3; col1++; + } } } + dl= dl->next; } - dl= dl->next; } - } - else if(ob->type==OB_MBALL) { - /* there are normals already */ - dl= ob->disp.first; - - while(dl) { + else if(ob->type==OB_MBALL) { + /* there are normals already */ + dl= ob->disp.first; - if(dl->type==DL_INDEX4) { - if(dl->nors) { - - if(dl->col1) MEM_freeN(dl->col1); - col1= dl->col1= MEM_mallocN(sizeof(int)*dl->nr, "col1"); - - ma= give_current_material(ob, dl->col+1); - if(ma==0) ma= &defmaterial; - - fp= dl->verts; - nor= dl->nors; - - a= dl->nr; - while(a--) { - VECCOPY(vec, fp); - Mat4MulVecfl(mat, vec); + while(dl) { + + if(dl->type==DL_INDEX4) { + if(dl->nors) { - /* transpose ! */ - n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2]; - n1[1]= imat[1][0]*nor[0]+imat[1][1]*nor[1]+imat[1][2]*nor[2]; - n1[2]= imat[2][0]*nor[0]+imat[2][1]*nor[1]+imat[2][2]*nor[2]; - Normalise(n1); - - fastshade(vec, n1, fp, ma, (char *)col1, 0, 0); + if(dl->col1) MEM_freeN(dl->col1); + col1= dl->col1= MEM_mallocN(sizeof(int)*dl->nr, "col1"); + + ma= give_current_material(ob, dl->col+1); + if(ma==NULL) ma= &defmaterial; - fp+= 3; col1++; nor+= 3; + fp= dl->verts; + nor= dl->nors; + + a= dl->nr; + while(a--) { + VECCOPY(vec, fp); + Mat4MulVecfl(mat, vec); + + /* transpose ! */ + n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2]; + n1[1]= imat[1][0]*nor[0]+imat[1][1]*nor[1]+imat[1][2]*nor[2]; + n1[2]= imat[2][0]*nor[0]+imat[2][1]*nor[1]+imat[2][2]*nor[2]; + Normalise(n1); + + fastshade(vec, n1, fp, ma, (char *)col1, 0, 0); + + fp+= 3; col1++; nor+= 3; + } } } + dl= dl->next; } - dl= dl->next; } + + end_fastshade_for_ob(ob); } } +/* frees render and shade part of displists */ void reshadeall_displist(void) { Base *base; Object *ob; - freefastshade(); + fastshade_free_render(); for(base= G.scene->base.first; base; base= base->next) { ob= base->object; @@ -621,31 +792,7 @@ void reshadeall_displist(void) } } -void count_displist(ListBase *lb, int *totvert, int *totface) -{ - DispList *dl; - - dl= lb->first; - while(dl) { - - switch(dl->type) { - case DL_SURF: - *totvert+= dl->nr*dl->parts; - *totface+= (dl->nr-1)*(dl->parts-1); - break; - case DL_INDEX3: - case DL_INDEX4: - *totvert+= dl->nr; - *totface+= dl->parts; - break; - case DL_POLY: - case DL_SEGM: - *totvert+= dl->nr*dl->parts; - } - - dl= dl->next; - } -} +/* ****************** make displists ********************* */ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase) { diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index f0087ef6cce..ae82ffb0128 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -182,5 +182,9 @@ float RE_filter_value(int type, float x); /* vector blur zbuffer method */ void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect); +/* shaded view options */ +void RE_Database_Shaded(struct Render *re, struct Scene *scene); +void RE_DataBase_GetView(struct Render *re, float mat[][4]); + #endif /* RE_PIPELINE_H */ diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h index 59f6da40f5e..f9015dc1161 100644 --- a/source/blender/render/extern/include/RE_shader_ext.h +++ b/source/blender/render/extern/include/RE_shader_ext.h @@ -114,5 +114,10 @@ typedef struct ShadeInput struct Tex; int multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres); +/* shaded view */ +struct Render; +void RE_shade_external(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr); + + #endif /* RE_SHADER_EXT_H */ diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 533e9830110..f88a7bed33b 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -1972,7 +1972,7 @@ static void area_lamp_vectors(LampRen *lar) } /* If lar takes more lamp data, the decoupling will be better. */ -static void add_render_lamp(Render *re, Object *ob, int actual_render) +static void add_render_lamp(Render *re, Object *ob) { Lamp *la= ob->data; LampRen *lar; @@ -1980,12 +1980,10 @@ static void add_render_lamp(Render *re, Object *ob, int actual_render) float mat[4][4], hoek, xn, yn; int c; - /* prevent only shadow from rendering light, but only return on render, not preview */ - if(actual_render) { - if(la->mode & LA_ONLYSHADOW) - if((re->r.mode & R_SHADOW)==0) - return; - } + /* prevent only shadow from rendering light */ + if(la->mode & LA_ONLYSHADOW) + if((re->r.mode & R_SHADOW)==0) + return; go= MEM_callocN(sizeof(GroupObject), "groupobject"); BLI_addtail(&re->lights, go); @@ -2150,7 +2148,7 @@ static void add_render_lamp(Render *re, Object *ob, int actual_render) } /* yafray: shadowbuffers and jitter only needed for internal render */ - if (actual_render && re->r.renderer==R_INTERN) { + if (re->r.renderer==R_INTERN) { if(re->r.mode & R_SHADOW) { if (la->type==LA_SPOT && (lar->mode & LA_SHAD) ) { /* Per lamp, one shadow buffer is made. */ @@ -2670,7 +2668,7 @@ static void init_render_object(Render *re, Object *ob, Object *par, int index, i ob->flag |= OB_DONE; if(ob->type==OB_LAMP) - add_render_lamp(re, ob, 1); + add_render_lamp(re, ob); else if ELEM(ob->type, OB_FONT, OB_CURVE) init_render_curve(re, ob, only_verts); else if(ob->type==OB_SURF) @@ -3586,6 +3584,132 @@ void RE_DataBase_ApplyWindow(Render *re) project_renderdata(re, projectverto, 0, 0); } +/* setup for shaded view, so only lamps and materials are initialized */ +void RE_Database_Shaded(Render *re, Scene *scene) +{ + Base *base; + Object *ob; + Scene *sce; + float mat[4][4]; + unsigned int lay; + + re->scene= scene; + + re->lights.first= re->lights.last= NULL; + + /* in localview, lamps are using normal layers, objects only local bits */ + if(re->scene->lay & 0xFF000000) lay= re->scene->lay & 0xFF000000; + else lay= re->scene->lay; + + /* if no camera, set unit */ + if(re->scene->camera) { + Mat4Ortho(re->scene->camera->obmat); + Mat4Invert(mat, re->scene->camera->obmat); + RE_SetView(re, mat); + } + else { + Mat4One(mat); + RE_SetView(re, mat); + } + + /* initializes global */ + set_node_shader_lamp_loop(shade_material_loop); + + for(SETLOOPER(re->scene, base)) { + ob= base->object; + /* imat objects has to be done here, since displace can have texture using Object map-input */ + MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat); + MTC_Mat4Invert(ob->imat, mat); + /* each object should only be rendered once */ + ob->flag &= ~OB_DONE; + } + + /* MAKE RENDER DATA */ + for(SETLOOPER(re->scene, base)) { + ob= base->object; + + /* OB_DONE means the object itself got duplicated, so was already converted */ + if(ob->flag & OB_DONE); + else if(ob->type==OB_LAMP) { + if( (base->lay & lay) || ((base->lay & re->scene->lay)) ) { + init_render_object(re, ob, NULL, 0, 0); + } + } + } + set_material_lightgroups(re); +} + +void RE_DataBase_GetView(Render *re, float mat[][4]) +{ + Mat4CpyMat4(mat, re->viewmat); +} + + + + +/* **************************************************************** */ +/* sticky texture coords */ +/* **************************************************************** */ + +void RE_make_sticky(void) +{ + Object *ob; + Base *base; + MVert *mvert; + Mesh *me; + MSticky *ms; + Render *re; + float ho[4], mat[4][4]; + int a; + + if(G.scene->camera==NULL) { + printf("Need camera to make sticky\n"); + return; + } + if(G.obedit) { + printf("Unable to make sticky in Edit Mode\n"); + return; + } + + re= RE_NewRender("_make sticky_"); + RE_InitState(re, &G.scene->r, G.scene->r.xsch, G.scene->r.ysch, NULL); + + /* use renderdata and camera to set viewplane */ + RE_SetCamera(re, G.scene->camera); + + /* and set view matrix */ + Mat4Ortho(G.scene->camera->obmat); + Mat4Invert(mat, G.scene->camera->obmat); + RE_SetView(re, mat); + + for(base= FIRSTBASE; base; base= base->next) { + if TESTBASELIB(base) { + if(base->object->type==OB_MESH) { + ob= base->object; + + me= ob->data; + mvert= me->mvert; + if(me->msticky) MEM_freeN(me->msticky); + me->msticky= MEM_mallocN(me->totvert*sizeof(MSticky), "sticky"); + + where_is_object(ob); + Mat4MulMat4(mat, ob->obmat, re->viewmat); + + ms= me->msticky; + for(a=0; a<me->totvert; a++, ms++, mvert++) { + VECCOPY(ho, mvert->co); + Mat4MulVecfl(mat, ho); + projectverto(ho, re->winmat, ho); + ms->co[0]= ho[0]/ho[3]; + ms->co[1]= ho[1]/ho[3]; + } + } + } + } +} + + + /* **************************************************************** */ /* Displacement mapping */ /* **************************************************************** */ diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 8f858e062de..1074fd3e36e 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -690,14 +690,3 @@ void initparts(Render *re) -/* **************************************************************** */ -/* sticky texture coords */ -/* **************************************************************** */ - -void RE_make_sticky(void) -{ - /* oldfile.txt */ -} - - - diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index da9705411ea..49ec3d65be0 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -2528,8 +2528,8 @@ void *shadepixel(ShadePixelInfo *shpi, float x, float y, int z, volatile int fac float hox, hoy, l, dl, u, v; float s00, s01, s10, s11, detsh; - /* XXXX */ - Zmulx= R.winx; Zmuly= R.winy; + /* old globals, localized now */ + Zmulx= ((float)R.winx)/2.0; Zmuly= ((float)R.winy)/2.0; s00= v3->ho[0]/v3->ho[3] - v1->ho[0]/v1->ho[3]; s01= v3->ho[1]/v3->ho[3] - v1->ho[1]/v1->ho[3]; @@ -3471,10 +3471,34 @@ void add_halo_flare(void) } R.r.mode= mode; - } - -/* end of render.c */ +/* if *re, then initialize, otherwise execute */ +void RE_shade_external(Render *re, ShadeInput *shi, ShadeResult *shr) +{ + static VlakRen vlr; + + /* init */ + if(re) { + R= *re; + + /* fake render face */ + memset(&vlr, 0, sizeof(VlakRen)); + vlr.lay= -1; + + return; + } + shi->vlr= &vlr; + + if(shi->mat->nodetree && shi->mat->use_nodes) + ntreeShaderExecTree(shi->mat->nodetree, shi, shr); + else { + /* copy all relevant material vars, note, keep this synced with render_types.h */ + memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); + shi->har= shi->mat->har; + + shade_material_loop(shi, shr); + } +} diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index 77c24374bc6..141bc44177d 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -877,7 +877,8 @@ static int cubemap(MTex *mtex, VlakRen *vlr, float x, float y, float z, float *a /* Mesh vertices have such flags, for others we calculate it once based on orco */ if((vlr->puno & (ME_PROJXY|ME_PROJXZ|ME_PROJYZ))==0) { - if(vlr->v1->orco) { + /* test for v1, vlr can be faked for baking */ + if(vlr->v1 && vlr->v1->orco) { float nor[3]; CalcNormFloat(vlr->v1->orco, vlr->v2->orco, vlr->v3->orco, nor); diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index d917043ad23..9e2fb54c188 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -1978,8 +1978,6 @@ void do_lampbuts(unsigned short event) break; } - - if(event) freefastshade(); } diff --git a/source/blender/src/usiblender.c b/source/blender/src/usiblender.c index ec5a86471ec..f912dabb014 100644 --- a/source/blender/src/usiblender.c +++ b/source/blender/src/usiblender.c @@ -779,10 +779,10 @@ void exit_usiblender(void) /* needed at least for a rare sigsegv that can happen in pydrivers */ BPY_end_python(); - free_blender(); /* blender.c, does entire library */ + fastshade_free_render(); /* shaded view */ + free_blender(); /* blender.c, does entire library */ free_matcopybuf(); free_ipocopybuf(); - freefastshade(); free_vertexpaint(); /* editnurb can remain to exist outside editmode */ diff --git a/source/blender/src/vpaint.c b/source/blender/src/vpaint.c index 08fbd778281..22ad81ee0e3 100644 --- a/source/blender/src/vpaint.c +++ b/source/blender/src/vpaint.c @@ -235,7 +235,8 @@ void make_vertexcol() /* single ob */ if(me==0) return; if(me->mcol) MEM_freeN(me->mcol); - mesh_create_shadedColors(ob, 1, (unsigned int**) &me->mcol, NULL); + me->mcol = MEM_callocN(sizeof(int)*me->totface*4, "me->mcol"); + // mesh_create_shadedColors(ob, 1, (unsigned int**) &me->mcol, NULL); for (i=0; i<me->totface*4; i++) { me->mcol[i].a = 255; @@ -1648,7 +1649,6 @@ void set_wpaint(void) /* toggle */ } } else { - freefastshade(); /* to be sure */ if(!(G.f & G_FACESELECT)) setcursor_space(SPACE_VIEW3D, CURSOR_STD); @@ -1700,7 +1700,6 @@ void set_vpaint(void) /* toggle */ setcursor_space(SPACE_VIEW3D, CURSOR_VPAINT); } else { - freefastshade(); /* to be sure */ if((G.f & G_FACESELECT)==0) setcursor_space(SPACE_VIEW3D, CURSOR_STD); } } |