svn merge ^/trunk/blender -r42080:42095
authorCampbell Barton <ideasman42@gmail.com>
Wed, 23 Nov 2011 17:14:27 +0000 (17:14 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 23 Nov 2011 17:14:27 +0000 (17:14 +0000)
27 files changed:
intern/cycles/CMakeLists.txt
intern/cycles/device/device.h
intern/cycles/device/device_cuda.cpp
intern/cycles/device/device_opencl.cpp
intern/cycles/render/session.cpp
intern/ghost/intern/GHOST_SystemCocoa.mm
intern/ghost/intern/GHOST_WindowCocoa.mm
release/datafiles/fonts/droidsans.ttf.gz
source/blender/blenkernel/intern/object.c
source/blender/editors/include/ED_mesh.h
source/blender/editors/include/ED_object.h
source/blender/editors/include/ED_view3d.h
source/blender/editors/object/object_modifier.c
source/blender/editors/object/object_relations.c
source/blender/editors/object/object_vgroup.c
source/blender/editors/render/render_update.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/rna_curve.c
source/blender/makesrna/intern/rna_meta.c
source/blender/makesrna/intern/rna_modifier.c
source/blender/makesrna/intern/rna_nodetree.c
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_space.c
source/blender/modifiers/intern/MOD_weightvgproximity.c
source/blenderplayer/bad_level_call_stubs/stubs.c

index a85b2ba8c2a14e4d3cc4ccc3ef0510dd02df7647..c5c4f6b22a6a46639bf36618747fa920c18b89d3 100644 (file)
@@ -12,9 +12,9 @@ if(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
        set(WITH_CYCLES_OPTIMIZED_KERNEL ON)
 
        if(WIN32 AND MSVC)
-               set(CYCLES_OPTIMIZED_KERNEL_FLAGS "/Ox /Ot /arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /EHsc /fp:fast")
+               set(CYCLES_OPTIMIZED_KERNEL_FLAGS "/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast")
        elseif(CMAKE_COMPILER_IS_GNUCC)
-               set(CYCLES_OPTIMIZED_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -DGOGOGO")
+               set(CYCLES_OPTIMIZED_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3")
        endif()
 endif()
 
index 5d6ac10dc407e48e9c7957dcfea0d075a331d5c3..5552e6ab7e22210bd6f7b3e553202afc739c47fd 100644 (file)
@@ -76,6 +76,7 @@ protected:
        Device() {}
 
        bool background;
+       string error_msg;
 
 public:
        virtual ~Device() {}
@@ -84,6 +85,7 @@ public:
 
        /* info */
        virtual string description() = 0;
+       const string& error_message() { return error_msg; }
 
        /* regular memory */
        virtual void mem_alloc(device_memory& mem, MemoryType type) = 0;
index 1158cc6c77cd864194dae9bd58afbf96266226b8..e32cbfcc8a7b7272b5eb1107f84f3feb27624527 100644 (file)
@@ -122,7 +122,10 @@ public:
                CUresult result = stmt; \
                \
                if(result != CUDA_SUCCESS) { \
-                       fprintf(stderr, "CUDA error: %s in %s\n", cuda_error_string(result), #stmt); \
+                       string message = string_printf("CUDA error: %s in %s", cuda_error_string(result), #stmt); \
+                       if(error_msg == "") \
+                               error_msg = message; \
+                       fprintf(stderr, "%s\n", message.c_str()); \
                        cuda_abort(); \
                } \
        }
@@ -132,10 +135,20 @@ public:
                if(result == CUDA_SUCCESS)
                        return false;
 
-               fprintf(stderr, "CUDA error: %s\n", cuda_error_string(result));
+               string message = string_printf("CUDA error: %s", cuda_error_string(result));
+               if(error_msg == "")
+                       error_msg = message;
+               fprintf(stderr, "%s\n", message.c_str());
                return true;
        }
 
+       void cuda_error(const string& message)
+       {
+               if(error_msg == "")
+                       error_msg = message;
+               fprintf(stderr, "%s\n", message.c_str());
+       }
+
        void cuda_push_context()
        {
                cuda_assert(cuCtxSetCurrent(cuContext))
@@ -224,14 +237,14 @@ public:
                        return cubin;
 
 #ifdef WITH_CUDA_BINARIES
-               fprintf(stderr, "CUDA binary kernel for this graphics card not found.\n");
+               cuda_error("CUDA binary kernel for this graphics card not found.");
                return "";
 #else
                /* if not, find CUDA compiler */
                string nvcc = cuCompilerPath();
 
                if(nvcc == "") {
-                       fprintf(stderr, "CUDA nvcc compiler not found. Install CUDA toolkit in default location.\n");
+                       cuda_error("CUDA nvcc compiler not found. Install CUDA toolkit in default location.");
                        return "";
                }
 
@@ -251,13 +264,13 @@ public:
                        nvcc.c_str(), major, minor, machine, kernel.c_str(), cubin.c_str(), maxreg, include.c_str());
 
                if(system(command.c_str()) == -1) {
-                       fprintf(stderr, "Failed to execute compilation command.\n");
+                       cuda_error("Failed to execute compilation command, see console for details.");
                        return "";
                }
 
                /* verify if compilation succeeded */
                if(!path_exists(cubin)) {
-                       fprintf(stderr, "CUDA kernel compilation failed.\n");
+                       cuda_error("CUDA kernel compilation failed, see console for details.");
                        return "";
                }
 
@@ -284,7 +297,7 @@ public:
 
                CUresult result = cuModuleLoad(&cuModule, cubin.c_str());
                if(cuda_error(result))
-                       fprintf(stderr, "Failed loading CUDA kernel %s.\n", cubin.c_str());
+                       cuda_error(string_printf("Failed loading CUDA kernel %s.", cubin.c_str()));
 
                cuda_pop_context();
 
index e0b4f67da057dc2d4ff09341cc6f89026a1d4261..d783ae6c174f522dbc6d47a9a418c27bc0a8e027 100644 (file)
@@ -109,17 +109,30 @@ public:
        bool opencl_error(cl_int err)
        {
                if(err != CL_SUCCESS) {
-                       fprintf(stderr, "OpenCL error (%d): %s\n", err, opencl_error_string(err));
+                       string message = string_printf("OpenCL error (%d): %s", err, opencl_error_string(err));
+                       if(error_msg == "")
+                               error_msg = message;
+                       fprintf(stderr, "%s\n", message.c_str());
                        return true;
                }
 
                return false;
        }
 
+       void opencl_error(const string& message)
+       {
+               if(error_msg == "")
+                       error_msg = message;
+               fprintf(stderr, "%s\n", message.c_str());
+       }
+
        void opencl_assert(cl_int err)
        {
                if(err != CL_SUCCESS) {
-                       fprintf(stderr, "OpenCL error (%d): %s\n", err, opencl_error_string(err));
+                       string message = string_printf("OpenCL error (%d): %s", err, opencl_error_string(err));
+                       if(error_msg == "")
+                               error_msg = message;
+                       fprintf(stderr, "%s\n", message.c_str());
 #ifndef NDEBUG
                        abort();
 #endif
@@ -147,7 +160,7 @@ public:
                        return;
 
                if(num_platforms == 0) {
-                       fprintf(stderr, "OpenCL: no platforms found.\n");
+                       opencl_error("OpenCL: no platforms found.");
                        return;
                }
 
@@ -183,24 +196,24 @@ public:
                clGetPlatformInfo(cpPlatform, CL_PLATFORM_VERSION, sizeof(version), &version, NULL);
 
                if(sscanf(version, "OpenCL %d.%d", &major, &minor) < 2) {
-                       fprintf(stderr, "OpenCL: failed to parse platform version string (%s).", version);
+                       opencl_error(string_printf("OpenCL: failed to parse platform version string (%s).", version));
                        return false;
                }
 
                if(!((major == req_major && minor >= req_minor) || (major > req_major))) {
-                       fprintf(stderr, "OpenCL: platform version 1.1 or later required, found %d.%d\n", major, minor);
+                       opencl_error(string_printf("OpenCL: platform version 1.1 or later required, found %d.%d", major, minor));
                        return false;
                }
 
                clGetDeviceInfo(cdDevice, CL_DEVICE_OPENCL_C_VERSION, sizeof(version), &version, NULL);
 
                if(sscanf(version, "OpenCL C %d.%d", &major, &minor) < 2) {
-                       fprintf(stderr, "OpenCL: failed to parse OpenCL C version string (%s).", version);
+                       opencl_error(string_printf("OpenCL: failed to parse OpenCL C version string (%s).", version));
                        return false;
                }
 
                if(!((major == req_major && minor >= req_minor) || (major > req_major))) {
-                       fprintf(stderr, "OpenCL: C version 1.1 or later required, found %d.%d\n", major, minor);
+                       opencl_error(string_printf("OpenCL: C version 1.1 or later required, found %d.%d", major, minor));
                        return false;
                }
 
@@ -216,7 +229,7 @@ public:
                vector<uint8_t> binary;
 
                if(!path_read_binary(clbin, binary)) {
-                       fprintf(stderr, "OpenCL failed to read cached binary %s.\n", clbin.c_str());
+                       opencl_error(string_printf("OpenCL failed to read cached binary %s.", clbin.c_str()));
                        return false;
                }
 
@@ -229,7 +242,7 @@ public:
                        &size, &bytes, &status, &ciErr);
 
                if(opencl_error(status) || opencl_error(ciErr)) {
-                       fprintf(stderr, "OpenCL failed create program from cached binary %s.\n", clbin.c_str());
+                       opencl_error(string_printf("OpenCL failed create program from cached binary %s.", clbin.c_str()));
                        return false;
                }
 
@@ -253,7 +266,7 @@ public:
                clGetProgramInfo(cpProgram, CL_PROGRAM_BINARIES, sizeof(uint8_t*), &bytes, NULL);
 
                if(!path_write_binary(clbin, binary)) {
-                       fprintf(stderr, "OpenCL failed to write cached binary %s.\n", clbin.c_str());
+                       opencl_error(string_printf("OpenCL failed to write cached binary %s.", clbin.c_str()));
                        return false;
                }
 
@@ -293,7 +306,8 @@ public:
                        clGetProgramBuildInfo(cpProgram, cdDevice, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
 
                        build_log[ret_val_size] = '\0';
-                       fprintf(stderr, "OpenCL build failed:\n %s\n", build_log);
+                       opencl_error("OpenCL build failed: errors in console");
+                       fprintf(stderr, "%s\n", build_log);
 
                        delete[] build_log;
 
index 2deb83674cca58ff4be9cf07ceae9555e7ca5b53..73ac033623dd4ba502b16f658da16d751327b3f7 100644 (file)
@@ -203,6 +203,10 @@ void Session::run_gpu()
                if(!no_tiles) {
                        /* update scene */
                        update_scene();
+
+                       if(device->error_message() != "")
+                               progress.set_cancel(device->error_message());
+
                        if(progress.get_cancel())
                                break;
                }
@@ -222,6 +226,9 @@ void Session::run_gpu()
 
                                device->task_wait();
 
+                               if(device->error_message() != "")
+                                       progress.set_cancel(device->error_message());
+
                                if(progress.get_cancel())
                                        break;
                        }
@@ -243,6 +250,9 @@ void Session::run_gpu()
                                }
                        }
 
+                       if(device->error_message() != "")
+                               progress.set_cancel(device->error_message());
+
                        if(progress.get_cancel())
                                break;
                }
@@ -345,6 +355,10 @@ void Session::run_cpu()
 
                        /* update scene */
                        update_scene();
+
+                       if(device->error_message() != "")
+                               progress.set_cancel(device->error_message());
+
                        if(progress.get_cancel())
                                break;
 
@@ -360,6 +374,9 @@ void Session::run_cpu()
 
                        if(!params.background)
                                need_tonemap = true;
+
+                       if(device->error_message() != "")
+                               progress.set_cancel(device->error_message());
                }
 
                device->task_wait();
@@ -379,6 +396,9 @@ void Session::run_cpu()
                                   want to show the result of an incomplete sample*/
                                tonemap();
                        }
