Merging r59104 through r59112 from trunk into soc-2013-depsgraph_mt
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 13 Aug 2013 15:09:19 +0000 (15:09 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 13 Aug 2013 15:09:19 +0000 (15:09 +0000)
13 files changed:
doc/python_api/rst/bge.logic.rst
intern/cycles/kernel/kernel_passes.h
intern/cycles/render/graph.cpp
intern/cycles/render/session.cpp
intern/cycles/render/svm.cpp
source/blender/blenkernel/BKE_material.h
source/blender/blenkernel/intern/material.c
source/blender/blenkernel/intern/sound.c
source/blender/blenlib/BLI_math_base.h
source/blender/editors/space_outliner/outliner_edit.c
source/blender/editors/space_outliner/space_outliner.c
source/blender/makesrna/intern/rna_ID.c
source/gameengine/Ketsji/KX_PythonInit.cpp

index 4dd0614700e8133d52467483d17ecae8bb48b866..c7915ee5279d60f5a0d42f096513c571f6d6ca5d 100644 (file)
@@ -362,9 +362,9 @@ Utility functions
 
    Use / as directory separator in path
    You can use '//' at the start of the string to define a relative path;
-   Blender replaces that string by the directory of the startup .blend or runtime file
-   to make a full path name (doesn't change during the game, even if you load other .blend).
-   The function also converts the directory separator to the local file system format.
+   Blender replaces that string by the directory of the current .blend or runtime file
+   to make a full path name. The function also converts the directory separator to
+   the local file system format.
 
    :arg path: The path string to be converted/expanded.
    :type path: string
index 0b45e2432831ea52a8921f4af6d45852cba1a3d1..4b8d6f84faa258cbe5a74df669f49877d1e6f89b 100644 (file)
@@ -48,7 +48,7 @@ __device_inline void kernel_write_data_passes(KernelGlobals *kg, __global float
        if(!(flag & PASS_ALL))
                return;
        
-       /* todo: add alpha treshold */
+       /* todo: add alpha threshold */
        if(!(path_flag & PATH_RAY_TRANSPARENT)) {
                if(sample == 0) {
                        if(flag & PASS_DEPTH) {
index 2e8bc77b9c9ae663878679c272400b77569e8724..4c6e64a1fb5231a51b9674fe191faaa9dc348375 100644 (file)
@@ -255,7 +255,7 @@ void ShaderGraph::finalize(bool do_bump, bool do_osl, bool do_multi_transform)
 
 void ShaderGraph::find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input)
 {
-       /* find all nodes that this input dependes on directly and indirectly */
+       /* find all nodes that this input depends on directly and indirectly */
        ShaderNode *node = (input->link)? input->link->parent: NULL;
 
        if(node) {
index 13c199f879ba14cea7876f1f32e47183d4d28c71..87f5722d144ebecc0bcd4ee4337f322c2b6db610 100644 (file)
@@ -135,7 +135,7 @@ void Session::reset_gpu(BufferParams& buffer_params, int samples)
 {
        thread_scoped_lock pause_lock(pause_mutex);
 
-       /* block for buffer acces and reset immediately. we can't do this
+       /* block for buffer access and reset immediately. we can't do this
         * in the thread, because we need to allocate an OpenGL buffer, and
         * that only works in the main thread */
        thread_scoped_lock display_lock(display_mutex);
index 9e887aeadf261ed30590139c4d4b5f8bfa343edc..4e6171554654fe56685865bddf3b793ec92fdd37 100644 (file)
@@ -504,7 +504,7 @@ void SVMCompiler::generate_closure(ShaderNode *node, set<ShaderNode*>& done)
 
 void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, set<ShaderNode*>& closure_done)
 {
-       /* todo: the weaks point here is that unlike the single closure sampling 
+       /* todo: the weak point here is that unlike the single closure sampling 
         * we will evaluate all nodes even if they are used as input for closures
         * that are unused. it's not clear what would be the best way to skip such
         * nodes at runtime, especially if they are tangled up  */
index 7c47380f8381cd29b5b8639b740b77de27d1dccc..5d8406ba76f14771e4fae942a87ffed8f580406c 100644 (file)
@@ -88,7 +88,7 @@ int object_remove_material_slot(struct Object *ob);
 
 /* rna api */
 void material_append_id(struct ID *id, struct Material *ma);
-struct Material *material_pop_id(struct ID *id, int index, int remove_material_slot); /* index is an int because of RNA */
+struct Material *material_pop_id(struct ID *id, int index, bool remove_material_slot); /* index is an int because of RNA */
 
 /* rendering */
 
index 4abeb8389d6566cbd80516a8e7c07ac4f27e6fff..cb6308b70618cd771be089f6996c7e0133edf19a 100644 (file)
@@ -572,7 +572,7 @@ void material_append_id(ID *id, Material *ma)
        }
 }
 
-Material *material_pop_id(ID *id, int index_i, int remove_material_slot)
+Material *material_pop_id(ID *id, int index_i, bool remove_material_slot)
 {
        short index = (short)index_i;
        Material *ret = NULL;
@@ -583,34 +583,24 @@ Material *material_pop_id(ID *id, int index_i, int remove_material_slot)
                        ret = (*matar)[index];
                        id_us_min((ID *)ret);
 
-                       if (remove_material_slot) {
-                               if (*totcol <= 1) {
-                                       *totcol = 0;
-                                       MEM_freeN(*matar);
-                                       *matar = NULL;
-                               }
-                               else {
-                                       Material **mat;
-                                       if (index + 1 != (*totcol))
-                                               memmove((*matar) + index, (*matar) + (index + 1), sizeof(void *) * ((*totcol) - (index + 1)));
-
-                                       (*totcol)--;
-                                       
-                                       mat = MEM_callocN(sizeof(void *) * (*totcol), "newmatar");
-                                       memcpy(mat, *matar, sizeof(void *) * (*totcol));
-                                       MEM_freeN(*matar);
-
-                                       *matar = mat;
-                                       test_object_materials(G.main, id);
-                               }
+                       if (*totcol <= 1) {
+                               *totcol = 0;
+                               MEM_freeN(*matar);
+                               *matar = NULL;
+                       }
+                       else {
+                               if (index + 1 != (*totcol))
+                                       memmove((*matar) + index, (*matar) + (index + 1), sizeof(void *) * ((*totcol) - (index + 1)));
+
+                               (*totcol)--;
+                               *matar = MEM_reallocN(*matar, sizeof(void *) * (*totcol));
+                               test_object_materials(G.main, id);
+                       }
 
+                       if (remove_material_slot) {
                                /* decrease mat_nr index */
                                data_delete_material_index_id(id, index);
                        }
-
-                       /* don't remove material slot, only clear it*/
-                       else
-                               (*matar)[index] = NULL;
                }
        }
        
@@ -1842,8 +1832,14 @@ static void convert_tfacematerial(Main *main, Material *ma)
                        mf->mat_nr = mat_nr;
                }
                /* remove material from mesh */
-               for (a = 0; a < me->totcol; )
-                       if (me->mat[a] == ma) material_pop_id(&me->id, a, 1); else a++;
+               for (a = 0; a < me->totcol; ) {
+                       if (me->mat[a] == ma) {
+                               material_pop_id(&me->id, a, true);
+                       }
+                       else {
+                               a++;
+                       }
+               }
        }
 }
 
index feff8f95fd7ef3b096da976b8992d3e8f591f2fd..2f8eb7d9931f54ea304d4c84db932c97334a2134 100644 (file)
 #include "BKE_sequencer.h"
 #include "BKE_scene.h"
 
-// evil quiet NaN definition
-static const int NAN_INT = 0x7FC00000;
-#define NAN_FLT *((float *)(&NAN_INT))
-
 #ifdef WITH_AUDASPACE
 // evil global ;-)
 static int sound_cfra;
index 4b71babdba18589849cd8202f095e815ff803843..69dbd3253f00258201f93d781c19f877b03e6199 100644 (file)
 #define MAXFLOAT  ((float)3.40282347e+38)
 #endif
 
+#if defined(__GNUC__)
+#  define NAN_FLT __builtin_nanf("")
+#else
+/* evil quiet NaN definition */
+static const int NAN_INT = 0x7FC00000;
+#  define NAN_FLT  (*((float *)(&NAN_INT)))
+#endif
+
 /* do not redefine functions from C99 or POSIX.1-2001 */
 #if !(defined(_ISOC99_SOURCE) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L))
 
index a014724af4a0d5aa37abb5ffec18f7ed029b04a1..ed4ecff88b9dde578399068b66db26d3e868269c 100644 (file)
@@ -1648,6 +1648,17 @@ void OUTLINER_OT_parent_drop(wmOperatorType *ot)
        RNA_def_enum(ot->srna, "type", prop_make_parent_types, 0, "Type", "");
 }
 
+static int outliner_parenting_poll(bContext *C)
+{
+       SpaceOops *soops = CTX_wm_space_outliner(C);
+
+       if (soops) {
+               return ELEM4(soops->outlinevis, SO_ALL_SCENES, SO_CUR_SCENE, SO_VISIBLE, SO_GROUPS);
+       }
+
+       return FALSE;
+}
+
 static int parent_clear_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
 {
        Main *bmain = CTX_data_main(C);
@@ -1662,12 +1673,6 @@ static int parent_clear_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSE
 
        /* search forwards to find the object */
        te = outliner_find_id(soops, &soops->tree, (ID *)ob);
-       /* then search backwards to get the scene */
-       scene = (Scene *)outliner_search_back(soops, te, ID_SCE);
-
-       if (scene == NULL) {
-               return OPERATOR_CANCELLED;
-       }
 
        ED_object_parent_clear(ob, RNA_enum_get(op->ptr, "type"));
 
@@ -1687,7 +1692,7 @@ void OUTLINER_OT_parent_clear(wmOperatorType *ot)
        /* api callbacks */
        ot->invoke = parent_clear_invoke;
 
-       ot->poll = ED_operator_outliner_active;
+       ot->poll = outliner_parenting_poll;
 
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
index 00476cd467d1752c90a22562015f2be810ee0f11..874852ee320749b4e5e66c963c5e6381b0a11761 100644 (file)
@@ -144,6 +144,10 @@ static int outliner_parent_clear_poll(bContext *C, wmDrag *drag, const wmEvent *
 
        UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &fmval[0], &fmval[1]);
 
+       if (!ELEM4(soops->outlinevis, SO_ALL_SCENES, SO_CUR_SCENE, SO_VISIBLE, SO_GROUPS)) {
+               return FALSE;
+       }
+
        if (drag->type == WM_DRAG_ID) {
                ID *id = (ID *)drag->poin;
                if (GS(id->name) == ID_OB) {
index 0489f85a37fc4d3cce525bf360464cc580b7ef0d..76337da32614b4dd301dd1ee7764d051daec62ee 100644 (file)
@@ -353,9 +353,26 @@ static void rna_IDMaterials_append_id(ID *id, Material *ma)
        WM_main_add_notifier(NC_OBJECT | ND_OB_SHADING, id);
 }
 
-static Material *rna_IDMaterials_pop_id(ID *id, int index_i, int remove_material_slot)
+static Material *rna_IDMaterials_pop_id(ID *id, ReportList *reports, int index_i, int remove_material_slot)
 {
-       Material *ma = material_pop_id(id, index_i, remove_material_slot);
+       Material *ma;
+       short *totcol = give_totcolp_id(id);
+       const short totcol_orig = *totcol;
+       if (index_i < 0) {
+               index_i += (*totcol);
+       }
+
+       if ((index_i < 0) || (index_i >= (*totcol))) {
+               BKE_report(reports, RPT_ERROR, "Index out of range");
+               return NULL;
+       }
+
+       ma = material_pop_id(id, index_i, remove_material_slot);
+
+       if (*totcol == totcol_orig) {
+               BKE_report(reports, RPT_ERROR, "No material to removed");
+               return NULL;
+       }
 
        DAG_id_tag_update(id, OB_RECALC_DATA);
        WM_main_add_notifier(NC_OBJECT | ND_DRAW, id);
@@ -476,9 +493,9 @@ static void rna_def_ID_materials(BlenderRNA *brna)
        RNA_def_property_flag(parm, PROP_REQUIRED);
 
        func = RNA_def_function(srna, "pop", "rna_IDMaterials_pop_id");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a material from the data block");
-       parm = RNA_def_int(func, "index", 0, 0, MAXMAT, "", "Index of material to remove", 0, MAXMAT);
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       parm = RNA_def_int(func, "index", -1, -MAXMAT, MAXMAT, "", "Index of material to remove", 0, MAXMAT);
        RNA_def_boolean(func, "update_data", 0, "", "Update data by re-adjusting the material slots assigned");
        parm = RNA_def_pointer(func, "material", "Material", "", "Material to remove");
        RNA_def_function_return(func, parm);
index e595f24a6624578d7f524c059375f58bad0e5170..d8b4bf9e8bdb0f48bf827744afb1e139143a61f5 100644 (file)
@@ -233,9 +233,8 @@ static char gPyExpandPath_doc[] =
 path - the string path to convert.\n\n\
 Use / as directory separator in path\n\
 You can use '//' at the start of the string to define a relative path;\n\
-Blender replaces that string by the directory of the startup .blend or runtime\n\
-file to make a full path name (doesn't change during the game, even if you load\n\
-other .blend).\n\
+Blender replaces that string by the directory of the current .blend or runtime\n\
+file to make a full path name.\n\
 The function also converts the directory separator to the local file system format.";
 
 static PyObject *gPyExpandPath(PyObject *, PyObject *args)