void ED_render_id_flush_update(Main *bmain, ID *id) { /* this can be called from render or baking thread when a python script makes * changes, in that case we don't want to do any editor updates, and making * GPU changes is not possible because OpenGL only works in the main thread */ if (!BLI_thread_is_main()) return; switch (GS(id->name)) { case ID_MA: material_changed(bmain, (Material *)id); render_engine_flag_changed(bmain, RE_ENGINE_UPDATE_MA); break; case ID_TE: texture_changed(bmain, (Tex *)id); break; case ID_WO: world_changed(bmain, (World *)id); break; case ID_LA: lamp_changed(bmain, (Lamp *)id); break; case ID_IM: image_changed(bmain, (Image *)id); break; case ID_SCE: scene_changed(bmain, (Scene *)id); render_engine_flag_changed(bmain, RE_ENGINE_UPDATE_OTHER); break; default: render_engine_flag_changed(bmain, RE_ENGINE_UPDATE_OTHER); break; } }
void ED_render_id_flush_update(Main *bmain, ID *id) { switch (GS(id->name)) { case ID_MA: material_changed(bmain, (Material *)id); break; case ID_TE: texture_changed(bmain, (Tex *)id); break; case ID_WO: world_changed(bmain, (World *)id); break; case ID_LA: lamp_changed(bmain, (Lamp *)id); break; case ID_IM: image_changed(bmain, (Image *)id); break; case ID_SCE: scene_changed(bmain, (Scene *)id); break; default: break; } }
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; } } } } } }