+
+                       if(device->error_message() != "")
+                               progress.set_cancel(device->error_message());
                }
 
                progress.set_update();
@@ -391,7 +411,11 @@ void Session::run()
        progress.set_status("Loading render kernels (may take a few minutes the first time)");
 
        if(!device->load_kernels()) {
-               progress.set_status("Failed loading render kernel, see console for errors");
+               string message = device->error_message();
+               if(message == "")
+                       message = "Failed loading render kernel, see console for errors";
+
+               progress.set_status("Error", message);
                progress.set_update();
                return;
        }
@@ -409,7 +433,7 @@ void Session::run()
 
        /* progress update */
        if(progress.get_cancel())
-               progress.set_status(progress.get_cancel_message());
+               progress.set_status("Cancel", progress.get_cancel_message());
        else
                progress.set_update();
 }
index 03c3427045db4a67c6767e43125f861b6de41707..12a732e59ef29d83042e4f062c07439a934c855b 100644 (file)
@@ -1765,7 +1765,7 @@ GHOST_TUns8* GHOST_SystemCocoa::getClipboard(bool selection) const
                return NULL;
        }
        
-       pastedTextSize = [textPasted lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding];
+       pastedTextSize = [textPasted lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
        
        temp_buff = (GHOST_TUns8*) malloc(pastedTextSize+1); 
 
@@ -1774,7 +1774,7 @@ GHOST_TUns8* GHOST_SystemCocoa::getClipboard(bool selection) const
                return NULL;
        }
        
