Cycles: svn merge -r41182:41205 ^/trunk/blender
[blender-staging.git] / source / blender / editors / space_buttons / buttons_context.c
index 309c5cfc2189bc95cbd7e64ed4fa033016622fb9..da38373d0d1c420b6b4b3c8780f435012ad44a0f 100644 (file)
@@ -56,7 +56,6 @@
 #include "BKE_screen.h"
 #include "BKE_texture.h"
 
 #include "BKE_screen.h"
 #include "BKE_texture.h"
 
-
 #include "RNA_access.h"
 
 #include "ED_armature.h"
 #include "RNA_access.h"
 
 #include "ED_armature.h"
 
 #include "buttons_intern.h"    // own include
 
 
 #include "buttons_intern.h"    // own include
 
-typedef struct ButsContextPath {
-       PointerRNA ptr[8];
-       int len;
-       int flag;
-       int tex_ctx;
-} ButsContextPath;
-
 static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type)
 {
        PointerRNA *ptr;
 static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type)
 {
        PointerRNA *ptr;
@@ -375,102 +367,141 @@ static int buttons_context_path_brush(ButsContextPath *path)
        return 0;
 }
 
        return 0;
 }
 
-static int buttons_context_path_texture(ButsContextPath *path)
+static int buttons_context_path_texture(ButsContextPath *path, ButsContextTexture *ct)
 {
 {
-       Material *ma;
-       Lamp *la;
-       Brush *br;
-       World *wo;
-       ParticleSystem *psys;
-       Tex *tex;
-       PointerRNA *ptr= &path->ptr[path->len-1];
-       int orig_len = path->len;
+       if(ct) {
+               /* new shading system */
+               PointerRNA *ptr= &path->ptr[path->len-1];
+               ID *id;
 
 
-       /* if we already have a (pinned) texture, we're done */
-       if(RNA_struct_is_a(ptr->type, &RNA_Texture)) {
-               return 1;
-       }
-       /* try brush */
-       if((path->tex_ctx == SB_TEXC_BRUSH) && buttons_context_path_brush(path)) {
-               br= path->ptr[path->len-1].data;
-               
-               if(br) {
-                       tex= give_current_brush_texture(br);
+               /* if we already have a (pinned) texture, we're done */
+               if(RNA_struct_is_a(ptr->type, &RNA_Texture))
+                       return 1;
 
 
-                       RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+               if(!ct->user)
+                       return 0;
+               
+               id= ct->user->id;
+
+               if(id) {
+                       if(GS(id->name) == ID_BR)
+                               buttons_context_path_brush(path);
+                       else if(GS(id->name) == ID_MA)
+                               buttons_context_path_material(path, 0);
+                       else if(GS(id->name) == ID_WO)
+                               buttons_context_path_world(path);
+                       else if(GS(id->name) == ID_LA)
+                               buttons_context_path_data(path, OB_LAMP);
+                       else if(GS(id->name) == ID_PA)
+                               buttons_context_path_particle(path);
+                       else if(GS(id->name) == ID_OB)
+                               buttons_context_path_object(path);
+               }
+               
+               if(ct->texture) {
+                       RNA_id_pointer_create(&ct->texture->id, &path->ptr[path->len]);
                        path->len++;
                        path->len++;
-                       return 1;
                }
                }
-       }
-       /* try world */
-       if((path->tex_ctx == SB_TEXC_WORLD) && buttons_context_path_world(path)) {
-               wo= path->ptr[path->len-1].data;
-
-               if(wo && GS(wo->id.name)==ID_WO) {
-                       tex= give_current_world_texture(wo);
 
 
-                       RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
-                       path->len++;
+               return 1;
+       }
+       else {
+               /* old shading system */
+               Material *ma;
+               Lamp *la;
+               Brush *br;
+               World *wo;
+               ParticleSystem *psys;
+               Tex *tex;
+               PointerRNA *ptr= &path->ptr[path->len-1];
+               int orig_len = path->len;
+
+               /* if we already have a (pinned) texture, we're done */
+               if(RNA_struct_is_a(ptr->type, &RNA_Texture)) {
                        return 1;
                }
                        return 1;
                }
-       }
-       /* try particles */
-       if((path->tex_ctx == SB_TEXC_PARTICLES) && buttons_context_path_particle(path)) {
-               if(path->ptr[path->len-1].type == &RNA_ParticleSettings) {
-                       ParticleSettings *part = path->ptr[path->len-1].data;
+               /* try brush */
+               if((path->tex_ctx == SB_TEXC_BRUSH) && buttons_context_path_brush(path)) {
+                       br= path->ptr[path->len-1].data;
+                       
+                       if(br) {
+                               tex= give_current_brush_texture(br);
 
 
-                       tex= give_current_particle_texture(part);
-                       RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
-                       path->len++;
-                       return 1;
+                               RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+                               path->len++;
+                               return 1;
+                       }
                }
                }
-               else {
-                       psys= path->ptr[path->len-1].data;
+               /* try world */
+               if((path->tex_ctx == SB_TEXC_WORLD) && buttons_context_path_world(path)) {
+                       wo= path->ptr[path->len-1].data;
 
 
-                       if(psys && psys->part && GS(psys->part->id.name)==ID_PA) {
-                               tex= give_current_particle_texture(psys->part);
+                       if(wo && GS(wo->id.name)==ID_WO) {
+                               tex= give_current_world_texture(wo);
 
                                RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
                                path->len++;
                                return 1;
                        }
                }
 
                                RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
                                path->len++;
                                return 1;
                        }
                }
-       }
-       /* try material */
-       if(buttons_context_path_material(path, 1)) {
-               ma= path->ptr[path->len-1].data;
+               /* try particles */
+               if((path->tex_ctx == SB_TEXC_PARTICLES) && buttons_context_path_particle(path)) {
+                       if(path->ptr[path->len-1].type == &RNA_ParticleSettings) {
+                               ParticleSettings *part = path->ptr[path->len-1].data;
 
 
-               if(ma) {
-                       tex= give_current_material_texture(ma);
+                               tex= give_current_particle_texture(part);
+                               RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+                               path->len++;
+                               return 1;
+                       }
+                       else {
+                               psys= path->ptr[path->len-1].data;
 
 
-                       RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
-                       path->len++;
-                       return 1;
+                               if(psys && psys->part && GS(psys->part->id.name)==ID_PA) {
+                                       tex= give_current_particle_texture(psys->part);
+
+                                       RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+                                       path->len++;
+                                       return 1;
+                               }
+                       }
                }
                }
-       }
-       /* try lamp */
-       if(buttons_context_path_data(path, OB_LAMP)) {
-               la= path->ptr[path->len-1].data;
+               /* try material */
+               if(buttons_context_path_material(path, 1)) {
+                       ma= path->ptr[path->len-1].data;
 
 
-               if(la) {
-                       tex= give_current_lamp_texture(la);
+                       if(ma) {
+                               tex= give_current_material_texture(ma);
 
 
-                       RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
-                       path->len++;
-                       return 1;
+                               RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+                               path->len++;
+                               return 1;
+                       }
                }
                }
-       }
-       /* try brushes again in case of no material, lamp, etc */
-       path->len = orig_len;
-       if(buttons_context_path_brush(path)) {
-               br= path->ptr[path->len-1].data;
-               
-               if(br) {
-                       tex= give_current_brush_texture(br);
+               /* try lamp */
+               if(buttons_context_path_data(path, OB_LAMP)) {
+                       la= path->ptr[path->len-1].data;
+
+                       if(la) {
+                               tex= give_current_lamp_texture(la);
+
+                               RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+                               path->len++;
+                               return 1;
+                       }
+               }
+               /* try brushes again in case of no material, lamp, etc */
+               path->len = orig_len;
+               if(buttons_context_path_brush(path)) {
+                       br= path->ptr[path->len-1].data;
                        
                        
-                       RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
-                       path->len++;
-                       return 1;
+                       if(br) {
+                               tex= give_current_brush_texture(br);
+                               
+                               RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+                               path->len++;
+                               return 1;
+                       }
                }
        }
 
                }
        }
 
@@ -532,7 +563,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
                        found= buttons_context_path_material(path, 0);
                        break;
                case BCONTEXT_TEXTURE:
                        found= buttons_context_path_material(path, 0);
                        break;
                case BCONTEXT_TEXTURE:
-                       found= buttons_context_path_texture(path);
+                       found= buttons_context_path_texture(path, sbuts->texuser);
                        break;
                case BCONTEXT_BONE:
                        found= buttons_context_path_bone(path);
                        break;
                case BCONTEXT_BONE:
                        found= buttons_context_path_bone(path);
@@ -582,6 +613,8 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
        PointerRNA *ptr;
        int a, pflag= 0, flag= 0;
 
        PointerRNA *ptr;
        int a, pflag= 0, flag= 0;
 
+       buttons_texture_context_compute(C, sbuts);
+
        if(!sbuts->path)
                sbuts->path= MEM_callocN(sizeof(ButsContextPath), "ButsContextPath");
        
        if(!sbuts->path)
                sbuts->path= MEM_callocN(sizeof(ButsContextPath), "ButsContextPath");
        
@@ -651,7 +684,8 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
 const char *buttons_context_dir[] = {
        "world", "object", "mesh", "armature", "lattice", "curve",
        "meta_ball", "lamp", "speaker", "camera", "material", "material_slot",
 const char *buttons_context_dir[] = {
        "world", "object", "mesh", "armature", "lattice", "curve",
        "meta_ball", "lamp", "speaker", "camera", "material", "material_slot",
-       "texture", "texture_slot", "bone", "edit_bone", "pose_bone", "particle_system", "particle_system_editable",
+       "texture", "texture_slot", "texture_user", "bone", "edit_bone",
+       "pose_bone", "particle_system", "particle_system_editable",
        "cloth", "soft_body", "fluid", "smoke", "collision", "brush", NULL};
 
 int buttons_context(const bContext *C, const char *member, bContextDataResult *result)
        "cloth", "soft_body", "fluid", "smoke", "collision", "brush", NULL};
 
 int buttons_context(const bContext *C, const char *member, bContextDataResult *result)
@@ -712,7 +746,17 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
                return 1;
        }
        else if(CTX_data_equals(member, "texture")) {
                return 1;
        }
        else if(CTX_data_equals(member, "texture")) {
-               set_pointer_type(path, result, &RNA_Texture);
+               ButsContextTexture *ct= sbuts->texuser;
+
+               if(ct) {
+                       /* new shading system */
+                       CTX_data_pointer_set(result, &ct->texture->id, &RNA_Texture, ct->texture);
+               }
+               else {
+                       /* old shading system */
+                       set_pointer_type(path, result, &RNA_Texture);
+               }
+
                return 1;
        }
        else if(CTX_data_equals(member, "material_slot")) {
                return 1;
        }
        else if(CTX_data_equals(member, "material_slot")) {
@@ -731,23 +775,52 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
 
                return 1;
        }
 
                return 1;
        }
