Changeset View
Changeset View
Standalone View
Standalone View
source/blender/makesrna/intern/rna_access.c
| Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | for (srna = BLENDER_RNA.structs.first; srna; srna = srna->cont.next) { | ||||
| BLENDER_RNA.structs_len += 1; | BLENDER_RNA.structs_len += 1; | ||||
| } | } | ||||
| } | } | ||||
| void RNA_exit(void) | void RNA_exit(void) | ||||
| { | { | ||||
| StructRNA *srna; | StructRNA *srna; | ||||
| RNA_property_update_cache_free(); | |||||
| for (srna = BLENDER_RNA.structs.first; srna; srna = srna->cont.next) { | for (srna = BLENDER_RNA.structs.first; srna; srna = srna->cont.next) { | ||||
| if (srna->cont.prophash) { | if (srna->cont.prophash) { | ||||
| BLI_ghash_free(srna->cont.prophash, NULL, NULL); | BLI_ghash_free(srna->cont.prophash, NULL, NULL); | ||||
| srna->cont.prophash = NULL; | srna->cont.prophash = NULL; | ||||
| } | } | ||||
| } | } | ||||
| RNA_free(&BLENDER_RNA); | RNA_free(&BLENDER_RNA); | ||||
| ▲ Show 20 Lines • Show All 2,192 Lines • ▼ Show 20 Lines | void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop) | ||||
| rna_property_update(C, CTX_data_main(C), CTX_data_scene(C), ptr, prop); | rna_property_update(C, CTX_data_main(C), CTX_data_scene(C), ptr, prop); | ||||
| } | } | ||||
| void RNA_property_update_main(Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop) | void RNA_property_update_main(Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop) | ||||
| { | { | ||||
| rna_property_update(NULL, bmain, scene, ptr, prop); | rna_property_update(NULL, bmain, scene, ptr, prop); | ||||
| } | } | ||||
| /* RNA Updates Cache ------------------------ */ | |||||
| /* Overview of RNA Update cache system: | |||||
| * | |||||
| * RNA Update calls need to be cached in order to maintain reasonable performance | |||||
| * of the animation system (i.e. maintaining a somewhat interactive framerate) | |||||
| * while still allowing updates to be called (necessary in particular for modifier | |||||
| * property updates to actually work). | |||||
| * | |||||
| * The cache is structured with a dual-layer structure | |||||
| * - L1 = PointerRNA used as key; owner_id is used (it should always be defined, | |||||
| * and most updates end up using just that anyways) | |||||
| * - L2 = Update functions to be called on those PointerRNA's | |||||
| */ | |||||
| /* cache element */ | |||||
| typedef struct tRnaUpdateCacheElem { | |||||
| struct tRnaUpdateCacheElem *next, *prev; | |||||
| PointerRNA ptr; /* L1 key - id as primary, data secondary/ignored? */ | |||||
| ListBase L2Funcs; /* L2 functions (LinkData<RnaUpdateFuncRef>) */ | |||||
| } tRnaUpdateCacheElem; | |||||
| /* cache global (tRnaUpdateCacheElem's) - only accessible using these API calls */ | |||||
| static ListBase rna_updates_cache = {NULL, NULL}; | |||||
| /* ........................... */ | |||||
| void RNA_property_update_cache_add(PointerRNA *ptr, PropertyRNA *prop) | |||||
| { | |||||
| const bool is_rna = (prop->magic == RNA_MAGIC); | |||||
| tRnaUpdateCacheElem *uce = NULL; | |||||
| UpdateFunc fn = NULL; | |||||
| LinkData *ld; | |||||
| /* sanity check */ | |||||
| if (NULL == ptr) { | |||||
| return; | |||||
| } | |||||
| prop = rna_ensure_property(prop); | |||||
| /* we can only handle update calls with no context args for now (makes animsys updates easier) */ | |||||
| if ((is_rna == false) || (prop->update == NULL) || (prop->flag & PROP_CONTEXT_UPDATE)) { | |||||
| return; | |||||
| } | |||||
| fn = prop->update; | |||||
| /* find cache element for which key matches... */ | |||||
| for (uce = rna_updates_cache.first; uce; uce = uce->next) { | |||||
| /* Just match by id only for now, | |||||
| * since most update calls that we'll encounter only really care about this. */ | |||||
| /* TODO: later, the cache might need to have some nesting on L1 to cope better | |||||
| * with these problems + some tagging to indicate we need this */ | |||||
| if (uce->ptr.owner_id == ptr->owner_id) { | |||||
| break; | |||||
| } | |||||
| } | |||||
| if (uce == NULL) { | |||||
| /* create new instance */ | |||||
| uce = MEM_callocN(sizeof(tRnaUpdateCacheElem), "tRnaUpdateCacheElem"); | |||||
| BLI_addtail(&rna_updates_cache, uce); | |||||
| /* copy pointer */ | |||||
| RNA_pointer_create(ptr->owner_id, ptr->type, ptr->data, &uce->ptr); | |||||
| } | |||||
| /* check on the update func */ | |||||
| for (ld = uce->L2Funcs.first; ld; ld = ld->next) { | |||||
| /* stop on match - function already cached */ | |||||
| if (fn == ld->data) { | |||||
| return; | |||||
| } | |||||
| } | |||||
| /* else... if still here, we need to add it */ | |||||
| BLI_addtail(&uce->L2Funcs, BLI_genericNodeN(fn)); | |||||
| } | |||||
| void RNA_property_update_cache_flush(Main *bmain, Scene *scene) | |||||
| { | |||||
| tRnaUpdateCacheElem *uce; | |||||
| /* TODO: should we check that bmain and scene are valid? The above stuff doesn't! */ | |||||
| /* execute the cached updates */ | |||||
| for (uce = rna_updates_cache.first; uce; uce = uce->next) { | |||||
| LinkData *ld; | |||||
| for (ld = uce->L2Funcs.first; ld; ld = ld->next) { | |||||
| UpdateFunc fn = (UpdateFunc)ld->data; | |||||
| fn(bmain, scene, &uce->ptr); | |||||
| } | |||||
| } | |||||
| } | |||||
| void RNA_property_update_cache_free(void) | |||||
| { | |||||
| tRnaUpdateCacheElem *uce, *ucn; | |||||
| for (uce = rna_updates_cache.first; uce; uce = ucn) { | |||||
| ucn = uce->next; | |||||
| /* free L2 cache */ | |||||
| BLI_freelistN(&uce->L2Funcs); | |||||
| /* remove self */ | |||||
| BLI_freelinkN(&rna_updates_cache, uce); | |||||
| } | |||||
| } | |||||
| /* ---------------------------------------------------------------------- */ | /* ---------------------------------------------------------------------- */ | ||||
| /* Property Data */ | /* Property Data */ | ||||
| bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop) | bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop) | ||||
| { | { | ||||
| BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; | BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; | ||||
| IDProperty *idprop; | IDProperty *idprop; | ||||
| ▲ Show 20 Lines • Show All 5,833 Lines • Show Last 20 Lines | |||||