-       strncpy((char*)temp_buff, [textPasted cStringUsingEncoding:NSISOLatin1StringEncoding], pastedTextSize);
+       strncpy((char*)temp_buff, [textPasted cStringUsingEncoding:NSUTF8StringEncoding], pastedTextSize);
        
        temp_buff[pastedTextSize] = '\0';
        
@@ -1806,7 +1806,7 @@ void GHOST_SystemCocoa::putClipboard(GHOST_TInt8 *buffer, bool selection) const
        
        [pasteBoard declareTypes:supportedTypes owner:nil];
        
-       textToCopy = [NSString stringWithCString:buffer encoding:NSISOLatin1StringEncoding];
+       textToCopy = [NSString stringWithCString:buffer encoding:NSUTF8StringEncoding];
        
        [pasteBoard setString:textToCopy forType:NSStringPboardType];
        
index 7bb1913d872d58c7d7445390f807dacc6cbaf21a..01217dfd17a799da4b3533b6bcfbfa7b47d7cf09 100644 (file)
@@ -238,10 +238,13 @@ extern "C" {
 
 #pragma mark NSOpenGLView subclass
 //We need to subclass it in order to give Cocoa the feeling key events are trapped
-@interface CocoaOpenGLView : NSOpenGLView
+@interface CocoaOpenGLView : NSOpenGLView <NSTextInput>
 {
        GHOST_SystemCocoa *systemCocoa;
        GHOST_WindowCocoa *associatedWindow;
+
+       bool composing;
+       NSString *composing_text;
 }
 - (void)setSystemAndWindowCocoa:(GHOST_SystemCocoa *)sysCocoa windowCocoa:(GHOST_WindowCocoa *)winCocoa;
 @end
@@ -251,6 +254,9 @@ extern "C" {
 {
        systemCocoa = sysCocoa;
        associatedWindow = winCocoa;
+
+       composing = false;
+       composing_text = nil;
 }
 
 - (BOOL)acceptsFirstResponder
@@ -258,9 +264,26 @@ extern "C" {
     return YES;
 }
 
-//The trick to prevent Cocoa from complaining (beeping)
-- (void)keyDown:(NSEvent *)theEvent
-{}
+// The trick to prevent Cocoa from complaining (beeping)
+- (void)keyDown:(NSEvent *)event
+{
+       // Start or continue composing?
+       if([[event characters] length] == 0  ||
+          [[event charactersIgnoringModifiers] length] == 0 ||
+          composing) {
+               composing = YES;
+               // interpret event to call insertText
+               NSMutableArray *events;
+               events = [[NSMutableArray alloc] initWithCapacity:1];
+               [events addObject:event];
+               [self interpretKeyEvents:events]; // calls insertText
+               [events removeObject:event];
+               [events release];
+
+               return;
+       }
+}
 
 #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
 //Cmd+key are handled differently before 10.5
@@ -306,8 +329,99 @@ extern "C" {
     }
 }
 
-@end
+// Text input
+
+- (void)composing_free
+{
+       composing = NO;
+
+       if(composing_text) {
+               [composing_text release];
+               composing_text = nil;
+       }
+}
+
+- (void)insertText:(id)chars
+{
+       [self composing_free];
+}
+
+- (void)setMarkedText:(id)chars selectedRange:(NSRange)range
+{
+       [self composing_free];
+       if([chars length] == 0)
+               return;
+       
+       // start composing
+       composing = YES;
+       composing_text = [chars copy];
+
+       // if empty, cancel
+       if([composing_text length] == 0)
+               [self composing_free];
+}
+
+- (void)unmarkText
+{
+       [self composing_free];
+}
+
+- (BOOL)hasMarkedText
+{
+       return (composing)? YES: NO;
+}
+
+- (void)doCommandBySelector:(SEL)selector
+{
+}
+
+- (BOOL)isComposing
+{
+       return composing;
+}
+
+- (NSInteger)conversationIdentifier
+{
+       return (NSInteger)self;
+}
+
+- (NSAttributedString *)attributedSubstringFromRange:(NSRange)range
+{
+       return [NSAttributedString new]; // XXX does this leak?
+}
+
+- (NSRange)markedRange
+{
+       unsigned int length = (composing_text)? [composing_text length]: 0;
+
+       if(composing)
+               return NSMakeRange(0, length);
+
+       return NSMakeRange(NSNotFound, 0);
+}
 
+- (NSRange)selectedRange
+{
+       unsigned int length = (composing_text)? [composing_text length]: 0;
+       return NSMakeRange(0, length);
+}
+
+- (NSRect)firstRectForCharacterRange:(NSRange)range
+{
+       return NSZeroRect;
+}
+
+- (NSUInteger)characterIndexForPoint:(NSPoint)point
+{
+       return NSNotFound;
+}
+
+- (NSArray*)validAttributesForMarkedText
+{
+       return [NSArray array]; // XXX does this leak?
+}
+
+@end
 
 #pragma mark initialization / finalization
 
index 9c70d31a2e38e70e4005a05ebbd33e03085e3c33..fdf92f669c41bd8870bbf85644ff8518a29c1973 100644 (file)
Binary files a/release/datafiles/fonts/droidsans.ttf.gz and b/release/datafiles/fonts/droidsans.ttf.gz differ
index ed7a22b5e0bf59531177d722d35d305d7c5ee349..5f689aafaca702e49dd4024b8a08f171702ccf65 100644 (file)
@@ -1801,6 +1801,7 @@ static void give_parvert(Object *par, int nr, float *vec)
                                dm->getVertCo(dm, 0, vec);
                        }
                }
+               else fprintf(stderr, "%s: DerivedMesh is needed to solve parenting, object position can be wrong now\n", __func__);
        }
        else if (ELEM(par->type, OB_CURVE, OB_SURF)) {
                Nurb *nu;
index accfbc646282a29a6fbf929abe0021307de300f9..5a511e0137c67addb60ab02785055276371fd6fb 100644 (file)
@@ -251,6 +251,7 @@ void                paintvert_flush_flags(struct Object *ob);
 struct bDeformGroup            *ED_vgroup_add(struct Object *ob);
 struct bDeformGroup            *ED_vgroup_add_name(struct Object *ob, const char *name);
 void                                   ED_vgroup_delete(struct Object *ob, struct bDeformGroup *defgroup);
+void                                   ED_vgroup_clear(struct Object *ob);
 void                                   ED_vgroup_select_by_name(struct Object *ob, const char *name);
 int                                            ED_vgroup_data_create(struct ID *id);
 int                                            ED_vgroup_give_array(struct ID *id, struct MDeformVert **dvert_arr, int *dvert_tot);
index 3ae3876c18a7933abf55b0add41ef1f7c70f6c57..e7d753ff45c0410dee9eb29850b059c9c1c5f1a8 100644 (file)
@@ -142,6 +142,7 @@ enum {
 
 struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type);
 int ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, struct ModifierData *md);
