55
55
static BL::NodeSocket get_node_output(BL::Node b_node, const string& name)
57
57
BL::Node::outputs_iterator b_out;
59
59
for(b_node.outputs.begin(b_out); b_out != b_node.outputs.end(); ++b_out)
60
60
if(b_out->name() == name)
68
68
static float3 get_node_output_rgba(BL::Node b_node, const string& name)
70
BL::NodeSocketRGBA sock(get_node_output(b_node, name));
71
return get_float3(sock.default_value());
70
BL::NodeSocket b_sock = get_node_output(b_node, name);
72
RNA_float_get_array(&b_sock.ptr, "default_value", value);
73
return make_float3(value[0], value[1], value[2]);
74
76
static float get_node_output_value(BL::Node b_node, const string& name)
76
BL::NodeSocketFloatNone sock(get_node_output(b_node, name));
77
return sock.default_value();
80
static ShaderSocketType convert_socket_type(BL::NodeSocket::type_enum b_type)
83
case BL::NodeSocket::type_VALUE:
84
return SHADER_SOCKET_FLOAT;
85
case BL::NodeSocket::type_INT:
86
return SHADER_SOCKET_INT;
87
case BL::NodeSocket::type_VECTOR:
88
return SHADER_SOCKET_VECTOR;
89
case BL::NodeSocket::type_RGBA:
90
return SHADER_SOCKET_COLOR;
91
case BL::NodeSocket::type_SHADER:
92
return SHADER_SOCKET_CLOSURE;
93
case BL::NodeSocket::type_STRING:
94
return SHADER_SOCKET_STRING;
96
case BL::NodeSocket::type_BOOLEAN:
97
case BL::NodeSocket::type_MESH:
99
return SHADER_SOCKET_FLOAT;
78
BL::NodeSocket b_sock = get_node_output(b_node, name);
79
return RNA_float_get(&b_sock.ptr, "default_value");
82
static float3 get_node_output_vector(BL::Node b_node, const string& name)
84
BL::NodeSocket b_sock = get_node_output(b_node, name);
86
RNA_float_get_array(&b_sock.ptr, "default_value", value);
87
return make_float3(value[0], value[1], value[2]);
90
static ShaderSocketType convert_socket_type(BL::NodeSocket b_socket)
92
switch (b_socket.type()) {
93
case BL::NodeSocket::type_VALUE:
94
return SHADER_SOCKET_FLOAT;
95
case BL::NodeSocket::type_INT:
96
return SHADER_SOCKET_INT;
97
case BL::NodeSocket::type_VECTOR:
98
return SHADER_SOCKET_VECTOR;
99
case BL::NodeSocket::type_RGBA:
100
return SHADER_SOCKET_COLOR;
101
case BL::NodeSocket::type_STRING:
102
return SHADER_SOCKET_STRING;
103
case BL::NodeSocket::type_SHADER:
104
return SHADER_SOCKET_CLOSURE;
107
return SHADER_SOCKET_UNDEFINED;
103
static void set_default_value(ShaderInput *input, BL::NodeSocket sock, BL::BlendData b_data, BL::ID b_id)
111
static void set_default_value(ShaderInput *input, BL::Node b_node, BL::NodeSocket b_sock, BL::BlendData b_data, BL::ID b_id)
105
113
/* copy values for non linked inputs */
106
114
switch(input->type) {
107
115
case SHADER_SOCKET_FLOAT: {
108
BL::NodeSocketFloatNone value_sock(sock);
109
input->set(value_sock.default_value());
116
input->set(get_float(b_sock.ptr, "default_value"));
112
119
case SHADER_SOCKET_INT: {
113
BL::NodeSocketIntNone value_sock(sock);
114
input->set((float)value_sock.default_value());
120
input->set((float)get_int(b_sock.ptr, "default_value"));
117
123
case SHADER_SOCKET_COLOR: {
118
BL::NodeSocketRGBA rgba_sock(sock);
119
input->set(get_float3(rgba_sock.default_value()));
124
input->set(float4_to_float3(get_float4(b_sock.ptr, "default_value")));
122
127
case SHADER_SOCKET_NORMAL:
123
128
case SHADER_SOCKET_POINT:
124
129
case SHADER_SOCKET_VECTOR: {
125
BL::NodeSocketVectorNone vec_sock(sock);
126
input->set(get_float3(vec_sock.default_value()));
130
input->set(get_float3(b_sock.ptr, "default_value"));
129
133
case SHADER_SOCKET_STRING: {
130
BL::NodeSocketStringNone string_sock(sock);
131
input->set((ustring)blender_absolute_path(b_data, b_id, string_sock.default_value()));
134
input->set((ustring)blender_absolute_path(b_data, b_id, get_string(b_sock.ptr, "default_value")));
134
138
case SHADER_SOCKET_CLOSURE:
139
case SHADER_SOCKET_UNDEFINED:
172
177
ShaderNode *node = NULL;
174
switch(b_node.type()) {
176
case BL::ShaderNode::type_GEOMETRY: break;
177
case BL::ShaderNode::type_MATERIAL: break;
178
case BL::ShaderNode::type_MATERIAL_EXT: break;
179
case BL::ShaderNode::type_OUTPUT: break;
180
case BL::ShaderNode::type_SQUEEZE: break;
181
case BL::ShaderNode::type_TEXTURE: break;
182
case BL::ShaderNode::type_FRAME: break;
183
/* handled outside this function */
184
case BL::ShaderNode::type_GROUP: break;
185
/* existing blender nodes */
186
case BL::ShaderNode::type_REROUTE: {
187
BL::Node::inputs_iterator b_input;
188
b_node.inputs.begin(b_input);
189
BL::Node::outputs_iterator b_output;
190
b_node.outputs.begin(b_output);
191
ProxyNode *proxy = new ProxyNode(convert_socket_type(b_input->type()), convert_socket_type(b_output->type()));
195
case BL::ShaderNode::type_CURVE_VEC: {
196
BL::ShaderNodeVectorCurve b_curve_node(b_node);
197
VectorCurvesNode *curves = new VectorCurvesNode();
198
curvemapping_color_to_array(b_curve_node.mapping(), curves->curves, RAMP_TABLE_SIZE, false);
202
case BL::ShaderNode::type_CURVE_RGB: {
203
BL::ShaderNodeRGBCurve b_curve_node(b_node);
204
RGBCurvesNode *curves = new RGBCurvesNode();
205
curvemapping_color_to_array(b_curve_node.mapping(), curves->curves, RAMP_TABLE_SIZE, true);
209
case BL::ShaderNode::type_VALTORGB: {
210
RGBRampNode *ramp = new RGBRampNode();
211
BL::ShaderNodeValToRGB b_ramp_node(b_node);
212
colorramp_to_array(b_ramp_node.color_ramp(), ramp->ramp, RAMP_TABLE_SIZE);
216
case BL::ShaderNode::type_RGB: {
217
ColorNode *color = new ColorNode();
218
color->value = get_node_output_rgba(b_node, "Color");
222
case BL::ShaderNode::type_VALUE: {
223
ValueNode *value = new ValueNode();
224
value->value = get_node_output_value(b_node, "Value");
228
case BL::ShaderNode::type_CAMERA: {
229
node = new CameraNode();
232
case BL::ShaderNode::type_INVERT: {
233
node = new InvertNode();
236
case BL::ShaderNode::type_GAMMA: {
237
node = new GammaNode();
240
case BL::ShaderNode::type_BRIGHTCONTRAST: {
241
node = new BrightContrastNode();
244
case BL::ShaderNode::type_MIX_RGB: {
245
BL::ShaderNodeMixRGB b_mix_node(b_node);
246
MixNode *mix = new MixNode();
247
mix->type = MixNode::type_enum[b_mix_node.blend_type()];
179
/* existing blender nodes */
180
if (b_node.is_a(&RNA_ShaderNodeRGBCurve)) {
181
BL::ShaderNodeRGBCurve b_curve_node(b_node);
182
RGBCurvesNode *curves = new RGBCurvesNode();
183
curvemapping_color_to_array(b_curve_node.mapping(), curves->curves, RAMP_TABLE_SIZE, true);
186
if (b_node.is_a(&RNA_ShaderNodeVectorCurve)) {
187
BL::ShaderNodeVectorCurve b_curve_node(b_node);
188
VectorCurvesNode *curves = new VectorCurvesNode();
189
curvemapping_color_to_array(b_curve_node.mapping(), curves->curves, RAMP_TABLE_SIZE, false);
192
else if (b_node.is_a(&RNA_ShaderNodeValToRGB)) {
193
RGBRampNode *ramp = new RGBRampNode();
194
BL::ShaderNodeValToRGB b_ramp_node(b_node);
195
colorramp_to_array(b_ramp_node.color_ramp(), ramp->ramp, RAMP_TABLE_SIZE);
196
ramp->interpolate = b_ramp_node.color_ramp().interpolation() != BL::ColorRamp::interpolation_CONSTANT;
199
else if (b_node.is_a(&RNA_ShaderNodeRGB)) {
200
ColorNode *color = new ColorNode();
201
color->value = get_node_output_rgba(b_node, "Color");
204
else if (b_node.is_a(&RNA_ShaderNodeValue)) {
205
ValueNode *value = new ValueNode();
206
value->value = get_node_output_value(b_node, "Value");
209
else if (b_node.is_a(&RNA_ShaderNodeCameraData)) {
210
node = new CameraNode();
212
else if (b_node.is_a(&RNA_ShaderNodeInvert)) {
213
node = new InvertNode();
215
else if (b_node.is_a(&RNA_ShaderNodeGamma)) {
216
node = new GammaNode();
218
else if (b_node.is_a(&RNA_ShaderNodeBrightContrast)) {
219
node = new BrightContrastNode();
221
else if (b_node.is_a(&RNA_ShaderNodeMixRGB)) {
222
BL::ShaderNodeMixRGB b_mix_node(b_node);
223
MixNode *mix = new MixNode();
224
mix->type = MixNode::type_enum[b_mix_node.blend_type()];
248
225
mix->use_clamp = b_mix_node.use_clamp();
252
case BL::ShaderNode::type_SEPRGB: {
253
node = new SeparateRGBNode();
256
case BL::ShaderNode::type_COMBRGB: {
257
node = new CombineRGBNode();
260
case BL::ShaderNode::type_HUE_SAT: {
261
node = new HSVNode();
264
case BL::ShaderNode::type_RGBTOBW: {
265
node = new ConvertNode(SHADER_SOCKET_COLOR, SHADER_SOCKET_FLOAT);
268
case BL::ShaderNode::type_MATH: {
269
BL::ShaderNodeMath b_math_node(b_node);
270
MathNode *math = new MathNode();
271
math->type = MathNode::type_enum[b_math_node.operation()];
228
else if (b_node.is_a(&RNA_ShaderNodeSeparateRGB)) {
229
node = new SeparateRGBNode();
231
else if (b_node.is_a(&RNA_ShaderNodeCombineRGB)) {
232
node = new CombineRGBNode();
234
else if (b_node.is_a(&RNA_ShaderNodeHueSaturation)) {
235
node = new HSVNode();
237
else if (b_node.is_a(&RNA_ShaderNodeRGBToBW)) {
238
node = new ConvertNode(SHADER_SOCKET_COLOR, SHADER_SOCKET_FLOAT);
240
else if (b_node.is_a(&RNA_ShaderNodeMath)) {
241
BL::ShaderNodeMath b_math_node(b_node);
242
MathNode *math = new MathNode();
243
math->type = MathNode::type_enum[b_math_node.operation()];
272
244
math->use_clamp = b_math_node.use_clamp();
276
case BL::ShaderNode::type_VECT_MATH: {
277
BL::ShaderNodeVectorMath b_vector_math_node(b_node);
278
VectorMathNode *vmath = new VectorMathNode();
279
vmath->type = VectorMathNode::type_enum[b_vector_math_node.operation()];
283
case BL::ShaderNode::type_NORMAL: {
284
BL::Node::outputs_iterator out_it;
285
b_node.outputs.begin(out_it);
286
BL::NodeSocketVectorNone vec_sock(*out_it);
288
NormalNode *norm = new NormalNode();
289
norm->direction = get_float3(vec_sock.default_value());
294
case BL::ShaderNode::type_MAPPING: {
295
BL::ShaderNodeMapping b_mapping_node(b_node);
296
MappingNode *mapping = new MappingNode();
298
get_tex_mapping(&mapping->tex_mapping, b_mapping_node);
305
case BL::ShaderNode::type_OUTPUT_MATERIAL:
306
case BL::ShaderNode::type_OUTPUT_WORLD:
307
case BL::ShaderNode::type_OUTPUT_LAMP: {
308
node = graph->output();
311
case BL::ShaderNode::type_FRESNEL: {
312
node = new FresnelNode();
315
case BL::ShaderNode::type_LAYER_WEIGHT: {
316
node = new LayerWeightNode();
319
case BL::ShaderNode::type_ADD_SHADER: {
320
node = new AddClosureNode();
323
case BL::ShaderNode::type_MIX_SHADER: {
324
node = new MixClosureNode();
327
case BL::ShaderNode::type_ATTRIBUTE: {
328
BL::ShaderNodeAttribute b_attr_node(b_node);
329
AttributeNode *attr = new AttributeNode();
330
attr->attribute = b_attr_node.attribute_name();
334
case BL::ShaderNode::type_BACKGROUND: {
335
node = new BackgroundNode();
338
case BL::ShaderNode::type_HOLDOUT: {
339
node = new HoldoutNode();
342
case BL::ShaderNode::type_BSDF_ANISOTROPIC: {
343
node = new WardBsdfNode();
346
case BL::ShaderNode::type_BSDF_DIFFUSE: {
347
node = new DiffuseBsdfNode();
350
case BL::ShaderNode::type_BSDF_GLOSSY: {
351
BL::ShaderNodeBsdfGlossy b_glossy_node(b_node);
352
GlossyBsdfNode *glossy = new GlossyBsdfNode();
354
switch(b_glossy_node.distribution()) {
355
case BL::ShaderNodeBsdfGlossy::distribution_SHARP:
356
glossy->distribution = ustring("Sharp");
358
case BL::ShaderNodeBsdfGlossy::distribution_BECKMANN:
359
glossy->distribution = ustring("Beckmann");
361
case BL::ShaderNodeBsdfGlossy::distribution_GGX:
362
glossy->distribution = ustring("GGX");
368
case BL::ShaderNode::type_BSDF_GLASS: {
369
BL::ShaderNodeBsdfGlass b_glass_node(b_node);
370
GlassBsdfNode *glass = new GlassBsdfNode();
371
switch(b_glass_node.distribution()) {
372
case BL::ShaderNodeBsdfGlass::distribution_SHARP:
373
glass->distribution = ustring("Sharp");
375
case BL::ShaderNodeBsdfGlass::distribution_BECKMANN:
376
glass->distribution = ustring("Beckmann");
378
case BL::ShaderNodeBsdfGlass::distribution_GGX:
379
glass->distribution = ustring("GGX");
385
case BL::ShaderNode::type_BSDF_REFRACTION: {
386
BL::ShaderNodeBsdfRefraction b_refraction_node(b_node);
387
RefractionBsdfNode *refraction = new RefractionBsdfNode();
388
switch(b_refraction_node.distribution()) {
389
case BL::ShaderNodeBsdfRefraction::distribution_SHARP:
390
refraction->distribution = ustring("Sharp");
392
case BL::ShaderNodeBsdfRefraction::distribution_BECKMANN:
393
refraction->distribution = ustring("Beckmann");
395
case BL::ShaderNodeBsdfRefraction::distribution_GGX:
396
refraction->distribution = ustring("GGX");
402
case BL::ShaderNode::type_BSDF_TRANSLUCENT: {
403
node = new TranslucentBsdfNode();
406
case BL::ShaderNode::type_BSDF_TRANSPARENT: {
407
node = new TransparentBsdfNode();
410
case BL::ShaderNode::type_BSDF_VELVET: {
411
node = new VelvetBsdfNode();
414
case BL::ShaderNode::type_EMISSION: {
415
node = new EmissionNode();
418
case BL::ShaderNode::type_AMBIENT_OCCLUSION: {
419
node = new AmbientOcclusionNode();
422
case BL::ShaderNode::type_VOLUME_ISOTROPIC: {
423
node = new IsotropicVolumeNode();
426
case BL::ShaderNode::type_VOLUME_TRANSPARENT: {
427
node = new TransparentVolumeNode();
430
case BL::ShaderNode::type_NEW_GEOMETRY: {
431
node = new GeometryNode();
434
case BL::ShaderNode::type_LIGHT_PATH: {
435
node = new LightPathNode();
438
case BL::ShaderNode::type_LIGHT_FALLOFF: {
439
node = new LightFalloffNode();
442
case BL::ShaderNode::type_OBJECT_INFO: {
443
node = new ObjectInfoNode();
446
case BL::ShaderNode::type_PARTICLE_INFO: {
447
node = new ParticleInfoNode();
450
case BL::ShaderNode::type_HAIR_INFO: {
451
node = new HairInfoNode();
454
case BL::ShaderNode::type_BUMP: {
455
node = new BumpNode();
458
case BL::ShaderNode::type_SCRIPT: {
247
else if (b_node.is_a(&RNA_ShaderNodeVectorMath)) {
248
BL::ShaderNodeVectorMath b_vector_math_node(b_node);
249
VectorMathNode *vmath = new VectorMathNode();
250
vmath->type = VectorMathNode::type_enum[b_vector_math_node.operation()];
253
else if (b_node.is_a(&RNA_ShaderNodeNormal)) {
254
BL::Node::outputs_iterator out_it;
255
b_node.outputs.begin(out_it);
257
NormalNode *norm = new NormalNode();
258
norm->direction = get_node_output_vector(b_node, "Normal");
261
else if (b_node.is_a(&RNA_ShaderNodeMapping)) {
262
BL::ShaderNodeMapping b_mapping_node(b_node);
263
MappingNode *mapping = new MappingNode();
265
get_tex_mapping(&mapping->tex_mapping, b_mapping_node);
270
else if (b_node.is_a(&RNA_ShaderNodeOutputMaterial)
271
|| b_node.is_a(&RNA_ShaderNodeOutputWorld)
272
|| b_node.is_a(&RNA_ShaderNodeOutputLamp)) {
273
node = graph->output();
275
else if (b_node.is_a(&RNA_ShaderNodeFresnel)) {
276
node = new FresnelNode();
278
else if (b_node.is_a(&RNA_ShaderNodeLayerWeight)) {
279
node = new LayerWeightNode();
281
else if (b_node.is_a(&RNA_ShaderNodeAddShader)) {
282
node = new AddClosureNode();
284
else if (b_node.is_a(&RNA_ShaderNodeMixShader)) {
285
node = new MixClosureNode();
287
else if (b_node.is_a(&RNA_ShaderNodeAttribute)) {
288
BL::ShaderNodeAttribute b_attr_node(b_node);
289
AttributeNode *attr = new AttributeNode();
290
attr->attribute = b_attr_node.attribute_name();
293
else if (b_node.is_a(&RNA_ShaderNodeBackground)) {
294
node = new BackgroundNode();
296
else if (b_node.is_a(&RNA_ShaderNodeHoldout)) {
297
node = new HoldoutNode();
299
else if (b_node.is_a(&RNA_ShaderNodeBsdfAnisotropic)) {
300
node = new WardBsdfNode();
302
else if (b_node.is_a(&RNA_ShaderNodeBsdfDiffuse)) {
303
node = new DiffuseBsdfNode();
305
else if (b_node.is_a(&RNA_ShaderNodeSubsurfaceScattering)) {
306
node = new SubsurfaceScatteringNode();
308
else if (b_node.is_a(&RNA_ShaderNodeBsdfGlossy)) {
309
BL::ShaderNodeBsdfGlossy b_glossy_node(b_node);
310
GlossyBsdfNode *glossy = new GlossyBsdfNode();
312
switch(b_glossy_node.distribution()) {
313
case BL::ShaderNodeBsdfGlossy::distribution_SHARP:
314
glossy->distribution = ustring("Sharp");
316
case BL::ShaderNodeBsdfGlossy::distribution_BECKMANN:
317
glossy->distribution = ustring("Beckmann");
319
case BL::ShaderNodeBsdfGlossy::distribution_GGX:
320
glossy->distribution = ustring("GGX");
325
else if (b_node.is_a(&RNA_ShaderNodeBsdfGlass)) {
326
BL::ShaderNodeBsdfGlass b_glass_node(b_node);
327
GlassBsdfNode *glass = new GlassBsdfNode();
328
switch(b_glass_node.distribution()) {
329
case BL::ShaderNodeBsdfGlass::distribution_SHARP:
330
glass->distribution = ustring("Sharp");
332
case BL::ShaderNodeBsdfGlass::distribution_BECKMANN:
333
glass->distribution = ustring("Beckmann");
335
case BL::ShaderNodeBsdfGlass::distribution_GGX:
336
glass->distribution = ustring("GGX");
341
else if (b_node.is_a(&RNA_ShaderNodeBsdfRefraction)) {
342
BL::ShaderNodeBsdfRefraction b_refraction_node(b_node);
343
RefractionBsdfNode *refraction = new RefractionBsdfNode();
344
switch(b_refraction_node.distribution()) {
345
case BL::ShaderNodeBsdfRefraction::distribution_SHARP:
346
refraction->distribution = ustring("Sharp");
348
case BL::ShaderNodeBsdfRefraction::distribution_BECKMANN:
349
refraction->distribution = ustring("Beckmann");
351
case BL::ShaderNodeBsdfRefraction::distribution_GGX:
352
refraction->distribution = ustring("GGX");
357
else if (b_node.is_a(&RNA_ShaderNodeBsdfToon)) {
358
BL::ShaderNodeBsdfToon b_toon_node(b_node);
359
ToonBsdfNode *toon = new ToonBsdfNode();
360
switch(b_toon_node.component()) {
361
case BL::ShaderNodeBsdfToon::component_DIFFUSE:
362
toon->component = ustring("Diffuse");
364
case BL::ShaderNodeBsdfToon::component_GLOSSY:
365
toon->component = ustring("Glossy");
370
else if (b_node.is_a(&RNA_ShaderNodeBsdfTranslucent)) {
371
node = new TranslucentBsdfNode();
373
else if (b_node.is_a(&RNA_ShaderNodeBsdfTransparent)) {
374
node = new TransparentBsdfNode();
376
else if (b_node.is_a(&RNA_ShaderNodeBsdfVelvet)) {
377
node = new VelvetBsdfNode();
379
else if (b_node.is_a(&RNA_ShaderNodeEmission)) {
380
node = new EmissionNode();
382
else if (b_node.is_a(&RNA_ShaderNodeAmbientOcclusion)) {
383
node = new AmbientOcclusionNode();
385
else if (b_node.is_a(&RNA_ShaderNodeVolumeIsotropic)) {
386
node = new IsotropicVolumeNode();
388
else if (b_node.is_a(&RNA_ShaderNodeVolumeTransparent)) {
389
node = new TransparentVolumeNode();
391
else if (b_node.is_a(&RNA_ShaderNodeNewGeometry)) {
392
node = new GeometryNode();
394
else if (b_node.is_a(&RNA_ShaderNodeWireframe)) {
395
BL::ShaderNodeWireframe b_wireframe_node(b_node);
396
WireframeNode *wire = new WireframeNode();
397
wire->use_pixel_size = b_wireframe_node.use_pixel_size();
400
else if (b_node.is_a(&RNA_ShaderNodeWavelength)) {
401
node = new WavelengthNode();
403
else if (b_node.is_a(&RNA_ShaderNodeLightPath)) {
404
node = new LightPathNode();
406
else if (b_node.is_a(&RNA_ShaderNodeLightFalloff)) {
407
node = new LightFalloffNode();
409
else if (b_node.is_a(&RNA_ShaderNodeObjectInfo)) {
410
node = new ObjectInfoNode();
412
else if (b_node.is_a(&RNA_ShaderNodeParticleInfo)) {
413
node = new ParticleInfoNode();
415
else if (b_node.is_a(&RNA_ShaderNodeHairInfo)) {
416
node = new HairInfoNode();
418
else if (b_node.is_a(&RNA_ShaderNodeBump)) {
419
BL::ShaderNodeBump b_bump_node(b_node);
420
BumpNode *bump = new BumpNode();
421
bump->invert = b_bump_node.invert();
424
else if (b_node.is_a(&RNA_ShaderNodeScript)) {
460
if(!scene->shader_manager->use_osl())
426
if(scene->shader_manager->use_osl()) {
463
427
/* create script node */
464
428
BL::ShaderNodeScript b_script_node(b_node);
465
429
OSLScriptNode *script_node = new OSLScriptNode();
505
471
node = script_node;
475
else if (b_node.is_a(&RNA_ShaderNodeTexImage)) {
476
BL::ShaderNodeTexImage b_image_node(b_node);
477
BL::Image b_image(b_image_node.image());
478
ImageTextureNode *image = new ImageTextureNode();
480
/* builtin images will use callback-based reading because
481
* they could only be loaded correct from blender side
483
bool is_builtin = b_image.packed_file() ||
484
b_image.source() == BL::Image::source_GENERATED ||
485
b_image.source() == BL::Image::source_MOVIE;
510
case BL::ShaderNode::type_TEX_IMAGE: {
511
BL::ShaderNodeTexImage b_image_node(b_node);
512
BL::Image b_image(b_image_node.image());
513
ImageTextureNode *image = new ImageTextureNode();
515
/* builtin images will use callback-based reading because
516
* they could only be loaded correct from blender side
488
/* for builtin images we're using image datablock name to find an image to
489
* read pixels from later
491
* also store frame number as well, so there's no differences in handling
492
* builtin names for packed images and movies
518
bool is_builtin = b_image.packed_file() ||
519
b_image.source() == BL::Image::source_GENERATED ||
520
b_image.source() == BL::Image::source_MOVIE;
523
/* for builtin images we're using image datablock name to find an image to
524
* read pixels from later
526
* also store frame number as well, so there's no differences in handling
527
* builtin names for packed images and movies
529
int scene_frame = b_scene.frame_current();
530
int image_frame = image_user_frame_number(b_image_node.image_user(), scene_frame);
531
image->filename = b_image.name() + "@" + string_printf("%d", image_frame);
532
image->builtin_data = b_image.ptr.data;
535
image->filename = image_user_file_path(b_image_node.image_user(), b_image, b_scene.frame_current());
536
image->builtin_data = NULL;
539
image->animated = b_image_node.image_user().use_auto_refresh();
541
image->color_space = ImageTextureNode::color_space_enum[(int)b_image_node.color_space()];
542
image->projection = ImageTextureNode::projection_enum[(int)b_image_node.projection()];
543
image->projection_blend = b_image_node.projection_blend();
544
get_tex_mapping(&image->tex_mapping, b_image_node.texture_mapping());
548
case BL::ShaderNode::type_TEX_ENVIRONMENT: {
549
BL::ShaderNodeTexEnvironment b_env_node(b_node);
550
BL::Image b_image(b_env_node.image());
551
EnvironmentTextureNode *env = new EnvironmentTextureNode();
553
bool is_builtin = b_image.packed_file() ||
554
b_image.source() == BL::Image::source_GENERATED ||
555
b_image.source() == BL::Image::source_MOVIE;
558
int scene_frame = b_scene.frame_current();
559
int image_frame = image_user_frame_number(b_env_node.image_user(), scene_frame);
560
env->filename = b_image.name() + "@" + string_printf("%d", image_frame);
561
env->builtin_data = b_image.ptr.data;
564
env->filename = image_user_file_path(b_env_node.image_user(), b_image, b_scene.frame_current());
565
env->animated = b_env_node.image_user().use_auto_refresh();
566
env->builtin_data = NULL;
569
env->color_space = EnvironmentTextureNode::color_space_enum[(int)b_env_node.color_space()];
570
env->projection = EnvironmentTextureNode::projection_enum[(int)b_env_node.projection()];
571
get_tex_mapping(&env->tex_mapping, b_env_node.texture_mapping());
575
case BL::ShaderNode::type_TEX_GRADIENT: {
576
BL::ShaderNodeTexGradient b_gradient_node(b_node);
577
GradientTextureNode *gradient = new GradientTextureNode();
578
gradient->type = GradientTextureNode::type_enum[(int)b_gradient_node.gradient_type()];
579
get_tex_mapping(&gradient->tex_mapping, b_gradient_node.texture_mapping());
583
case BL::ShaderNode::type_TEX_VORONOI: {
584
BL::ShaderNodeTexVoronoi b_voronoi_node(b_node);
585
VoronoiTextureNode *voronoi = new VoronoiTextureNode();
586
voronoi->coloring = VoronoiTextureNode::coloring_enum[(int)b_voronoi_node.coloring()];
587
get_tex_mapping(&voronoi->tex_mapping, b_voronoi_node.texture_mapping());
591
case BL::ShaderNode::type_TEX_MAGIC: {
592
BL::ShaderNodeTexMagic b_magic_node(b_node);
593
MagicTextureNode *magic = new MagicTextureNode();
594
magic->depth = b_magic_node.turbulence_depth();
595
get_tex_mapping(&magic->tex_mapping, b_magic_node.texture_mapping());
599
case BL::ShaderNode::type_TEX_WAVE: {
600
BL::ShaderNodeTexWave b_wave_node(b_node);
601
WaveTextureNode *wave = new WaveTextureNode();
602
wave->type = WaveTextureNode::type_enum[(int)b_wave_node.wave_type()];
603
get_tex_mapping(&wave->tex_mapping, b_wave_node.texture_mapping());
607
case BL::ShaderNode::type_TEX_CHECKER: {
608
BL::ShaderNodeTexChecker b_checker_node(b_node);
609
CheckerTextureNode *checker = new CheckerTextureNode();
610
get_tex_mapping(&checker->tex_mapping, b_checker_node.texture_mapping());
614
case BL::ShaderNode::type_TEX_BRICK: {
615
BL::ShaderNodeTexBrick b_brick_node(b_node);
616
BrickTextureNode *brick = new BrickTextureNode();
617
brick->offset = b_brick_node.offset();
618
brick->offset_frequency = b_brick_node.offset_frequency();
619
brick->squash = b_brick_node.squash();
620
brick->squash_frequency = b_brick_node.squash_frequency();
621
get_tex_mapping(&brick->tex_mapping, b_brick_node.texture_mapping());
625
case BL::ShaderNode::type_TEX_NOISE: {
626
BL::ShaderNodeTexNoise b_noise_node(b_node);
627
NoiseTextureNode *noise = new NoiseTextureNode();
628
get_tex_mapping(&noise->tex_mapping, b_noise_node.texture_mapping());
632
case BL::ShaderNode::type_TEX_MUSGRAVE: {
633
BL::ShaderNodeTexMusgrave b_musgrave_node(b_node);
634
MusgraveTextureNode *musgrave = new MusgraveTextureNode();
635
musgrave->type = MusgraveTextureNode::type_enum[(int)b_musgrave_node.musgrave_type()];
636
get_tex_mapping(&musgrave->tex_mapping, b_musgrave_node.texture_mapping());
640
case BL::ShaderNode::type_TEX_COORD: {
641
BL::ShaderNodeTexCoord b_tex_coord_node(b_node);
642
TextureCoordinateNode *tex_coord = new TextureCoordinateNode();
643
tex_coord->from_dupli = b_tex_coord_node.from_dupli();
647
case BL::ShaderNode::type_TEX_SKY: {
648
BL::ShaderNodeTexSky b_sky_node(b_node);
649
SkyTextureNode *sky = new SkyTextureNode();
650
sky->sun_direction = get_float3(b_sky_node.sun_direction());
651
sky->turbidity = b_sky_node.turbidity();
652
get_tex_mapping(&sky->tex_mapping, b_sky_node.texture_mapping());
656
case BL::ShaderNode::type_NORMAL_MAP: {
657
BL::ShaderNodeNormalMap b_normal_map_node(b_node);
658
NormalMapNode *nmap = new NormalMapNode();
659
nmap->space = NormalMapNode::space_enum[(int)b_normal_map_node.space()];
660
nmap->attribute = b_normal_map_node.uv_map();
664
case BL::ShaderNode::type_TANGENT: {
665
BL::ShaderNodeTangent b_tangent_node(b_node);
666
TangentNode *tangent = new TangentNode();
667
tangent->direction_type = TangentNode::direction_type_enum[(int)b_tangent_node.direction_type()];
668
tangent->axis = TangentNode::axis_enum[(int)b_tangent_node.axis()];
669
tangent->attribute = b_tangent_node.uv_map();
494
int scene_frame = b_scene.frame_current();
495
int image_frame = image_user_frame_number(b_image_node.image_user(), scene_frame);
496
image->filename = b_image.name() + "@" + string_printf("%d", image_frame);
497
image->builtin_data = b_image.ptr.data;
500
image->filename = image_user_file_path(b_image_node.image_user(), b_image, b_scene.frame_current());
501
image->builtin_data = NULL;
504
image->animated = b_image_node.image_user().use_auto_refresh();
506
image->color_space = ImageTextureNode::color_space_enum[(int)b_image_node.color_space()];
507
image->projection = ImageTextureNode::projection_enum[(int)b_image_node.projection()];
508
image->projection_blend = b_image_node.projection_blend();
509
get_tex_mapping(&image->tex_mapping, b_image_node.texture_mapping());
512
else if (b_node.is_a(&RNA_ShaderNodeTexEnvironment)) {
513
BL::ShaderNodeTexEnvironment b_env_node(b_node);
514
BL::Image b_image(b_env_node.image());
515
EnvironmentTextureNode *env = new EnvironmentTextureNode();
517
bool is_builtin = b_image.packed_file() ||
518
b_image.source() == BL::Image::source_GENERATED ||
519
b_image.source() == BL::Image::source_MOVIE;
522
int scene_frame = b_scene.frame_current();
523
int image_frame = image_user_frame_number(b_env_node.image_user(), scene_frame);
524
env->filename = b_image.name() + "@" + string_printf("%d", image_frame);
525
env->builtin_data = b_image.ptr.data;
528
env->filename = image_user_file_path(b_env_node.image_user(), b_image, b_scene.frame_current());
529
env->animated = b_env_node.image_user().use_auto_refresh();
530
env->builtin_data = NULL;
533
env->color_space = EnvironmentTextureNode::color_space_enum[(int)b_env_node.color_space()];
534
env->projection = EnvironmentTextureNode::projection_enum[(int)b_env_node.projection()];
535
get_tex_mapping(&env->tex_mapping, b_env_node.texture_mapping());
538
else if (b_node.is_a(&RNA_ShaderNodeTexGradient)) {
539
BL::ShaderNodeTexGradient b_gradient_node(b_node);
540
GradientTextureNode *gradient = new GradientTextureNode();
541
gradient->type = GradientTextureNode::type_enum[(int)b_gradient_node.gradient_type()];
542
get_tex_mapping(&gradient->tex_mapping, b_gradient_node.texture_mapping());
545
else if (b_node.is_a(&RNA_ShaderNodeTexVoronoi)) {
546
BL::ShaderNodeTexVoronoi b_voronoi_node(b_node);
547
VoronoiTextureNode *voronoi = new VoronoiTextureNode();
548
voronoi->coloring = VoronoiTextureNode::coloring_enum[(int)b_voronoi_node.coloring()];
549
get_tex_mapping(&voronoi->tex_mapping, b_voronoi_node.texture_mapping());
552
else if (b_node.is_a(&RNA_ShaderNodeTexMagic)) {
553
BL::ShaderNodeTexMagic b_magic_node(b_node);
554
MagicTextureNode *magic = new MagicTextureNode();
555
magic->depth = b_magic_node.turbulence_depth();
556
get_tex_mapping(&magic->tex_mapping, b_magic_node.texture_mapping());
559
else if (b_node.is_a(&RNA_ShaderNodeTexWave)) {
560
BL::ShaderNodeTexWave b_wave_node(b_node);
561
WaveTextureNode *wave = new WaveTextureNode();
562
wave->type = WaveTextureNode::type_enum[(int)b_wave_node.wave_type()];
563
get_tex_mapping(&wave->tex_mapping, b_wave_node.texture_mapping());
566
else if (b_node.is_a(&RNA_ShaderNodeTexChecker)) {
567
BL::ShaderNodeTexChecker b_checker_node(b_node);
568
CheckerTextureNode *checker = new CheckerTextureNode();
569
get_tex_mapping(&checker->tex_mapping, b_checker_node.texture_mapping());
572
else if (b_node.is_a(&RNA_ShaderNodeTexBrick)) {
573
BL::ShaderNodeTexBrick b_brick_node(b_node);
574
BrickTextureNode *brick = new BrickTextureNode();
575
brick->offset = b_brick_node.offset();
576
brick->offset_frequency = b_brick_node.offset_frequency();
577
brick->squash = b_brick_node.squash();
578
brick->squash_frequency = b_brick_node.squash_frequency();
579
get_tex_mapping(&brick->tex_mapping, b_brick_node.texture_mapping());
582
else if (b_node.is_a(&RNA_ShaderNodeTexNoise)) {
583
BL::ShaderNodeTexNoise b_noise_node(b_node);
584
NoiseTextureNode *noise = new NoiseTextureNode();
585
get_tex_mapping(&noise->tex_mapping, b_noise_node.texture_mapping());
588
else if (b_node.is_a(&RNA_ShaderNodeTexMusgrave)) {
589
BL::ShaderNodeTexMusgrave b_musgrave_node(b_node);
590
MusgraveTextureNode *musgrave = new MusgraveTextureNode();
591
musgrave->type = MusgraveTextureNode::type_enum[(int)b_musgrave_node.musgrave_type()];
592
get_tex_mapping(&musgrave->tex_mapping, b_musgrave_node.texture_mapping());
595
else if (b_node.is_a(&RNA_ShaderNodeTexCoord)) {
596
BL::ShaderNodeTexCoord b_tex_coord_node(b_node);
597
TextureCoordinateNode *tex_coord = new TextureCoordinateNode();
598
tex_coord->from_dupli = b_tex_coord_node.from_dupli();
601
else if (b_node.is_a(&RNA_ShaderNodeTexSky)) {
602
BL::ShaderNodeTexSky b_sky_node(b_node);
603
SkyTextureNode *sky = new SkyTextureNode();
604
sky->sun_direction = get_float3(b_sky_node.sun_direction());
605
sky->turbidity = b_sky_node.turbidity();
606
get_tex_mapping(&sky->tex_mapping, b_sky_node.texture_mapping());
609
else if (b_node.is_a(&RNA_ShaderNodeNormalMap)) {
610
BL::ShaderNodeNormalMap b_normal_map_node(b_node);
611
NormalMapNode *nmap = new NormalMapNode();
612
nmap->space = NormalMapNode::space_enum[(int)b_normal_map_node.space()];
613
nmap->attribute = b_normal_map_node.uv_map();
616
else if (b_node.is_a(&RNA_ShaderNodeTangent)) {
617
BL::ShaderNodeTangent b_tangent_node(b_node);
618
TangentNode *tangent = new TangentNode();
619
tangent->direction_type = TangentNode::direction_type_enum[(int)b_tangent_node.direction_type()];
620
tangent->axis = TangentNode::axis_enum[(int)b_tangent_node.axis()];
621
tangent->attribute = b_tangent_node.uv_map();
675
625
if(node && node != graph->output())
697
645
if(b_input->ptr.data == b_socket.ptr.data)
702
/* find in outputs */
707
for(b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
708
if(b_output->name() == name) {
714
if(b_output->ptr.data == b_socket.ptr.data)
649
/* rename if needed */
650
if (name == "Shader")
654
name = string_printf("%s%d", name.c_str(), counter);
656
return node->input(name.c_str());
659
static ShaderOutput *node_find_output_by_name(ShaderNode *node, BL::Node b_node, BL::NodeSocket b_socket)
661
BL::Node::outputs_iterator b_output;
662
string name = b_socket.name();
664
int counter = 0, total = 0;
666
for (b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
667
if (b_output->name() == name) {
673
if(b_output->ptr.data == b_socket.ptr.data)
719
677
/* rename if needed */
678
if (name == "Shader")
721
679
name = "Closure";
724
682
name = string_printf("%s%d", name.c_str(), counter);
726
return SocketPair(node_map[b_node.ptr.data], name);
684
return node->output(name.c_str());
729
static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, ShaderGraph *graph, BL::ShaderNodeTree b_ntree, PtrSockMap& sockets_map)
687
static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, ShaderGraph *graph, BL::ShaderNodeTree b_ntree,
688
const ProxyMap &proxy_input_map, const ProxyMap &proxy_output_map)
732
691
BL::ShaderNodeTree::nodes_iterator b_node;
734
PtrSockMap proxy_map;
692
PtrInputMap input_map;
693
PtrOutputMap output_map;
695
BL::Node::inputs_iterator b_input;
696
BL::Node::outputs_iterator b_output;
736
698
for(b_ntree.nodes.begin(b_node); b_node != b_ntree.nodes.end(); ++b_node) {
738
BL::Node::inputs_iterator b_input;
739
BL::Node::outputs_iterator b_output;
740
bool found_match = false;
742
/* this is slightly different than blender logic, we just connect a
743
* single pair for of input/output, but works ok for the node we have */
699
if (b_node->mute() || b_node->is_a(&RNA_NodeReroute)) {
700
/* replace muted node with internal links */
701
BL::Node::internal_links_iterator b_link;
702
for (b_node->internal_links.begin(b_link); b_link != b_node->internal_links.end(); ++b_link) {
703
ProxyNode *proxy = new ProxyNode(convert_socket_type(b_link->to_socket()));
705
input_map[b_link->from_socket().ptr.data] = proxy->inputs[0];
706
output_map[b_link->to_socket().ptr.data] = proxy->outputs[0];
711
else if (b_node->is_a(&RNA_ShaderNodeGroup) || b_node->is_a(&RNA_NodeCustomGroup)) {
713
BL::ShaderNodeTree b_group_ntree(PointerRNA_NULL);
714
if (b_node->is_a(&RNA_ShaderNodeGroup))
715
b_group_ntree = BL::ShaderNodeTree(((BL::NodeGroup)(*b_node)).node_tree());
717
b_group_ntree = BL::ShaderNodeTree(((BL::NodeCustomGroup)(*b_node)).node_tree());
718
ProxyMap group_proxy_input_map, group_proxy_output_map;
720
/* Add a proxy node for each socket
721
* Do this even if the node group has no internal tree,
722
* so that links have something to connect to and assert won't fail.
744
724
for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
745
if(b_input->is_linked()) {
746
for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
747
if(b_output->is_linked() && b_input->type() == b_output->type()) {
748
ProxyNode *proxy = new ProxyNode(convert_socket_type(b_input->type()), convert_socket_type(b_output->type()));
751
proxy_map[b_input->ptr.data] = SocketPair(proxy, proxy->inputs[0]->name);
752
proxy_map[b_output->ptr.data] = SocketPair(proxy, proxy->outputs[0]->name);
725
ProxyNode *proxy = new ProxyNode(convert_socket_type(*b_input));
728
/* register the proxy node for internal binding */
729
group_proxy_input_map[b_input->identifier()] = proxy;
731
input_map[b_input->ptr.data] = proxy->inputs[0];
733
set_default_value(proxy->inputs[0], *b_node, *b_input, b_data, b_ntree);
735
for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
736
ProxyNode *proxy = new ProxyNode(convert_socket_type(*b_output));
739
/* register the proxy node for internal binding */
740
group_proxy_output_map[b_output->identifier()] = proxy;
742
output_map[b_output->ptr.data] = proxy->outputs[0];
746
add_nodes(scene, b_data, b_scene, graph, b_group_ntree, group_proxy_input_map, group_proxy_output_map);
748
else if (b_node->is_a(&RNA_NodeGroupInput)) {
749
/* map each socket to a proxy node */
750
for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
751
ProxyMap::const_iterator proxy_it = proxy_input_map.find(b_output->identifier());
752
if (proxy_it != proxy_input_map.end()) {
753
ProxyNode *proxy = proxy_it->second;
755
output_map[b_output->ptr.data] = proxy->outputs[0];
759
else if (b_node->is_a(&RNA_NodeGroupOutput)) {
760
BL::NodeGroupOutput b_output_node(*b_node);
761
/* only the active group output is used */
762
if (b_output_node.is_active_output()) {
763
/* map each socket to a proxy node */
764
for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
765
ProxyMap::const_iterator proxy_it = proxy_output_map.find(b_input->identifier());
766
if (proxy_it != proxy_output_map.end()) {
767
ProxyNode *proxy = proxy_it->second;
769
input_map[b_input->ptr.data] = proxy->inputs[0];
771
set_default_value(proxy->inputs[0], *b_node, *b_input, b_data, b_ntree);
764
else if(b_node->is_a(&RNA_NodeGroup)) {
765
/* add proxy converter nodes for inputs and outputs */
766
BL::NodeGroup b_gnode(*b_node);
767
BL::ShaderNodeTree b_group_ntree(b_gnode.node_tree());
771
BL::Node::inputs_iterator b_input;
772
BL::Node::outputs_iterator b_output;
774
PtrSockMap group_sockmap;
776
for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
777
ShaderSocketType extern_type = convert_socket_type(b_input->type());
778
ShaderSocketType intern_type = convert_socket_type(b_input->group_socket().type());
779
ShaderNode *proxy = graph->add(new ProxyNode(extern_type, intern_type));
781
/* map the external node socket to the proxy node socket */
782
proxy_map[b_input->ptr.data] = SocketPair(proxy, proxy->inputs[0]->name);
783
/* map the internal group socket to the proxy node socket */
784
group_sockmap[b_input->group_socket().ptr.data] = SocketPair(proxy, proxy->outputs[0]->name);
786
/* default input values of the group node */
787
set_default_value(proxy->inputs[0], *b_input, b_data, b_group_ntree);
790
for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
791
ShaderSocketType extern_type = convert_socket_type(b_output->type());
792
ShaderSocketType intern_type = convert_socket_type(b_output->group_socket().type());
793
ShaderNode *proxy = graph->add(new ProxyNode(intern_type, extern_type));
795
/* map the external node socket to the proxy node socket */
796
proxy_map[b_output->ptr.data] = SocketPair(proxy, proxy->outputs[0]->name);
797
/* map the internal group socket to the proxy node socket */
798
group_sockmap[b_output->group_socket().ptr.data] = SocketPair(proxy, proxy->inputs[0]->name);
800
/* default input values of internal, unlinked group outputs */
801
set_default_value(proxy->inputs[0], b_output->group_socket(), b_data, b_group_ntree);
804
add_nodes(scene, b_data, b_scene, graph, b_group_ntree, group_sockmap);
807
777
ShaderNode *node = add_node(scene, b_data, b_scene, graph, b_ntree, BL::ShaderNode(*b_node));
810
BL::Node::inputs_iterator b_input;
812
node_map[b_node->ptr.data] = node;
780
/* map node sockets for linking */
814
781
for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
815
SocketPair pair = node_socket_map_pair(node_map, *b_node, *b_input);
816
ShaderInput *input = pair.first->input(pair.second.c_str());
820
/* copy values for non linked inputs */
821
set_default_value(input, *b_input, b_data, b_ntree);
782
ShaderInput *input = node_find_input_by_name(node, *b_node, *b_input);
783
input_map[b_input->ptr.data] = input;
785
set_default_value(input, *b_node, *b_input, b_data, b_ntree);
787
for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
788
ShaderOutput *output = node_find_output_by_name(node, *b_node, *b_output);
789
output_map[b_output->ptr.data] = output;