rendered paste bodyvoid node_script_parse_cb(struct bNodeTree *ntree, struct bNode *node)
{printf("node_script_parse_cb\n");
BPy_Node *pynode= NULL;
BPy_ShadeInput *myshi = NULL;
PyObject *outputdef= NULL;
PyObject *inputdef= NULL;
PyObject *key= NULL;
PyObject *value= NULL;
PyObject *testinst= NULL;
PyObject *args= NULL;
int pos = 0;
NodeScriptDict *nsd;
void *shi; /* for BPy_ShadeInput *shi */
void *node1; /* for BPy_Node *node */
PyObject *pyresult = NULL;
Text *txt = 0;
char *buf;
if(! node->id) {
return;
}
if(node->custom1!=SH_NODE_SCRIPT_READY) {
txt = (Text *)node->id;
//nsd = (NodeScriptDict *)node->storage;
PyObject *dict=init_scriptdict();
buf = txt_to_buf( txt );
pyresult = PyRun_String(buf, Py_file_input, dict, dict);
MEM_freeN(buf);
if(!pyresult) {
if(PyErr_Occurred()) {
PyErr_Print();
}
Py_XDECREF(pyresult);
return;
}
Py_DECREF(pyresult);
//PyObject_Del(pyresult);
myshi=(BPy_ShadeInput *)ShadeInput_CreatePyObject(NULL);
while(PyDict_Next( dict, &pos, &key, &value) ) {
if(PyObject_TypeCheck(value, &PyType_Type)) {
pynode = (BPy_Node *)Node_CreatePyObject(node);
outputdef= Node_CreateOutputDefMap(pynode);
inputdef= Node_CreateInputDefMap(pynode);
args= Py_BuildValue("(NN)", inputdef, outputdef);
testinst= PyObject_Call(value, args, NULL);
if(testinst && PyObject_TypeCheck(testinst, &Node_Type)==1) {
node1= testinst;
nsd->node=node1;
nsd->shi= myshi;
nsd->dict=dict;
free_scriptdict((PyObject *)(nsd->dict));
node->typeinfo->execfunc= node_script_exec;
if(node->custom1== SH_NODE_SCRIPT_NEW) {
node->typeinfo->pynode= testinst;
node->typeinfo->id= node->id;
nodeRegisterType(ntree, node->typeinfo);
node->custom1= SH_NODE_SCRIPT_CREATED;
} else if(node->custom1== SH_NODE_SCRIPT_REPARSE) {
node->typeinfo->pynode= testinst;
node->typeinfo->id= node->id;
ntreeUpdateType(ntree, node->typeinfo);
node->custom1= SH_NODE_SCRIPT_UPDATED;
} else if(node->custom1== SH_NODE_SCRIPT_LOADED) {
node->typeinfo->pynode= testinst;
node->typeinfo->id= node->id;
nodeRegisterType(ntree, node->typeinfo);
node->custom1= SH_NODE_SCRIPT_READY;
} else if(node->custom1== SH_NODE_SCRIPT_ADDEXIST) {
node->custom1= SH_NODE_SCRIPT_READY;
}
break;
}
}
}
}
}