воскресенье, 12 апреля 2015 г.

Есть прогресс с отображением через BGL.

Разобрался с проблемой создания класса, который будет отрисовывать список точек через BGL. Проблема была в том, что раньше я создавал класс каждый раз, когда вызывалось изменение в рисуемой картинке. Теперь вроде бы получается отправлять данные в созданный класс, не громоздя класс над классом. Получившийся вариант скорее подходит для отображения быстро меняющейся обстановки, вроде монитора радара, чем для отображения статичных массивов данных, вроде миникарты. Для миникарты нужно создавать именно что массив обновляемых данных. Бленда не будет, потому что все что нужно- взять объект в сцене, и на сенсор Always повесить контроллер питона с указанием функции init, и на еще один какой-то сенсор, работающий в импульсном режиме, повесить контроллер питона с функцией main. Тем более, что все равно очень сыро. Подсветки синтаксиса тоже не будет.




# -*- coding: utf-8 -*-

import bge
import bgl

class bgl_class(object):
   
    # Инициализируем класс
    def __init__(self):
        # создаем атрибуты высоты и ширины экрана
        self.width = bge.render.getWindowWidth()
        self.height = bge.render.getWindowHeight()
        # атрибут - список/очередь отображения стек
        self.par = []
        # текущая сцена
        scene = bge.logic.getCurrentScene()
        # прописываем в текущую сцену рендер класса
        scene.post_draw.append(self.draw)
       
    # Переключение в Orфографический вид                  
    def OrthoMode(self):
        width = self.width
        height = self.height
        bgl.glMatrixMode(bgl.GL_PROJECTION);
        bgl.glPushMatrix();
        bgl.glLoadIdentity();
        bgl.gluOrtho2D(0, width, 0, height)
        bgl.glMatrixMode(bgl.GL_MODELVIEW);
        bgl.glLoadIdentity();
        bgl.glDisable(bgl.GL_LIGHTING)
       
    # Переключение в перспективный вид
    def PerspectiveMode(self):
        bgl.glMatrixMode( bgl.GL_PROJECTION );
        bgl.glPopMatrix();
        bgl.glMatrixMode( bgl.GL_MODELVIEW );
        bgl.glEnable(bgl.GL_LIGHTING)
   
    # Отрисовка
    def draw(self):
        self.OrthoMode()#установка режима рисования в 2d
        self.drawList() # собственно рисование
        self.PerspectiveMode()# установка режима рисования в 3d
   
    # Рисование полученных объектов
    def drawList(self):
        # Цикл, для ограничения количества итераций, на случай,
        # если данные будут приходить редко и помногу. Совсем необязательно.
        for i in range(0, 50):
            # если стек пуст, то выход из цикла
            if len(self.par) == 0:
                break
            # берем первый элемент стек и извлекаем из него координаты и цвет
            x, y, color = self.par.pop(0)
            # сброс настроек
            bgl.glLoadIdentity()
            # устанавливаем размер точки
            bgl.glPointSize(3)
            # перемещаемся от текущего положения
            bgl.glTranslatef(x, y, 0.0)
            # очищаем экран, заливая его цветом
            bgl.glClearColor(0.0,0.0,0.0,0.0)
            # устанавливаем текущий цвет
            bgl.glColor4f(color[0], color[1], color[2], color[3]);
           
            # начинаем рисовать точку
            bgl.glBegin(bgl.GL_POINTS)
            # Собственно рисование
            bgl.glVertex2f(3, 3)
            # прекращаем рисовать точку
            bgl.glEnd()
        return 0
           
# создание класса
def init(cont):
    cont = bge.logic.getCurrentController()
    own = cont.owner
    # Пишем класс в проперти, надо бы добавить проверку состояния сенсора, что бы
    # два раза класс не создавать
    own['bgl'] = bgl_class()
   
# передача в класс данных для рисования      
def main(cont):
    cont = bge.logic.getCurrentController()
    sens = cont.sensors[0]
    own = cont.owner
    # Создаем или читаем откуда-нибудь список точек, которые нам необходимо
    # отобразить, лучше бы конечно сделать специальные классы
    # [x , y, [color]]
    par = [
           [100.0, 100.0, [255.0,0.0,0.0,255.0]],
           [1.0, 101.0, [255.0,0.0,0.0,255.0]],
           [5.0, 100.0, [0.0,0.0,255.0,255.0]]
             ]
    # чтобы два раза не рисовать
    if sens.positive:
        # добавляем данные поэлементно (а не всем списком) в стек
        own['bgl'].par.extend(par)

Комментариев нет:

Отправить комментарий