-       else if(CTX_data_equals(member, "texture_node")) {
-               PointerRNA *ptr;
+       else if(CTX_data_equals(member, "texture_user")) {
+               ButsContextTexture *ct= sbuts->texuser;
 
 
-               if((ptr=get_pointer_type(path, &RNA_Material))) {
-                       Material *ma= ptr->data;
+               if(!ct)
+                       return 0; /* old shading system */
 
 
-                       if(ma) {
-                               bNode *node= give_current_material_texture_node(ma);
-                               CTX_data_pointer_set(result, &ma->id, &RNA_Node, node);
-                       }
+               if(ct->user && ct->user->ptr.data) {
+                       ButsTextureUser *user= ct->user; 
+                       CTX_data_pointer_set(result, user->ptr.id.data, user->ptr.type, user->ptr.data);
                }
 
                return 1;
        }
                }
 
                return 1;
        }
+       else if(CTX_data_equals(member, "texture_node")) {
+               ButsContextTexture *ct= sbuts->texuser;
+
+               if(ct) {
+                       /* new shading system */
+                       if(ct->user && ct->user->node)
+                               CTX_data_pointer_set(result, &ct->user->ntree->id, &RNA_Node, ct->user->node);
+
+                       return 1;
+               }
+               else {
+                       /* old shading system */
+                       PointerRNA *ptr;
+
+                       if((ptr=get_pointer_type(path, &RNA_Material))) {
+                               Material *ma= ptr->data;
+
+                               if(ma) {
+                                       bNode *node= give_current_material_texture_node(ma);
+                                       CTX_data_pointer_set(result, &ma->id, &RNA_Node, node);
+                               }
+                       }
+
+                       return 1;
+               }
+       }
        else if(CTX_data_equals(member, "texture_slot")) {
        else if(CTX_data_equals(member, "texture_slot")) {
+               ButsContextTexture *ct= sbuts->texuser;
                PointerRNA *ptr;
 
                PointerRNA *ptr;
 
+               if(ct)
+                       return 0; /* new shading system */
+
                if((ptr=get_pointer_type(path, &RNA_Material))) {
                        Material *ma= ptr->data;
 
                if((ptr=get_pointer_type(path, &RNA_Material))) {
                        Material *ma= ptr->data;