В первой строке извлекается список тем, которые присутствуют. Первая из них является активной темой. Из этой темы мы извлекаем пространство
Нашей следующей проблемой будет нарисовать подсветку в форме диска в специфическом месте. Так как размер диска совсем небольшой (его можно скорректировать изменением переменной size), мы можем аппроксимировать его достаточно хорошо формой восьмиугольника. Мы загружаем список координат x и y такого восьмиугольника в список
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 (выделено в предыдущем коде). Мы начинаем с установки режима рисования многоугольника, затем добавляем вершину для каждого кортежа в списке
Вы можете спросить, каким образом эти функции рисования знают, как перевести местоположение в 3D в координаты на экране, и тут есть действительно больше, чем кажется на первый взгляд, как мы увидим в следующей части кода. Необходимая функция, вызываемая для сообщения графической системе, как преобразовать 3D-координаты в координаты экрана, не включена в функцию
Следовательно, мы определяем функцию
def drawAuras(locations,groupname):
viewMatrix = Window.GetPerspMatrix()
viewBuff = [viewMatrix[i][j] for i in xrange(4)
for j in xrange(4)]
viewBuff = BGL.Buffer(BGL.GL_FLOAT, 16, viewBuff)
BGL.glLoadIdentity()
BGL.glMatrixMode(BGL.GL_PROJECTION)
BGL.glLoadMatrixf(viewBuff)
BGL.glColor3f(*color)
for loc in locations:
drawDisk(loc)
n=len(locations)
if n>0:
BGL.glColor3f(*textcolor)
x=sum([l[0] for l in locations])/n
y=sum([l[1] for l in locations])/n
z=sum([l[2] for l in locations])/n
BGL.glRasterPos3f(x+2*size,y,z)
Draw.Text(groupname,'small')