diff options
author | Campbell Barton <ideasman42@gmail.com> | 2007-04-23 02:08:19 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2007-04-23 02:08:19 +0400 |
commit | 94ad8c810c1699188f4c54a9307af31fc5fd9e7a (patch) | |
tree | 1383cf6f4649cf29ecc7753f74fe899fd3bf65e1 /source | |
parent | 1c52e2cfa4096f3775472bd11d5ac982edc5ae3a (diff) |
Changed TESTBASE and TESTBASE_LIB to check the hidden flag
Checked every instance of testbase to see this dosnt break anything, also changed TESTBASE and TESTBASELIB, both were used incorrectly in places.
added error_libdata() for library error messages that are everywhere.
added object_data_is_libdata to test if the object and its data's are from a library.
fixed 2 crashs in adding Curve points to a library object (remember to check, verify_ipocurve returns NULL!)
made duplicating and making dupli's real for lib objects possible, disabled joining into lib armatures and meshes.
Diffstat (limited to 'source')
30 files changed, 197 insertions, 136 deletions
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h index 464b851413f..ad2dbc52d69 100644 --- a/source/blender/blenlib/BLI_blenlib.h +++ b/source/blender/blenlib/BLI_blenlib.h @@ -389,4 +389,3 @@ void BLI_timestr(double time, char *str); #endif #endif - diff --git a/source/blender/include/BDR_editobject.h b/source/blender/include/BDR_editobject.h index 31412a4fd0a..2a96a8d65cb 100644 --- a/source/blender/include/BDR_editobject.h +++ b/source/blender/include/BDR_editobject.h @@ -117,6 +117,7 @@ void add_hook(void); void hook_select(struct HookModifierData *hmd); int hook_getIndexArray(int *tot, int **indexar, char *name, float *cent_r); +int object_data_is_libdata(struct Object *ob); void hide_objects(int select); void show_objects(void); diff --git a/source/blender/include/BIF_toolbox.h b/source/blender/include/BIF_toolbox.h index d2ff84d18d8..72867cbfa05 100644 --- a/source/blender/include/BIF_toolbox.h +++ b/source/blender/include/BIF_toolbox.h @@ -43,6 +43,8 @@ void reset_toolbox(void); void notice (char *str, ...); void error (char *fmt, ...); +void error_libdata (void); + int saveover (char *filename); int okee (char *fmt, ...); diff --git a/source/blender/include/blendef.h b/source/blender/include/blendef.h index dc0d1998808..4b36aea88a8 100644 --- a/source/blender/include/blendef.h +++ b/source/blender/include/blendef.h @@ -95,8 +95,8 @@ #define NOT_YET 0 -#define TESTBASE(base) ( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) ) -#define TESTBASELIB(base) ( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && ((base)->object->id.lib==0)) +#define TESTBASE(base) ( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) ) +#define TESTBASELIB(base) ( ((base)->flag & SELECT) && ((base)->lay & G.vd->lay) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0)) #define BASE_SELECTABLE(base) ((base->lay & G.vd->lay) && !(base->object->restrictflag & OB_RESTRICT_SELECT) && !(base->object->restrictflag & OB_RESTRICT_VIEW)) #define FIRSTBASE G.scene->base.first #define LASTBASE G.scene->base.last @@ -441,4 +441,8 @@ #define VP_HARD 64 #define VP_ONLYVGROUP 128 +/* Error messages */ +#define ERROR_LIBDATA_MESSAGE "Can't edit external libdata" + + #endif diff --git a/source/blender/python/api2_2x/Constraint.c b/source/blender/python/api2_2x/Constraint.c index 901947574b4..37c24dbbda6 100644 --- a/source/blender/python/api2_2x/Constraint.c +++ b/source/blender/python/api2_2x/Constraint.c @@ -392,10 +392,14 @@ static PyObject *Constraint_insertKey( BPy_Constraint * self, PyObject * arg ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected a float argument" ); - // constraint_active_func(ob_v, con_v); + /* constraint_active_func(ob_v, con_v); */ get_constraint_ipo_context( ob, actname ); icu= verify_ipocurve((ID *)ob, ID_CO, actname, con->name, CO_ENFORCE); - + + if (!icu) + return EXPP_ReturnPyObjError( PyExc_RuntimeError, + "cannot get a curve from this IPO, may be using libdata" ); + if( ob->action ) insert_vert_ipo( icu, get_action_frame(ob, cfra), con->enforce); else diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c index beeb42af96c..29478de74ff 100644 --- a/source/blender/python/api2_2x/Object.c +++ b/source/blender/python/api2_2x/Object.c @@ -2504,6 +2504,11 @@ static PyObject *Object_setConstraintInfluenceForBone( BPy_Object * self, icu = verify_ipocurve((ID *)self->object, ID_CO, boneName, constName, CO_ENFORCE); + + if (!icu) + return EXPP_ReturnPyObjError( PyExc_RuntimeError, + "cannot get a curve from this IPO, may be using libdata" ); + insert_vert_ipo(icu, (float)CFRA, influence); self->object->recalc |= OB_RECALC_OB; diff --git a/source/blender/src/butspace.c b/source/blender/src/butspace.c index e58b3d5542f..f694c9aa862 100644 --- a/source/blender/src/butspace.c +++ b/source/blender/src/butspace.c @@ -39,6 +39,7 @@ #include <config.h> #endif +#include "blendef.h" #include "MEM_guardedalloc.h" #include "DNA_color_types.h" @@ -714,7 +715,7 @@ void drawbutspace(ScrArea *sa, void *spacedata) glClearColor(col[0], col[1], col[2], 0.0); glClear(GL_COLOR_BUFFER_BIT); - uiSetButLock(G.scene->id.lib!=0, "Can't edit library data"); + uiSetButLock(G.scene->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiFreeBlocksWin(&sa->uiblocks, sa->win); /* select the context to be drawn, per contex/tab the actual context is tested */ diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index 96e4ed4454d..6bf20a228ea 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -803,7 +803,7 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me) block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_type", UI_EMBOSS, UI_HELV, curarea->win); if( uiNewPanel(curarea, block, "Mesh", "Editing", 320, 0, 318, 204)==0) return; - uiSetButLock(me->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiDefButBitS(block, TOG, ME_AUTOSMOOTH, REDRAWVIEW3D, "Auto Smooth",10,180,170,19, &me->flag, 0, 0, 0, 0, "Treats all set-smoothed faces with angles less than Degr: as 'smooth' during render"); @@ -2057,7 +2057,7 @@ static void editing_panel_modifiers(Object *ob) block= uiNewBlock(&curarea->uiblocks, "editing_panel_modifiers", UI_EMBOSS, UI_HELV, curarea->win); if( uiNewPanel(curarea, block, "Modifiers", "Editing", 640, 0, 318, 204)==0) return; - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); uiNewPanelHeight(block, 204); uiDefBlockBut(block, modifiers_add_menu, ob, "Add Modifier", 0, 190, 130, 20, "Add a new modifier"); @@ -2110,7 +2110,7 @@ static void editing_panel_shapes(Object *ob) if( uiNewPanel(curarea, block, "Shapes", "Editing", 640, 0, 318, 204)==0) return; /* Todo check data is library here */ - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); uiDefBut(block, BUT, B_ADDKEY, "Add Shape Key" , 10, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, "Add new Shape Key"); @@ -3017,7 +3017,7 @@ static void editing_panel_camera_type(Object *ob, Camera *cam) block= uiNewBlock(&curarea->uiblocks, "editing_panel_camera_type", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Camera", "Editing", 320, 0, 318, 204)==0) return; - uiSetButLock(ob->id.lib || cam->id.lib, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); uiDefBut(block, LABEL, 10, "Lens:", 10, 180, 150, 20, 0, 0.0, 0.0, 0, 0, ""); @@ -3761,7 +3761,7 @@ static int ob_arm_bone_pchan_lock(Object *ob, bArmature *arm, Bone *bone, bPoseC return 0; if(arm->id.lib) { if(pchan==NULL) - uiSetButLock(1, "Can't edit library data"); + uiSetButLock(1, ERROR_LIBDATA_MESSAGE); else if(ob->proxy && bone->layer & arm->layer_protected) { uiSetButLock(1, "Can't edit protected proxy channel"); return 1; @@ -4389,8 +4389,7 @@ static void editing_panel_links(Object *ob) block= uiNewBlock(&curarea->uiblocks, "editing_panel_links", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Link and Materials", "Editing", 0, 0, 318, 204)==0) return; - if (ob) - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); buttons_active_id(&id, &idfrom); @@ -4434,7 +4433,7 @@ static void editing_panel_links(Object *ob) uiBlockSetCol(block, TH_AUTO); } if(ob) { - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); but = uiDefBut(block, TEX, B_IDNAME, "OB:", xco, 180, 454-xco, YIC, ob->id.name+2, 0.0, 21.0, 0, 0, "Active Object name."); #ifdef WITH_VERSE if(ob->vnode) uiButSetFunc(but, test_and_send_idbutton_cb, ob, ob->id.name); @@ -4504,7 +4503,7 @@ static void editing_panel_links(Object *ob) else { ID *id= ob->data; - uiSetButLock(id->lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign (block); uiDefBut (block, BUT, B_NEWVGROUP, "New", 143, 90, 70, 21, 0, 0, 0, 0, 0, "Creates a new vertex group"); @@ -4522,7 +4521,7 @@ static void editing_panel_links(Object *ob) else return; id= ob->data; - uiSetButLock(id->lib!=NULL, "Cannot edit Library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); if(ob->type==OB_MESH) poin= &( ((Mesh *)ob->data)->texflag ); else if(ob->type==OB_MBALL) poin= &( ((MetaBall *)ob->data)->texflag ); @@ -5313,9 +5312,7 @@ void editing_panel_mesh_multires() block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_multires", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Multires", "Editing", 500, 0, 318, 204)==0) return; - if (ob->id.lib || me->id.lib) - uiSetButLock(1, "Can't edit library data"); - + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); if(!me->mr) { but= uiDefBut(block,BUT,B_NOP,"Add Multires", cx,cy,268,19,0,0,0,0,0,""); @@ -5384,7 +5381,7 @@ void editing_panels() ob= OBACT; if(ob==NULL) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); switch(ob->type) { case OB_MESH: diff --git a/source/blender/src/buttons_logic.c b/source/blender/src/buttons_logic.c index 2a2cf583129..1a1d7828ef0 100644 --- a/source/blender/src/buttons_logic.c +++ b/source/blender/src/buttons_logic.c @@ -2536,7 +2536,7 @@ void logic_buts(void) ob= OBACT; if(ob==0) return; - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); sprintf(name, "buttonswin %d", curarea->win); block= uiNewBlock(&curarea->uiblocks, name, UI_EMBOSS, UI_HELV, curarea->win); @@ -2622,7 +2622,7 @@ void logic_buts(void) for(a=0; a<count; a++) { ob= (Object *)idar[a]; uiClearButLock(); - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); if( (ob->scavisflag & OB_VIS_SENS) == 0) continue; @@ -2693,7 +2693,7 @@ void logic_buts(void) for(a=0; a<count; a++) { ob= (Object *)idar[a]; uiClearButLock(); - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); if( (ob->scavisflag & OB_VIS_CONT) == 0) continue; /* presume it is only objects for now */ @@ -2761,7 +2761,7 @@ void logic_buts(void) for(a=0; a<count; a++) { ob= (Object *)idar[a]; uiClearButLock(); - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); if( (ob->scavisflag & OB_VIS_ACT) == 0) continue; /* presume it is only objects for now */ diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index b22bc0fa2e1..c0b9d324503 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -254,7 +254,12 @@ static void add_influence_key_to_constraint_func (void *ob_v, void *con_v) /* adds ipo & channels & curve if needed */ icu= verify_ipocurve((ID *)ob, ID_CO, actname, con->name, CO_ENFORCE); - + + if (!icu) { + error("Cannot get a curve from this IPO, may be dealing with linked data"); + return; + } + if(ob->action) insert_vert_ipo(icu, get_action_frame(ob, (float)CFRA), con->enforce); else @@ -1588,7 +1593,7 @@ void softbody_bake(Object *ob) } else { for(base=G.scene->base.first; base; base= base->next) { - if(TESTBASE(base)) { + if(TESTBASELIB(base)) { if(base->object->soft) { sb= base->object->soft; sfra= MIN2(sfra, sb->sfra); @@ -1628,7 +1633,7 @@ void softbody_bake(Object *ob) sbObjectToSoftbody(ob); // free bake else { for(base=G.scene->base.first; base; base= base->next) { - if(TESTBASE(base)) { + if(TESTBASELIB(base)) { if(base->object->soft) { sbObjectToSoftbody(base->object); // free bake } @@ -1646,7 +1651,7 @@ void softbody_bake(Object *ob) ob->softflag &= ~OB_SB_BAKEDO; else { for(base=G.scene->base.first; base; base= base->next) - if(TESTBASE(base)) + if(TESTBASELIB(base)) if(base->object->soft) base->object->softflag &= ~OB_SB_BAKEDO; } @@ -1953,7 +1958,7 @@ static void object_panel_object(Object *ob) block= uiNewBlock(&curarea->uiblocks, "object_panel_object", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Object and Links", "Object", 0, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); /* object name */ uiBlockSetCol(block, TH_BUT_SETTING2); @@ -2020,7 +2025,7 @@ static void object_panel_anim(Object *ob) block= uiNewBlock(&curarea->uiblocks, "object_panel_anim", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Anim settings", "Object", 320, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiDefButS(block, ROW,B_TRACKBUTS,"TrackX", 24,180,59,19, &ob->trackflag, 12.0, 0.0, 0, 0, "Specify the axis that points to another object"); @@ -2085,7 +2090,7 @@ static void object_panel_draw(Object *ob) block= uiNewBlock(&curarea->uiblocks, "object_panel_draw", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Draw", "Object", 640, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); /* LAYERS */ xco= 120; @@ -2148,7 +2153,7 @@ void object_panel_constraint(char *context) block= uiNewBlock(&curarea->uiblocks, "object_panel_constraint", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Constraints", context, 960, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); /* this is a variable height panel, newpanel doesnt force new size on existing panels */ /* so first we make it default height */ @@ -2391,7 +2396,7 @@ static void object_panel_fields(Object *ob) block= uiNewBlock(&curarea->uiblocks, "object_panel_fields", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Fields and Deflection", "Physics", 0, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); /* should become button, option? */ if(ob->pd==NULL) { @@ -2504,7 +2509,7 @@ static void object_softbodies_II(Object *ob) uiNewPanelTabbed("Soft Body", "Physics"); if(uiNewPanel(curarea, block, "Soft Body Collision", "Physics", 651, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); val = modifiers_isSoftbodyEnabled(ob); if(!val) { @@ -2581,7 +2586,7 @@ static void object_softbodies(Object *ob) block= uiNewBlock(&curarea->uiblocks, "object_softbodies", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Soft Body", "Physics", 640, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); val = modifiers_isSoftbodyEnabled(ob); but = uiDefButI(block, TOG, REDRAWBUTSOBJECT, "Soft Body", 10,200,130,20, &val, 0, 0, 0, 0, "Sets object to become soft body"); @@ -2711,7 +2716,7 @@ static void object_panel_particles_motion(Object *ob) uiNewPanelTabbed("Particles ", "Physics"); if(uiNewPanel(curarea, block, "Particle Motion", "Physics", 320, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); /* top row */ uiBlockBeginAlign(block); @@ -2775,7 +2780,7 @@ static void object_panel_particles(Object *ob) block= uiNewBlock(&curarea->uiblocks, "object_panel_particles", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Particles ", "Physics", 320, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); if (ob->type == OB_MESH) { uiBlockBeginAlign(block); @@ -2867,7 +2872,7 @@ static void object_panel_fluidsim(Object *ob) block= uiNewBlock(&curarea->uiblocks, "object_fluidsim", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Fluid Simulation", "Physics", 1060, 0, 318, 204)==0) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); if(ob->type==OB_MESH) { if(((Mesh *)ob->data)->totvert == 0) { diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c index ca0a319c159..b70778987a5 100644 --- a/source/blender/src/buttons_scene.c +++ b/source/blender/src/buttons_scene.c @@ -392,7 +392,7 @@ static void sound_panel_sound(bSound *sound) uiDefBut(block, BUT, B_SOUND_COPY_SOUND, "Copy sound", 220,160,90,20, 0, 0, 0, 0, 0, "Make another copy (duplicate) of the current sound"); - uiSetButLock(sound->id.lib!=0, "Can't edit library data"); + uiSetButLock(sound->id.lib!=0, ERROR_LIBDATA_MESSAGE); sound_initialize_sample(sound); sample = sound->sample; diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 3cf7e80f04f..ce9c2f53906 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -420,7 +420,7 @@ static void texture_panel_plugin(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_plugin", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Plugin", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); if(tex->plugin && tex->plugin->doit) { @@ -452,7 +452,7 @@ static void texture_panel_magic(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_magic", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Magic", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiDefButS(block, NUM, B_TEXPRV, "Depth:", 10, 90, 150, 19, &tex->noisedepth, 0.0, 10.0, 0, 0, "Sets the depth of the pattern"); @@ -465,7 +465,7 @@ static void texture_panel_blend(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_blend", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Blend", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiDefButS(block, ROW, B_TEXPRV, "Lin", 10, 180, 75, 19, &tex->stype, 2.0, 0.0, 0, 0, "Creates a linear progresion"); @@ -494,7 +494,7 @@ static void texture_panel_wood(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_wood", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Wood", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiDefButS(block, ROW, B_TEXPRV, "Bands", 10, 180, 75, 18, &tex->stype, 2.0, 0.0, 0, 0, "Uses standard wood texture in bands"); @@ -526,7 +526,7 @@ static void texture_panel_stucci(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_stucci", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Stucci", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiDefButS(block, ROW, B_TEXPRV, "Plastic", 10, 180, 100, 19, &tex->stype, 2.0, 0.0, 0, 0, "Uses standard stucci"); @@ -555,7 +555,7 @@ static void texture_panel_marble(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_marble", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Marble", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiDefButS(block, ROW, B_TEXPRV, "Soft", 10, 180, 100, 18, &tex->stype, 2.0, 0.0, 0, 0, "Uses soft marble"); @@ -588,7 +588,7 @@ static void texture_panel_clouds(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_clouds", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Clouds", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiDefButS(block, ROW, B_TEXPRV, "Default", 10, 180, 70, 18, &tex->stype, 2.0, 0.0, 0, 0, "Uses standard noise"); @@ -618,7 +618,7 @@ static void texture_panel_musgrave(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_musgrave", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Musgrave", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); str= "Multifractal %x0|Ridged Multifractal %x1|Hybrid Multifractal %x2|Hetero Terrain %x4|fBm %x3"; uiDefButS(block, MENU, B_TEXREDR_PRV, str, 10, 160, 150, 19, &tex->stype, 0.0, 0.0, 0, 0, "Sets Musgrave type"); @@ -653,7 +653,7 @@ static void texture_panel_distnoise(Tex *tex) uiBlock *block; block= uiNewBlock(&curarea->uiblocks, "texture_panel_distnoise", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Distorted Noise", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); /* distortion amount */ @@ -682,7 +682,7 @@ static void texture_panel_voronoi(Tex *tex) uiBlock *block; block= uiNewBlock(&curarea->uiblocks, "texture_panel_voronoi", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Voronoi", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); /* color types */ uiBlockBeginAlign(block); @@ -1076,7 +1076,7 @@ void uiblock_image_panel(uiBlock *block, Image **ima_pp, ImageUser *iuser, /* the main ima source types */ if(ima) { - uiSetButLock(ima->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ima->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiBlockSetFunc(block, image_src_change_cb, ima, iuser); uiDefButS(block, ROW, imagechanged, "Still", 10, 180, 60, 20, &ima->source, 0.0, IMA_SRC_FILE, 0, 0, "Single Image file"); @@ -1216,7 +1216,7 @@ static void texture_panel_image_map(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_image_map", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Map Image", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); /* types */ uiBlockBeginAlign(block); @@ -1281,7 +1281,7 @@ static void texture_panel_envmap(Tex *tex) block= uiNewBlock(&curarea->uiblocks, "texture_panel_envmap", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Envmap", "Texture", 640, 0, 318, 204)==0) return; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); if(tex->env==NULL) { tex->env= BKE_add_envmap(); @@ -1609,7 +1609,7 @@ static void texture_panel_texture(MTex *mtex, Material *ma, World *wrld, Lamp *l char textypes[512]; Tex *tex= (Tex *)id; - uiSetButLock(tex->id.lib!=0, "Can't edit library data"); + uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE); /* newnoise: all texture types as menu, not enough room for more buttons. * Can widen panel, but looks ugly when other panels overlap it */ @@ -1931,7 +1931,7 @@ static void world_panel_mapto(World *wrld) uiNewPanelTabbed("Texture and Input", "World"); if(uiNewPanel(curarea, block, "Map To", "World", 1280, 0, 318, 204)==0) return; - uiSetButLock(wrld->id.lib!=0, "Can't edit library data"); + uiSetButLock(wrld->id.lib!=0, ERROR_LIBDATA_MESSAGE); mtex= wrld->mtex[ wrld->texact ]; if(mtex==NULL) { @@ -1985,7 +1985,7 @@ static void world_panel_texture(World *wrld) block= uiNewBlock(&curarea->uiblocks, "world_panel_texture", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Texture and Input", "World", 960, 0, 318, 204)==0) return; - uiSetButLock(wrld->id.lib!=0, "Can't edit library data"); + uiSetButLock(wrld->id.lib!=0, ERROR_LIBDATA_MESSAGE); /* TEX CHANNELS */ uiBlockSetCol(block, TH_BUT_NEUTRAL); @@ -2065,7 +2065,7 @@ static void world_panel_mistaph(World *wrld) block= uiNewBlock(&curarea->uiblocks, "world_panel_mistaph", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Mist / Stars / Physics", "World", 640, 0, 318, 204)==0) return; - uiSetButLock(wrld->id.lib!=0, "Can't edit library data"); + uiSetButLock(wrld->id.lib!=0, ERROR_LIBDATA_MESSAGE); #if GAMEBLENDER == 1 uiDefButI(block, MENU, 1, @@ -2170,7 +2170,7 @@ static void world_panel_world(World *wrld) if(wrld==NULL) return; - uiSetButLock(wrld->id.lib!=0, "Can't edit library data"); + uiSetButLock(wrld->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockSetCol(block, TH_AUTO); uiDefButF(block, COL, B_WORLDPRV, "", 10,150,145,19, &wrld->horr, 0, 0, 0, B_COLHOR, ""); @@ -2209,7 +2209,7 @@ static void world_panel_preview(World *wrld) if(wrld==NULL) return; - uiSetButLock(wrld->id.lib!=0, "Can't edit library data"); + uiSetButLock(wrld->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockSetDrawExtraFunc(block, BIF_previewdraw); @@ -2316,7 +2316,7 @@ static void lamp_panel_mapto(Object *ob, Lamp *la) uiNewPanelTabbed("Texture and Input", "Lamp"); if(uiNewPanel(curarea, block, "Map To", "Lamp", 1280, 0, 318, 204)==0) return; - uiSetButLock(la->id.lib!=0, "Can't edit library data"); + uiSetButLock(la->id.lib!=0, ERROR_LIBDATA_MESSAGE); mtex= la->mtex[ la->texact ]; if(mtex==NULL) { @@ -2363,7 +2363,7 @@ static void lamp_panel_texture(Object *ob, Lamp *la) block= uiNewBlock(&curarea->uiblocks, "lamp_panel_texture", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Texture and Input", "Lamp", 960, 0, 318, 204)==0) return; - uiSetButLock(la->id.lib!=0, "Can't edit library data"); + uiSetButLock(la->id.lib!=0, ERROR_LIBDATA_MESSAGE); /* TEX CHANNELS */ uiBlockSetCol(block, TH_BUT_NEUTRAL); @@ -2447,7 +2447,7 @@ static void lamp_panel_spot(Object *ob, Lamp *la) if(G.vd) grid= G.vd->grid; if(grid<1.0) grid= 1.0; - uiSetButLock(la->id.lib!=0, "Can't edit library data"); + uiSetButLock(la->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockSetCol(block, TH_BUT_SETTING1); uiBlockBeginAlign(block); @@ -2553,7 +2553,7 @@ static void lamp_panel_yafray(Object *ob, Lamp *la) /* hemis not used in yafray */ if(la->type==LA_HEMI) return; - uiSetButLock(la->id.lib!=0, "Can't edit library data"); + uiSetButLock(la->id.lib!=0, ERROR_LIBDATA_MESSAGE); /* photonlight params */ if (la->type==LA_YF_PHOTON) { @@ -2641,7 +2641,7 @@ static void lamp_panel_lamp(Object *ob, Lamp *la) if(G.vd) grid= G.vd->grid; if(grid<1.0) grid= 1.0; - uiSetButLock(la->id.lib!=0, "Can't edit library data"); + uiSetButLock(la->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockSetCol(block, TH_BUT_SETTING2); xco= std_libbuttons(block, 8, 180, 0, NULL, B_LAMPBROWSE, ID_LA, 0, (ID *)la, (ID *)ob, &(G.buts->menunr), B_LAMPALONE, B_LAMPLOCAL, 0, 0, 0); @@ -2650,7 +2650,7 @@ static void lamp_panel_lamp(Object *ob, Lamp *la) uiDefButF(block, NUM,B_LAMPREDRAW,"Dist:", xco,180,300-xco,20,&la->dist, 0.01, 5000.0*grid, 100, 0, "Sets the distance value at which light intensity is half"); uiBlockBeginAlign(block); - uiSetButLock(la->id.lib!=0, "Can't edit library data"); + uiSetButLock(la->id.lib!=0, ERROR_LIBDATA_MESSAGE); if(la->type==LA_AREA) { //uiDefButS(block, MENU, B_LAMPREDRAW, "Shape %t|Square %x0|Rect %x1|Cube %x2|Box %x3", uiDefButS(block, MENU, B_LAMPREDRAW, "Shape %t|Square %x0|Rect %x1", @@ -2709,7 +2709,7 @@ static void lamp_panel_preview(Object *ob, Lamp *la) block= uiNewBlock(&curarea->uiblocks, "lamp_panel_preview", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Preview", "Lamp", 0, 0, 318, 204)==0) return; - uiSetButLock(la->id.lib!=0, "Can't edit library data"); + uiSetButLock(la->id.lib!=0, ERROR_LIBDATA_MESSAGE); uiBlockSetDrawExtraFunc(block, BIF_previewdraw); @@ -2950,7 +2950,7 @@ static void material_panel_map_to(Material *ma, int from_nodes) uiNewPanelTabbed("Texture", "Material"); if(uiNewPanel(curarea, block, "Map To", "Material", 1600, 0, 318, 204)==0) return; - uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); mtex= ma->mtex[ ma->texact ]; if(mtex==NULL) { @@ -3030,7 +3030,7 @@ static void material_panel_map_input(Object *ob, Material *ma) uiNewPanelTabbed("Texture", "Material"); if(uiNewPanel(curarea, block, "Map Input", "Material", 1280, 0, 318, 204)==0) return; - uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); mtex= ma->mtex[ ma->texact ]; if(mtex==NULL) { @@ -3119,7 +3119,7 @@ static void material_panel_texture(Material *ma) } uiBlockEndAlign(block); - uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); /* SEPTEX */ uiBlockSetCol(block, TH_AUTO); @@ -3182,7 +3182,7 @@ static void material_panel_tramir(Material *ma) uiNewPanelTabbed("Shaders", "Material"); if(uiNewPanel(curarea, block, "Mirror Transp", "Material", 640, 0, 318, 204)==0) return; - uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); uiDefButBitI(block, TOG, MA_RAYMIRROR, B_MATPRV,"Ray Mirror",210,180,100,20, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for mirror reflection rendering"); @@ -3231,7 +3231,7 @@ static void material_panel_tramir_yafray(Material *ma) uiNewPanelTabbed("Shaders", "Material"); if(uiNewPanel(curarea, block, "Mirror Transp", "Material", 640, 0, 318, 204)==0) return; - uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); /* material preset menu */ uiDefBut(block, LABEL, 0, "Mat.Preset", 20, 182, 100, 20, 0, 0.0, 0.0, 0, 0, ""); @@ -3277,7 +3277,7 @@ static void material_panel_shading(Material *ma) block= uiNewBlock(&curarea->uiblocks, "material_panel_shading", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Shaders", "Material", 640, 0, 318, 204)==0) return; - uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); if(ma->mode & MA_HALO) { uiDefButF(block, NUM, B_MATPRV, "HaloSize: ", 10,155,190,18, &(ma->hasize), 0.0, 100.0, 10, 3, "Sets the dimension of the halo"); @@ -3384,7 +3384,7 @@ static void material_panel_ramps(Material *ma) uiNewPanelTabbed("Material", "Material"); if(uiNewPanel(curarea, block, "Ramps", "Material", 640, 0, 318, 204)==0) return; - uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiBlockSetCol(block, TH_BUT_SETTING1); @@ -3454,7 +3454,7 @@ static void material_panel_material(Material *ma) block= uiNewBlock(&curarea->uiblocks, "material_panel_material", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Material", "Material", 320, 0, 318, 204)==0) return; - uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); uiBlockBeginAlign(block); uiDefIconBut(block, BUT, B_MATCOPY, ICON_COPYUP, 262,200,XIC,YIC, 0, 0, 0, 0, 0, "Copies Material to the buffer"); uiDefIconBut(block, BUT, B_MATPASTE, ICON_PASTEUP, 283,200,XIC,YIC, 0, 0, 0, 0, 0, "Pastes Material from the buffer"); @@ -3580,7 +3580,7 @@ static void material_panel_links(Object *ob, Material *ma) uiBlockSetCol(block, TH_BUT_SETTING2); xco= std_libbuttons(block, 10, 160, 0, NULL, B_MATBROWSE, ID_MA, 0, id, idfrom, &(G.buts->menunr), B_MATALONE, B_MATLOCAL, B_MATDELETE, B_AUTOMATNAME, B_KEEPDATA); - if(ma) uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + if(ma) uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); if(ma) uiDefButC(block, TOG, B_MAT_USENODES, "Nodes", xco+5,160,300-xco-5,20, &ma->use_nodes, 0.0f, 0.0f, 0, 0, ""); @@ -3596,7 +3596,7 @@ static void material_panel_links(Object *ob, Material *ma) /* indicate which one is linking a material */ if(id) { if(id->lib) - uiSetButLock(1, "Can't edit library data"); + uiSetButLock(1, ERROR_LIBDATA_MESSAGE); else uiClearButLock(); @@ -3621,7 +3621,7 @@ static void material_panel_links(Object *ob, Material *ma) uiBlockEndAlign(block); if(ma==NULL) return; - uiSetButLock(ma->id.lib!=NULL, "Can't edit library data"); + uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE); /* Active material node */ if(ma->use_nodes) { diff --git a/source/blender/src/drawipo.c b/source/blender/src/drawipo.c index 293c1c2aed0..36cf21d3114 100644 --- a/source/blender/src/drawipo.c +++ b/source/blender/src/drawipo.c @@ -1839,6 +1839,10 @@ void do_ipobuts(unsigned short event) if(ei) { if(ei->icu==NULL) { ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode); + if (!ei->icu) { + error("Could not add a driver to this curve, may be linked data!"); + break; + } ei->flag |= IPO_SELECT; ei->icu->flag= ei->flag; } diff --git a/source/blender/src/drawnla.c b/source/blender/src/drawnla.c index 5d9334e452b..ca73119c102 100644 --- a/source/blender/src/drawnla.c +++ b/source/blender/src/drawnla.c @@ -85,7 +85,7 @@ #include "butspace.h" #include "mydevice.h" -#define TESTBASE_SAFE(base) ((base)->flag & SELECT) +#define TESTBASE_SAFE(base) ((base)->flag & SELECT && ((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) /* the left hand side with channels only */ diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c index 60da13a4e4a..338d8042572 100644 --- a/source/blender/src/drawnode.c +++ b/source/blender/src/drawnode.c @@ -2184,7 +2184,7 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node) block= uiNewBlock(&sa->uiblocks, str, UI_EMBOSS, UI_HELV, sa->win); uiBlockSetFlag(block, UI_BLOCK_NO_HILITE); if(snode->id) - uiSetButLock(snode->id->lib!=NULL, "Can't edit library data"); + uiSetButLock(snode->id->lib!=NULL, ERROR_LIBDATA_MESSAGE); } } diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c index daa60318686..6ff4d35e4a9 100644 --- a/source/blender/src/drawview.c +++ b/source/blender/src/drawview.c @@ -2200,7 +2200,7 @@ static void view3d_panel_object(short cntrl) // VIEW3D_HANDLER_OBJECT if(!uiNewPanel(curarea, block, "Transform Properties", "View3d", 10, 230, 318, 204)) return; - if(ob->id.lib) uiSetButLock(1, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); if(G.f & (G_VERTEXPAINT|G_FACESELECT|G_TEXTUREPAINT|G_WEIGHTPAINT)) { uiBlockSetFlag(block, UI_BLOCK_FRONTBUFFER); // force old style frontbuffer draw diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c index e52a61b1b19..2eee1f86d80 100644 --- a/source/blender/src/editarmature.c +++ b/source/blender/src/editarmature.c @@ -522,7 +522,11 @@ int join_armature(void) ob= OBACT; if(ob->type!=OB_ARMATURE) return 0; - arm= get_armature(ob); + if (object_data_is_libdata(ob)) { + error_libdata(); + return 0; + } + arm= get_armature(ob); /* Get editbones of active armature to add editbones to */ ebbase.first=ebbase.last= NULL; diff --git a/source/blender/src/editcurve.c b/source/blender/src/editcurve.c index e3dc812831b..aeea0300890 100644 --- a/source/blender/src/editcurve.c +++ b/source/blender/src/editcurve.c @@ -3655,6 +3655,11 @@ int join_curve(int type) int a; ob= OBACT; + if (object_data_is_libdata(ob)) { + error_libdata(); + return 0; + } + if(!G.vd || ob->type!=type) return 0; if(ob->lay & G.vd->lay); else return 0; tempbase.first= tempbase.last= 0; @@ -3665,7 +3670,7 @@ int join_curve(int type) base= FIRSTBASE; while(base) { nextb= base->next; - if TESTBASELIB(base) { + if TESTBASE(base) { if(base->object->type==type) { if(base->object != ob) { diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c index 1617f6f68ca..895a081a18a 100644 --- a/source/blender/src/editface.c +++ b/source/blender/src/editface.c @@ -1419,16 +1419,12 @@ void set_faceselect() /* toggle */ Mesh *me = 0; if(ob==NULL) return; - if(ob->id.lib) { - error("Can't edit library data"); + if(object_data_is_libdata(ob)) { + error_libdata(); return; } me= get_mesh(ob); - if(me && me->id.lib) { - error("Can't edit library data"); - return; - } scrarea_queue_headredraw(curarea); @@ -1517,16 +1513,13 @@ void set_texturepaint() /* toggle */ scrarea_queue_headredraw(curarea); if(ob==NULL) return; - if(ob->id.lib) { - error("Can't edit library data"); + + if (object_data_is_libdata(ob)) { + error_libdata(); return; } me= get_mesh(ob); - if(me && me->id.lib) { - error("Can't edit library data"); - return; - } if(me) DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); diff --git a/source/blender/src/editipo.c b/source/blender/src/editipo.c index 4e184494b32..63e2466f4f9 100644 --- a/source/blender/src/editipo.c +++ b/source/blender/src/editipo.c @@ -1840,7 +1840,9 @@ Ipo *verify_ipo(ID *from, short blocktype, char *actname, char *constname) return NULL; } -/* returns and creates */ +/* returns and creates + * Make sure functions check for NULL or they will crash! + * */ IpoCurve *verify_ipocurve(ID *from, short blocktype, char *actname, char *constname, int adrcode) { Ipo *ipo; @@ -1850,7 +1852,7 @@ IpoCurve *verify_ipocurve(ID *from, short blocktype, char *actname, char *constn /* creates ipo too */ ipo= verify_ipo(from, blocktype, actname, constname); - if(ipo && ipo->id.lib==NULL) { + if(ipo && ipo->id.lib==NULL && from->lib==NULL) { for(icu= ipo->curve.first; icu; icu= icu->next) { if(icu->adrcode==adrcode) break; @@ -1980,7 +1982,10 @@ void add_vert_ipo(void) if(ei->icu==NULL) { if(G.sipo->from) { ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode); - ei->flag |= ei->icu->flag & IPO_AUTO_HORIZ; /* new curve could have been added, weak... */ + if (ei->icu) + ei->flag |= ei->icu->flag & IPO_AUTO_HORIZ; /* new curve could have been added, weak... */ + else + error("Cannot create an IPO curve, you may be using libdata"); } } if(ei->icu==NULL) return; @@ -4341,7 +4346,7 @@ void movekey_obipo(int dir) /* only call external from view3d queue */ base= FIRSTBASE; while(base) { - if TESTBASE(base) { + if TESTBASELIB(base) { ob= base->object; if(ob->ipo && ob->ipo->showkey) { elems.first= elems.last= 0; diff --git a/source/blender/src/editnode.c b/source/blender/src/editnode.c index 76de9f11b53..28c1d898a62 100644 --- a/source/blender/src/editnode.c +++ b/source/blender/src/editnode.c @@ -2190,7 +2190,7 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt) } if(fromlib==-1) - error("Cannot edit Library Data"); + error_libdata(); if(doredraw) scrarea_queue_winredraw(sa); if(doredraw==2) diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 67acf97f534..5e859501b6a 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -1593,9 +1593,8 @@ void enter_editmode(int wc) ob= base->object; if(ob->data==0) return; - id= ob->data; - if(id->lib) { - error("Can't edit library data"); + if (object_data_is_libdata(ob)) { + error_libdata(); return; } @@ -1604,10 +1603,6 @@ void enter_editmode(int wc) if(ob->type==OB_MESH) { me= get_mesh(ob); if( me==0 ) return; - if(me->id.lib) { - error("Can't edit library data"); - return; - } if(me->pv) sculptmode_pmv_off(me); ok= 1; G.obedit= ob; @@ -1618,10 +1613,6 @@ void enter_editmode(int wc) if (ob->type==OB_ARMATURE){ arm= base->object->data; if (!arm) return; - if (arm->id.lib){ - error("Can't edit library data"); - return; - } ok=1; G.obedit=ob; make_editArmature(); @@ -2823,7 +2814,7 @@ void flip_subdivison(int level) mode= eModifierMode_Render|eModifierMode_Realtime; for(base= G.scene->base.first; base; base= base->next) { - if(TESTBASE(base)) { + if(TESTBASELIB(base)) { object_flip_subdivison(base->object, &set, level, mode); if(base->object->dup_group) { GroupObject *go; @@ -4716,7 +4707,7 @@ void adduplicate(int mode, int dupflag) base= FIRSTBASE; while(base) { - if TESTBASELIB(base) { + if TESTBASE(base) { ob= base->object; if(ob->flag & OB_POSEMODE) { @@ -4937,7 +4928,7 @@ void make_duplilist_real() base= FIRSTBASE; while(base) { - if TESTBASELIB(base) { + if TESTBASE(base) { if(base->object->transflag & OB_DUPLI) { ListBase *lb= object_duplilist(G.scene, base->object); @@ -5168,7 +5159,7 @@ void set_ob_ipoflags(void) base= FIRSTBASE; while(base) { - if TESTBASE(base) { + if TESTBASELIB(base) { if(base->object->ipoflag & OB_DRAWKEY) { set= 0; break; @@ -5179,7 +5170,7 @@ void set_ob_ipoflags(void) base= FIRSTBASE; while(base) { - if TESTBASE(base) { + if TESTBASELIB(base) { if(set) { base->object->ipoflag |= OB_DRAWKEY; if(base->object->ipo) base->object->ipo->showkey= 1; @@ -5455,12 +5446,24 @@ void hookmenu(void) } } +/* + * Returns true if teh Object data is a from an external blend file (libdata) + * */ +int object_data_is_libdata(Object *ob) +{ + if (!ob) return 0; + if (ob->id.lib) return 1; + if (!ob->data) return 0; + if (((ID *)ob->data)->lib) return 1; + return 0; +} + void hide_objects(int select) { Base *base; int changed = 0; for(base = FIRSTBASE; base; base=base->next){ - if(TESTBASE(base)==select){ + if(TESTBASELIB(base)==select){ base->flag &= ~SELECT; base->object->flag = base->flag; base->object->restrictflag |= OB_RESTRICT_VIEW; diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c index aacb083e98a..232a69979bd 100644 --- a/source/blender/src/editview.c +++ b/source/blender/src/editview.c @@ -909,7 +909,10 @@ void deselectall(void) /* is toggle */ break; } /* are there any objects in the view*/ - if(base->lay & G.vd->lay) + if(base->lay & G.vd->lay && + (base->object->restrictflag & OB_RESTRICT_VIEW)==0 && + (base->object->restrictflag & OB_RESTRICT_SELECT)==0 + ) ok=1; base= base->next; @@ -919,7 +922,10 @@ void deselectall(void) /* is toggle */ base= FIRSTBASE; while(base) { - if(base->lay & G.vd->lay) { + if(base->lay & G.vd->lay && + (base->object->restrictflag & OB_RESTRICT_VIEW)==0 && + (base->object->restrictflag & OB_RESTRICT_SELECT)==0 + ) { if(a) select_base_v3d(base, BA_DESELECT); else @@ -943,7 +949,9 @@ void selectswap(void) Base *base; for(base= FIRSTBASE; base; base= base->next) { - if(base->lay & G.vd->lay) { + if(base->lay & G.vd->lay && + (base->object->restrictflag & OB_RESTRICT_VIEW)==0 + ) { if TESTBASE(base) select_base_v3d(base, BA_DESELECT); else @@ -968,7 +976,10 @@ void selectall_type(short obtype) base= FIRSTBASE; while(base) { - if((base->lay & G.vd->lay) && (base->object->type == obtype)) { + if((base->lay & G.vd->lay) && + (base->object->type == obtype) && + (base->object->restrictflag & OB_RESTRICT_VIEW)==0 + ) { select_base_v3d(base, BA_SELECT); base->object->flag= base->flag; } @@ -989,7 +1000,9 @@ void selectall_layer(unsigned int layernum) base= FIRSTBASE; while(base) { - if (base->lay == (1<< (layernum -1))) { + if(base->lay == (1<< (layernum -1)) && + (base->object->restrictflag & OB_RESTRICT_VIEW)==0 + ) { select_base_v3d(base, BA_SELECT); base->object->flag= base->flag; } @@ -1142,7 +1155,8 @@ static void select_all_from_groups(Base *basact) for(go= group->gobject.first; go; go= go->next) { if(deselect) go->ob->flag &= ~SELECT; else { - if (!(go->ob->restrictflag & OB_RESTRICT_SELECT)) + if ((go->ob->restrictflag & OB_RESTRICT_SELECT)==0 && + (go->ob->restrictflag & OB_RESTRICT_VIEW)==0) go->ob->flag |= SELECT; } } @@ -1169,7 +1183,10 @@ static Base *mouse_select_menu(unsigned int *buffer, int hits, short *mval) char str[32]; for(base=FIRSTBASE; base; base= base->next) { - if(base->lay & G.vd->lay) { + if(base->lay & G.vd->lay && + (base->object->restrictflag & OB_RESTRICT_SELECT)==0 && + (base->object->restrictflag & OB_RESTRICT_VIEW)==0 + ) { baseList[baseCount] = NULL; /* two selection methods, the CTRL select uses max dist of 15 */ diff --git a/source/blender/src/header_ipo.c b/source/blender/src/header_ipo.c index 6076129c641..d4041a817db 100644 --- a/source/blender/src/header_ipo.c +++ b/source/blender/src/header_ipo.c @@ -1310,12 +1310,12 @@ void ipo_buttons(void) uiBlockBeginAlign(block); if(curarea->headertype==HEADERTOP) { uiDefIconBut(block, BUT, B_IPOCOPY, ICON_COPYUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected curves to the buffer"); - uiSetButLock(G.sipo->ipo && G.sipo->ipo->id.lib, "Can't edit library data"); + uiSetButLock(G.sipo->ipo && G.sipo->ipo->id.lib, ERROR_LIBDATA_MESSAGE); uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer"); } else { uiDefIconBut(block, BUT, B_IPOCOPY, ICON_COPYDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected curves to the buffer"); - uiSetButLock(G.sipo->ipo && G.sipo->ipo->id.lib, "Can't edit library data"); + uiSetButLock(G.sipo->ipo && G.sipo->ipo->id.lib, ERROR_LIBDATA_MESSAGE); uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer"); } uiBlockEndAlign(block); diff --git a/source/blender/src/header_node.c b/source/blender/src/header_node.c index b2feadd99f2..83aff8bcbe1 100644 --- a/source/blender/src/header_node.c +++ b/source/blender/src/header_node.c @@ -515,7 +515,7 @@ static void do_node_nodemenu(void *arg, int event) break; } - if(fromlib==-1) error("Can't edit Library Data"); + if(fromlib==-1) error_libdata(); allqueue(REDRAWNODE, 0); } diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c index c0bf857826f..78ba3fd535b 100644 --- a/source/blender/src/header_view3d.c +++ b/source/blender/src/header_view3d.c @@ -5202,7 +5202,7 @@ void view3d_buttons(void) uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the current pose to the buffer"); - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); uiDefIconBut(block, BUT, B_ACTPASTE, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the pose from the buffer"); @@ -5214,7 +5214,7 @@ void view3d_buttons(void) uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the current pose to the buffer"); - uiSetButLock(ob->id.lib!=0, "Can't edit library data"); + uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); uiDefIconBut(block, BUT, B_ACTPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the pose from the buffer"); diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c index dd1a99d9f2b..83297907992 100644 --- a/source/blender/src/headerbuttons.c +++ b/source/blender/src/headerbuttons.c @@ -268,14 +268,14 @@ int std_libbuttons(uiBlock *block, short xco, short yco, if ELEM8( id_code, ID_SCE, ID_SCR, ID_MA, ID_TE, ID_WO, ID_IP, ID_AC, ID_BR) extrastr= "ADD NEW %x 32767"; else if (id_code==ID_TXT) extrastr= "OPEN NEW %x 32766 |ADD NEW %x 32767"; else if (id_code==ID_SO) extrastr= "OPEN NEW %x 32766"; - - uiSetButLock(G.scene->id.lib!=0, "Can't edit library data"); + + uiSetButLock(G.scene->id.lib!=0, ERROR_LIBDATA_MESSAGE); if( id_code==ID_SCE || id_code==ID_SCR ) uiClearButLock(); if(curarea->spacetype==SPACE_BUTS) uiSetButLock(id_code!=ID_SCR && G.obedit!=0 && G.buts->mainb==CONTEXT_EDITING, "Cannot perform in EditMode"); - if(parid) uiSetButLock(parid->lib!=0, "Can't edit library data"); + if(parid) uiSetButLock(parid->lib!=0, ERROR_LIBDATA_MESSAGE); if (lb) { if( id_code==ID_IP) @@ -307,7 +307,7 @@ int std_libbuttons(uiBlock *block, short xco, short yco, /* Redalert overrides pin color */ if(id->us<=0) uiBlockSetCol(block, TH_REDALERT); - uiSetButLock(id->lib!=0, "Can't edit library data"); + uiSetButLock(id->lib!=0, ERROR_LIBDATA_MESSAGE); if(GS(id->name)==ID_SCE) strcpy(str1, "SCE:"); else if(GS(id->name)==ID_SCE) strcpy(str1, "SCR:"); diff --git a/source/blender/src/meshtools.c b/source/blender/src/meshtools.c index cbb14166b36..41a9bece61a 100644 --- a/source/blender/src/meshtools.c +++ b/source/blender/src/meshtools.c @@ -135,6 +135,11 @@ int join_mesh(void) ob= OBACT; if(!ob || ob->type!=OB_MESH) return 0; + + if (object_data_is_libdata(ob)) { + error_libdata(); + return 0; + } #ifdef WITH_VERSE /* it isn't allowed to join shared object at verse server diff --git a/source/blender/src/outliner.c b/source/blender/src/outliner.c index d0d3336dc45..e29275e40d0 100644 --- a/source/blender/src/outliner.c +++ b/source/blender/src/outliner.c @@ -1293,7 +1293,7 @@ static void tree_element_active_object(SpaceOops *soops, TreeElement *te) if(G.qual & LR_SHIFTKEY) { /* swap select */ if(base->flag & SELECT) base->flag &= ~SELECT; - else base->flag |= SELECT; + else if ((base->object->restrictflag & OB_RESTRICT_VIEW)==0) base->flag |= SELECT; base->object->flag= base->flag; } else { @@ -1303,8 +1303,10 @@ static void tree_element_active_object(SpaceOops *soops, TreeElement *te) b->flag &= ~SELECT; b->object->flag= b->flag; } - base->flag |= SELECT; - base->object->flag |= SELECT; + if ((base->object->restrictflag & OB_RESTRICT_VIEW)==0) { + base->flag |= SELECT; + base->object->flag |= SELECT; + } } set_active_base(base); /* editview.c */ @@ -1895,7 +1897,7 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even if(ELEM8(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_R_LAYER_BASE, TSE_R_PASS)) error("Cannot edit builtin name"); else if(tselem->id->lib) - error("Cannot edit Library Data"); + error_libdata(); else { tselem->flag |= TSE_TEXTBUT; } @@ -2471,7 +2473,7 @@ static void object_select_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem Base *base= (Base *)te->directdata; if(base==NULL) base= object_in_scene((Object *)tselem->id, G.scene); - if(base) { + if(base && ((base->object->restrictflag & OB_RESTRICT_VIEW)==0)) { base->flag |= SELECT; base->object->flag |= SELECT; } diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c index dcbdf5758b1..f4f9147b3b3 100644 --- a/source/blender/src/toolbox.c +++ b/source/blender/src/toolbox.c @@ -236,6 +236,11 @@ void error(char *fmt, ...) va_end(ap); } +void error_libdata(void) +{ + error(ERROR_LIBDATA_MESSAGE); +} + int saveover(char *file) { int len= strlen(file); |