diff options
author | Ton Roosendaal <ton@blender.org> | 2006-12-05 19:44:57 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-12-05 19:44:57 +0300 |
commit | 869eeadeff956f88f48a3b26ea69d0c2938233a3 (patch) | |
tree | 00f22b1f756cf45ad6769ce92b34b6fb2d95a1c0 /source/blender/blenkernel | |
parent | 3177c4f69fcb53c2aad744ee951ea60d98a77c86 (diff) |
Damn! Commit for render passes in wrong dir....
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_blender.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_material.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 41 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node_composite.c | 93 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node_shaders.c | 35 |
6 files changed, 121 insertions, 53 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 298ed5ff025..71ede8820db 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -44,7 +44,7 @@ struct ListBase; struct MemFile; #define BLENDER_VERSION 242 -#define BLENDER_SUBVERSION 1 +#define BLENDER_SUBVERSION 2 #define BLENDER_MINVERSION 240 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index a9609f88c98..93260bac73d 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -53,7 +53,7 @@ void make_local_material(struct Material *ma); struct Material ***give_matarar(struct Object *ob); short *give_totcolp(struct Object *ob); struct Material *give_current_material(struct Object *ob, int act); -ID *material_from(struct Object *ob, int act); +struct ID *material_from(struct Object *ob, int act); void assign_material(struct Object *ob, struct Material *ma, int act); void new_material_to_objectdata(struct Object *ob); diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 94884caaa25..88f35113dac 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -270,6 +270,7 @@ struct CompBuf; void ntreeCompositTagRender(struct bNodeTree *ntree); void ntreeCompositTagAnimated(struct bNodeTree *ntree); void ntreeCompositTagGenerators(struct bNodeTree *ntree); +void ntreeCompositForceHidden(struct bNodeTree *ntree); void free_compbuf(struct CompBuf *cbuf); /* internal...*/ diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index e54f44075fb..1bcea5a6e42 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -574,7 +574,7 @@ void new_material_to_objectdata(Object *ob) ob->actcol= ob->totcol; } -static void do_init_render_material(Material *ma, int osa, float *amb) +static void do_init_render_material(Material *ma, int r_mode, float *amb) { MTex *mtex; int a, needuv=0; @@ -590,11 +590,11 @@ static void do_init_render_material(Material *ma, int osa, float *amb) if(ma->septex & (1<<a)) continue; mtex= ma->mtex[a]; - if(mtex && mtex->tex) { + if(mtex && mtex->tex && mtex->tex->type) { ma->texco |= mtex->texco; ma->mapto |= mtex->mapto; - if(osa) { + if(r_mode & R_OSA) { if ELEM3(mtex->tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) ma->texco |= TEXCO_OSA; } @@ -604,20 +604,23 @@ static void do_init_render_material(Material *ma, int osa, float *amb) } } - if(ma->mode & MA_RADIO) needuv= 1; + if(r_mode & R_RADIO) + if(ma->mode & MA_RADIO) needuv= 1; if(ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP|MA_FACETEXTURE)) { needuv= 1; - if(osa) ma->texco |= TEXCO_OSA; /* for texfaces */ + if(r_mode & R_OSA) ma->texco |= TEXCO_OSA; /* for texfaces */ } if(needuv) ma->texco |= NEED_UV; - // since the raytracer doesnt recalc O structs for each ray, we have to preset them all - if(ma->mode & (MA_RAYMIRROR|MA_RAYTRANSP|MA_SHADOW_TRA)) { - ma->texco |= NEED_UV|TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM; - if(osa) ma->texco |= TEXCO_OSA; + /* since the raytracer doesnt recalc O structs for each ray, we have to preset them all */ + if(r_mode & R_RAYTRACE) { + if(ma->mode & (MA_RAYMIRROR|MA_RAYTRANSP|MA_SHADOW_TRA)) { + ma->texco |= NEED_UV|TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM; + if(r_mode & R_OSA) ma->texco |= TEXCO_OSA; + } } - + if(amb) { ma->ambr= ma->amb*amb[0]; ma->ambg= ma->amb*amb[1]; @@ -627,7 +630,7 @@ static void do_init_render_material(Material *ma, int osa, float *amb) ma->mode_l= ma->mode; } -static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int osa, float *amb) +static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode, float *amb) { bNode *node; @@ -636,32 +639,32 @@ static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int osa, f if(GS(node->id->name)==ID_MA) { Material *ma= (Material *)node->id; if(ma!=basemat) { - do_init_render_material(ma, osa, amb); + do_init_render_material(ma, r_mode, amb); basemat->texco |= ma->texco; basemat->mode_l |= ma->mode_l; } } else if(node->type==NODE_GROUP) - init_render_nodetree((bNodeTree *)node->id, basemat, osa, amb); + init_render_nodetree((bNodeTree *)node->id, basemat, r_mode, amb); } } /* parses the geom+tex nodes */ - basemat->texco |= ntreeShaderGetTexco(ntree, osa); + basemat->texco |= ntreeShaderGetTexco(ntree, r_mode); } -void init_render_material(Material *mat, int osa, float *amb) +void init_render_material(Material *mat, int r_mode, float *amb) { - do_init_render_material(mat, osa, amb); + do_init_render_material(mat, r_mode, amb); if(mat->nodetree && mat->use_nodes) { - init_render_nodetree(mat->nodetree, mat, osa, amb); + init_render_nodetree(mat->nodetree, mat, r_mode, amb); ntreeBeginExecTree(mat->nodetree); /* has internal flag to detect it only does it once */ } } -void init_render_materials(int osa, float *amb) +void init_render_materials(int r_mode, float *amb) { Material *ma; @@ -670,7 +673,7 @@ void init_render_materials(int osa, float *amb) /* is_used flag comes back in convertblender.c */ ma->flag &= ~MA_IS_USED; if(ma->id.us) - init_render_material(ma, osa, amb); + init_render_material(ma, r_mode, amb); } } diff --git a/source/blender/blenkernel/intern/node_composite.c b/source/blender/blenkernel/intern/node_composite.c index 6050b1c98ba..ed43cf2d808 100644 --- a/source/blender/blenkernel/intern/node_composite.c +++ b/source/blender/blenkernel/intern/node_composite.c @@ -1053,14 +1053,16 @@ static bNodeType cmp_node_image= { #define RRES_OUT_IMAGE 0 #define RRES_OUT_ALPHA 1 #define RRES_OUT_Z 2 -#define RRES_OUT_NOR 3 +#define RRES_OUT_NORMAL 3 #define RRES_OUT_VEC 4 -#define RRES_OUT_COL 5 +#define RRES_OUT_RGBA 5 #define RRES_OUT_DIFF 6 #define RRES_OUT_SPEC 7 -#define RRES_OUT_SHAD 8 +#define RRES_OUT_SHADOW 8 #define RRES_OUT_AO 9 -#define RRES_OUT_RAY 10 +#define RRES_OUT_REFLECT 10 +#define RRES_OUT_REFRACT 11 +#define RRES_OUT_INDEXOB 12 static bNodeSocketType cmp_node_rlayers_out[]= { { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, @@ -1068,12 +1070,14 @@ static bNodeSocketType cmp_node_rlayers_out[]= { { SOCK_VALUE, 0, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VECTOR, 0, "Speed", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, -// { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, -// { SOCK_RGBA, 0, "Diffuse", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, -// { SOCK_RGBA, 0, "Specular", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, -// { SOCK_RGBA, 0, "Shadow", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, -// { SOCK_RGBA, 0, "AO", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, -// { SOCK_RGBA, 0, "Ray", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Diffuse", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Specular", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Shadow", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "AO", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Reflect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Refract", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; @@ -1085,7 +1089,7 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in CompBuf *buf; int buftype= CB_VEC3; - if(passcode==SCE_PASS_Z) + if(ELEM(passcode, SCE_PASS_Z, SCE_PASS_INDEXOB)) buftype= CB_VAL; else if(passcode==SCE_PASS_VECTOR) buftype= CB_VEC4; @@ -1141,22 +1145,26 @@ static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **in, out[RRES_OUT_Z]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_Z); if(out[RRES_OUT_VEC]->hasoutput) out[RRES_OUT_VEC]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_VECTOR); - if(out[RRES_OUT_NOR]->hasoutput) - out[RRES_OUT_NOR]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_NORMAL); - /* - if(out[RRES_OUT_COL]->hasoutput) - out[RRES_OUT_COL]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_RGBA); + if(out[RRES_OUT_NORMAL]->hasoutput) + out[RRES_OUT_NORMAL]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_NORMAL); + + if(out[RRES_OUT_RGBA]->hasoutput) + out[RRES_OUT_RGBA]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_RGBA); if(out[RRES_OUT_DIFF]->hasoutput) out[RRES_OUT_DIFF]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_DIFFUSE); if(out[RRES_OUT_SPEC]->hasoutput) out[RRES_OUT_SPEC]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_SPEC); - if(out[RRES_OUT_SHAD]->hasoutput) - out[RRES_OUT_SHAD]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_SHADOW); + if(out[RRES_OUT_SHADOW]->hasoutput) + out[RRES_OUT_SHADOW]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_SHADOW); if(out[RRES_OUT_AO]->hasoutput) out[RRES_OUT_AO]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_AO); - if(out[RRES_OUT_RAY]->hasoutput) - out[RRES_OUT_RAY]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_RAY); - */ + if(out[RRES_OUT_REFLECT]->hasoutput) + out[RRES_OUT_REFLECT]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_REFLECT); + if(out[RRES_OUT_REFRACT]->hasoutput) + out[RRES_OUT_REFRACT]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_REFRACT); + if(out[RRES_OUT_INDEXOB]->hasoutput) + out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rr->rectx, rr->recty, SCE_PASS_INDEXOB); + generate_preview(node, stackbuf); } } @@ -4384,6 +4392,49 @@ bNodeType *node_all_composit[]= { /* ******************* parse ************ */ +/* based on rules, force sockets hidden always */ +void ntreeCompositForceHidden(bNodeTree *ntree) +{ + bNode *node; + + if(ntree==NULL) return; + + for(node= ntree->nodes.first; node; node= node->next) { + if( node->type==CMP_NODE_R_LAYERS) { + Scene *sce= node->id?(Scene *)node->id:G.scene; /* G.scene is WEAK! */ + SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1); + if(srl) { + bNodeSocket *sock; + for(sock= node->outputs.first; sock; sock= sock->next) + sock->flag &= ~SOCK_UNAVAIL; + + sock= BLI_findlink(&node->outputs, RRES_OUT_Z); + if(!(srl->passflag & SCE_PASS_Z)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_NORMAL); + if(!(srl->passflag & SCE_PASS_NORMAL)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_VEC); + if(!(srl->passflag & SCE_PASS_VECTOR)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_RGBA); + if(!(srl->passflag & SCE_PASS_RGBA)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_DIFF); + if(!(srl->passflag & SCE_PASS_DIFFUSE)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_SPEC); + if(!(srl->passflag & SCE_PASS_SPEC)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_SHADOW); + if(!(srl->passflag & SCE_PASS_SHADOW)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_AO); + if(!(srl->passflag & SCE_PASS_AO)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_REFLECT); + if(!(srl->passflag & SCE_PASS_REFLECT)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_REFRACT); + if(!(srl->passflag & SCE_PASS_REFRACT)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB); + if(!(srl->passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL; + } + } + } + +} /* called from render pipeline, to tag render input and output */ void ntreeCompositTagRender(bNodeTree *ntree) diff --git a/source/blender/blenkernel/intern/node_shaders.c b/source/blender/blenkernel/intern/node_shaders.c index e3710dfbaf7..49c3c4eff59 100644 --- a/source/blender/blenkernel/intern/node_shaders.c +++ b/source/blender/blenkernel/intern/node_shaders.c @@ -34,6 +34,7 @@ #include "DNA_ID.h" #include "DNA_material_types.h" #include "DNA_node_types.h" +#include "DNA_scene_types.h" #include "DNA_texture_types.h" #include "BKE_blender.h" @@ -54,8 +55,8 @@ /* ********* exec data struct, remains internal *********** */ typedef struct ShaderCallData { - ShadeInput *shi; - ShadeResult *shr; + ShadeInput *shi; /* from render pipe */ + ShadeResult *shr; /* from render pipe */ } ShaderCallData; @@ -103,9 +104,7 @@ static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bN if(node->flag & NODE_DO_OUTPUT) { ShadeResult *shr= ((ShaderCallData *)data)->shr; - VECCOPY(shr->diff, col); - col[0]= col[1]= col[2]= 0.0f; - VECCOPY(shr->spec, col); + QUATCOPY(shr->combined, col); shr->alpha= col[3]; // VECCOPY(shr->nor, in[3]->vec); @@ -223,9 +222,10 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, if(data && node->id) { ShadeResult shrnode; ShadeInput *shi; + ShaderCallData *shcd= data; float col[4], *nor; - shi= ((ShaderCallData *)data)->shi; + shi= shcd->shi; shi->mat= (Material *)node->id; /* copy all relevant material vars, note, keep this synced with render_types.h */ @@ -264,9 +264,9 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, /* write to outputs */ if(node->custom1 & SH_NODE_MAT_DIFF) { - VECCOPY(col, shrnode.diff); - if(node->custom1 & SH_NODE_MAT_SPEC) { - VecAddf(col, col, shrnode.spec); + VECCOPY(col, shrnode.combined); + if(!(node->custom1 & SH_NODE_MAT_SPEC)) { + VecSubf(col, col, shrnode.spec); } } else if(node->custom1 & SH_NODE_MAT_SPEC) { @@ -291,6 +291,9 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, VECCOPY(out[MAT_OUT_NORMAL]->vec, shi->vn); + /* copy passes, now just active node */ + if(node->flag & NODE_ACTIVE) + *(shcd->shr)= shrnode; } } @@ -1029,11 +1032,21 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) scd.shr= shr; ntreeExecTree(ntree, &scd, shi->thread); /* threads */ + + /* better not allow negative for now */ + if(shr->spec[0]<0.0f) shr->spec[0]= 0.0f; + if(shr->spec[1]<0.0f) shr->spec[1]= 0.0f; + if(shr->spec[2]<0.0f) shr->spec[2]= 0.0f; + + if(shr->combined[0]<0.0f) shr->combined[0]= 0.0f; + if(shr->combined[1]<0.0f) shr->combined[1]= 0.0f; + if(shr->combined[2]<0.0f) shr->combined[2]= 0.0f; + } /* go over all used Geometry and Texture nodes, and return a texco flag */ /* no group inside needed, this function is called for groups too */ -int ntreeShaderGetTexco(bNodeTree *ntree, int osa) +int ntreeShaderGetTexco(bNodeTree *ntree, int r_mode) { bNode *node; bNodeSocket *sock; @@ -1043,7 +1056,7 @@ int ntreeShaderGetTexco(bNodeTree *ntree, int osa) for(node= ntree->nodes.first; node; node= node->next) { if(node->type==SH_NODE_TEXTURE) { - if(osa && node->id) { + if((r_mode & R_OSA) && node->id) { Tex *tex= (Tex *)node->id; if ELEM3(tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) texco |= TEXCO_OSA|NEED_UV; |