Выбрать главу

Вторая выделенная строка показывает начало кода, который будет выполняться, если мы запускаем скрипт из текстового редактора. Он создаёт строку, состоящую из имен всех групп вершин, связанных с активным объектом, разделенных символами трубы (|) и с добавленным подходящим названием. Эта строка передаётся в функцию PupMenu(), которая отобразит меню, и возвратит выбор пользователя, либо -1, если ничего не было выбрано.

Если была выбрана группа вершин, мы пытаемся извлечь свойство Highlight. Если это получается, мы записываем в данные этого свойства имя выбранной группы вершин. Если свойство еще не существовало, мы добавляем новое с именем Highlight и в качестве данных также присваиваем имя выбранной группы вершин.

Затем мы должны убедиться, что скриптсвязи включены (окно Кнопок | панель Scripts | Scriptlinks. Щелкните на Enable Script Links, если это еще не было сделано). Обратите внимание, что Блендеру все равно, имеем ли мы дело с обработчиками пространства или скриптсвязями, поскольку они включаются одинаково.

Последним шагом в использовании нашего обработчика пространства будет ассоциация его с 3D-видом. Чтобы сделать это, включите галочку Draw: AuraSpaceHandler.py в меню View - Space Handler Scripts окна 3D-вида.

Использование тем

Код, который мы еще не видели, имеет дело с фактическим рисованием подсветки и именем группы вершин, чтобы идентифицировать то, что мы выделяем. Он начинается с определения цвета, который мы используем для подсветки, и текста, извлекая их из текущей темы. Таким образом пользователь может настраивать эти цвета удобным способом из окна Пользовательских настроек:

theme     = Window.Theme.Get()[0]

textcolor = [float(v)/255 for v in theme.get(

             Window.Types.VIEW3D ).text_hi[:3]]

color     = [float(v)/255 for v in

             theme.get(Window.Types.VIEW3D).active[:3]]

В первой строке извлекается список тем, которые присутствуют. Первая из них является активной темой. Из этой темы мы извлекаем пространство VIEW3D, и его атрибут text_hi является списком из четырех целых, представляющим цвет RGBA. Мы удаляем из списка альфа-компоненту и преобразуем его в список трех чисел с плавающей точкой (floats) в дипазоне [0, 1], которые мы используем как цвет нашего текста. Таким же образом мы создаем цвет подсветки из атрибута active.

Нашей следующей проблемой будет нарисовать подсветку в форме диска в специфическом месте. Так как размер диска совсем небольшой (его можно скорректировать изменением переменной size), мы можем аппроксимировать его достаточно хорошо формой восьмиугольника. Мы загружаем список координат x и y такого восьмиугольника в список diskvertices:

size=0.2

diskvertices=[( 0.0, 1.0),( 0.7, 0.7),

              ( 1.0, 0.0),( 0.7,-0.7),

              ( 0.0,-1.0),(-0.7,-0.7),

              (-1.0, 0.0),(-0.7, 0.7)]

def drawDisk(loc):

   BGL.glBegin(BGL.GL_POLYGON)

   for x,y in diskvertices:

      BGL.glVertex3f(loc[0]+x*size,loc[1]+y*size,loc[2])

   BGL.glEnd()

Само рисование восьмиугольника сильно зависит от функций, предоставляемых модулем Блендера BGL (выделено в предыдущем коде). Мы начинаем с установки режима рисования многоугольника, затем добавляем вершину для каждого кортежа в списке diskvertices. Позиция, переданная в функцию drawDisk(), будет центром, а вершины будут целиком лежать в круге с радиусом, равным размеру size. Когда мы вызываем функцию glEnd(), будет нарисован многоугольник, заполненный внутри текущим цветом.

Вы можете спросить, каким образом эти функции рисования знают, как перевести местоположение в 3D в координаты на экране, и тут есть действительно больше, чем кажется на первый взгляд, как мы увидим в следующей части кода. Необходимая функция, вызываемая для сообщения графической системе, как преобразовать 3D-координаты в координаты экрана, не включена в функцию drawDisk() (в предшествующем куске кода). Дело в том, что вычисление этой информации отдельно для каждого диска должно привести к лишней потере в производительности, так как эта информация одинаковая для каждого диска, который мы рисуем.