forked from mattebb/3delightblender
/
rfb_node_desc.py
133 lines (115 loc) · 4.7 KB
/
rfb_node_desc.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
"""Classes to parse and store node descriptions.
"""
# TODO: NodeDesc.node_type should be an enum.
# pylint: disable=import-error
# pylint: disable=relative-import
# pylint: disable=invalid-name
# pylint: disable=superfluous-parens
import re
from rman_utils.node_desc_param import osl_metadatum
from rman_utils.node_desc import NodeDesc
from .conditional_visibility import build_condvis_expr
from .rfb_node_desc_param import (
RfbNodeDescParamXML,
RfbNodeDescParamOSL,
RfbNodeDescParamJSON,
blender_finalize)
# globals
LIGHTFILTER_CLASSIF = "classification:rendernode/RenderMan/lightfilter"
class RfbNodeDesc(NodeDesc):
"""Specialize NodeDesc for Blender.
Arguments:
NodeDesc {object} -- Generic class encapsulating shader parameters
"""
def __init__(self, *args):
args2 = args + (build_condvis_expr,)
kwargs = {'xmlparamclass': RfbNodeDescParamXML,
'oslparamclass': RfbNodeDescParamOSL,
'jsonparamclass': RfbNodeDescParamJSON, }
super(RfbNodeDesc, self).__init__(*args2, **kwargs)
# declare our attributes
self.nodeid = None
self.classification = None
self.file_extension = None
self.on_create = []
self.unique = False
self.params_only_ae = False
self._ctlname = None
# finish our own parsing
self._parse_shader_metadata()
self._set_ctlname()
self._backward_compatibility()
# free memory
self.clear_parsed_data()
blender_finalize(self)
def _set_ctlname(self):
"""remove any illegal character for a maya ui object."""
self._ctlname = re.sub(r'[^\w]', '', self._name)
@property
def ctlname(self):
"""Return the ui control name used by maya."""
if self._ctlname is None and self._name is not None:
self._ctlname = re.sub(r'[^\w]', '', self._name)
return self._ctlname
def _parse_shader_metadata(self):
data_type = self.parsed_data_type()
if data_type == 'xml':
xml = self.parsed_data()
rfmdata = xml.getElementsByTagName('rfmdata')
if rfmdata:
# mandatory attributes: classification
self.classification = rfmdata[0].getAttribute('classification')
# display driver file extension - xml only
self.file_extension = rfmdata[0].getAttribute('fileextension')
if self.file_extension in ('', 'null'):
self.file_extension = None
elif data_type == 'json':
# mandatory attributes: nodeid and classification
jdata = self.parsed_data()
mandatory_attr_list = ['classification']
for attr in mandatory_attr_list:
setattr(self, attr, jdata[attr])
# additional metadata
optional_attr_list = [
('on_create', 'onCreate', []), ('unique', 'unique', False),
('params_only_ae', 'params_only_AE', False)]
for attr, key, default in optional_attr_list:
setattr(self, attr, jdata.get(key, default))
elif data_type == 'oso':
# mandatory attributes: classification
oinfo = self.parsed_data()
meta = {p['name']: p for p in oinfo.shadermetadata()}
self.classification = osl_metadatum(meta, 'rfm_classification')
# categorize osl shaders as patterns by default, if metadata didn't
# say.
if not self.classification:
self.classification = 'rendernode/RenderMan/pattern/'
self.help = osl_metadatum(meta, 'help')
def _backward_compatibility(self):
# in RIS, displacement should translate to displace
# NOTE: is this still useful now that REYES is gone ?
if self.node_type == 'displacement':
self.node_type = 'displace'
def __str__(self):
"""debugging method
Returns:
str -- a human-readable dump of the node.
"""
ostr = 'ShadingNode: %s ------------------------------\n' % self.name
ostr += 'node_type: %s\n' % self.node_type
ostr += 'rman_node_type: %s\n' % self.rman_node_type
ostr += 'nodeid: %s\n' % self.nodeid
ostr += 'classification: %s\n' % self.classification
if hasattr(self, 'help'):
ostr += 'help: %s\n' % self.help
ostr += '\nINPUTS:\n'
for prm in self.params:
ostr += ' %s\n' % prm
ostr += '\nOUTPUTS\n:'
for opt in self.outputs:
ostr += '%s\n' % opt
ostr += '\nATTRIBUTES:\n'
for attr in self.attributes:
ostr += '%s\n' % attr
ostr += '-' * 79
return ostr