[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36332] trunk/blender/source/blender: fix [#27178] Material links lost when making mesh data local
Campbell Barton
ideasman42 at gmail.com
Tue Apr 26 09:17:22 CEST 2011
Revision: 36332
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36332
Author: campbellbarton
Date: 2011-04-26 07:17:21 +0000 (Tue, 26 Apr 2011)
Log Message:
-----------
fix [#27178] Material links lost when making mesh data local
- making local object data - Curve/Mesh/MBall lost references to linked materials.
- joining a linked mesh object into a local one lost the link.
As well as these reported bugs, checked all local functions for consistency/correctness and found other cases which would also fail.
- making local metaball didn't ensure unique ID name.
- make_local_armature() was missing check for object users - main body of code would never run.
- local particles didn't set the dupli-group or textures to extern.
checked all local functions for consistency/correctness.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_material.h
trunk/blender/source/blender/blenkernel/BKE_mesh.h
trunk/blender/source/blender/blenkernel/BKE_object.h
trunk/blender/source/blender/blenkernel/intern/action.c
trunk/blender/source/blender/blenkernel/intern/armature.c
trunk/blender/source/blender/blenkernel/intern/brush.c
trunk/blender/source/blender/blenkernel/intern/curve.c
trunk/blender/source/blender/blenkernel/intern/lattice.c
trunk/blender/source/blender/blenkernel/intern/material.c
trunk/blender/source/blender/blenkernel/intern/mball.c
trunk/blender/source/blender/blenkernel/intern/mesh.c
trunk/blender/source/blender/blenkernel/intern/object.c
trunk/blender/source/blender/blenkernel/intern/particle.c
trunk/blender/source/blender/blenkernel/intern/texture.c
trunk/blender/source/blender/blenkernel/intern/world.c
trunk/blender/source/blender/editors/mesh/meshtools.c
Modified: trunk/blender/source/blender/blenkernel/BKE_material.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_material.h 2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/BKE_material.h 2011-04-26 07:17:21 UTC (rev 36332)
@@ -55,6 +55,7 @@
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);
+void extern_local_matarar(struct Material **matar, short totcol);
void automatname(struct Material *);
Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h 2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h 2011-04-26 07:17:21 UTC (rev 36332)
@@ -66,7 +66,6 @@
struct Mesh *add_mesh(const char *name);
struct Mesh *copy_mesh(struct Mesh *me);
void mesh_update_customdata_pointers(struct Mesh *me);
-void make_local_tface(struct Mesh *me);
void make_local_mesh(struct Mesh *me);
void boundbox_mesh(struct Mesh *me, float *loc, float *size);
void tex_space_mesh(struct Mesh *me);
Modified: trunk/blender/source/blender/blenkernel/BKE_object.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_object.h 2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/BKE_object.h 2011-04-26 07:17:21 UTC (rev 36332)
@@ -91,7 +91,6 @@
struct Object *add_object(struct Scene *scene, int type);
struct Object *copy_object(struct Object *ob);
-void expand_local_object(struct Object *ob);
void make_local_object(struct Object *ob);
int object_is_libdata(struct Object *ob);
int object_data_is_libdata(struct Object *ob);
Modified: trunk/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/action.c 2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/action.c 2011-04-26 07:17:21 UTC (rev 36332)
@@ -95,6 +95,7 @@
void make_local_action(bAction *act)
{
// Object *ob;
+ Main *bmain= G.main;
bAction *actn;
int local=0, lib=0;
@@ -102,7 +103,7 @@
if (act->id.us==1) {
act->id.lib= NULL;
act->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)act, NULL);
+ new_id(&bmain->action, (ID *)act, NULL);
return;
}
@@ -121,7 +122,7 @@
act->id.lib= NULL;
act->id.flag= LIB_LOCAL;
//make_local_action_channels(act);
- new_id(NULL, (ID *)act, NULL);
+ new_id(&bmain->action, (ID *)act, NULL);
}
else if(local && lib) {
actn= copy_action(act);
Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c 2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c 2011-04-26 07:17:21 UTC (rev 36332)
@@ -137,39 +137,42 @@
void make_local_armature(bArmature *arm)
{
+ Main *bmain= G.main;
int local=0, lib=0;
Object *ob;
- bArmature *newArm;
-
- if (arm->id.lib==NULL)
- return;
+
+ if (arm->id.lib==NULL) return;
if (arm->id.us==1) {
arm->id.lib= NULL;
arm->id.flag= LIB_LOCAL;
- new_id(NULL, (ID*)arm, NULL);
+ new_id(&bmain->armature, (ID*)arm, NULL);
return;
}
-
+
+ for(ob= bmain->object.first; ob && ELEM(0, lib, local); ob= ob->id.next) {
+ if(ob->data == arm) {
+ if(ob->id.lib) lib= 1;
+ else local= 1;
+ }
+ }
+
if(local && lib==0) {
arm->id.lib= NULL;
arm->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)arm, NULL);
+ new_id(&bmain->armature, (ID *)arm, NULL);
}
else if(local && lib) {
- newArm= copy_armature(arm);
- newArm->id.us= 0;
+ bArmature *armn= copy_armature(arm);
+ armn->id.us= 0;
- ob= G.main->object.first;
- while(ob) {
- if(ob->data==arm) {
-
+ for(ob= bmain->object.first; ob; ob= ob->id.next) {
+ if(ob->data == arm) {
if(ob->id.lib==NULL) {
- ob->data= newArm;
- newArm->id.us++;
+ ob->data= armn;
+ armn->id.us++;
arm->id.us--;
}
}
- ob= ob->id.next;
}
}
}
Modified: trunk/blender/source/blender/blenkernel/intern/brush.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/brush.c 2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/brush.c 2011-04-26 07:17:21 UTC (rev 36332)
@@ -180,14 +180,20 @@
curvemapping_free(brush->curve);
}
+static void extern_local_brush(Brush *brush)
+{
+ id_lib_extern((ID *)brush->mtex.tex);
+}
+
void make_local_brush(Brush *brush)
{
+
/* - only lib users: do nothing
- * - only local users: set flag
- * - mixed: make copy
- */
-
- Brush *brushn;
+ * - only local users: set flag
+ * - mixed: make copy
+ */
+
+ Main *bmain= G.main;
Scene *scene;
int local= 0, lib= 0;
@@ -197,19 +203,22 @@
/* special case: ima always local immediately */
brush->clone.image->id.lib= NULL;
brush->clone.image->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)brush->clone.image, NULL);
+ new_id(&bmain->brush, (ID *)brush->clone.image, NULL);
+ extern_local_brush(brush);
}
- for(scene= G.main->scene.first; scene; scene=scene->id.next)
+ for(scene= bmain->scene.first; scene && ELEM(0, lib, local); scene=scene->id.next) {
if(paint_brush(&scene->toolsettings->imapaint.paint)==brush) {
if(scene->id.lib) lib= 1;
else local= 1;
}
+ }
if(local && lib==0) {
brush->id.lib= NULL;
brush->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)brush, NULL);
+ new_id(&bmain->brush, (ID *)brush, NULL);
+ extern_local_brush(brush);
/* enable fake user by default */
if (!(brush->id.flag & LIB_FAKEUSER)) {
@@ -218,17 +227,19 @@
}
}
else if(local && lib) {
- brushn= copy_brush(brush);
+ Brush *brushn= copy_brush(brush);
brushn->id.us= 1; /* only keep fake user */
brushn->id.flag |= LIB_FAKEUSER;
- for(scene= G.main->scene.first; scene; scene=scene->id.next)
- if(paint_brush(&scene->toolsettings->imapaint.paint)==brush)
+ for(scene= bmain->scene.first; scene; scene=scene->id.next) {
+ if(paint_brush(&scene->toolsettings->imapaint.paint)==brush) {
if(scene->id.lib==NULL) {
paint_brush_set(&scene->toolsettings->imapaint.paint, brushn);
brushn->id.us++;
brush->id.us--;
}
+ }
+ }
}
}
Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c 2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c 2011-04-26 07:17:21 UTC (rev 36332)
@@ -63,7 +63,8 @@
#include "BKE_key.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_object.h"
+#include "BKE_object.h"
+#include "BKE_material.h"
#include "ED_curve.h"
@@ -216,10 +217,22 @@
return cun;
}
+static void extern_local_curve(Curve *cu)
+{
+ id_lib_extern((ID *)cu->vfont);
+ id_lib_extern((ID *)cu->vfontb);
+ id_lib_extern((ID *)cu->vfonti);
+ id_lib_extern((ID *)cu->vfontbi);
+
+ if(cu->mat) {
+ extern_local_matarar(cu->mat, cu->totcol);
+ }
+}
+
void make_local_curve(Curve *cu)
{
- Object *ob = NULL;
- Curve *cun;
+ Main *bmain= G.main;
+ Object *ob;
int local=0, lib=0;
/* - when there are only lib users: don't do
@@ -229,47 +242,41 @@
if(cu->id.lib==NULL) return;
- if(cu->vfont) cu->vfont->id.lib= NULL;
- if(cu->vfontb) cu->vfontb->id.lib= NULL;
- if(cu->vfonti) cu->vfonti->id.lib= NULL;
- if(cu->vfontbi) cu->vfontbi->id.lib= NULL;
-
if(cu->id.us==1) {
cu->id.lib= NULL;
cu->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)cu, NULL);
+
+ new_id(&bmain->curve, (ID *)cu, NULL);
+ extern_local_curve(cu);
return;
}
-
- ob= G.main->object.first;
- while(ob) {
- if(ob->data==cu) {
+
+ for(ob= bmain->object.first; ob && ELEM(0, lib, local); ob= ob->id.next) {
+ if(ob->data == cu) {
if(ob->id.lib) lib= 1;
else local= 1;
}
- ob= ob->id.next;
}
-
+
if(local && lib==0) {
cu->id.lib= NULL;
cu->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)cu, NULL);
+
+ new_id(&bmain->curve, (ID *)cu, NULL);
+ extern_local_curve(cu);
}
else if(local && lib) {
- cun= copy_curve(cu);
+ Curve *cun= copy_curve(cu);
cun->id.us= 0;
-
- ob= G.main->object.first;
- while(ob) {
+
+ for(ob= bmain->object.first; ob; ob= ob->id.next) {
if(ob->data==cu) {
-
if(ob->id.lib==NULL) {
ob->data= cun;
cun->id.us++;
cu->id.us--;
}
}
- ob= ob->id.next;
}
}
}
Modified: trunk/blender/source/blender/blenkernel/intern/lattice.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lattice.c 2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/lattice.c 2011-04-26 07:17:21 UTC (rev 36332)
@@ -249,8 +249,8 @@
void make_local_lattice(Lattice *lt)
{
+ Main *bmain= G.main;
Object *ob;
- Lattice *ltn;
int local=0, lib=0;
/* - only lib users: do nothing
@@ -262,39 +262,34 @@
if(lt->id.us==1) {
lt->id.lib= NULL;
lt->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)lt, NULL);
+ new_id(&bmain->latt, (ID *)lt, NULL);
return;
}
- ob= G.main->object.first;
- while(ob) {
+ for(ob= bmain->object.first; ob && ELEM(0, lib, local); ob= ob->id.next) {
if(ob->data==lt) {
if(ob->id.lib) lib= 1;
else local= 1;
}
- ob= ob->id.next;
}
if(local && lib==0) {
lt->id.lib= NULL;
lt->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)lt, NULL);
+ new_id(&bmain->latt, (ID *)lt, NULL);
}
else if(local && lib) {
- ltn= copy_lattice(lt);
+ Lattice *ltn= copy_lattice(lt);
ltn->id.us= 0;
-
- ob= G.main->object.first;
- while(ob) {
+
+ for(ob= bmain->object.first; ob; ob= ob->id.next) {
if(ob->data==lt) {
-
if(ob->id.lib==NULL) {
ob->data= ltn;
ltn->id.us++;
lt->id.us--;
}
}
- ob= ob->id.next;
}
}
}
Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c 2011-04-26 00:10:15 UTC (rev 36331)
+++ trunk/blender/source/blender/blenkernel/intern/material.c 2011-04-26 07:17:21 UTC (rev 36332)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list