+void ED_object_modifier_clear(struct Main *bmain, struct Scene *scene, struct Object *ob);
 int ED_object_modifier_move_down(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
 int ED_object_modifier_move_up(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
 int ED_object_modifier_convert(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, struct ModifierData *md);
index 07fc4e77ac11b389e4cdc725968e8d68fe3321a3..1df8f723140f9d9a3d1571306985931f61b80cc8 100644 (file)
@@ -296,5 +296,6 @@ int ED_view3d_camera_lock_sync(struct View3D *v3d, struct RegionView3D *rv3d);
 
 struct BGpic *ED_view3D_background_image_new(struct View3D *v3d);
 void ED_view3D_background_image_remove(struct View3D *v3d, struct BGpic *bgpic);
+void ED_view3D_background_image_clear(struct View3D *v3d);
 
 #endif /* ED_VIEW3D_H */
index f1a36a07734c7561cab142b7e890a20fa303b7b7..ae6658c7e1a4bfc5e39d7430eadabc004c227f43 100644 (file)
@@ -158,10 +158,9 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc
        return new_md;
 }
 
-int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Object *ob, ModifierData *md)
+static int object_modifier_remove(Object *ob, ModifierData *md, int *sort_depsgraph)
 {
        ModifierData *obmd;
-       int sort_depsgraph = 0;
 
        /* It seems on rapid delete it is possible to
         * get called twice on same modifier, so make
@@ -169,11 +168,9 @@ int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Ob
        for(obmd=ob->modifiers.first; obmd; obmd=obmd->next)
                if(obmd==md)
                        break;
-       
-       if(!obmd) {
-               BKE_reportf(reports, RPT_ERROR, "Modifier '%s' not in object '%s'", ob->id.name, md->name);
+
+       if(!obmd)
                return 0;
-       }
 
        /* special cases */
        if(md->type == eModifierType_ParticleSystem) {
@@ -194,13 +191,13 @@ int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Ob
                if(ob->pd)
                        ob->pd->deflect= 0;
 
-               sort_depsgraph = 1;
+               *sort_depsgraph = 1;
        }
        else if(md->type == eModifierType_Surface) {
                if(ob->pd && ob->pd->shape == PFIELD_SHAPE_SURFACE)
                        ob->pd->shape = PFIELD_SHAPE_PLANE;
 
-               sort_depsgraph = 1;
+               *sort_depsgraph = 1;
        }
        else if(md->type == eModifierType_Smoke) {
                ob->dt = OB_TEXTURE;
@@ -239,6 +236,21 @@ int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Ob
        BLI_remlink(&ob->modifiers, md);
        modifier_free(md);
 
+       return 1;
+}
+
+int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Object *ob, ModifierData *md)
+{
+       int sort_depsgraph = 0;
+       int ok;
+
+       ok= object_modifier_remove(ob, md, &sort_depsgraph);
+
+       if(!ok) {
+               BKE_reportf(reports, RPT_ERROR, "Modifier '%s' not in object '%s'", ob->id.name, md->name);
+               return 0;
+       }
+
        DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 
        /* sorting has to be done after the update so that dynamic systems can react properly */
@@ -248,6 +260,31 @@ int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Ob
        return 1;
 }
 
