forked from bartvdbraak/blender
2.5
* Optimized RNA property lookups and path resolving, still can be much better, but now the 1000 IPO example on bf-taskforce25 runs at reasonable speed. * Also an optimization in the depsgraph when dealing with many objects, this was actually also a bottleneck here.
This commit is contained in:
parent
7349d775b0
commit
aa0aac706e
@ -36,6 +36,7 @@ struct Scene;
|
|||||||
struct DagNodeQueue;
|
struct DagNodeQueue;
|
||||||
struct DagForest;
|
struct DagForest;
|
||||||
struct DagNode;
|
struct DagNode;
|
||||||
|
struct GHash;
|
||||||
|
|
||||||
/* **** DAG relation types *** */
|
/* **** DAG relation types *** */
|
||||||
|
|
||||||
|
@ -65,6 +65,7 @@ typedef struct DagNode
|
|||||||
void * first_ancestor;
|
void * first_ancestor;
|
||||||
int ancestor_count;
|
int ancestor_count;
|
||||||
int lay; // accumulated layers of its relations + itself
|
int lay; // accumulated layers of its relations + itself
|
||||||
|
int scelay; // layers due to being in scene
|
||||||
int lasttime; // if lasttime != DagForest->time, this node was not evaluated yet for flushing
|
int lasttime; // if lasttime != DagForest->time, this node was not evaluated yet for flushing
|
||||||
int BFS_dist; // BFS distance
|
int BFS_dist; // BFS distance
|
||||||
int DFS_dist; // DFS distance
|
int DFS_dist; // DFS distance
|
||||||
@ -93,6 +94,7 @@ typedef struct DagNodeQueue
|
|||||||
typedef struct DagForest
|
typedef struct DagForest
|
||||||
{
|
{
|
||||||
ListBase DagNode;
|
ListBase DagNode;
|
||||||
|
struct GHash *nodeHash;
|
||||||
int numNodes;
|
int numNodes;
|
||||||
int is_acyclic;
|
int is_acyclic;
|
||||||
int time; // for flushing/tagging, compare with node->lasttime
|
int time; // for flushing/tagging, compare with node->lasttime
|
||||||
|
@ -61,6 +61,8 @@
|
|||||||
#include "DNA_view2d_types.h"
|
#include "DNA_view2d_types.h"
|
||||||
#include "DNA_view3d_types.h"
|
#include "DNA_view3d_types.h"
|
||||||
|
|
||||||
|
#include "BLI_ghash.h"
|
||||||
|
|
||||||
#include "BKE_action.h"
|
#include "BKE_action.h"
|
||||||
#include "BKE_effect.h"
|
#include "BKE_effect.h"
|
||||||
#include "BKE_global.h"
|
#include "BKE_global.h"
|
||||||
@ -754,6 +756,9 @@ void free_forest(DagForest *Dag)
|
|||||||
itN = itN->next;
|
itN = itN->next;
|
||||||
MEM_freeN(tempN);
|
MEM_freeN(tempN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BLI_ghash_free(Dag->nodeHash, NULL, NULL);
|
||||||
|
Dag->nodeHash= NULL;
|
||||||
Dag->DagNode.first = NULL;
|
Dag->DagNode.first = NULL;
|
||||||
Dag->DagNode.last = NULL;
|
Dag->DagNode.last = NULL;
|
||||||
Dag->numNodes = 0;
|
Dag->numNodes = 0;
|
||||||
@ -762,13 +767,9 @@ void free_forest(DagForest *Dag)
|
|||||||
|
|
||||||
DagNode * dag_find_node (DagForest *forest,void * fob)
|
DagNode * dag_find_node (DagForest *forest,void * fob)
|
||||||
{
|
{
|
||||||
DagNode *node = forest->DagNode.first;
|
if(forest->nodeHash)
|
||||||
|
return BLI_ghash_lookup(forest->nodeHash, fob);
|
||||||
while (node) {
|
|
||||||
if (node->ob == fob)
|
|
||||||
return node;
|
|
||||||
node = node->next;
|
|
||||||
}
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -794,7 +795,12 @@ DagNode * dag_add_node (DagForest *forest, void * fob)
|
|||||||
forest->DagNode.first = node;
|
forest->DagNode.first = node;
|
||||||
forest->numNodes = 1;
|
forest->numNodes = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!forest->nodeHash)
|
||||||
|
forest->nodeHash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
|
||||||
|
BLI_ghash_insert(forest->nodeHash, fob, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1805,17 +1811,10 @@ static void flush_update_node(DagNode *node, unsigned int layer, int curtime)
|
|||||||
/* node was checked to have lasttime != curtime , and is of type ID_OB */
|
/* node was checked to have lasttime != curtime , and is of type ID_OB */
|
||||||
static unsigned int flush_layer_node(Scene *sce, DagNode *node, int curtime)
|
static unsigned int flush_layer_node(Scene *sce, DagNode *node, int curtime)
|
||||||
{
|
{
|
||||||
Base *base;
|
|
||||||
DagAdjList *itA;
|
DagAdjList *itA;
|
||||||
|
|
||||||
node->lasttime= curtime;
|
node->lasttime= curtime;
|
||||||
node->lay= 0;
|
node->lay= node->scelay;
|
||||||
for(base= sce->base.first; base; base= base->next) {
|
|
||||||
if(node->ob == base->object) {
|
|
||||||
node->lay= ((Object *)node->ob)->lay;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(itA = node->child; itA; itA= itA->next) {
|
for(itA = node->child; itA; itA= itA->next) {
|
||||||
if(itA->node->type==ID_OB) {
|
if(itA->node->type==ID_OB) {
|
||||||
@ -1860,9 +1859,10 @@ static void flush_pointcache_reset(DagNode *node, int curtime, int reset)
|
|||||||
/* flushes all recalc flags in objects down the dependency tree */
|
/* flushes all recalc flags in objects down the dependency tree */
|
||||||
void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time)
|
void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time)
|
||||||
{
|
{
|
||||||
DagNode *firstnode;
|
DagNode *firstnode, *node;
|
||||||
DagAdjList *itA;
|
DagAdjList *itA;
|
||||||
Object *ob;
|
Object *ob;
|
||||||
|
Base *base;
|
||||||
int lasttime;
|
int lasttime;
|
||||||
|
|
||||||
if(sce->theDag==NULL) {
|
if(sce->theDag==NULL) {
|
||||||
@ -1879,6 +1879,15 @@ void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time)
|
|||||||
sce->theDag->time++; // so we know which nodes were accessed
|
sce->theDag->time++; // so we know which nodes were accessed
|
||||||
lasttime= sce->theDag->time;
|
lasttime= sce->theDag->time;
|
||||||
|
|
||||||
|
|
||||||
|
for(base= sce->base.first; base; base= base->next) {
|
||||||
|
node= dag_get_node(sce->theDag, base->object);
|
||||||
|
if(node)
|
||||||
|
node->scelay= base->object->lay;
|
||||||
|
else
|
||||||
|
node->scelay= 0;
|
||||||
|
}
|
||||||
|
|
||||||
for(itA = firstnode->child; itA; itA= itA->next)
|
for(itA = firstnode->child; itA; itA= itA->next)
|
||||||
if(itA->node->lasttime!=lasttime && itA->node->type==ID_OB)
|
if(itA->node->lasttime!=lasttime && itA->node->type==ID_OB)
|
||||||
flush_layer_node(sce, itA->node, lasttime);
|
flush_layer_node(sce, itA->node, lasttime);
|
||||||
|
@ -42,6 +42,8 @@ extern "C" {
|
|||||||
BlenderRNA *RNA_create(void);
|
BlenderRNA *RNA_create(void);
|
||||||
void RNA_define_free(BlenderRNA *brna);
|
void RNA_define_free(BlenderRNA *brna);
|
||||||
void RNA_free(BlenderRNA *brna);
|
void RNA_free(BlenderRNA *brna);
|
||||||
|
|
||||||
|
void RNA_init(void);
|
||||||
void RNA_exit(void);
|
void RNA_exit(void);
|
||||||
|
|
||||||
/* Struct */
|
/* Struct */
|
||||||
|
@ -1488,8 +1488,8 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
|
|||||||
if(nest != NULL) {
|
if(nest != NULL) {
|
||||||
len= strlen(nest);
|
len= strlen(nest);
|
||||||
|
|
||||||
strnest= MEM_mallocN(sizeof(char)*(len+1), "rna_generate_property -> strnest");
|
strnest= MEM_mallocN(sizeof(char)*(len+2), "rna_generate_property -> strnest");
|
||||||
errnest= MEM_mallocN(sizeof(char)*(len+1), "rna_generate_property -> errnest");
|
errnest= MEM_mallocN(sizeof(char)*(len+2), "rna_generate_property -> errnest");
|
||||||
|
|
||||||
strcpy(strnest, "_"); strcat(strnest, nest);
|
strcpy(strnest, "_"); strcat(strnest, nest);
|
||||||
strcpy(errnest, "."); strcat(errnest, nest);
|
strcpy(errnest, "."); strcat(errnest, nest);
|
||||||
@ -1713,6 +1713,8 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
|
|||||||
if(func->cont.prev) fprintf(f, "(FunctionRNA*)&rna_%s_%s_func,\n", srna->identifier, ((FunctionRNA*)func->cont.prev)->identifier);
|
if(func->cont.prev) fprintf(f, "(FunctionRNA*)&rna_%s_%s_func,\n", srna->identifier, ((FunctionRNA*)func->cont.prev)->identifier);
|
||||||
else fprintf(f, "NULL,\n");
|
else fprintf(f, "NULL,\n");
|
||||||
|
|
||||||
|
fprintf(f, "\tNULL,\n");
|
||||||
|
|
||||||
parm= func->cont.properties.first;
|
parm= func->cont.properties.first;
|
||||||
if(parm) fprintf(f, "\t{(PropertyRNA*)&rna_%s_%s_%s, ", srna->identifier, func->identifier, parm->identifier);
|
if(parm) fprintf(f, "\t{(PropertyRNA*)&rna_%s_%s_%s, ", srna->identifier, func->identifier, parm->identifier);
|
||||||
else fprintf(f, "\t{NULL, ");
|
else fprintf(f, "\t{NULL, ");
|
||||||
@ -1744,6 +1746,8 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
|
|||||||
if(srna->cont.prev) fprintf(f, "(ContainerRNA *)&RNA_%s,\n", ((StructRNA*)srna->cont.prev)->identifier);
|
if(srna->cont.prev) fprintf(f, "(ContainerRNA *)&RNA_%s,\n", ((StructRNA*)srna->cont.prev)->identifier);
|
||||||
else fprintf(f, "NULL,\n");
|
else fprintf(f, "NULL,\n");
|
||||||
|
|
||||||
|
fprintf(f, "\tNULL,\n");
|
||||||
|
|
||||||
prop= srna->cont.properties.first;
|
prop= srna->cont.properties.first;
|
||||||
if(prop) fprintf(f, "\t{(PropertyRNA*)&rna_%s_%s, ", srna->identifier, prop->identifier);
|
if(prop) fprintf(f, "\t{(PropertyRNA*)&rna_%s_%s, ", srna->identifier, prop->identifier);
|
||||||
else fprintf(f, "\t{NULL, ");
|
else fprintf(f, "\t{NULL, ");
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "BLI_blenlib.h"
|
#include "BLI_blenlib.h"
|
||||||
#include "BLI_dynstr.h"
|
#include "BLI_dynstr.h"
|
||||||
|
#include "BLI_ghash.h"
|
||||||
|
|
||||||
#include "BKE_context.h"
|
#include "BKE_context.h"
|
||||||
#include "BKE_idprop.h"
|
#include "BKE_idprop.h"
|
||||||
@ -46,10 +47,35 @@
|
|||||||
|
|
||||||
#include "rna_internal.h"
|
#include "rna_internal.h"
|
||||||
|
|
||||||
/* Exit */
|
/* Init/Exit */
|
||||||
|
|
||||||
|
void RNA_init()
|
||||||
|
{
|
||||||
|
StructRNA *srna;
|
||||||
|
PropertyRNA *prop;
|
||||||
|
|
||||||
|
for(srna=BLENDER_RNA.structs.first; srna; srna=srna->cont.next) {
|
||||||
|
if(!srna->cont.prophash) {
|
||||||
|
srna->cont.prophash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
|
||||||
|
|
||||||
|
for(prop=srna->cont.properties.first; prop; prop=prop->next)
|
||||||
|
if(!(prop->flag & PROP_BUILTIN))
|
||||||
|
BLI_ghash_insert(srna->cont.prophash, (void*)prop->identifier, prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RNA_exit()
|
void RNA_exit()
|
||||||
{
|
{
|
||||||
|
StructRNA *srna;
|
||||||
|
|
||||||
|
for(srna=BLENDER_RNA.structs.first; srna; srna=srna->cont.next) {
|
||||||
|
if(srna->cont.prophash) {
|
||||||
|
BLI_ghash_free(srna->cont.prophash, NULL, NULL);
|
||||||
|
srna->cont.prophash= NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RNA_free(&BLENDER_RNA);
|
RNA_free(&BLENDER_RNA);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -388,24 +414,13 @@ int RNA_struct_is_a(StructRNA *type, StructRNA *srna)
|
|||||||
|
|
||||||
PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
|
PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
|
||||||
{
|
{
|
||||||
CollectionPropertyIterator iter;
|
PropertyRNA *iterprop= RNA_struct_iterator_property(ptr->type);
|
||||||
PropertyRNA *iterprop, *prop;
|
PointerRNA propptr;
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
iterprop= RNA_struct_iterator_property(ptr->type);
|
if(RNA_property_collection_lookup_string(ptr, iterprop, identifier, &propptr))
|
||||||
RNA_property_collection_begin(ptr, iterprop, &iter);
|
return propptr.data;
|
||||||
prop= NULL;
|
|
||||||
|
return NULL;
|
||||||
for(; iter.valid; RNA_property_collection_next(&iter), i++) {
|
|
||||||
if(strcmp(identifier, RNA_property_identifier(iter.ptr.data)) == 0) {
|
|
||||||
prop= iter.ptr.data;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RNA_property_collection_end(&iter);
|
|
||||||
|
|
||||||
return prop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the property which uses the given nested struct */
|
/* Find the property which uses the given nested struct */
|
||||||
@ -1643,12 +1658,18 @@ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int
|
|||||||
buf= MEM_callocN(sizeof(char)*(len+1), "rna_path_token");
|
buf= MEM_callocN(sizeof(char)*(len+1), "rna_path_token");
|
||||||
|
|
||||||
/* copy string, taking into account escaped ] */
|
/* copy string, taking into account escaped ] */
|
||||||
for(p=*path, i=0, j=0; i<len; i++, p++) {
|
if(bracket) {
|
||||||
if(*p == '\\' && *(p+1) == ']');
|
for(p=*path, i=0, j=0; i<len; i++, p++) {
|
||||||
else buf[j++]= *p;
|
if(*p == '\\' && *(p+1) == ']');
|
||||||
}
|
else buf[j++]= *p;
|
||||||
|
}
|
||||||
|
|
||||||
buf[j]= 0;
|
buf[j]= 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
memcpy(buf, *path, sizeof(char)*len);
|
||||||
|
buf[len]= '\0';
|
||||||
|
}
|
||||||
|
|
||||||
/* set path to start of next token */
|
/* set path to start of next token */
|
||||||
if(*p == ']') p++;
|
if(*p == ']') p++;
|
||||||
@ -1660,8 +1681,7 @@ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int
|
|||||||
|
|
||||||
int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
|
int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
|
||||||
{
|
{
|
||||||
CollectionPropertyIterator iter;
|
PropertyRNA *prop;
|
||||||
PropertyRNA *prop, *iterprop;
|
|
||||||
PointerRNA curptr, nextptr;
|
PointerRNA curptr, nextptr;
|
||||||
char fixedbuf[256], *token;
|
char fixedbuf[256], *token;
|
||||||
int len, intkey;
|
int len, intkey;
|
||||||
@ -1676,18 +1696,7 @@ int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, Prope
|
|||||||
if(!token)
|
if(!token)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
iterprop= RNA_struct_iterator_property(curptr.type);
|
prop= RNA_struct_find_property(&curptr, token);
|
||||||
RNA_property_collection_begin(&curptr, iterprop, &iter);
|
|
||||||
prop= NULL;
|
|
||||||
|
|
||||||
for(; iter.valid; RNA_property_collection_next(&iter)) {
|
|
||||||
if(strcmp(token, RNA_property_identifier(iter.ptr.data)) == 0) {
|
|
||||||
prop= iter.ptr.data;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RNA_property_collection_end(&iter);
|
|
||||||
|
|
||||||
if(token != fixedbuf)
|
if(token != fixedbuf)
|
||||||
MEM_freeN(token);
|
MEM_freeN(token);
|
||||||
|
@ -38,6 +38,8 @@
|
|||||||
#include "RNA_define.h"
|
#include "RNA_define.h"
|
||||||
#include "RNA_types.h"
|
#include "RNA_types.h"
|
||||||
|
|
||||||
|
#include "BLI_ghash.h"
|
||||||
|
|
||||||
#include "rna_internal.h"
|
#include "rna_internal.h"
|
||||||
|
|
||||||
/* Global used during defining */
|
/* Global used during defining */
|
||||||
@ -557,6 +559,7 @@ StructRNA *RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *
|
|||||||
/* copy from struct to derive stuff, a bit clumsy since we can't
|
/* copy from struct to derive stuff, a bit clumsy since we can't
|
||||||
* use MEM_dupallocN, data structs may not be alloced but builtin */
|
* use MEM_dupallocN, data structs may not be alloced but builtin */
|
||||||
memcpy(srna, srnafrom, sizeof(StructRNA));
|
memcpy(srna, srnafrom, sizeof(StructRNA));
|
||||||
|
srna->cont.prophash= NULL;
|
||||||
srna->cont.properties.first= srna->cont.properties.last= NULL;
|
srna->cont.properties.first= srna->cont.properties.last= NULL;
|
||||||
srna->functions.first= srna->functions.last= NULL;
|
srna->functions.first= srna->functions.last= NULL;
|
||||||
srna->py_type= NULL;
|
srna->py_type= NULL;
|
||||||
@ -604,7 +607,7 @@ StructRNA *RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *
|
|||||||
|
|
||||||
if(DefRNA.preprocess) {
|
if(DefRNA.preprocess) {
|
||||||
RNA_def_property_struct_type(prop, "Property");
|
RNA_def_property_struct_type(prop, "Property");
|
||||||
RNA_def_property_collection_funcs(prop, "rna_builtin_properties_begin", "rna_builtin_properties_next", "rna_iterator_listbase_end", "rna_builtin_properties_get", 0, 0, 0, 0, 0);
|
RNA_def_property_collection_funcs(prop, "rna_builtin_properties_begin", "rna_builtin_properties_next", "rna_iterator_listbase_end", "rna_builtin_properties_get", 0, 0, "rna_builtin_properties_lookup_string", 0, 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#ifdef RNA_RUNTIME
|
#ifdef RNA_RUNTIME
|
||||||
@ -923,8 +926,13 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
prop->flag |= PROP_IDPROPERTY|PROP_RUNTIME;
|
prop->flag |= PROP_IDPROPERTY|PROP_RUNTIME;
|
||||||
|
#ifdef RNA_RUNTIME
|
||||||
|
if(cont->prophash)
|
||||||
|
BLI_ghash_insert(cont->prophash, (void*)prop->identifier, prop);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
rna_addtail(&cont->properties, prop);
|
rna_addtail(&cont->properties, prop);
|
||||||
|
|
||||||
|
@ -217,6 +217,7 @@ void rna_builtin_properties_begin(struct CollectionPropertyIterator *iter, struc
|
|||||||
void rna_builtin_properties_next(struct CollectionPropertyIterator *iter);
|
void rna_builtin_properties_next(struct CollectionPropertyIterator *iter);
|
||||||
PointerRNA rna_builtin_properties_get(struct CollectionPropertyIterator *iter);
|
PointerRNA rna_builtin_properties_get(struct CollectionPropertyIterator *iter);
|
||||||
PointerRNA rna_builtin_type_get(struct PointerRNA *ptr);
|
PointerRNA rna_builtin_type_get(struct PointerRNA *ptr);
|
||||||
|
PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key);
|
||||||
|
|
||||||
/* Iterators */
|
/* Iterators */
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ struct ReportList;
|
|||||||
struct CollectionPropertyIterator;
|
struct CollectionPropertyIterator;
|
||||||
struct bContext;
|
struct bContext;
|
||||||
struct IDProperty;
|
struct IDProperty;
|
||||||
|
struct GHash;
|
||||||
|
|
||||||
#define RNA_MAX_ARRAY 32
|
#define RNA_MAX_ARRAY 32
|
||||||
|
|
||||||
@ -83,6 +84,7 @@ typedef PointerRNA (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, con
|
|||||||
typedef struct ContainerRNA {
|
typedef struct ContainerRNA {
|
||||||
void *next, *prev;
|
void *next, *prev;
|
||||||
|
|
||||||
|
struct GHash *prophash;
|
||||||
ListBase properties;
|
ListBase properties;
|
||||||
} ContainerRNA;
|
} ContainerRNA;
|
||||||
|
|
||||||
|
@ -34,6 +34,8 @@
|
|||||||
|
|
||||||
#ifdef RNA_RUNTIME
|
#ifdef RNA_RUNTIME
|
||||||
|
|
||||||
|
#include "BLI_ghash.h"
|
||||||
|
|
||||||
/* Struct */
|
/* Struct */
|
||||||
|
|
||||||
static void rna_Struct_identifier_get(PointerRNA *ptr, char *value)
|
static void rna_Struct_identifier_get(PointerRNA *ptr, char *value)
|
||||||
@ -277,6 +279,51 @@ PointerRNA rna_builtin_properties_get(CollectionPropertyIterator *iter)
|
|||||||
return rna_Struct_properties_get(iter);
|
return rna_Struct_properties_get(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key)
|
||||||
|
{
|
||||||
|
StructRNA *srna;
|
||||||
|
PropertyRNA *prop;
|
||||||
|
IDProperty *group, *idp;
|
||||||
|
PointerRNA propptr;
|
||||||
|
|
||||||
|
memset(&propptr, 0, sizeof(propptr));
|
||||||
|
srna= ptr->type;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if(srna->cont.prophash) {
|
||||||
|
prop= BLI_ghash_lookup(srna->cont.prophash, (void*)key);
|
||||||
|
|
||||||
|
if(prop) {
|
||||||
|
propptr.type= &RNA_Property;
|
||||||
|
propptr.data= prop;
|
||||||
|
return propptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(prop=srna->cont.properties.first; prop; prop=prop->next) {
|
||||||
|
if(!(prop->flag & PROP_BUILTIN) && strcmp(prop->identifier, key)==0) {
|
||||||
|
propptr.type= &RNA_Property;
|
||||||
|
propptr.data= prop;
|
||||||
|
return propptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while((srna=srna->base));
|
||||||
|
|
||||||
|
group= RNA_struct_idproperties(ptr, 0);
|
||||||
|
|
||||||
|
if(group) {
|
||||||
|
for(idp=group->data.group.first; idp; idp=idp->next) {
|
||||||
|
if(strcmp(idp->name, key) == 0) {
|
||||||
|
propptr.type= &RNA_Property;
|
||||||
|
propptr.data= idp;
|
||||||
|
return propptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return propptr;
|
||||||
|
}
|
||||||
|
|
||||||
PointerRNA rna_builtin_type_get(PointerRNA *ptr)
|
PointerRNA rna_builtin_type_get(PointerRNA *ptr)
|
||||||
{
|
{
|
||||||
return rna_pointer_inherit_refine(ptr, &RNA_Struct, ptr->type);
|
return rna_pointer_inherit_refine(ptr, &RNA_Struct, ptr->type);
|
||||||
|
@ -77,6 +77,8 @@
|
|||||||
|
|
||||||
#include "WM_api.h"
|
#include "WM_api.h"
|
||||||
|
|
||||||
|
#include "RNA_define.h"
|
||||||
|
|
||||||
#include "GPU_draw.h"
|
#include "GPU_draw.h"
|
||||||
#include "GPU_extensions.h"
|
#include "GPU_extensions.h"
|
||||||
|
|
||||||
@ -310,11 +312,13 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
BLI_where_am_i(bprogname, argv[0]);
|
BLI_where_am_i(bprogname, argv[0]);
|
||||||
|
|
||||||
|
RNA_init();
|
||||||
|
|
||||||
/* Hack - force inclusion of the plugin api functions,
|
/* Hack - force inclusion of the plugin api functions,
|
||||||
* see blenpluginapi:pluginapi.c
|
* see blenpluginapi:pluginapi.c
|
||||||
*/
|
*/
|
||||||
pluginapi_force_ref();
|
pluginapi_force_ref();
|
||||||
|
|
||||||
init_nodesystem();
|
init_nodesystem();
|
||||||
|
|
||||||
initglobals(); /* blender.c */
|
initglobals(); /* blender.c */
|
||||||
|
@ -51,6 +51,7 @@ SET(INC
|
|||||||
../../../../source/blender
|
../../../../source/blender
|
||||||
../../../../source/blender/include
|
../../../../source/blender/include
|
||||||
../../../../source/blender/makesdna
|
../../../../source/blender/makesdna
|
||||||
|
../../../../source/blender/makesrna
|
||||||
../../../../source/gameengine/Rasterizer
|
../../../../source/gameengine/Rasterizer
|
||||||
../../../../source/gameengine/GameLogic
|
../../../../source/gameengine/GameLogic
|
||||||
../../../../source/gameengine/Expressions
|
../../../../source/gameengine/Expressions
|
||||||
|
@ -86,6 +86,8 @@ extern "C"
|
|||||||
#include "BKE_main.h"
|
#include "BKE_main.h"
|
||||||
#include "BKE_utildefines.h"
|
#include "BKE_utildefines.h"
|
||||||
|
|
||||||
|
#include "RNA_define.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#ifdef NDEBUG
|
#ifdef NDEBUG
|
||||||
@ -344,6 +346,8 @@ int main(int argc, char** argv)
|
|||||||
*/
|
*/
|
||||||
#endif // __APPLE__
|
#endif // __APPLE__
|
||||||
|
|
||||||
|
RNA_init();
|
||||||
|
|
||||||
init_nodesystem();
|
init_nodesystem();
|
||||||
|
|
||||||
initglobals();
|
initglobals();
|
||||||
|
@ -68,6 +68,7 @@ CPPFLAGS += -I../../../blender/blenlib
|
|||||||
CPPFLAGS += -I../../../blender/blenloader
|
CPPFLAGS += -I../../../blender/blenloader
|
||||||
CPPFLAGS += -I../../../blender/imbuf
|
CPPFLAGS += -I../../../blender/imbuf
|
||||||
CPPFLAGS += -I../../../blender/makesdna
|
CPPFLAGS += -I../../../blender/makesdna
|
||||||
|
CPPFLAGS += -I../../../blender/makesrna
|
||||||
CPPFLAGS += -I../../../blender/readblenfile
|
CPPFLAGS += -I../../../blender/readblenfile
|
||||||
CPPFLAGS += -I../../../blender/gpu
|
CPPFLAGS += -I../../../blender/gpu
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ incs = ['.',
|
|||||||
'#source/blender',
|
'#source/blender',
|
||||||
'#source/blender/include',
|
'#source/blender/include',
|
||||||
'#source/blender/makesdna',
|
'#source/blender/makesdna',
|
||||||
|
'#source/blender/makesrna',
|
||||||
'#source/gameengine/BlenderRoutines',
|
'#source/gameengine/BlenderRoutines',
|
||||||
'#source/gameengine/Rasterizer',
|
'#source/gameengine/Rasterizer',
|
||||||
'#source/gameengine/GameLogic',
|
'#source/gameengine/GameLogic',
|
||||||
|
Loading…
Reference in New Issue
Block a user