Skip to content

Commit e316e51

Browse files
committed
various fixes to make the rivet shader work.
1 parent 48684b0 commit e316e51

File tree

8 files changed

+75
-10
lines changed

8 files changed

+75
-10
lines changed

Nodes.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,33 @@ def AddNodeLink(self, targetNode, targetIndex, sourceNode, SourceIndex):
6868
link = NodeLink(targetNode, targetIndex, sourceNode, SourceIndex)
6969
self.LinkList.append(link)
7070

71+
def prune(self):
72+
return
73+
print("---------prune---------")
74+
while True:
75+
SourceNodes = []
76+
for el in self.LinkList:
77+
if el.SourceNode not in SourceNodes:
78+
SourceNodes.append(el.SourceNode)
79+
80+
DeadNodes = []
81+
for el in self.NodeList:
82+
if el not in SourceNodes:
83+
if (el.Name != "OutputNode"):
84+
DeadNodes.append(el)
85+
print("Dead Nodes : %s" % len(DeadNodes))
86+
for nod in DeadNodes:
87+
print("Dead node : %s " % nod.Name)
88+
TargetLinks = []
89+
for el in self.LinkList:
90+
if el.TargetNode == nod:
91+
TargetLinks.append(el)
92+
for el in TargetLinks:
93+
self.LinkList.remove(el)
94+
self.NodeList.remove(nod)
95+
if (len(DeadNodes)==0):
96+
break
97+
7198
def Nodes(self):
7299
return self.Nodes
73100

@@ -110,15 +137,28 @@ def MakeConst(self, var):
110137
print("Unsupported const type %s(%s)" % (var.Name, var.dataType))
111138

112139
def MakeGlobal(self,var):
113-
node = self.CreateNode('ShaderNodeNewGeometry')
114140
if var.Name=="N":
141+
node = self.CreateNode('ShaderNodeNewGeometry')
115142
self.SetVar(var, node, 1)
116143
elif var.Name=="I":
144+
node = self.CreateNode('ShaderNodeNewGeometry')
117145
self.SetVar(var, node, 4)
118146
elif var.Name=="P":
147+
node = self.CreateNode('ShaderNodeNewGeometry')
119148
self.SetVar(var, node, 0)
120149
elif var.Name=="Ng":
150+
node = self.CreateNode('ShaderNodeNewGeometry')
121151
self.SetVar(var, node, 3)
152+
elif var.Name=="u":
153+
node = self.CreateNode('ShaderNodeTexCoord')
154+
Split = self.CreateNode('ShaderNodeSeparateXYZ')
155+
self.AddNodeLink(Split, 0, node, 0)
156+
self.SetVar(var, Split, 0)
157+
elif var.Name=="v":
158+
node = self.CreateNode('ShaderNodeTexCoord')
159+
Split = self.CreateNode('ShaderNodeSeparateXYZ')
160+
self.AddNodeLink(Split, 0, node, 0)
161+
self.SetVar(var, Split, 1)
122162
else:
123163
print("Unhandled global %s" % var.Name)
124164

OSOInstruction.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import shlex
2+
13
class OSOInstruction():
24
def __init__(self, line, tag):
3-
tokens = line.split()
5+
tokens = shlex.split(line)
6+
tokens = [word for word in tokens if not word.startswith('%meta')]
47
self.Opcode = tokens[0]
58
self.Tag = tag
69
self.Hints = []

OSOReader.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import shlex
12
from .OSOVariable import OSOVariable
23
from .OSOInstruction import OSOInstruction
34
from enum import Enum
@@ -23,15 +24,17 @@ def __init__(self, filename):
2324
self.Instructions.append(inst)
2425

2526
def HandleVersion(self, line):
26-
tokens = line.split()
27+
tokens = shlex.split(line)
2728
if tokens[0] == 'OpenShadingLanguage':
2829
self.Version = tokens[1]
2930
self.ParserState = ParserState.WaitVariablesAndCode
3031
return True
3132
return False
3233

3334
def HandleCode(self, line):
34-
tokens = line.split()
35+
tokens = shlex.split(line)
36+
tokens = [word for word in tokens if not word.startswith('%meta')]
37+
3538
if tokens[0] == 'code':
3639
self.CurrentTag = tokens[1]
3740
else:
@@ -40,7 +43,9 @@ def HandleCode(self, line):
4043
return True
4144