+void ED_object_modifier_clear(Main *bmain, Scene *scene, Object *ob)
+{
+       ModifierData *md =ob->modifiers.first;
+       int sort_depsgraph = 0;
+
+       if(!md)
+               return;
+
+       while(md) {
+               ModifierData *next_md;
+
+               next_md= md->next;
+
+               object_modifier_remove(ob, md, &sort_depsgraph);
+
+               md= next_md;
+       }
+
+       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+
+       /* sorting has to be done after the update so that dynamic systems can react properly */
+       if(sort_depsgraph)
+               DAG_scene_sort(bmain, scene);
+}
+
 int ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *md)
 {
        if(md->prev) {
index ae6ec15e911275b318fbe9e2a3ff5713f8def930..ab4ff20d503b866c7aac71ac933e44a3e05629c6 100644 (file)
@@ -61,6 +61,7 @@
 #include "BKE_constraint.h"
 #include "BKE_curve.h"
 #include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
 #include "BKE_displist.h"
 #include "BKE_global.h"
 #include "BKE_fcurve.h"
@@ -132,6 +133,10 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
 
                em= me->edit_btmesh;
 
+               /* derivedMesh might be needed for solving parenting,
+                  so re-create it here */
+               makeDerivedMesh(scene, obedit, em, CD_MASK_BAREMESH, 0);
+
                BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
                        if (BM_TestHFlag(eve, BM_SELECT)) {
                                if(v1==0) v1= nr;
index d00c4b7907f6f8504125e576fac600db6e03025a..b747d3bc9fc0c581c14005da20ca5e93bbdf0ba4 100644 (file)
@@ -141,6 +141,23 @@ void ED_vgroup_delete(Object *ob, bDeformGroup *defgroup)
                vgroup_delete_object_mode(ob, dg);
 }
 
+void ED_vgroup_clear(Object *ob)
+{
+       bDeformGroup *dg= (bDeformGroup *)ob->defbase.first;
+       int edit_mode= ED_vgroup_object_is_edit_mode(ob);
+
+       while (dg) {
+               bDeformGroup *next_dg= dg->next;
+
+               if(edit_mode)
+                       vgroup_delete_edit_mode(ob, dg);
+               else
+                       vgroup_delete_object_mode(ob, dg);
+
+               dg= next_dg;
+       }
+}
+
 int ED_vgroup_data_create(ID *id)
 {
        /* create deform verts */
index 72ea79fae7e41f60f9ef56a219fed403af085459..f353a090305d6e5ef39c9c773de75199d5aed0c7 100644 (file)
@@ -188,6 +188,10 @@ static int nodes_use_tex(bNodeTree *ntree, Tex *tex)
                        if(node->id == (ID*)tex) {
                                return 1;
                        }
+                       else if(GS(node->id->name) == ID_MA) {
+                               if(mtex_use_tex(((Material*)node->id)->mtex, MAX_MTEX, tex))
+                                       return 1;
+                       }
                        else if(node->type==NODE_GROUP) {
                                if(nodes_use_tex((bNodeTree *)node->id, tex))
                                        return 1;
@@ -198,14 +202,46 @@ static int nodes_use_tex(bNodeTree *ntree, Tex *tex)
        return 0;
 }
 
-static void material_changed(Main *UNUSED(bmain), Material *ma)
+static int nodes_use_material(bNodeTree *ntree, Material *ma)
+{
+       bNode *node;
+
+       for(node=ntree->nodes.first; node; node= node->next) {
+               if(node->id) {
+                       if(node->id == (ID*)ma) {
+                               return 1;
+                       }
+                       else if(node->type==NODE_GROUP) {
+                               if(nodes_use_material((bNodeTree *)node->id, ma))
+                                       return 1;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static void material_changed(Main *bmain, Material *ma)
 {
+       Material *parent;
+
        /* icons */
        BKE_icon_changed(BKE_icon_getid(&ma->id));
 
        /* glsl */
        if(ma->gpumaterial.first)
                GPU_material_free(ma);
+
+       /* find node materials using this */
+       for(parent=bmain->mat.first; parent; parent=parent->id.next) {
+               if(parent->use_nodes && parent->nodetree && nodes_use_material(parent->nodetree, ma));
+               else continue;
+
+               BKE_icon_changed(BKE_icon_getid(&parent->id));
+
+               if(parent->gpumaterial.first)
+                       GPU_material_free(parent);
+       }
 }
 
 static void texture_changed(Main *bmain, Tex *tex)
index 32e162fd09c2329c4e4f878af38a65b895cf85d9..6d2a745fd6756ef741d0dd39301ba42a32db3d21 100644 (file)
@@ -3547,7 +3547,7 @@ BGpic *ED_view3D_background_image_new(View3D *v3d)
        return bgpic;
 }
 
-void ED_view3D_background_image_remove(struct View3D *v3d, struct BGpic *bgpic)
+void ED_view3D_background_image_remove(View3D *v3d, BGpic *bgpic)
 {
        BLI_remlink(&v3d->bgpicbase, bgpic);
 
@@ -3559,3 +3559,16 @@ void ED_view3D_background_image_remove(struct View3D *v3d, struct BGpic *bgpic)
 
        MEM_freeN(bgpic);
 }
+
+void ED_view3D_background_image_clear(View3D *v3d)
+{
+       BGpic *bgpic= v3d->bgpicbase.first;
+
+       while(bgpic) {
+               BGpic *next_bgpic= bgpic->next;
+
+               ED_view3D_background_image_remove(v3d, bgpic);
+
+               bgpic= next_bgpic;
+       }
+}
index c0faed6988515a17cbc583c06b8c45345d5620c6..3800b09e3f7b3986b87d4b4f4c0f1255a760421c 100644 (file)
@@ -997,8 +997,8 @@ StructRNA *ID_code_to_RNA_type(short idcode);
 /* macro which inserts the function name */
 #ifdef __GNUC__
 #  define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args)
-#else /* MSVC doesnt support variable length args in macros */
-#  define RNA_warning _RNA_warning
+#else
+#  define RNA_warning(format, args, ...) _RNA_warning("%s: " format "\n", __FUNCTION__, __VA_ARGS__)
 #endif
 
 void _RNA_warning(const char *format, ...)
index 95f44d86058b5ab2964758d069dafa9525002f56..3125c2eec0866bdc94c1c42f992ba679171488d4 100644 (file)
@@ -588,6 +588,19 @@ static void rna_Curve_spline_remove(Curve *cu, ReportList *reports, Nurb *nu)
 
        freeNurb(nu);
        /* invalidate pointer!, no can do */
+
+       DAG_id_tag_update(&cu->id, OB_RECALC_DATA);
+       WM_main_add_notifier(NC_GEOM|ND_DATA, NULL);
+}
+
+static void rna_Curve_spline_clear(Curve *cu)
+{
+       ListBase *nurbs= BKE_curve_nurbs(cu);
+
+       freeNurblist(nurbs);
+
+       DAG_id_tag_update(&cu->id, OB_RECALC_DATA);
+       WM_main_add_notifier(NC_GEOM|ND_DATA, NULL);
 }
 
 static PointerRNA rna_Curve_active_spline_get(PointerRNA *ptr)
@@ -1200,6 +1213,9 @@ static void rna_def_curve_splines(BlenderRNA *brna, PropertyRNA *cprop)
        parm= RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 
+       func= RNA_def_function(srna, "clear", "rna_Curve_spline_clear");
+       RNA_def_function_ui_description(func, "Remove all spline from a curve");
+
        prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "Object");
        RNA_def_property_pointer_funcs(prop, "rna_Curve_active_spline_get", "rna_Curve_active_spline_set", NULL, NULL);
index 323fb6780fb69dbb91e1687caff12f352c41be86..5f948a3a243cab423303fda294aa5d5b017be35c 100644 (file)
@@ -147,6 +147,17 @@ static void rna_MetaBall_elements_remove(MetaBall *mb, ReportList *reports, Meta
        }
 }
 
+static void rna_MetaBall_elements_clear(MetaBall *mb)
+{
+       BLI_freelistN(&mb->elems);
+
+       /* cheating way for importers to avoid slow updates */
+       if(mb->id.us > 0) {
+               DAG_id_tag_update(&mb->id, 0);
+               WM_main_add_notifier(NC_GEOM|ND_DATA, &mb->id);
+       }
+}
+
 #else
 
 static void rna_def_metaelement(BlenderRNA *brna)
@@ -234,17 +245,20 @@ static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_struct_ui_text(srna, "Meta Elements", "Collection of metaball elements");
 
        func= RNA_def_function(srna, "new", "rna_MetaBall_elements_new");
-       RNA_def_function_ui_description(func, "Add a new spline to the curve");
+       RNA_def_function_ui_description(func, "Add a new element to the metaball");
        RNA_def_enum(func, "type", metaelem_type_items, MB_BALL, "", "type for the new meta-element");
        parm= RNA_def_pointer(func, "element", "MetaElement", "", "The newly created meta-element");
        RNA_def_function_return(func, parm);
 
        func= RNA_def_function(srna, "remove", "rna_MetaBall_elements_remove");
-       RNA_def_function_ui_description(func, "Remove a spline from a curve");
+       RNA_def_function_ui_description(func, "Remove an element from the metaball");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm= RNA_def_pointer(func, "element", "MetaElement", "", "The element to remove");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 
+       func= RNA_def_function(srna, "clear", "rna_MetaBall_elements_clear");
+       RNA_def_function_ui_description(func, "Remove all elements from the metaball");
+
        prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "lastelem");
        RNA_def_property_ui_text(prop, "Active Element", "Last selected element");
index 6cf3a3ee56e5ce4094886be18a21373e55219591..013a4e57db69118d05f7e12f6a5ef2eb44ca7bf8 100644 (file)
@@ -2574,10 +2574,10 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
 static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna)
 {
        static EnumPropertyItem weightvg_mask_tex_map_items[] = {
-               {MOD_DISP_MAP_LOCAL, "LOCAL", 0, "Local", ""},
-               {MOD_DISP_MAP_GLOBAL, "GLOBAL", 0, "Global", ""},
-               {MOD_DISP_MAP_OBJECT, "OBJECT", 0, "Object", ""},
-               {MOD_DISP_MAP_UV, "UV", 0, "UV", ""},
+               {MOD_DISP_MAP_LOCAL, "LOCAL", 0, "Local", "Use local generated coordinates"},
+               {MOD_DISP_MAP_GLOBAL, "GLOBAL", 0, "Global", "Use global coordinates"},
+               {MOD_DISP_MAP_OBJECT, "OBJECT", 0, "Object", "Use local generated coordinates of another object"},
+               {MOD_DISP_MAP_UV, "UV", 0, "UV", "Use coordinates from an UV layer"},
                {0, NULL, 0, NULL, NULL}};
 
        static EnumPropertyItem weightvg_mask_tex_used_items[] = {
@@ -2595,7 +2595,7 @@ static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna)
 
        prop= RNA_def_property(srna, "mask_constant", PROP_FLOAT, PROP_NONE);
        RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
-       RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+       RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 0);
        RNA_def_property_ui_text(prop, "Influence", "Global influence of current modifications on vgroup");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
@@ -2638,14 +2638,15 @@ static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna)
 static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
 {
        static EnumPropertyItem weightvg_edit_falloff_type_items[] = {
-               {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""},
+               {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", "Null action"},
                {MOD_WVG_MAPPING_CURVE, "CURVE", ICON_RNDCURVE, "Custom Curve", ""},
                {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""},
                {MOD_WVG_MAPPING_SMOOTH, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""},
                {MOD_WVG_MAPPING_ROOT, "ROOT", ICON_ROOTCURVE, "Root", ""},
                {MOD_WVG_MAPPING_SPHERE, "ICON_SPHERECURVE", ICON_SPHERECURVE, "Sphere", ""},
                {MOD_WVG_MAPPING_RANDOM, "RANDOM", ICON_RNDCURVE, "Random", ""},
-               {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE, "Median Step", ""}, /* Would need a better icon... */
+               {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE /* Would need a better icon... */, "Median Step",
+                                      "Map all values below 0.5 to 0.0, and all others to 1.0"},
                {0, NULL, 0, NULL, NULL}};
 
        StructRNA *srna;
@@ -2682,7 +2683,7 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
 
        prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE);
        RNA_def_property_range(prop, 0.0, 1.0f);
-       RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+       RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 0);
        RNA_def_property_ui_text(prop, "Default Weight", "Default weight a vertex will have if "
                                                         "it is not in the vgroup");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -2695,7 +2696,7 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
        prop= RNA_def_property(srna, "add_threshold", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "add_threshold");
        RNA_def_property_range(prop, 0.0, 1.0);
