Node.Socket('color2',
val= [0.0,1.0,0.0,1.0]),
Node.Socket('color3',
val= [0.0,0.0,1.0,1.0]),
Node.Socket('Coords',
val= 3*[1.0])]
sockets.output = [Node.Socket('Color',
val = 4*[1.0])]
Первые несколько строк начинают определение наших входных и выходных сокетов. Выход в любом случае будет просто цветом, но набор входных сокетов у нас более разнообразный. Мы определяем три различных входных цвета, поскольку при заполнении шестиугольниками нужно три цвета, чтобы дать каждому шестиугольнику цвет, отличимый от своего соседа.
Мы также определяем вход
Наконец, мы определяем сокет
Мы заканчиваем нашу функцию
self.cos45 = cos(pi/4)
self.sin45 = sin(pi/4)
self.stretch = 1/sqrt(3.0)
self.cmap = { (0,0):None,(0,1):2, (0,2):0,
(1,0):0, (1,1):1, (1,2):None,
(2,0):2, (2,1):None,(2,2):1 }
Следующим шагом будет определение функции
def __call__(self):
tex_coord = self.input.Coords
# мы игнорируем любую z-координату
x = tex_coord[0]*self.input.scale
y = tex_coord[1]*self.input.scale
c1 = self.input.color1
c2 = self.input.color2
c3 = self.input.color3
col= c1
Функция
if self.input.type<= 1.0:
col = self.triangle(x,y,c1,c2)
elif self.input.type <= 2.0:
col = self.checker(x,y,c1,c2)
else:
col = self.hexagon(x,y,c1,c2,c3)
self.output.Color = col
Все различные функции генерации узоров очень похожи; они берут координаты
def checker(self,x,y,c1,c2):
if int(floor(x%2)) înt(floor(y%2)):
return c1
return c2
Функция
def triangle(self,x,y,c1,c2):
y *= self.stretch
x,y = self.cos45*x - self.sin45*y,
self.sin45*x + self.cos45*y
if int(floor(x%2)) înt(floor(y%2)) ^ \
int(y%2>x%2) : return c1
return c2
Функция
def hexagon(self,x,y,c1,c2,c3):
y *= self.stretch
x,y = self.cos45*x - self.sin45*y,
self.sin45*x + self.cos45*y