4245
def HandleVariablesAndCode(self, line):
43-
tokens = line.split()
46+
tokens = shlex.split(line)
47+
tokens = [word for word in tokens if not word.startswith('%meta')]
48+
4449
if tokens[0] == 'code':
4550
self.ParserState = ParserState.WaitCode
4651
return self.HandleCode(line)

OSOVariable.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import shlex
12
class OSOVariable():
23
def __init__(self, line):
3-
tokens = line.split()
4+
tokens = shlex.split(line)
45
idx = 2
56
if len(tokens) > 2:
67
self.InitVar = ""

OpcodeBaseTypes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def GeneratePointPoint(self, nodeGraph):
156156
nodeGraph.AddLink(node, 0, self.Source1)
157157
nodeGraph.AddLink(node, 1, self.Source2)
158158
nodeGraph.SetVar(self.Destination, node, 0)
159-
elif self.Operation in ["MULTIPLY" ,"DIVIDE"]:
159+
elif self.Operation in ["MULTIPLY" ,"DIVIDE","MODULO"]:
160160
node1 = nodeGraph.CreateNode('ShaderNodeSeparateXYZ')
161161
nodeGraph.AddLink(node1, 0, self.Source1)
162162
node2 = nodeGraph.CreateNode('ShaderNodeSeparateXYZ')

Opcodes.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,9 @@ def __init__(self, OSO, index):
691691
elif (len(self.Instuction.Parameters) == 2):
692692
self.Source1 = OSOVariable('const string uperlin "uperlin"')
693693
self.Source2 = OSO.GetVariable(self.Instuction.Parameters[1])
694+
if (len(self.Instuction.Parameters) == 4): #TODO: period is ignored.
695+
self.Source1 = OSO.GetVariable(self.Instuction.Parameters[1])
696+
self.Source2 = OSO.GetVariable(self.Instuction.Parameters[2])
694697

695698
def Destination(self):
696699
return self.Destination
@@ -715,7 +718,7 @@ def Generate(self, nodeGraph):
715718
elif (self.Destination.IsPointLike()):
716719
nodeGraph.SetVar(self.Destination, node, 0)
717720

718-
if self.Source1.defaults[0] in ['"perlin"','"snoise"'] :
721+
if self.Source1.defaults[0] in ['"perlin"','"snoise"',"perlin","snoise"] :
719722
node = nodeGraph.CreateNode("ShaderNodeTexNoise")
720723
node.SetProperty("inputs[1].default_value", "1.0")
721724
node.SetProperty("inputs[2].default_value", "0.0")
@@ -780,7 +783,7 @@ def Generate(self, nodeGraph):
780783
else:
781784
print("unknown noise target")
782785

783-
if self.Source1.defaults[0] == '"cell"':
786+
if self.Source1.defaults[0] in ['"cell"','cell'] :
784787
# split the source vector
785788
node = nodeGraph.CreateNode('ShaderNodeSeparateXYZ')
786789
nodeGraph.AddLink(node, 0, self.Source2)

__init__.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
import bpy
33
import nodeitems_utils
44
from nodeitems_utils import NodeCategory, NodeItem
5+
import sys
6+
import importlib
7+
58

69
bl_info = {
710
"name": "OSLPY",
@@ -16,7 +19,16 @@
1619
"wiki_url": "",
1720
"category": "Node"}
1821

19-
22+
modulesNames = ['NodeGroupBuilder', 'Nodes','OpcodeBaseTypes','Opcodes','osl_py_addin','OSOInstruction','OSOReader','OSOVariable','StringBuilder']
23+
24+
modulesFullNames = {}
25+
for currentModuleName in modulesNames:
26+
modulesFullNames[currentModuleName] = ('{}'.format(currentModuleName))
27+
28+
for currentModuleFullName in modulesFullNames.values():
29+
if currentModuleFullName in sys.modules:
30+
importlib.reload(sys.modules[currentModuleFullName])
31+
2032
class ExtraNodesCategory(NodeCategory):
2133
@classmethod
2234
def poll(cls, context):

osl_py_addin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ def UpdateScript(self):
123123
OutputIdx = OutputIdx + 1
124124
# print("Compiled %s", graph.ShaderName)
125125
# print("Generating nodegroup...")
126+
graph.prune()
126127
self.node_tree = CreateNodeGroup(graph, oso.Variables)
127128
for var in oso.Variables:
128129
if var.varType == 'param' and 'oslpy_has_' in var.Name:

0 commit comments

Comments
 (0)