-       RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+       RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 0);
        RNA_def_property_ui_text(prop, "Add Threshold", "Lower bound for a vertex's weight "
                                                        "to be added to the vgroup");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -2703,7 +2704,7 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
        prop= RNA_def_property(srna, "remove_threshold", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "rem_threshold");
        RNA_def_property_range(prop, 0.0, 1.0);
-       RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+       RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 0);
        RNA_def_property_ui_text(prop, "Rem Threshold", "Upper bound for a vertex's weight "
                                                        "to be removed from the vgroup");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -2715,21 +2716,21 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
 static void rna_def_modifier_weightvgmix(BlenderRNA *brna)
 {
        static EnumPropertyItem weightvg_mix_modes_items[] = {
-               {MOD_WVG_MIX_SET, "SET", 0, "Replace weights", ""},
-               {MOD_WVG_MIX_ADD, "ADD", 0, "Add to weights", ""},
-               {MOD_WVG_MIX_SUB, "SUB", 0, "Subtract from weights", ""},
-               {MOD_WVG_MIX_MUL, "MUL", 0, "Multiply weights", ""},
-               {MOD_WVG_MIX_DIV, "DIV", 0, "Divide weights", ""},
-               {MOD_WVG_MIX_DIF, "DIF", 0, "Difference", ""},
-               {MOD_WVG_MIX_AVG, "AVG", 0, "Average", ""},
+               {MOD_WVG_MIX_SET, "SET", 0, "Replace", "Replace VGroup A's weights by VGroup b's ones"},
+               {MOD_WVG_MIX_ADD, "ADD", 0, "Add", "Add VGroup B's weights to VGroup A's ones"},
+               {MOD_WVG_MIX_SUB, "SUB", 0, "Subtract", "Subtract VGroup B's weights from VGroup A's ones"},
+               {MOD_WVG_MIX_MUL, "MUL", 0, "Multiply", "Multiply VGroup A's weights by VGroup B's ones"},
+               {MOD_WVG_MIX_DIV, "DIV", 0, "Divide", "Divide VGroup A's weights by VGroup B's ones"},
+               {MOD_WVG_MIX_DIF, "DIF", 0, "Difference", "Difference between VGroup A's and VGroup B's weigths"},
+               {MOD_WVG_MIX_AVG, "AVG", 0, "Average", "Average value of VGroup A's and VGroup B's weigths"},
                {0, NULL, 0, NULL, NULL}};
 
        static EnumPropertyItem weightvg_mix_set_items[] = {
-               {MOD_WVG_SET_ALL,   "ALL",   0, "All vertices", ""},
-               {MOD_WVG_SET_A,     "A",   0, "Vertices from group A", ""},
-               {MOD_WVG_SET_B,     "B",   0, "Vertices from group B", ""},
-               {MOD_WVG_SET_OR,    "OR", 0, "Vertices from one group", ""},
-               {MOD_WVG_SET_AND,   "AND", 0, "Vertices from both groups", ""},
+               {MOD_WVG_SET_ALL,   "ALL",   0, "All", "Affect all vertices (might add some to VGroup A)"},
+               {MOD_WVG_SET_A,     "A",   0, "VGroup A", "Affect vertices in VGroup A"},
+               {MOD_WVG_SET_B,     "B",   0, "VGroup B", "Affect vertices in VGroup B (might add some to VGroup A)"},
+               {MOD_WVG_SET_OR,    "OR", 0, "VGroup A or B", "Affect vertices in at least one of both VGroups (might add some to VGroup A)"},
+               {MOD_WVG_SET_AND,   "AND", 0, "VGroup A and B", "Affect vertices in both groups"},
                {0, NULL, 0, NULL, NULL}};
 
        StructRNA *srna;
@@ -2755,14 +2756,14 @@ static void rna_def_modifier_weightvgmix(BlenderRNA *brna)
 
        prop= RNA_def_property(srna, "default_weight_a", PROP_FLOAT, PROP_NONE);
        RNA_def_property_range(prop, 0.0, 1.0f);
-       RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+       RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 0);
        RNA_def_property_ui_text(prop, "Default Weight A", "Default weight a vertex will have if "
                                                         "it is not in the first vgroup");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop= RNA_def_property(srna, "default_weight_b", PROP_FLOAT, PROP_NONE);
        RNA_def_property_range(prop, 0.0, 1.0f);
