static void material_changed(Main *bmain, Material *ma) { Material *parent; Object *ob; Scene *scene; int texture_draw = false; /* icons */ BKE_icon_changed(BKE_icon_id_ensure(&ma->id)); /* glsl */ if (ma->gpumaterial.first) GPU_material_free(&ma->gpumaterial); /* 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)) { /* pass */ } else { continue; } BKE_icon_changed(BKE_icon_id_ensure(&parent->id)); if (parent->gpumaterial.first) GPU_material_free(&parent->gpumaterial); } /* find if we have a scene with textured display */ for (scene = bmain->scene.first; scene; scene = scene->id.next) { if (scene->customdata_mask & CD_MASK_MTFACE) { texture_draw = true; break; } } /* find textured objects */ if (texture_draw) { for (ob = bmain->object.first; ob; ob = ob->id.next) { DerivedMesh *dm = ob->derivedFinal; Material ***material = give_matarar(ob); short a, *totmaterial = give_totcolp(ob); if (dm && totmaterial && material) { for (a = 0; a < *totmaterial; a++) { if ((*material)[a] == ma) { GPU_drawobject_free(dm); break; } } } } } }
static void image_changed(Main *bmain, Image *ima) { Tex *tex; /* icons */ BKE_icon_changed(BKE_icon_id_ensure(&ima->id)); /* textures */ for (tex = bmain->tex.first; tex; tex = tex->id.next) if (tex->ima == ima) texture_changed(bmain, tex); }
static int ui_id_brush_get_icon(const bContext *C, ID *id) { Brush *br = (Brush *)id; if (br->flag & BRUSH_CUSTOM_ICON) { BKE_icon_id_ensure(id); ui_id_brush_render(C, id); } else { Object *ob = CTX_data_active_object(C); SpaceImage *sima; EnumPropertyItem *items = NULL; int tool, mode = 0; /* XXX: this is not nice, should probably make brushes * be strictly in one paint mode only to avoid * checking various context stuff here */ if (CTX_wm_view3d(C) && ob) { if (ob->mode & OB_MODE_SCULPT) mode = OB_MODE_SCULPT; else if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) mode = OB_MODE_VERTEX_PAINT; else if (ob->mode & OB_MODE_TEXTURE_PAINT) mode = OB_MODE_TEXTURE_PAINT; } else if ((sima = CTX_wm_space_image(C)) && (sima->mode == SI_MODE_PAINT)) { mode = OB_MODE_TEXTURE_PAINT; } /* reset the icon */ if (mode == OB_MODE_SCULPT) { items = brush_sculpt_tool_items; tool = br->sculpt_tool; } else if (mode == OB_MODE_VERTEX_PAINT) { items = brush_vertex_tool_items; tool = br->vertexpaint_tool; } else if (mode == OB_MODE_TEXTURE_PAINT) { items = brush_image_tool_items; tool = br->imagepaint_tool; } if (!items || !RNA_enum_icon_from_value(items, tool, &id->icon_id)) id->icon_id = 0; } return id->icon_id; }
ImBuf *get_brush_icon(Brush *brush) { static const int flags = IB_rect | IB_multilayer | IB_metadata; char path[FILE_MAX]; const char *folder; if (!(brush->icon_imbuf)) { if (brush->flag & BRUSH_CUSTOM_ICON) { if (brush->icon_filepath[0]) { // first use the path directly to try and load the file BLI_strncpy(path, brush->icon_filepath, sizeof(brush->icon_filepath)); BLI_path_abs(path, BKE_main_blendfile_path_from_global()); /* use default colorspaces for brushes */ brush->icon_imbuf = IMB_loadiffname(path, flags, NULL); // otherwise lets try to find it in other directories if (!(brush->icon_imbuf)) { folder = BKE_appdir_folder_id(BLENDER_DATAFILES, "brushicons"); BLI_make_file_string( BKE_main_blendfile_path_from_global(), path, folder, brush->icon_filepath); if (path[0]) { /* use fefault color spaces */ brush->icon_imbuf = IMB_loadiffname(path, flags, NULL); } } if (brush->icon_imbuf) { BKE_icon_changed(BKE_icon_id_ensure(&brush->id)); } } } } if (!(brush->icon_imbuf)) { brush->id.icon_id = 0; } return brush->icon_imbuf; }
static void world_changed(Main *bmain, World *wo) { Material *ma; /* icons */ BKE_icon_changed(BKE_icon_id_ensure(&wo->id)); /* glsl */ for (ma = bmain->mat.first; ma; ma = ma->id.next) if (ma->gpumaterial.first) GPU_material_free(&ma->gpumaterial); if (defmaterial.gpumaterial.first) GPU_material_free(&defmaterial.gpumaterial); if (wo->gpumaterial.first) GPU_material_free(&wo->gpumaterial); }
static void lamp_changed(Main *bmain, Lamp *la) { Object *ob; Material *ma; /* icons */ BKE_icon_changed(BKE_icon_id_ensure(&la->id)); /* glsl */ for (ob = bmain->object.first; ob; ob = ob->id.next) if (ob->data == la && ob->gpulamp.first) GPU_lamp_free(ob); for (ma = bmain->mat.first; ma; ma = ma->id.next) if (ma->gpumaterial.first) GPU_material_free(&ma->gpumaterial); if (defmaterial.gpumaterial.first) GPU_material_free(&defmaterial.gpumaterial); }
int ui_id_icon_get(const bContext *C, ID *id, const bool big) { int iconid = 0; /* icon */ switch (GS(id->name)) { case ID_BR: iconid = ui_id_brush_get_icon(C, id); break; case ID_MA: /* fall through */ case ID_TE: /* fall through */ case ID_IM: /* fall through */ case ID_WO: /* fall through */ case ID_LA: /* fall through */ iconid = BKE_icon_id_ensure(id); /* checks if not exists, or changed */ UI_id_icon_render(C, NULL, id, big, true); break; default: break; } return iconid; }
static void texture_changed(Main *bmain, Tex *tex) { Material *ma; Lamp *la; World *wo; Scene *scene; Object *ob; bNode *node; bool texture_draw = false; /* icons */ BKE_icon_changed(BKE_icon_id_ensure(&tex->id)); /* paint overlays */ for (scene = bmain->scene.first; scene; scene = scene->id.next) BKE_paint_invalidate_overlay_tex(scene, tex); /* find materials */ for (ma = bmain->mat.first; ma; ma = ma->id.next) { if (!material_uses_texture(ma, tex)) continue; BKE_icon_changed(BKE_icon_id_ensure(&ma->id)); if (ma->gpumaterial.first) GPU_material_free(&ma->gpumaterial); } /* find lamps */ for (la = bmain->lamp.first; la; la = la->id.next) { if (mtex_use_tex(la->mtex, MAX_MTEX, tex)) { lamp_changed(bmain, la); } else if (la->nodetree && nodes_use_tex(la->nodetree, tex)) { lamp_changed(bmain, la); } else { continue; } } /* find worlds */ for (wo = bmain->world.first; wo; wo = wo->id.next) { if (mtex_use_tex(wo->mtex, MAX_MTEX, tex)) { /* pass */ } else if (wo->nodetree && nodes_use_tex(wo->nodetree, tex)) { /* pass */ } else { continue; } BKE_icon_changed(BKE_icon_id_ensure(&wo->id)); if (wo->gpumaterial.first) GPU_material_free(&wo->gpumaterial); } /* find compositing nodes */ for (scene = bmain->scene.first; scene; scene = scene->id.next) { if (scene->use_nodes && scene->nodetree) { for (node = scene->nodetree->nodes.first; node; node = node->next) { if (node->id == &tex->id) ED_node_tag_update_id(&scene->id); } } if (scene->customdata_mask & CD_MASK_MTFACE) texture_draw = true; } /* find textured objects */ if (texture_draw) { for (ob = bmain->object.first; ob; ob = ob->id.next) { DerivedMesh *dm = ob->derivedFinal; Material ***material = give_matarar(ob); short a, *totmaterial = give_totcolp(ob); if (dm && totmaterial && material) { for (a = 0; a < *totmaterial; a++) { if (ob->matbits && ob->matbits[a]) ma = ob->mat[a]; else ma = (*material)[a]; if (ma && material_uses_texture(ma, tex)) { GPU_drawobject_free(dm); break; } } } } } }