[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33796] trunk/blender/source/blender: Bugfix #25301
Ton Roosendaal
ton at blender.org
Sun Dec 19 21:12:12 CET 2010
Revision: 33796
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33796
Author: ton
Date: 2010-12-19 21:12:12 +0100 (Sun, 19 Dec 2010)
Log Message:
-----------
Bugfix #25301
Preview render for node shaders broke, caused by localizing
materials last week, to prevent thread crashes. Fixed now.
Also added a temp fix to draw color-management corrected
node previews default. Will follow scene setting tomorrow.
Also: SSS in nodes doesn't render yet. Was issue in 2.4 too...
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_material.h
trunk/blender/source/blender/blenkernel/intern/material.c
trunk/blender/source/blender/blenkernel/intern/node.c
trunk/blender/source/blender/editors/render/render_preview.c
trunk/blender/source/blender/render/intern/source/pipeline.c
trunk/blender/source/blender/render/intern/source/sss.c
Modified: trunk/blender/source/blender/blenkernel/BKE_material.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_material.h 2010-12-19 19:22:17 UTC (rev 33795)
+++ trunk/blender/source/blender/blenkernel/BKE_material.h 2010-12-19 20:12:12 UTC (rev 33796)
@@ -49,6 +49,7 @@
void init_material(struct Material *ma);
struct Material *add_material(const char *name);
struct Material *copy_material(struct Material *ma);
+struct Material *localize_material(struct Material *ma);
struct Material *give_node_material(struct Material *ma); /* returns node material or self */
void make_local_material(struct Material *ma);
Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c 2010-12-19 19:22:17 UTC (rev 33795)
+++ trunk/blender/source/blender/blenkernel/intern/material.c 2010-12-19 20:12:12 UTC (rev 33796)
@@ -44,6 +44,7 @@
#include "DNA_scene_types.h"
#include "BLI_math.h"
+#include "BLI_listbase.h"
#include "BKE_animsys.h"
#include "BKE_displist.h"
@@ -196,6 +197,7 @@
return ma;
}
+/* XXX keep synced with next function */
Material *copy_material(Material *ma)
{
Material *man;
@@ -227,6 +229,38 @@
return man;
}
+/* XXX (see above) material copy without adding to main dbase */
+Material *localize_material(Material *ma)
+{
+ Material *man;
+ int a;
+
+ man= copy_libblock(ma);
+ BLI_remlink(&G.main->mat, man);
+
+ for(a=0; a<MAX_MTEX; a++) {
+ if(ma->mtex[a]) {
+ man->mtex[a]= MEM_mallocN(sizeof(MTex), "copymaterial");
+ memcpy(man->mtex[a], ma->mtex[a], sizeof(MTex));
+ /* free_material decrements! */
+ id_us_plus((ID *)man->mtex[a]->tex);
+ }
+ }
+
+ if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col);
+ if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec);
+
+ if (ma->preview) man->preview = BKE_previewimg_copy(ma->preview);
+
+ if(ma->nodetree) {
+ man->nodetree= ntreeLocalize(ma->nodetree);
+ }
+
+ man->gpumaterial.first= man->gpumaterial.last= NULL;
+
+ return man;
+}
+
void make_local_material(Material *ma)
{
Main *bmain= G.main;
Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c 2010-12-19 19:22:17 UTC (rev 33795)
+++ trunk/blender/source/blender/blenkernel/intern/node.c 2010-12-19 20:12:12 UTC (rev 33796)
@@ -1186,12 +1186,12 @@
}
if(node->preview->rect==NULL) {
- node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(float)*4, "node preview rect");
+ node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(char)*4, "node preview rect");
node->preview->xsize= xsize;
node->preview->ysize= ysize;
}
else
- memset(node->preview->rect, 0, 4*xsize + xsize*ysize*sizeof(float)*4);
+ memset(node->preview->rect, 0, 4*xsize + xsize*ysize*sizeof(char)*4);
}
void ntreeInitPreview(bNodeTree *ntree, int xsize, int ysize)
@@ -1241,12 +1241,18 @@
if(x>=0 && y>=0) {
if(x<preview->xsize && y<preview->ysize) {
unsigned char *tar= preview->rect+ 4*((preview->xsize*y) + x);
- //if(tar[0]==0.0f) {
- tar[0]= FTOCHAR(col[0]);
- tar[1]= FTOCHAR(col[1]);
- tar[2]= FTOCHAR(col[2]);
+
+ if(TRUE) {
+ tar[0]= FTOCHAR(linearrgb_to_srgb(col[0]));
+ tar[1]= FTOCHAR(linearrgb_to_srgb(col[1]));
+ tar[2]= FTOCHAR(linearrgb_to_srgb(col[2]));
+ }
+ else {
+ tar[0]= FTOCHAR(col[0]);
+ tar[1]= FTOCHAR(col[1]);
+ tar[2]= FTOCHAR(col[2]);
+ }
tar[3]= FTOCHAR(col[3]);
- //}
}
//else printf("prv out bound x y %d %d\n", x, y);
}
@@ -1699,33 +1705,36 @@
{
bNode *node;
- /* find the active outputs, might become tree type dependant handler */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- bNode *tnode;
- int output= 0;
-
- /* we need a check for which output node should be tagged like this, below an exception */
- if(node->type==CMP_NODE_OUTPUT_FILE)
- continue;
-
- /* there is more types having output class, each one is checked */
- for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
- if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- /* same type, exception for viewer */
- if(tnode->type==node->type ||
- (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
- ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
- if(tnode->flag & NODE_DO_OUTPUT) {
- output++;
- if(output>1)
- tnode->flag &= ~NODE_DO_OUTPUT;
+ if(ntree->type==NTREE_COMPOSIT) {
+
+ /* find the active outputs, might become tree type dependant handler */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+ bNode *tnode;
+ int output= 0;
+
+ /* we need a check for which output node should be tagged like this, below an exception */
+ if(node->type==CMP_NODE_OUTPUT_FILE)
+ continue;
+
+ /* there is more types having output class, each one is checked */
+ for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
+ if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+ /* same type, exception for viewer */
+ if(tnode->type==node->type ||
+ (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
+ ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
+ if(tnode->flag & NODE_DO_OUTPUT) {
+ output++;
+ if(output>1)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+ }
}
}
}
+ if(output==0)
+ node->flag |= NODE_DO_OUTPUT;
}
- if(output==0)
- node->flag |= NODE_DO_OUTPUT;
}
}
@@ -2586,8 +2595,6 @@
/* ensures only a single output node is enabled */
ntreeSetOutput(ntree);
- /* move over the compbufs */
- /* right after ntreeCopyTree() oldsock pointers are valid */
for(node= ntree->nodes.first; node; node= node->next) {
/* store new_node pointer to original */
@@ -2595,22 +2602,27 @@
/* ensure new user input gets handled ok */
node->need_exec= 0;
- if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
- if(node->id) {
- if(node->flag & NODE_DO_OUTPUT)
- node->new_node->id= (ID *)copy_image((Image *)node->id);
- else
- node->new_node->id= NULL;
+ if(ntree->type==NTREE_COMPOSIT) {
+ /* move over the compbufs */
+ /* right after ntreeCopyTree() oldsock pointers are valid */
+
+ if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+ if(node->id) {
+ if(node->flag & NODE_DO_OUTPUT)
+ node->new_node->id= (ID *)copy_image((Image *)node->id);
+ else
+ node->new_node->id= NULL;
+ }
}
- }
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- sock->new_sock->ns.data= sock->ns.data;
- compbuf_set_node(sock->new_sock->ns.data, node->new_node);
-
- sock->ns.data= NULL;
- sock->new_sock->new_sock= sock;
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+
+ sock->new_sock->ns.data= sock->ns.data;
+ compbuf_set_node(sock->new_sock->ns.data, node->new_node);
+
+ sock->ns.data= NULL;
+ sock->new_sock->new_sock= sock;
+ }
}
}
@@ -2638,19 +2650,38 @@
/* sync local composite with real tree */
/* local composite is supposed to be running, be careful moving previews! */
+/* is called by jobs manager, outside threads, so it doesnt happen during draw */
void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
{
bNode *lnode;
- /* move over the compbufs and previews */
- for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
- if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+ if(ntree->type==NTREE_COMPOSIT) {
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+ if(node_exists(ntree, lnode->new_node)) {
+
+ if(lnode->preview && lnode->preview->rect) {
+ node_free_preview(lnode->new_node);
+ lnode->new_node->preview= lnode->preview;
+ lnode->preview= NULL;
+ }
+ }
+ }
+ }
+ }
+ else if(ntree->type==NTREE_SHADER) {
+ /* copy over contents of previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
if(node_exists(ntree, lnode->new_node)) {
+ bNode *node= lnode->new_node;
- if(lnode->preview && lnode->preview->rect) {
- node_free_preview(lnode->new_node);
- lnode->new_node->preview= lnode->preview;
- lnode->preview= NULL;
+ if(node->preview && node->preview->rect) {
+ if(lnode->preview && lnode->preview->rect) {
+ int xsize= node->preview->xsize;
+ int ysize= node->preview->ysize;
+ memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4);
+ }
}
}
}
Modified: trunk/blender/source/blender/editors/render/render_preview.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_preview.c 2010-12-19 19:22:17 UTC (rev 33795)
+++ trunk/blender/source/blender/editors/render/render_preview.c 2010-12-19 20:12:12 UTC (rev 33796)
@@ -343,13 +343,12 @@
strcpy(sce->r.engine, scene->r.engine);
if(id_type==ID_MA) {
- Material *mat= NULL;
+ Material *mat= NULL, *origmat= (Material *)id;
if(id) {
/* work on a copy */
- mat= copy_material((Material *)id);
+ mat= localize_material(origmat);
sp->matcopy= mat;
- BLI_remlink(&G.main->mat, mat);
BLI_addtail(&pr_main->mat, mat);
init_render_material(mat, 0, NULL); /* call that retrieves mode_l */
@@ -403,18 +402,16 @@
}
else {
sce->lay= 1<<mat->pr_type;
- if(mat->nodetree && sp->pr_method==PR_NODE_RENDER)
+ if(mat->nodetree && sp->pr_method==PR_NODE_RENDER) {
+ /* two previews, they get copied by wmJob */
ntreeInitPreview(mat->nodetree, sp->sizex, sp->sizey);
+ ntreeInitPreview(origmat->nodetree, sp->sizex, sp->sizey);
+ }
}
}
else {
sce->r.mode &= ~(R_OSA|R_RAYTRACE|R_SSS);
- /* get rid of copied material */
- BLI_remlink(&pr_main->mat, sp->matcopy);
- free_material(sp->matcopy);
- MEM_freeN(sp->matcopy);
- sp->matcopy= NULL;
}
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list