-       RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+       RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 0);
        RNA_def_property_ui_text(prop, "Default Weight B", "Default weight a vertex will have if "
                                                           "it is not in the second vgroup");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -2799,14 +2800,15 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna)
                {0, NULL, 0, NULL, NULL}};
 
        static EnumPropertyItem weightvg_proximity_falloff_type_items[] = {
-               {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""},
+               {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", "Null action"},
                /* No curve mapping here! */
                {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""},
                {MOD_WVG_MAPPING_SMOOTH, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""},
                {MOD_WVG_MAPPING_ROOT, "ROOT", ICON_ROOTCURVE, "Root", ""},
                {MOD_WVG_MAPPING_SPHERE, "ICON_SPHERECURVE", ICON_SPHERECURVE, "Sphere", ""},
                {MOD_WVG_MAPPING_RANDOM, "RANDOM", ICON_RNDCURVE, "Random", ""},
-               {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE, "Median Step", ""}, /* Would need a better icon... */
+               {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE /* Would need a better icon... */, "Median Step",
+                                      "Map all values below 0.5 to 0.0, and all others to 1.0"},
                {0, NULL, 0, NULL, NULL}};
 
        StructRNA *srna;
index cd1b74f2b38b2551d04d8c75d82037145748bb25..062fbad421af8b0737041f23a015cc65526b044e 100644 (file)
@@ -645,6 +645,26 @@ static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, bNod
        }
 }
 
+static void rna_NodeTree_node_clear(bNodeTree *ntree)
+{
+       bNode *node= ntree->nodes.first;
+
+       while(node) {
+               bNode *next_node= node->next;
+
+               if (node->id)
+                       id_us_min(node->id);
+
+               nodeFreeNode(ntree, node);
+
+               node= next_node;
+       }
+
+       ntreeUpdateTree(ntree); /* update group node socket links*/
+
+       WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+}
+
 static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, bNodeSocket *in, bNodeSocket *out)
 {
        bNodeLink *ret;
@@ -687,6 +707,22 @@ static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNod
        }
 }
 
+static void rna_NodeTree_link_clear(bNodeTree *ntree)
+{
+       bNodeLink *link= ntree->links.first;
+
+       while(link) {
+               bNodeLink *next_link= link->next;
+
+               nodeRemLink(ntree, link);
+
+               link= next_link;
+       }
+       ntreeUpdateTree(ntree);
+
+       WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+}
+
 static bNodeSocket *rna_NodeTree_input_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type)
 {
        /* XXX should check if tree is a group here! no good way to do this currently. */
@@ -2828,6 +2864,9 @@ static void rna_def_nodetree_link_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm= RNA_def_pointer(func, "link", "NodeLink", "", "The node link to remove");
        RNA_def_property_flag(parm, PROP_REQUIRED);
+
+       func= RNA_def_function(srna, "clear", "rna_NodeTree_link_clear");
+       RNA_def_function_ui_description(func, "remove all node links from the node tree");
 }
 
 static void rna_def_composite_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
@@ -2856,6 +2895,9 @@ static void rna_def_composite_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm= RNA_def_pointer(func, "node", "Node", "", "The node to remove");
        RNA_def_property_flag(parm, PROP_REQUIRED);
+
+       func= RNA_def_function(srna, "clear", "rna_NodeTree_node_clear");
+       RNA_def_function_ui_description(func, "Remove all nodes from this node tree");
 }
 
 static void rna_def_shader_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
@@ -2884,6 +2926,9 @@ static void rna_def_shader_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm= RNA_def_pointer(func, "node", "Node", "", "The node to remove");
        RNA_def_property_flag(parm, PROP_REQUIRED);
+
+       func= RNA_def_function(srna, "clear", "rna_NodeTree_node_clear");
+       RNA_def_function_ui_description(func, "Remove all nodes from this node tree");
 }
 
 static void rna_def_texture_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
@@ -2912,6 +2957,9 @@ static void rna_def_texture_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm= RNA_def_pointer(func, "node", "Node", "", "The node to remove");
        RNA_def_property_flag(parm, PROP_REQUIRED);
+
+       func= RNA_def_function(srna, "clear", "rna_NodeTree_node_clear");
+       RNA_def_function_ui_description(func, "Remove all nodes from this node tree");
 }
 
 static void rna_def_node_socket(BlenderRNA *brna)
index df2b2881c037356c7af3e3dd4a8fb34fd98bc178..2a384329360df59b839c233f117c7e6441b61bb2 100644 (file)
@@ -1157,6 +1157,16 @@ static void rna_Object_constraints_remove(Object *object, ReportList *reports, b
        WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT|NA_REMOVED, object);
 }
 
+static void rna_Object_constraints_clear(Object *object)
+{
+       free_constraints(&object->constraints);
+
+       ED_object_constraint_update(object);
+       ED_object_constraint_set_active(object, NULL);
+
+       WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT|NA_REMOVED, object);
+}
+
 static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, ReportList *reports, const char *name, int type)
 {
        return ED_object_modifier_add(reports, CTX_data_main(C), CTX_data_scene(C), object, name, type);
@@ -1165,6 +1175,15 @@ static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, Report
 static void rna_Object_modifier_remove(Object *object, bContext *C, ReportList *reports, ModifierData *md)
 {
        ED_object_modifier_remove(reports, CTX_data_main(C), CTX_data_scene(C), object, md);
+
+       WM_main_add_notifier(NC_OBJECT|ND_MODIFIER|NA_REMOVED, object);
+}
+
+static void rna_Object_modifier_clear(Object *object, bContext *C)
+{
+       ED_object_modifier_clear(CTX_data_main(C), CTX_data_scene(C), object);
+
+       WM_main_add_notifier(NC_OBJECT|ND_MODIFIER|NA_REMOVED, object);
 }
 
 static void rna_Object_boundbox_get(PointerRNA *ptr, float *values)
@@ -1196,6 +1215,13 @@ static void rna_Object_vgroup_remove(Object *ob, bDeformGroup *defgroup)
        WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
 }
 
+static void rna_Object_vgroup_clear(Object *ob)
+{
+       ED_vgroup_clear(ob);
+
+       WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
+}
+
 static void rna_VertexGroup_vertex_add(ID *id, bDeformGroup *def, ReportList *reports, int index_len,
                                        int *index, float weight, int assignmode)
 {
@@ -1637,6 +1663,9 @@ static void rna_def_object_constraints(BlenderRNA *brna, PropertyRNA *cprop)
        /* constraint to remove */
        parm= RNA_def_pointer(func, "constraint", "Constraint", "", "Removed constraint");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+       func= RNA_def_function(srna, "clear", "rna_Object_constraints_clear");
+       RNA_def_function_ui_description(func, "Remove all constraint from this object");
 }
 
 /* object.modifiers */
@@ -1685,6 +1714,11 @@ static void rna_def_object_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
        /* target to remove*/
        parm= RNA_def_pointer(func, "modifier", "Modifier", "", "Modifier to remove");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+       /* clear all modifiers */
