80
89
/* create session */
81
90
BlenderSession *session;
92
Py_BEGIN_ALLOW_THREADS
84
/* interactive session */
95
/* interactive viewport session */
85
96
int width = region.width();
86
97
int height = region.height();
88
99
session = new BlenderSession(engine, userpref, data, scene, v3d, rv3d, width, height);
102
/* override some settings for preview */
103
if(engine.is_preview()) {
104
PointerRNA cscene = RNA_pointer_get(&sceneptr, "cycles");
106
RNA_boolean_set(&cscene, "shading_system", preview_osl);
107
RNA_boolean_set(&cscene, "use_progressive_refine", true);
110
/* offline session or preview render */
92
111
session = new BlenderSession(engine, userpref, data, scene);
95
116
return PyLong_FromVoidPtr(session);
210
static PyObject *osl_update_node_func(PyObject *self, PyObject *args)
212
PyObject *pynodegroup, *pynode;
213
const char *filepath = NULL;
215
if(!PyArg_ParseTuple(args, "OOs", &pynodegroup, &pynode, &filepath))
220
RNA_pointer_create((ID*)PyLong_AsVoidPtr(pynodegroup), &RNA_ShaderNodeScript, (void*)PyLong_AsVoidPtr(pynode), &nodeptr);
221
BL::ShaderNodeScript b_node(nodeptr);
223
/* update bytecode hash */
224
string bytecode = b_node.bytecode();
226
if(!bytecode.empty()) {
228
md5.append((const uint8_t*)bytecode.c_str(), bytecode.size());
229
b_node.bytecode_hash(md5.get_hex().c_str());
232
b_node.bytecode_hash("");
234
/* query from file path */
237
if(!OSLShaderManager::osl_query(query, filepath))
240
/* add new sockets from parameters */
241
set<void*> used_sockets;
243
for(int i = 0; i < query.nparams(); i++) {
244
const OSL::OSLQuery::Parameter *param = query.getparam(i);
246
/* skip unsupported types */
247
if(param->varlenarray || param->isstruct || param->type.arraylen > 1)
250
/* determine socket type */
251
BL::NodeSocket::type_enum socket_type;
252
float default_float4[4] = {0.0f, 0.0f, 0.0f, 1.0f};
253
float default_float = 0.0f;
255
std::string default_string = "";
257
if(param->isclosure) {
258
socket_type = BL::NodeSocket::type_SHADER;
260
else if(param->type.vecsemantics == TypeDesc::COLOR) {
261
socket_type = BL::NodeSocket::type_RGBA;
263
if(param->validdefault) {
264
default_float4[0] = param->fdefault[0];
265
default_float4[1] = param->fdefault[1];
266
default_float4[2] = param->fdefault[2];
269
else if(param->type.vecsemantics == TypeDesc::POINT ||
270
param->type.vecsemantics == TypeDesc::VECTOR ||
271
param->type.vecsemantics == TypeDesc::NORMAL) {
272
socket_type = BL::NodeSocket::type_VECTOR;
274
if(param->validdefault) {
275
default_float4[0] = param->fdefault[0];
276
default_float4[1] = param->fdefault[1];
277
default_float4[2] = param->fdefault[2];
280
else if(param->type.aggregate == TypeDesc::SCALAR) {
281
if(param->type.basetype == TypeDesc::INT) {
282
socket_type = BL::NodeSocket::type_INT;
283
if(param->validdefault)
284
default_int = param->idefault[0];
286
else if(param->type.basetype == TypeDesc::FLOAT) {
287
socket_type = BL::NodeSocket::type_VALUE;
288
if(param->validdefault)
289
default_float = param->fdefault[0];
291
else if(param->type.basetype == TypeDesc::STRING) {
292
socket_type = BL::NodeSocket::type_STRING;
293
if(param->validdefault)
294
default_string = param->sdefault[0];
302
/* find socket socket */
303
BL::NodeSocket b_sock = b_node.find_socket(param->name.c_str(), param->isoutput);
305
/* remove if type no longer matches */
306
if(b_sock && b_sock.type() != socket_type) {
307
b_node.remove_socket(b_sock);
308
b_sock = BL::NodeSocket(PointerRNA_NULL);
311
/* create new socket */
313
b_sock = b_node.add_socket(param->name.c_str(), socket_type, param->isoutput);
315
/* set default value */
316
if(socket_type == BL::NodeSocket::type_VALUE) {
317
BL::NodeSocketFloatNone b_float_sock(b_sock.ptr);
318
b_float_sock.default_value(default_float);
320
else if(socket_type == BL::NodeSocket::type_INT) {
321
BL::NodeSocketIntNone b_int_sock(b_sock.ptr);
322
b_int_sock.default_value(default_int);
324
else if(socket_type == BL::NodeSocket::type_RGBA) {
325
BL::NodeSocketRGBA b_rgba_sock(b_sock.ptr);
326
b_rgba_sock.default_value(default_float4);
328
else if(socket_type == BL::NodeSocket::type_VECTOR) {
329
BL::NodeSocketVectorNone b_vector_sock(b_sock.ptr);
330
b_vector_sock.default_value(default_float4);
332
else if(socket_type == BL::NodeSocket::type_STRING) {
333
BL::NodeSocketStringNone b_string_sock(b_sock.ptr);
334
b_string_sock.default_value(default_string);
338
used_sockets.insert(b_sock.ptr.data);
341
/* remove unused parameters */
345
BL::Node::inputs_iterator b_input;
346
BL::Node::outputs_iterator b_output;
350
for (b_node.inputs.begin(b_input); b_input != b_node.inputs.end(); ++b_input) {
351
if(used_sockets.find(b_input->ptr.data) == used_sockets.end()) {
352
b_node.remove_socket(*b_input);
358
for (b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
359
if(used_sockets.find(b_output->ptr.data) == used_sockets.end()) {
360
b_node.remove_socket(*b_output);
370
static PyObject *osl_compile_func(PyObject *self, PyObject *args)
372
const char *inputfile = NULL, *outputfile = NULL;
374
if(!PyArg_ParseTuple(args, "ss", &inputfile, &outputfile))
378
if(!OSLShaderManager::osl_compile(inputfile, outputfile))
158
385
static PyMethodDef methods[] = {
159
386
{"init", init_func, METH_VARARGS, ""},
160
387
{"create", create_func, METH_VARARGS, ""},
162
389
{"render", render_func, METH_O, ""},
163
390
{"draw", draw_func, METH_VARARGS, ""},
164
391
{"sync", sync_func, METH_O, ""},
392
{"reset", reset_func, METH_VARARGS, ""},
394
{"osl_update_node", osl_update_node_func, METH_VARARGS, ""},
395
{"osl_compile", osl_compile_func, METH_VARARGS, ""},
165
397
{"available_devices", available_devices_func, METH_NOARGS, ""},
166
398
{NULL, NULL, 0, NULL},
194
426
foreach(DeviceInfo& info, devices) {
195
427
if(info.type == type ||
196
(info.type == DEVICE_MULTI && info.multi_devices[0].type == type)) {
197
CCLDeviceInfo cinfo = {info.id.c_str(), info.description.c_str(), i++};
428
(info.type == DEVICE_MULTI && info.multi_devices[0].type == type))
432
strncpy(cinfo.identifier, info.id.c_str(), sizeof(cinfo.identifier));
433
cinfo.identifier[info.id.length()] = '\0';
435
strncpy(cinfo.name, info.description.c_str(), sizeof(cinfo.name));
436
cinfo.name[info.description.length()] = '\0';
198
440
device_list.push_back(cinfo);
202
444
/* null terminate */
203
445
if(!device_list.empty()) {
204
CCLDeviceInfo cinfo = {NULL, NULL, 0};
446
CCLDeviceInfo cinfo = {"", "", 0};
205
447
device_list.push_back(cinfo);