+       func= RNA_def_function(srna, "clear", "rna_Object_modifier_clear");
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+       RNA_def_function_ui_description(func, "Remove all modifiers from the object");
 }
 
 /* object.particle_systems */
@@ -1759,6 +1793,9 @@ static void rna_def_object_vertex_groups(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Delete vertex group from object");
        parm= RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to remove");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+       func= RNA_def_function(srna, "clear", "rna_Object_vgroup_clear");
+       RNA_def_function_ui_description(func, "Delete all vertex groups from object");
 }
 
 
index f9b88e19248472e4df94ca968be91f9c404a0dd0..40fcfa3e0168397bd1f75c5ef83510b17b8a8741 100644 (file)
@@ -1196,6 +1196,10 @@ static TimeMarker *rna_TimeLine_add(Scene *scene, const char name[])
        marker->frame= 1;
        BLI_strncpy_utf8(marker->name, name, sizeof(marker->name));
        BLI_addtail(&scene->markers, marker);
+
+       WM_main_add_notifier(NC_SCENE|ND_MARKERS, NULL);
+       WM_main_add_notifier(NC_ANIMATION|ND_MARKERS, NULL);
+
        return marker;
 }
 
@@ -1208,6 +1212,17 @@ static void rna_TimeLine_remove(Scene *scene, ReportList *reports, TimeMarker *m
 
        /* XXX, invalidates PyObject */
        MEM_freeN(marker);
+
+       WM_main_add_notifier(NC_SCENE|ND_MARKERS, NULL);
+       WM_main_add_notifier(NC_ANIMATION|ND_MARKERS, NULL);
+}
+
+static void rna_TimeLine_clear(Scene *scene)
+{
+       BLI_freelistN(&scene->markers);
+
+       WM_main_add_notifier(NC_SCENE|ND_MARKERS, NULL);
+       WM_main_add_notifier(NC_ANIMATION|ND_MARKERS, NULL);
 }
 
 static KeyingSet *rna_Scene_keying_set_new(Scene *sce, ReportList *reports, const char name[])
@@ -3607,6 +3622,9 @@ static void rna_def_timeline_markers(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm= RNA_def_pointer(func, "marker", "TimelineMarker", "", "Timeline marker to remove");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+       func= RNA_def_function(srna, "clear", "rna_TimeLine_clear");
+       RNA_def_function_ui_description(func, "Remove all timeline markers");
 }
 
 /* scene.keying_sets */
index 9f6f0bb7802f08aa1041c9674a7ec26e56e3cccc..495a83f4bbee291ff7e2cf46c6f94f8602bfedf3 100644 (file)
@@ -911,6 +911,12 @@ static void rna_BackgroundImage_remove(View3D *v3d, ReportList *reports, BGpic *
        }
 }
 
+static void rna_BackgroundImage_clear(View3D *v3d)
+{
+       ED_view3D_background_image_clear(v3d);
+       WM_main_add_notifier(NC_SPACE|ND_SPACE_VIEW3D, v3d);
+}
+
 /* Space Node Editor */
 
 static int rna_SpaceNodeEditor_node_tree_poll(PointerRNA *ptr, PointerRNA value)
@@ -1328,6 +1334,9 @@ static void rna_def_backgroundImages(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm= RNA_def_pointer(func, "image", "BackgroundImage", "", "Image displayed as viewport background");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+       func= RNA_def_function(srna, "clear", "rna_BackgroundImage_clear");
+       RNA_def_function_ui_description(func, "Remove all background images");
 }
 
 static void rna_def_space_view3d(BlenderRNA *brna)
index ad16cbe97a0e54388013e269f82bb815a8fd0ede..8b44f262e41c691067f2ab733b3016259323de4b 100644 (file)
@@ -466,6 +466,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
 
                if (use_trgt_verts || use_trgt_edges || use_trgt_faces) {
                        DerivedMesh *target_dm = obr->derivedFinal;
+                       short free_target_dm = FALSE;
                        if (!target_dm) {
                                if (ELEM3(obr->type, OB_CURVE, OB_SURF, OB_FONT))
                                        target_dm = CDDM_from_curve(obr);
@@ -476,6 +477,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                                        else
                                                target_dm = CDDM_from_mesh(me, obr);
                                }
+                               free_target_dm = TRUE;
                        }
 
                        /* We must check that we do have a valid target_dm! */
@@ -495,6 +497,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                                        if(dists_f)
                                                new_w[i] = minf(dists_f[i], new_w[i]);
                                }
+                               if(free_target_dm) target_dm->release(target_dm);
                                if(dists_v) MEM_freeN(dists_v);
                                if(dists_e) MEM_freeN(dists_e);
                                if(dists_f) MEM_freeN(dists_f);
index f0c706afb79f703160664fe6edbf0b8927376414..ecdbc8a39b69f54ec4252c4935d2f01b9c710b9b 100644 (file)
@@ -282,6 +282,7 @@ void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar){}
 void ED_view3d_from_m4(float mat[][4], float ofs[3], float quat[4], float *dist){}
 struct BGpic *ED_view3D_background_image_new(struct View3D *v3d){return (struct BGpic *) NULL;}
 void ED_view3D_background_image_remove(struct View3D *v3d, struct BGpic *bgpic){}
+void ED_view3D_background_image_clear(struct View3D *v3d){}
 void view3d_apply_mat4(float mat[][4], float *ofs, float *quat, float *dist){}
 int text_file_modified(struct Text *text){return 0;}
 void ED_node_shader_default(struct Material *ma){}
@@ -289,6 +290,7 @@ void ED_screen_animation_timer_update(struct bContext *C, int redraws){}
 void ED_base_object_select(struct Base *base, short mode){}
 int ED_object_modifier_remove(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md){return 0;}
 int ED_object_modifier_add(struct ReportList *reports, struct Scene *scene, struct Object *ob, char *name, int type){return 0;}
+void ED_object_modifier_clear(struct Scene *scene, struct Object *ob){}
 void ED_object_enter_editmode(struct bContext *C, int flag){}
 void ED_object_exit_editmode(struct bContext *C, int flag){}
 int uiLayoutGetActive(struct uiLayout *layout){return 0;}
@@ -322,6 +324,7 @@ void ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup *dg, int vertnum,
 void ED_vgroup_vert_remove(struct Object *ob, struct bDeformGroup *dg, int vertnum){}
 void ED_vgroup_vert_weight(struct Object *ob, struct bDeformGroup *dg, int vertnum){}
 void ED_vgroup_delete(struct Object *ob, struct bDeformGroup *defgroup){}
+void ED_vgroup_clear(struct Object *ob){}
 void ED_vgroup_object_is_edit_mode(struct Object *ob){}
 
 void ED_sequencer_update_view(struct bContext *C, int view){}