Esempio n. 1
0
 def _resize_display(self, width, height):
     """Change the display size."""
     maximised = sdl2.SDL_GetWindowFlags(
         self.display) & sdl2.SDL_WINDOW_MAXIMIZED
     # workaround for maximised state not reporting correctly (at least on Ubuntu Unity)
     # detect if window is very large compared to screen; force maximise if so.
     to_maximised = (width >= 0.95 * self.physical_size[0]
                     and height >= 0.9 * self.physical_size[1])
     if not maximised:
         if to_maximised:
             # force maximise for large windows
             sdl2.SDL_MaximizeWindow(self.display)
         else:
             # regular resize on non-maximised windows
             sdl2.SDL_SetWindowSize(self.display, width, height)
     else:
         # resizing throws us out of maximised mode
         if not to_maximised:
             sdl2.SDL_RestoreWindow(self.display)
     # get window size
     w, h = ctypes.c_int(), ctypes.c_int()
     sdl2.SDL_GetWindowSize(self.display, ctypes.byref(w), ctypes.byref(h))
     self.window_width, self.window_height = w.value, h.value
     self.display_surface = sdl2.SDL_GetWindowSurface(self.display)
     self.screen_changed = True
Esempio n. 2
0
def run():
    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
    window = sdl2.SDL_CreateWindow(b"Hello World", sdl2.SDL_WINDOWPOS_CENTERED,
                                   sdl2.SDL_WINDOWPOS_CENTERED, 592, 460,
                                   sdl2.SDL_WINDOW_SHOWN)
    fname = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                         "resources", "hello.bmp")
    image = sdl2.SDL_LoadBMP(fname.encode("utf-8"))
    windowsurface = sdl2.SDL_GetWindowSurface(window)
    sdl2.SDL_BlitSurface(image, None, windowsurface, None)
    sdl2.SDL_UpdateWindowSurface(window)
    sdl2.SDL_FreeSurface(image)

    running = True
    event = sdl2.SDL_Event()
    while running:
        while sdl2.SDL_PollEvent(ctypes.byref(event)) != 0:
            if event.type == sdl2.SDL_QUIT:
                running = False
                break
        sdl2.SDL_Delay(10)

    sdl2.SDL_DestroyWindow(window)
    sdl2.SDL_Quit()
    return 0
Esempio n. 3
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Fireworks Demo",
            sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED,
            width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load Textures
        texture = loadTexture(b'res/flare.bmp', gl.GL_ALPHA, gl.GL_REPEAT)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(0.001, 0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)

        # the base system
        self.basesystem = BaseSystem(self.height, texture)

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.angleY = 0.0
        self.camPosZ = 5.0
        self.spacePressed = -1.0
        self.systems = []
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks()-1]
        self.lasttime = self.frames[-1]
Esempio n. 4
0
def showImage(image):
    global windowArray, window
    if windowArray is None:
        sdl2.ext.init()
        window = sdl2.ext.Window("test", size=(image.shape[0],image.shape[1]))
        window.show()
        windowSurf = sdl2.SDL_GetWindowSurface(window.window)
        windowArray = sdl2.ext.pixels3d(windowSurf.contents)
    numpy.copyto(windowArray, image)
    window.refresh()
Esempio n. 5
0
def stimDisplayMirrorChildFunction(qTo,
                                   qFrom,
                                   windowSize=[1920 / 2, 1080 / 2],
                                   windowPosition=[0, 0]):
    import sdl2
    import sdl2.ext
    import sys
    import time
    from PIL import Image  #for image manipulation
    try:
        import appnope
        appnope.nope()
    except:
        pass

    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
    window = sdl2.ext.Window("mirror",
                             size=windowSize,
                             position=windowPosition,
                             flags=sdl2.SDL_WINDOW_SHOWN)
    windowID = sdl2.SDL_GetWindowID(window.window)
    windowSurf = sdl2.SDL_GetWindowSurface(window.window)
    windowArray = sdl2.ext.pixels3d(windowSurf.contents)

    sdl2.ext.fill(windowSurf.contents,
                  sdl2.pixels.SDL_Color(r=255, g=255, b=255, a=255))
    window.refresh()

    for i in range(10):
        sdl2.SDL_PumpEvents()  #to show the windows

    def exitSafely():
        sys.exit()

    while True:
        if not qTo.empty():
            message = qTo.get()
            if message == 'quit':
                exitSafely()
            elif message[0] == 'frame':
                # print ['q',time.time()-message[3]] #time spent in queue
                res = message[1]
                buffer = message[2]
                image = Image.fromstring(mode="RGB", size=res, data=buffer)
                image = image.transpose(Image.ROTATE_270)
                # start = time.time()
                # image.thumbnail([res[1]/2,res[0]/2],Image.LANCZOS)
                # print ['resize',time.time()-start]
                windowArray[:, :, 0:3] = image
                window.refresh()
        sdl2.SDL_PumpEvents()
        for event in sdl2.ext.get_events():
            if event.type == sdl2.SDL_WINDOWEVENT:
                if (event.window.event == sdl2.SDL_WINDOWEVENT_CLOSE):
                    exitSafely()
Esempio n. 6
0
def writerChildFunction(qTo,
                        qFrom,
                        windowSize=[200, 200],
                        windowPosition=[0, 0]):
    import sdl2
    import sdl2.ext
    import sys
    import time
    try:
        import appnope
        appnope.nope()
    except:
        pass

    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
    window = sdl2.ext.Window("writer",
                             size=windowSize,
                             position=windowPosition,
                             flags=sdl2.SDL_WINDOW_SHOWN)
    windowID = sdl2.SDL_GetWindowID(window.window)
    windowSurf = sdl2.SDL_GetWindowSurface(window.window)
    sdl2.ext.fill(windowSurf.contents,
                  sdl2.pixels.SDL_Color(r=255, g=255, b=255, a=255))
    window.refresh()

    for i in range(10):
        sdl2.SDL_PumpEvents()  #to show the windows

    files = {}

    def exitSafely():
        try:
            for index, fileObj in files.items():
                fileObj.close()
                # gpg -r "Michael Lawrence <*****@*****.**>" -e mac.txt
        except:
            pass
        sys.exit()

    while True:
        if not qTo.empty():
            message = qTo.get()
            if message == 'quit':
                exitSafely()
            elif message[0] == 'newFile':
                files[message[1]] = open(message[2], 'w')
            elif message[0] == 'write':
                files[message[1]].write(message[2] + '\n')
        else:
            time.sleep(1)
        sdl2.SDL_PumpEvents()
        for event in sdl2.ext.get_events():
            if event.type == sdl2.SDL_WINDOWEVENT:
                if (event.window.event == sdl2.SDL_WINDOWEVENT_CLOSE):
                    exitSafely()
Esempio n. 7
0
 def _do_create_window(self, width, height):
     """Create a new SDL window """
     flags = sdl2.SDL_WINDOW_RESIZABLE | sdl2.SDL_WINDOW_SHOWN
     if self.fullscreen:
          flags |= sdl2.SDL_WINDOW_FULLSCREEN_DESKTOP | sdl2.SDL_WINDOW_BORDERLESS
     sdl2.SDL_DestroyWindow(self.display)
     self.display = sdl2.SDL_CreateWindow(self.caption,
                 sdl2.SDL_WINDOWPOS_CENTERED, sdl2.SDL_WINDOWPOS_CENTERED,
                 width, height, flags)
     self._set_icon()
     self.display_surface = sdl2.SDL_GetWindowSurface(self.display)
     self.screen_changed = True
     self.window_width, self.window_height = width, height
Esempio n. 8
0
 def __init__(self):
     self.windowSize = (960, 720)
     # initialize sdl2 game window
     sdl2.ext.init()
     self.window = sdl2.ext.Window("test", size=self.windowSize)
     self.window.show()
     windowSurf = sdl2.SDL_GetWindowSurface(self.window.window)
     self.windowArray = sdl2.ext.pixels3d(windowSurf.contents)
     self.image = None
     # Init Tello object that interacts with the Tello drone
     self.drone = Drone()
     self.mode = None
     self.yolo_initialized = False
     self.tracker_initialized = False
     self.face_finder_initialized = False
     self.FPS = 25
     self.follow_obj = "person"
     self.yolo_tracker_sync_time = 4  # time to run yolo once every _3_ sec
     self.yolo_tracker_last_sync = time.time()
     logger.info("Game Initialized")
Esempio n. 9
0
    def show(self):
        # Init video
        global HAS_INIT_SDL_VIDEO
        if not HAS_INIT_SDL_VIDEO:
            self._no_error(sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO))
        else:
            HAS_INIT_SDL_VIDEO = True

        # Create window
        self._window = self._no_null(
            sdl2.SDL_CreateWindow(b"FGAme Game", sdl2.SDL_WINDOWPOS_CENTERED,
                                  sdl2.SDL_WINDOWPOS_CENTERED, self.width,
                                  self.height, sdl2.SDL_WINDOW_SHOWN))
        self._surface = sdl2.SDL_GetWindowSurface(self._window)

        # Create a renderer
        # flags = sdl2.SDL_RENDERER_SOFTWARE
        # flags = sdl2.SDL_RENDERER_ACCELERATED
        # flags = sdl2.SDL_RENDERER_PRESENTVSYNC
        flags = sdl2.SDL_RENDERER_ACCELERATED | sdl2.SDL_RENDERER_PRESENTVSYNC
        self._renderer = self._no_null(
            sdl2.SDL_CreateRenderer(self._window, -1, flags))

        # Create a rect instance that stores the window shape
        self._screen_rect = self._no_null(
            sdl2.SDL_Rect(x=0, y=0, w=self.width, h=self.height))

        # Saves background color
        if self.background is not None:
            R, B, G, A = Color(self.background)
            self._bg_color = (R << 24) + (G << 16) + (B << 8) + A
        else:
            self._bg_color = None
        self._LP_short = gfx.aapolygonRGBA.argtypes[1]

        # Flip image
        self.flip()
Esempio n. 10
0
def labjackChildFunction(qTo,
                         qFrom,
                         windowSize=[200, 200],
                         windowPosition=[0, 0]):
    import sdl2
    import sdl2.ext
    import sys
    import time
    try:
        import appnope
        appnope.nope()
    except:
        pass

    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
    window = sdl2.ext.Window("labjack",
                             size=windowSize,
                             position=windowPosition,
                             flags=sdl2.SDL_WINDOW_SHOWN)
    windowID = sdl2.SDL_GetWindowID(window.window)
    windowSurf = sdl2.SDL_GetWindowSurface(window.window)
    sdl2.ext.fill(windowSurf.contents,
                  sdl2.pixels.SDL_Color(r=255, g=255, b=255, a=255))
    window.refresh()

    for i in range(10):
        sdl2.SDL_PumpEvents()  #to show the windows

    import u3

    d = u3.U3()
    d.configU3()
    d.getCalibrationData()
    d.configAnalog(u3.FIO0)
    checkForNextZeroTime = False
    checkForTrialNextZeroTime = False

    def exitSafely():
        d.close()
        sys.exit()

    sendTriggers = False
    while True:
        if sendTriggers:
            if not checkForNextZeroTime:
                temp = d.getAIN(0)
                # print temp
                if temp > .5:  #photosensor surpasses criterion
                    d.getFeedback(u3.BitStateWrite(IONumber=8, State=1))
                    nextZeroTime = time.time(
                    ) + .010  #wait 10ms before setting the state back to zero, giving the amp time to pick it up
                    checkForNextZeroTime = True
            else:
                if time.time() >= nextZeroTime:  #time to turn the bit back off
                    d.getFeedback(u3.BitStateWrite(IONumber=8, State=0))
                    checkForNextZeroTime = False
            if checkForTrialNextZeroTime:
                if time.time() >= trialNextZeroTime:
                    d.getFeedback(u3.BitStateWrite(IONumber=9, State=0))
                    checkForTrialNextZeroTime = False
        if not qTo.empty():
            message = qTo.get()
            if message == 'quit':
                exitSafely()
            elif message == 'trialDone':
                sendTriggers = False
                checkForTrialNextZeroTime = False
                checkForNextZeroTime = False
                d.getFeedback(u3.BitStateWrite(
                    IONumber=8, State=0))  #should be zero, but just in case...
                d.getFeedback(u3.BitStateWrite(
                    IONumber=9, State=0))  #should be zero, but just in case...
            elif message == 'trialStart':
                sendTriggers = True
                d.getFeedback(u3.BitStateWrite(IONumber=9, State=1))
                trialNextZeroTime = time.time(
                ) + .010  #wait 10ms before setting the state back to zero, giving the amp time to pick it up
                checkForTrialNextZeroTime = True
        sdl2.SDL_PumpEvents()
        for event in sdl2.ext.get_events():
            if event.type == sdl2.SDL_WINDOWEVENT:
                if (event.window.event == sdl2.SDL_WINDOWEVENT_CLOSE):
                    exitSafely()
Esempio n. 11
0
def eyelinkChildFunction(qTo,
                         qFrom,
                         windowSize=[200, 200],
                         windowPosition=[0, 0],
                         stimDisplayRes=[1920, 1080],
                         calibrationDisplaySize=[1920, 1080],
                         calibrationDotSize=10,
                         eyelinkIp='100.1.1.1',
                         edfFileName='temp.edf',
                         edfPath='./_Data/temp.edf',
                         saccadeSoundFile='_Stimuli/stop.wav',
                         blinkSoundFile='_Stimuli/stop.wav'):
    import sdl2
    import sdl2.ext
    import math
    import OpenGL.GL as gl
    import sdl2.sdlmixer
    import pylink
    import numpy
    import sys
    import shutil
    import subprocess
    import time
    import os
    import array
    from PIL import Image
    from PIL import ImageDraw
    try:
        import appnope
        appnope.nope()
    except:
        pass

    byteify = lambda x, enc: x.encode(enc)

    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
    window = sdl2.ext.Window("eyelink",
                             size=windowSize,
                             position=windowPosition,
                             flags=sdl2.SDL_WINDOW_SHOWN)
    windowID = sdl2.SDL_GetWindowID(window.window)
    windowSurf = sdl2.SDL_GetWindowSurface(window.window)
    sdl2.ext.fill(windowSurf.contents,
                  sdl2.pixels.SDL_Color(r=0, g=0, b=0, a=255))
    window.refresh()

    for i in range(10):
        sdl2.SDL_PumpEvents()  #to show the windows

    sdl2.SDL_Init(sdl2.SDL_INIT_AUDIO)
    sdl2.sdlmixer.Mix_OpenAudio(44100, sdl2.sdlmixer.MIX_DEFAULT_FORMAT, 2,
                                1024)

    class Sound:
        def __init__(self, fileName):
            self.sample = sdl2.sdlmixer.Mix_LoadWAV(
                sdl2.ext.compat.byteify(fileName, "utf-8"))
            self.started = False

        def play(self):
            self.channel = sdl2.sdlmixer.Mix_PlayChannel(-1, self.sample, 0)
            self.started = True

        def stillPlaying(self):
            if self.started:
                if sdl2.sdlmixer.Mix_Playing(self.channel):
                    return True
                else:
                    self.started = False
                    return False
            else:
                return False

    saccadeSound = Sound(saccadeSoundFile)
    blinkSound = Sound(blinkSoundFile)

    def exitSafely():
        if 'eyelink' in locals():
            if eyelink.isRecording() == 0:
                eyelink.stopRecording()
            eyelink.setOfflineMode()
            eyelink.closeDataFile()
            eyelink.receiveDataFile(edfFileName, 'temp.edf')
            eyelink.close()
            if os.path.isfile('temp.edf'):
                shutil.move('temp.edf', edfPath)
                # if os.path.isfile(edfPath):
                # 	subprocess.call('./edf2asc -y ./'+edfPath,shell=True)
        sys.exit(
        )  #process gets hung here if called when showing images from eyelink

    pylink.setDriftCorrectSounds('off', 'off', 'off')
    pylink.setCalibrationSounds('off', 'off', 'off')

    edfPath = './_Data/temp.edf'  #temporary default location, to be changed later when ID is established
    done = False
    while not done:
        try:
            # print '\neyelink: Attempting to connect to eyelink (check that wifi is off!)'
            eyelink = pylink.EyeLink(eyelinkIp)
            done = True
        except:
            while not qTo.empty():
                message = qTo.get()
                if message == 'quit':
                    exitSafely()
                else:
                    qTo.put(message)

    # print 'eyelink: connected'
    eyelink.sendCommand(
        'select_parser_configuration 0'
    )  # 0--> standard (cognitive); 1--> sensitive (psychophysical)
    # eyelink.sendCommand('sample_rate 500')
    eyelink.setLinkEventFilter("SACCADE,BLINK,FIXATION,LEFT,RIGHT")
    eyelink.openDataFile(edfFileName)
    eyelink.sendCommand(
        "screen_pixel_coords =  %d %d %d %d" %
        (stimDisplayRes[0] / 2 - calibrationDisplaySize[0] / 2,
         stimDisplayRes[1] / 2 - calibrationDisplaySize[1] / 2,
         stimDisplayRes[0] / 2 + calibrationDisplaySize[0] / 2,
         stimDisplayRes[1] / 2 + calibrationDisplaySize[1] / 2))
    eyelink.sendMessage("DISPLAY_COORDS  0 0 %d %d" %
                        (stimDisplayRes[0], stimDisplayRes[1]))
    eyelink.sendCommand("saccade_velocity_threshold = 60")
    eyelink.sendCommand("saccade_acceleration_threshold = 19500")

    class EyeLinkCoreGraphicsPySDL2(pylink.EyeLinkCustomDisplay):
        def __init__(self):
            # self.__target_beep__ = Sound('_Stimuli/type.wav')
            # self.__target_beep__done__ = Sound('qbeep.wav')
            # self.__target_beep__error__ = Sound('error.wav')
            if sys.byteorder == 'little':
                self.byteorder = 1
            else:
                self.byteorder = 0
            self.imagebuffer = array.array('I')
            self.pal = None
            self.__img__ = None

        def record_abort_hide(self):
            pass

        def play_beep(self, beepid):
            pass
            # if beepid == pylink.DC_TARG_BEEP or beepid == pylink.CAL_TARG_BEEP:
            # 	self.__target_beep__.play()
            # elif beepid == pylink.CAL_ERR_BEEP or beepid == pylink.DC_ERR_BEEP:
            # 	self.__target_beep__error__.play()
            # else:#	CAL_GOOD_BEEP or DC_GOOD_BEEP
            # 	self.__target_beep__done__.play()
        def clear_cal_display(self):
            # # print 'clear_cal_display'
            qFrom.put('clearCalDisplay')

        def setup_cal_display(self):
            # # print 'setup_cal_display'
            qFrom.put('setupCalDisplay')

        def exit_cal_display(self):
            # # print 'exit_cal_display'
            qFrom.put('exitCalDisplay')

        def erase_cal_target(self):
            # # print 'erase_cal_target'
            qFrom.put('eraseCalTarget')

        def draw_cal_target(self, x, y):
            # # print 'draw_cal_target'
            qFrom.put(['drawCalTarget', x, y])

        def setup_image_display(self, width, height):
            # # print 'eyelink: setup_image_display'
            self.img_size = (width, height)
            return (0)

        def exit_image_display(self):
            # # print 'eyelink: exit_image_display'
            pass

        def image_title(self, text):
            # # print 'eyelink: image_title'
            pass

        def set_image_palette(self, r, g, b):
            # # print 'eyelink: set_image_palette'
            self.imagebuffer = array.array('I')
            sz = len(r)
            i = 0
            self.pal = []
            while i < sz:
                rf = int(b[i])
                gf = int(g[i])
                bf = int(r[i])
                if self.byteorder:
                    self.pal.append((rf << 16) | (gf << 8) | (bf))
                else:
                    self.pal.append(
                        (bf << 24) | (gf << 16) | (rf << 8))  #for mac
                i = i + 1

        def draw_image_line(self, width, line, totlines, buff):
            # # print 'eyelink: draw_image_line'
            i = 0
            while i < width:
                if buff[i] >= len(self.pal):
                    buff[i] = len(self.pal) - 1
                self.imagebuffer.append(self.pal[buff[i] & 0x000000FF])
                i = i + 1
            if line == totlines:
                img = Image.fromstring('RGBX', (width, totlines),
                                       self.imagebuffer.tostring())
                img = img.convert('RGBA')
                self.__img__ = img.copy()
                self.__draw__ = ImageDraw.Draw(self.__img__)
                self.draw_cross_hair(
                )  #inherited method, calls draw_line and draw_losenge
                qFrom.put([
                    'image',
                    numpy.array(
                        self.__img__.resize([
                            self.__img__.size[0] * 4, self.__img__.size[1] * 4
                        ], Image.BICUBIC))
                ])
                self.__img__ = None
                self.__draw__ = None
                self.imagebuffer = array.array('I')

        def getColorFromIndex(self, colorindex):
            if colorindex == pylink.CR_HAIR_COLOR: return (255, 255, 255, 255)
            elif colorindex == pylink.PUPIL_HAIR_COLOR:
                return (255, 255, 255, 255)
            elif colorindex == pylink.PUPIL_BOX_COLOR:
                return (0, 255, 0, 255)
            elif colorindex == pylink.SEARCH_LIMIT_BOX_COLOR:
                return (255, 0, 0, 255)
            elif colorindex == pylink.MOUSE_CURSOR_COLOR:
                return (255, 0, 0, 255)
            else:
                return (0, 0, 0, 0)

        def draw_line(self, x1, y1, x2, y2, colorindex):
            # # print 'eyelink: draw_line'
            if x1 < 0: x1 = 0
            if x2 < 0: x2 = 0
            if y1 < 0: y1 = 0
            if y2 < 0: y2 = 0
            if x1 > self.img_size[0]: x1 = self.img_size[0]
            if x2 > self.img_size[0]: x2 = self.img_size[0]
            if y1 > self.img_size[1]: y1 = self.img_size[1]
            if y2 > self.img_size[1]: y2 = self.img_size[1]
            imr = self.__img__.size
            x1 = int((float(x1) / float(self.img_size[0])) * imr[0])
            x2 = int((float(x2) / float(self.img_size[0])) * imr[0])
            y1 = int((float(y1) / float(self.img_size[1])) * imr[1])
            y2 = int((float(y2) / float(self.img_size[1])) * imr[1])
            color = self.getColorFromIndex(colorindex)
            self.__draw__.line([(x1, y1), (x2, y2)], fill=color)
            return 0

        def draw_lozenge(self, x, y, width, height, colorindex):
            # # print 'eyelink: draw_lozenge'
            color = self.getColorFromIndex(colorindex)
            imr = self.__img__.size
            x = int((float(x) / float(self.img_size[0])) * imr[0])
            width = int((float(width) / float(self.img_size[0])) * imr[0])
            y = int((float(y) / float(self.img_size[1])) * imr[1])
            height = int((float(height) / float(self.img_size[1])) * imr[1])
            if width > height:
                rad = height / 2
                self.__draw__.line([(x + rad, y), (x + width - rad, y)],
                                   fill=color)
                self.__draw__.line([(x + rad, y + height),
                                    (x + width - rad, y + height)],
                                   fill=color)
                clip = (x, y, x + height, y + height)
                self.__draw__.arc(clip, 90, 270, fill=color)
                clip = ((x + width - height), y, x + width, y + height)
                self.__draw__.arc(clip, 270, 90, fill=color)
            else:
                rad = width / 2
                self.__draw__.line([(x, y + rad), (x, y + height - rad)],
                                   fill=color)
                self.__draw__.line([(x + width, y + rad),
                                    (x + width, y + height - rad)],
                                   fill=color)
                clip = (x, y, x + width, y + width)
                self.__draw__.arc(clip, 180, 360, fill=color)
                clip = (x, y + height - width, x + width, y + height)
                self.__draw__.arc(clip, 360, 180, fill=color)
            return 0

        def get_mouse_state(self):
            # pos = pygame.mouse.get_pos()
            # state = pygame.mouse.get_pressed()
            # return (pos,state[0])
            pass

        def get_input_key(self):
            ky = []
            while not qTo.empty():
                message = qTo.get()
                # print 'eyelink: '
                # print message
                if message == 'button':
                    ky.append(
                        pylink.KeyInput(32, 0)
                    )  #button translated to space keypress (for drift correct)
                # if message=='quit':
                # 	# print 'received message to exit'
                # 	exitSafely()
                # el
                elif message[0] == 'keycode':
                    keysym = message[1]
                    keycode = keysym.sym
                    if keycode == sdl2.SDLK_F1: keycode = pylink.F1_KEY
                    elif keycode == sdl2.SDLK_F2: keycode = pylink.F2_KEY
                    elif keycode == sdl2.SDLK_F3: keycode = pylink.F3_KEY
                    elif keycode == sdl2.SDLK_F4: keycode = pylink.F4_KEY
                    elif keycode == sdl2.SDLK_F5: keycode = pylink.F5_KEY
                    elif keycode == sdl2.SDLK_F6: keycode = pylink.F6_KEY
                    elif keycode == sdl2.SDLK_F7: keycode = pylink.F7_KEY
                    elif keycode == sdl2.SDLK_F8: keycode = pylink.F8_KEY
                    elif keycode == sdl2.SDLK_F9: keycode = pylink.F9_KEY
                    elif keycode == sdl2.SDLK_F10: keycode = pylink.F10_KEY
                    elif keycode == sdl2.SDLK_PAGEUP: keycode = pylink.PAGE_UP
                    elif keycode == sdl2.SDLK_PAGEDOWN:
                        keycode = pylink.PAGE_DOWN
                    elif keycode == sdl2.SDLK_UP:
                        keycode = pylink.CURS_UP
                    elif keycode == sdl2.SDLK_DOWN:
                        keycode = pylink.CURS_DOWN
                    elif keycode == sdl2.SDLK_LEFT:
                        keycode = pylink.CURS_LEFT
                    elif keycode == sdl2.SDLK_RIGHT:
                        keycode = pylink.CURS_RIGHT
                    elif keycode == sdl2.SDLK_BACKSPACE:
                        keycode = ord('\b')
                    elif keycode == sdl2.SDLK_RETURN:
                        keycode = pylink.ENTER_KEY
                    elif keycode == sdl2.SDLK_ESCAPE:
                        keycode = pylink.ESC_KEY
                    elif keycode == sdl2.SDLK_TAB:
                        keycode = ord('\t')
                    elif keycode == pylink.JUNK_KEY:
                        keycode = 0
                    ky.append(pylink.KeyInput(keycode, keysym.mod))
            return ky

    customDisplay = EyeLinkCoreGraphicsPySDL2()
    pylink.openGraphicsEx(customDisplay)
    newGazeTarget = False
    gazeTarget = numpy.array(calibrationDisplaySize) / 2.0
    gazeTargetCriterion = calibrationDotSize
    doSounds = False
    reportSaccades = False
    reportBlinks = False
    lastMessageTime = time.time()
    lastStartBlinkTime = time.time()
    while True:
        sdl2.SDL_PumpEvents()
        for event in sdl2.ext.get_events():
            if event.type == sdl2.SDL_WINDOWEVENT:
                if (event.window.event == sdl2.SDL_WINDOWEVENT_CLOSE):
                    exitSafely()
        if not qTo.empty():
            message = qTo.get()
            if message == 'quit':
                exitSafely()
            elif message[0] == 'edfPath':
                edfPath = message[1]
            elif message[0] == 'doSounds':
                doSounds = message[1]
            elif message[0] == 'reportSaccades':
                reportSaccades = message[1]
            elif message[0] == 'reportBlinks':
                reportBlinks = message[1]
            elif message[0] == 'sendMessage':
                eyelink.sendMessage(message[1])
            elif message[0] == 'doDriftCorrect':
                # print 'eyelink: drift correct requested'
                if eyelink.isRecording() == 0:
                    eyelink.stopRecording()
                try:
                    location = message[1]
                    error = eyelink.doDriftCorrect(location[0], location[1], 0,
                                                   1)
                    # print error
                    # print 'eyelink: drift correct attempted'
                    if error != 27:
                        qFrom.put('driftCorrectComplete')
                    else:
                        qFrom.put('doCalibration')
                except:
                    qFrom.put('doCalibration')
            elif message == 'startRecording':
                # print 'eyelink: received message to begin recording'
                eyelink.startRecording(
                    1, 1, 1, 1
                )  #this retuns immediately takes 10-30ms to actually kick in on the tracker
                while not (eyelink.isRecording() == 0):
                    pass
                    # print eyelink.isRecording()
                qFrom.put('recordingStarted')
            elif message[0] == 'newGazeTarget':
                # # print message
                newGazeTarget = True
                gazeTarget = numpy.array(message[1])
                gazeTargetCriterion = numpy.array(message[2])
                # # print message
                # # print 'waiting for gaze confirmation'
            elif message[0] == 'acceptTrigger':
                eyelink.accept_trigger()
            elif message == 'doCalibration':
                doSounds = False
                if eyelink.isRecording() == 0:
                    eyelink.stopRecording()
                eyelink.doTrackerSetup()
                # # print 'calComplete'
                qFrom.put('calibrationComplete')
        if eyelink.isRecording(
        ) == 0:  #stupid, I know, but eyelink.isRecording() returns 0 if it *is* indeed recording!
            eyeData = eyelink.getNextData()
            # if eyeData==pylink.SAMPLE_TYPE:
            # 	eyeSample = eyelink.getFloatData()
            # 	gaze = None
            # 	if eyeSample.isRightSample():
            # 		gaze = eyeSample.getRightEye().getGaze()
            # 	elif eyeSample.isLeftSample():
            # 		gaze = eyeSample.getLeftEye().getGaze()
            # 	if gaze!=None:
            # 		if gaze[0]!=-32768.0:
            # 			gazeDistFromGazeTarget = numpy.linalg.norm(numpy.array(gaze)-gazeTarget)
            # 			if newGazeTarget:
            # 				if gazeDistFromGazeTarget<gazeTargetCriterion:
            # 					# print ['gazeTargetMet',gaze,gazeTargetCriterion,gazeTarget,gazeDistFromGazeTarget]
            # 					qFrom.put(['gazeTargetMet',gazeTarget])
            # 					newGazeTarget = False
            # 				else:
            # 					qFrom.put(['gazeTargetNotMet',gazeTarget])
            # 					# print ['gazeTargetNotMet',gaze,gazeTarget,gazeDistFromGazeTarget,gazeTargetCriterion]
            if eyeData == pylink.ENDSACC:
                eyeSample = eyelink.getFloatData()
                gazeStartTime = eyeSample.getStartTime()
                gazeStart = eyeSample.getStartGaze()
                gazeEnd = eyeSample.getEndGaze()
                # # print ['eyelink: saccade',gazeStart,gazeEnd]
                if (gazeStart[0] != -32768.0) & (gazeEnd[0] != -32768.0):
                    gazeDistFromGazeTarget = numpy.linalg.norm(
                        numpy.array(gazeEnd) - gazeTarget)
                    if gazeDistFromGazeTarget < 1000:
                        if newGazeTarget:
                            # # print [gazeDistFromGazeTarget,gazeTargetCriterion,gazeTarget,gazeEnd]
                            if gazeDistFromGazeTarget < gazeTargetCriterion:
                                # # print ['gazeTargetMet',gazeEnd,gazeTargetCriterion,gazeTarget,gazeDistFromGazeTarget]
                                qFrom.put([
                                    'gazeTargetMet', gazeTarget, gazeStartTime
                                ])
                                newGazeTarget = False
                                # # print 'gazeTargetMet'
                        elif gazeDistFromGazeTarget > gazeTargetCriterion:
                            if reportSaccades:
                                qFrom.put(['gazeTargetLost', gazeTarget])
                                # # print ['gazeTargetLost',gazeTarget]
                            if (not saccadeSound.stillPlaying()) and (
                                    not blinkSound.stillPlaying()):
                                if doSounds:
                                    saccadeSound.play()
            elif eyeData == pylink.STARTBLINK:
                # 	lastStartBlinkTime = time.time()
                # elif eyeData==pylink.ENDBLINK:
                # 	if (time.time()-lastStartBlinkTime)>.1:
                if reportBlinks:
                    qFrom.put('blink')
                    # # print 'eyelink: blink'
                if (not saccadeSound.stillPlaying()) and (
                        not blinkSound.stillPlaying()):
                    if doSounds:
                        #blinkSound.play()
                        qFrom.put('blink')
Esempio n. 12
0
    """
    Gets details of window position by title text. [Windows Only]
    """
    def _window_callback(hwnd, all_windows):
        all_windows.append((hwnd, win32gui.GetWindowText(hwnd)))

    windows = []
    win32gui.EnumWindows(_window_callback, windows)
    if exact:
        return [hwnd for hwnd, title in windows if title_text == title]
    else:
        return [hwnd for hwnd, title in windows if title_text in title]


sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)

#window_handle = get_windows_bytitle("Dwarf Fortress", True)
window_handle = get_windows_bytitle("Untitled", False)

df_window = sdl2.SDL_CreateWindowFrom(window_handle[0])
df_sur = sdl2.SDL_GetWindowSurface(df_window)
save_sur = sdl2.SDL_CreateRGBSurface(0, df_sur[0].w, df_sur[0].h, 32, 0, 0, 0,
                                     0)
#result = sdl2.SDL_SaveBMP(save_sur,'test.bmp')
result = sdl2.SDL_SaveBMP(df_sur, 'test.bmp')
print result
sdl2.SDL_FreeSurface(df_sur)
print(sdl2.SDL_GetError())

sys.exit()
Esempio n. 13
0
        else:

            print('mode 2: basic rgb rendering (slow)...')

            # mode 2
            m.addScaler(vstream, *size)

    else:

        print('mode 3: software rendering (very slow)...')

        # mode 3
        m.addScaler(vstream, *size)

        sdl2.SDL_DestroyRenderer(renderer)
        windowSurface = sdl2.SDL_GetWindowSurface(window)

    print('Press Esc to quit...')

    running = True
    event = sdl2.SDL_Event()
    while running:

        # process events...
        while sdl2.SDL_PollEvent(ctypes.byref(event)) != 0:
            keySim = event.key.keysym.sym
            if (event.type == sdl2.SDL_KEYDOWN and keySim == sdl2.SDLK_ESCAPE) or\
                    event.type == sdl2.SDL_QUIT:
                running = False
                break
Esempio n. 14
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Galaxy Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        gl.glEnable(gl.GL_DEPTH_TEST)
        # load Textures
        texture = loadTexture(b'res/flare.bmp', gl.GL_ALPHA, gl.GL_CLAMP)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useRealStep()  # no adjustment
        # create Renderer
        renderer = GLQuadRenderer.create()  # type: GLQuadRenderer
        renderer.setTexturingMode(spk.TEXTURE_2D)
        renderer.setTexture(texture)
        renderer.setTextureBlending(gl.GL_MODULATE)
        renderer.setScale(0.05, 0.05)
        renderer.setBlending(spk.BLENDING_ADD)
        renderer.enableRenderingHint(spk.DEPTH_WRITE, False)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        galaxy_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | spk.FLAG_SIZE
        galaxy_mutable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE
        galaxy_random = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_SIZE
        galaxy_interpolated = spk.FLAG_ALPHA
        galaxyModel = spk.Model.create(galaxy_enable, galaxy_mutable,
                                       galaxy_random,
                                       galaxy_interpolated)  # type: spk.Model
        galaxyModel.setParam(spk.PARAM_RED, 0.0, 0.3, 0.5, 0.5)
        galaxyModel.setParam(spk.PARAM_GREEN, 0.0, 0.3, 0.5, 0.5)
        galaxyModel.setParam(spk.PARAM_BLUE, 1.0, 0.1)
        galaxyModel.setParam(spk.PARAM_SIZE, 0.1, 5.0)
        galaxyModel.setLifeTime(35.0, 40.0)
        ip_alpha = galaxyModel.getInterpolator(spk.PARAM_ALPHA)
        ip_alpha.addEntry(0.0, 0.0)
        ip_alpha.addEntry(0.95, 0.6, 1.0)
        ip_alpha.addEntry(1.0, 0.0)
        star_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | spk.FLAG_SIZE
        star_mutable = spk.FLAG_NONE
        star_random = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_ALPHA | spk.FLAG_SIZE
        starModel = spk.Model.create(star_enable, star_mutable,
                                     star_random)  # type: spk.Model
        starModel.setParam(spk.PARAM_RED, 0.8, 1.0)
        starModel.setParam(spk.PARAM_GREEN, 0.4, 1.0)
        starModel.setParam(spk.PARAM_BLUE, 0.8, 1.0)
        starModel.setParam(spk.PARAM_ALPHA, 0.2, 1.0)
        starModel.setParam(spk.PARAM_SIZE, 0.1, 5.0)
        starModel.setImmortal(True)
        # create Emitter
        # 2 emitters in diagonal lines on Y=0 plane
        lineEmitter1 = spk.RandomEmitter.create()  # type: spk.RandomEmitter
        lineEmitter1.setZone(
            spk.Line.create(spk.Vector3D(-2.5, 0.0, -2.5),
                            spk.Vector3D(2.5, 0.0, 2.5)))
        lineEmitter1.setFlow(100)
        lineEmitter1.setForce(0.0, 0.01)
        lineEmitter2 = spk.RandomEmitter.create()
        lineEmitter2.setZone(
            spk.Line.create(spk.Vector3D(-2.5, 0.0, 2.5),
                            spk.Vector3D(2.5, 0.0, -2.5)))
        lineEmitter2.setFlow(100)
        lineEmitter2.setForce(0.0, 0.01)
        # create Modifier
        vortex = spk.Vortex.create()  # type: spk.Vortex
        vortex.setRotationSpeed(0.4,
                                False)  # True->[rad/sec], False->[unit/src]
        vortex.setAttractionSpeed(0.04, True)
        vortex.setEyeRadius(0.05)
        vortex.enableParticleKilling(True)  # kill attracted particles
        # create Group
        galaxyGroup = spk.Group.create(galaxyModel, 8000)  # type: spk.Group
        galaxyGroup.addEmitter(lineEmitter1)
        galaxyGroup.addEmitter(lineEmitter2)
        galaxyGroup.setRenderer(renderer)
        galaxyGroup.addModifier(vortex)
        self.galaxyGroup = galaxyGroup
        starGroup = spk.Group.create(starModel, 1000)
        starGroup.setRenderer(renderer)
        skySphere = spk.Sphere(spk.Vector3D(), 16.0)
        starGroup.addParticles(1000,
                               zone=skySphere,
                               velocity=spk.Vector3D(),
                               full=False)
        starGroup.flushAddedParticles()
        # create System
        galaxySystem = spk.System.create()  # type: spk.System
        galaxySystem.addGroup(galaxyGroup)
        self.galaxySystem = galaxySystem
        starSystem = spk.System.create()
        starSystem.addGroup(starGroup)
        self.starSystem = starSystem

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.renderEnv = True
        self.angleY = 0.0
        self.angleX = 45.0
        self.camPosZ = 5.0
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 15
0
def calibrationChildFunction(qTo,
                             qFrom,
                             viewingDistance=100,
                             stimDisplayWidth=100,
                             stimDisplayRes=(2560, 1440),
                             stimDisplayPosition=(-2560, 0),
                             mirrorDisplayPosition=(0, 0),
                             calibrationDotSizeInDegrees=1,
                             timestampMethod=0,
                             mirrorDownSize=2,
                             manualCalibrationOrder=True):
    import numpy  #for image and display manipulation
    import scipy.misc  #for image and display manipulation
    import math  #for trig and other math stuff
    import sys  #for quitting
    import sdl2
    import sdl2.ext
    import random

    #set the getTime function
    if (timestampMethod == 0) or (timestampMethod == 1):
        #initialize timer
        sdl2.SDL_Init(sdl2.SDL_INIT_TIMER)
        if timestampMethod == 0:
            #define a function to use the high-precision timer, returning a float in seconds
            def getTime():
                return sdl2.SDL_GetPerformanceCounter(
                ) * 1.0 / sdl2.SDL_GetPerformanceFrequency()

        elif timestampMethod == 1:
            #use the SDL_GetTicks timer
            def getTime():
                return sdl2.SDL_GetTicks() / 1000.0
    elif timestampMethod == 2:
        #use time.time()
        import time
        getTime = time.time

    #initialize video
    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
    sdl2.SDL_SetHint("SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS", "0")
    mirrorDisplay = sdl2.ext.Window("Mirror",
                                    size=(stimDisplayRes[0] / mirrorDownSize,
                                          stimDisplayRes[1] / mirrorDownSize),
                                    position=mirrorDisplayPosition,
                                    flags=sdl2.SDL_WINDOW_SHOWN)
    mirrorDisplaySurf = sdl2.SDL_GetWindowSurface(mirrorDisplay.window)
    mirrorDisplayArray = sdl2.ext.pixels3d(mirrorDisplaySurf.contents)
    # stimDisplay = sdl2.ext.Window("Calibration",size=stimDisplayRes,position=stimDisplayPosition,flags=sdl2.SDL_WINDOW_SHOWN|sdl2.SDL_WINDOW_FULLSCREEN_DESKTOP|sdl2.SDL_RENDERER_ACCELERATED | sdl2.SDL_RENDERER_PRESENTVSYNC)
    stimDisplay = sdl2.ext.Window(
        "Calibration",
        size=stimDisplayRes,
        position=stimDisplayPosition,
        flags=sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_BORDERLESS
        | sdl2.SDL_RENDERER_ACCELERATED | sdl2.SDL_RENDERER_PRESENTVSYNC)
    stimDisplaySurf = sdl2.SDL_GetWindowSurface(stimDisplay.window)
    stimDisplayArray = sdl2.ext.pixels3d(stimDisplaySurf.contents)
    sdl2.SDL_PumpEvents()  #to show the windows
    sdl2.SDL_PumpEvents()  #to show the windows
    sdl2.SDL_PumpEvents()  #to show the windows
    sdl2.SDL_PumpEvents()  #to show the windows
    sdl2.SDL_PumpEvents()  #to show the windows
    sdl2.SDL_PumpEvents()  #to show the windows
    ########
    #Perform some calculations to convert stimulus measurements in degrees to pixels
    ########
    stimDisplayWidthInDegrees = math.degrees(
        math.atan((stimDisplayWidth / 2.0) / viewingDistance) * 2)
    PPD = stimDisplayRes[
        0] / stimDisplayWidthInDegrees  #compute the pixels per degree (PPD)
    calibrationDotSize = int(calibrationDotSizeInDegrees * PPD)
    #initialize font
    sdl2.sdlttf.TTF_Init()
    font = sdl2.sdlttf.TTF_OpenFont('./pytracker/Resources/DejaVuSans.ttf',
                                    int(PPD) * 2)
    ########
    # Define some useful colors for SDL2
    ########
    white = sdl2.pixels.SDL_Color(r=255, g=255, b=255, a=255)
    black = sdl2.pixels.SDL_Color(r=0, g=0, b=0, a=255)
    grey = sdl2.pixels.SDL_Color(r=127, g=127, b=127, a=255)
    lightGrey = sdl2.pixels.SDL_Color(r=200, g=200, b=200, a=255)

    def drawDot(loc):
        cy, cx = loc
        cx = stimDisplayRes[1] / 2 + cx
        cy = stimDisplayRes[0] / 2 + cy
        radius = calibrationDotSize / 2
        y, x = numpy.ogrid[-radius:radius, -radius:radius]
        index = numpy.logical_and((x**2 + y**2) <= (radius**2),
                                  (x**2 + y**2) >= ((radius / 4)**2))
        stimDisplayArray[(cy - radius):(cy + radius),
                         (cx - radius):(cx + radius), ][index] = [
                             255, 255, 255, 255
                         ]

    calibrationLocations = dict()
    calibrationLocations['CENTER'] = numpy.array([0, 0])
    calibrationLocations['N'] = numpy.array(
        [0, int(0 - stimDisplayRes[1] / 2.0 + calibrationDotSize)])
    calibrationLocations['S'] = numpy.array(
        [0, int(0 + stimDisplayRes[1] / 2.0 - calibrationDotSize)])
    calibrationLocations['E'] = numpy.array(
        [int(0 - stimDisplayRes[0] / 2.0 + calibrationDotSize), 0])
    calibrationLocations['W'] = numpy.array(
        [int(0 + stimDisplayRes[0] / 2.0 - calibrationDotSize), 0])
    calibrationLocations['NE'] = numpy.array([
        int(0 + stimDisplayRes[0] / 2.0 - calibrationDotSize),
        int(0 - stimDisplayRes[1] / 2.0 + calibrationDotSize)
    ])
    calibrationLocations['SE'] = numpy.array([
        int(0 + stimDisplayRes[0] / 2.0 - calibrationDotSize),
        int(0 + stimDisplayRes[1] / 2.0 - calibrationDotSize)
    ])
    calibrationLocations['NW'] = numpy.array([
        int(0 - stimDisplayRes[0] / 2.0 + calibrationDotSize),
        int(0 - stimDisplayRes[1] / 2.0 + calibrationDotSize)
    ])
    calibrationLocations['SW'] = numpy.array([
        int(0 - stimDisplayRes[0] / 2.0 + calibrationDotSize),
        int(0 + stimDisplayRes[1] / 2.0 - calibrationDotSize)
    ])
    calibrationKey = {
        'q': 'NW',
        'w': 'N',
        'e': 'NE',
        'a': 'E',
        's': 'CENTER',
        'd': 'W',
        'z': 'SW',
        'x': 'S',
        'c': 'SE'
    }

    # calibrationLocations['N2'] = numpy.array([0,int((0-stimDisplayRes[1]/2.0+calibrationDotSize)/2.0)])
    # calibrationLocations['S2'] = numpy.array([0,int((0+stimDisplayRes[1]/2.0-calibrationDotSize)/2.0)])
    # calibrationLocations['W2'] = numpy.array([int((0-stimDisplayRes[0]/2.0+calibrationDotSize)/2.0),0])
    # calibrationLocations['E2'] = numpy.array([int((0+stimDisplayRes[0]/2.0-calibrationDotSize)/2.0),0])
    # calibrationLocations['NE2'] = numpy.array([int((0+stimDisplayRes[0]/2.0-calibrationDotSize)/2.0),int((0-stimDisplayRes[1]/2.0+calibrationDotSize)/2.0)])
    # calibrationLocations['SE2'] = numpy.array([int((0+stimDisplayRes[0]/2.0-calibrationDotSize)/2.0),int((0+stimDisplayRes[1]/2.0-calibrationDotSize)/2.0)])
    # calibrationLocations['NW2'] = numpy.array([int((0-stimDisplayRes[0]/2.0+calibrationDotSize)/2.0),int((0-stimDisplayRes[1]/2.0+calibrationDotSize)/2.0)])
    # calibrationLocations['SW2'] = numpy.array([int((0-stimDisplayRes[0]/2.0+calibrationDotSize)/2.0),int((0+stimDisplayRes[1]/2.0-calibrationDotSize)/2.0)])

    #define a function that will kill everything safely
    def exitSafely():
        qFrom.put(['stopQueing', getTime()])
        sdl2.ext.quit()
        sys.exit()

    #define a function that waits for a given duration to pass
    def simpleWait(duration):
        start = getTime()
        while getTime() < (start + duration):
            sdl2.SDL_PumpEvents()

    #define a function to draw a numpy array on  surface centered on given coordinates
    def blitArray(src, dst, xOffset=0, yOffset=0):
        x1 = dst.shape[0] / 2 + xOffset - src.shape[0] / 2
        y1 = dst.shape[1] / 2 + yOffset - src.shape[1] / 2
        x2 = x1 + src.shape[0]
        y2 = y1 + src.shape[1]
        dst[x1:x2, y1:y2, :] = src

    def blitSurf(srcSurf, dst, dstSurf, xOffset=0, yOffset=0):
        x = dst.size[0] / 2 + xOffset - srcSurf.w / 2
        y = dst.size[1] / 2 + yOffset - srcSurf.h / 2
        sdl2.SDL_BlitSurface(srcSurf, None, dstSurf,
                             sdl2.SDL_Rect(x, y, srcSurf.w, srcSurf.h))
        sdl2.SDL_UpdateWindowSurface(
            dst.window
        )  #should this really be here? (will it cause immediate update?)
        # sdl2.SDL_FreeSurface(srcSurf)

    #define a function that waits for a response
    def waitForResponse():
        # sdl2.SDL_FlushEvents()
        done = False
        while not done:
            sdl2.SDL_PumpEvents()
            for event in sdl2.ext.get_events():
                if event.type == sdl2.SDL_KEYDOWN:
                    response = sdl2.SDL_GetKeyName(
                        event.key.keysym.sym).lower()
                    if response == 'escape':
                        exitSafely()
                    else:
                        done = True
        # sdl2.SDL_FlushEvents()
        return response

    def refreshWindows():
        stimDisplay.refresh()
        image = stimDisplayArray[:, :, 0:3]
        image = scipy.misc.imresize(
            image, (stimDisplayRes[0] / 2, stimDisplayRes[1] / 2),
            interp='nearest')
        mirrorDisplayArray[:, :, 0:3] = image
        mirrorDisplay.refresh()
        return None

    def clearScreen(color):
        sdl2.ext.fill(stimDisplaySurf.contents, color)

    def drawText(myText, myFont, textColor, textWidth=.9):
        lineHeight = sdl2.sdlttf.TTF_RenderText_Blended(
            myFont, 'T', textColor).contents.h
        textWidthMax = int(stimDisplay.size[0])
        paragraphs = myText.splitlines()
        renderList = []
        textHeight = 0
        for thisParagraph in paragraphs:
            words = thisParagraph.split(' ')
            if len(words) == 1:
                renderList.append(words[0])
                if (thisParagraph != paragraphs[len(paragraphs) - 1]):
                    renderList.append(' ')
                    textHeight = textHeight + lineHeight
            else:
                thisWordIndex = 0
                while thisWordIndex < (len(words) - 1):
                    lineStart = thisWordIndex
                    lineWidth = 0
                    while (thisWordIndex <
                           (len(words) - 1)) and (lineWidth <= textWidthMax):
                        thisWordIndex = thisWordIndex + 1
                        lineWidth = sdl2.sdlttf.TTF_RenderText_Blended(
                            myFont,
                            ' '.join(words[lineStart:(thisWordIndex + 1)]),
                            textColor).contents.w
                    if thisWordIndex < (len(words) - 1):
                        #last word went over, paragraph continues
                        renderList.append(' '.join(
                            words[lineStart:(thisWordIndex - 1)]))
                        textHeight = textHeight + lineHeight
                        thisWordIndex = thisWordIndex - 1
                    else:
                        if lineWidth <= textWidthMax:
                            #short final line
                            renderList.append(' '.join(
                                words[lineStart:(thisWordIndex + 1)]))
                            textHeight = textHeight + lineHeight
                        else:
                            #full line then 1 word final line
                            renderList.append(' '.join(
                                words[lineStart:thisWordIndex]))
                            textHeight = textHeight + lineHeight
                            renderList.append(words[thisWordIndex])
                            textHeight = textHeight + lineHeight
                        #at end of paragraph, check whether a inter-paragraph space should be added
                        if (thisParagraph != paragraphs[len(paragraphs) - 1]):
                            renderList.append(' ')
                            textHeight = textHeight + lineHeight
        numLines = len(renderList) * 1.0
        for thisLine in range(len(renderList)):
            thisRender = sdl2.sdlttf.TTF_RenderText_Blended(
                myFont, renderList[thisLine], textColor).contents
            x = int(stimDisplay.size[0] / 2.0 - thisRender.w / 2.0)
            y = int(stimDisplay.size[1] / 2.0 - thisRender.h / 2.0 +
                    1.0 * thisLine / numLines * textHeight)
            sdl2.SDL_BlitSurface(
                thisRender, None, stimDisplaySurf,
                sdl2.SDL_Rect(x, y, thisRender.w, thisRender.h))
            sdl2.SDL_UpdateWindowSurface(
                stimDisplay.window
            )  #should this really be here? (will it cause immediate update?)

    #define a function that prints a message on the stimDisplay while looking for user input to continue. The function returns the total time it waited
    def showMessage(myText, lockWait=False):
        messageViewingTimeStart = getTime()
        clearScreen(black)
        refreshWindows()
        clearScreen(black)
        drawText(myText, font, lightGrey)
        simpleWait(0.500)
        refreshWindows()
        clearScreen(black)
        if lockWait:
            response = None
            while response not in ['return', 'y', 'n']:
                response = waitForResponse()
        else:
            response = waitForResponse()
        refreshWindows()
        clearScreen(black)
        simpleWait(0.500)
        messageViewingTime = getTime() - messageViewingTimeStart
        return [response, messageViewingTime]

    #define a function to show stimuli and collect calibration data
    def getCalibrationData():
        if not manualCalibrationOrder:
            dotLocationList = ['q', 'w', 'e', 'a', 's', 'd', 'z', 'x', 'c']
            random.shuffle(dotLocationList)
        done = False
        eyeData = []
        coordsList = []
        startTimes = []
        stopTimes = []
        qFrom.put('startQueing')
        while not done:
            if manualCalibrationOrder:
                dotLocation = waitForResponse()
            else:
                if len(dotLocationList) == 0:
                    break
                else:
                    dotLocation = dotLocationList.pop()
            if dotLocation == '0':
                phase1Done = True
            elif not dotLocation in calibrationKey:
                pass
            else:
                displayCoords = calibrationLocations[
                    calibrationKey[dotLocation]]
                coordsList.append(displayCoords / PPD)
                clearScreen(black)
                drawDot(displayCoords)
                refreshWindows()
                junk = waitForResponse()
                startTimes.append(getTime())
                simpleWait(1)
                stopTimes.append(getTime())
            while not qTo.empty():
                eyeData.append(qTo.get())
        clearScreen(black)
        refreshWindows()
        qFrom.put(['stopQueing', getTime()])
        simpleWait(1)
        done = False
        while not done:
            if not qTo.empty():
                message = qTo.get()
                if message == 'doneQueing':
                    done = True
                else:
                    eyeData.append(message)
        calibrationData = []
        for i in range(len(startTimes)):
            temp = [[
                list(coordsList[i])[0],
                list(coordsList[i])[1], 1.0, e[1], e[2], e[1] * e[2], e[3],
                e[4], e[3] * e[4]
            ] for e in eyeData
                    if ((e[0] > startTimes[i]) and (e[0] < stopTimes[i]))]
            temp = [item for sublist in temp for item in sublist]
            calibrationData.append(temp)

        calibrationData = numpy.array(
            [item for sublist in calibrationData for item in sublist])
        calibrationData = calibrationData.reshape(
            [len(calibrationData) / 9, 9])
        return calibrationData

    #define a function to compute prediciton error
    def getErrors(calibrationData, xCoefLeft, xCoefRight, yCoefLeft,
                  yCoefRight, leftCols, rightCols):
        xPredsLeft = xCoefLeft[0] + xCoefLeft[1] * calibrationData[:, leftCols[
            1]] + xCoefLeft[2] * calibrationData[:, leftCols[2]] + xCoefLeft[
                3] * calibrationData[:, leftCols[3]]
        yPredsLeft = yCoefLeft[0] + yCoefLeft[1] * calibrationData[:, leftCols[
            1]] + yCoefLeft[2] * calibrationData[:, leftCols[2]] + yCoefLeft[
                3] * calibrationData[:, leftCols[3]]
        xPredsRight = xCoefRight[
            0] + xCoefRight[1] * calibrationData[:, rightCols[1]] + xCoefRight[
                2] * calibrationData[:, rightCols[2]] + xCoefRight[
                    3] * calibrationData[:, rightCols[3]]
        yPredsRight = yCoefRight[
            0] + yCoefRight[1] * calibrationData[:, rightCols[1]] + yCoefRight[
                2] * calibrationData[:, rightCols[2]] + yCoefRight[
                    3] * calibrationData[:, rightCols[3]]
        xPreds = (xPredsLeft + xPredsRight) / 2
        yPreds = (yPredsLeft + yPredsRight) / 2
        xError = numpy.mean((xPreds - calibrationData[:, 0])**2)**.5
        yError = numpy.mean((yPreds - calibrationData[:, 1])**2)**.5
        totError = numpy.mean((((xPreds - calibrationData[:, 0])**2) +
                               (yPreds - calibrationData[:, 1])**2)**.5)
        return [xError, yError, totError]

    #start calibration
    done = False
    while not done:
        showMessage('When you are ready to begin calibration, press any key.')
        calibrationData = getCalibrationData()
        leftCols = [2, 3, 4, 5]
        rightCols = [2, 6, 7, 8]
        xCoefLeft = numpy.linalg.lstsq(calibrationData[:, leftCols],
                                       calibrationData[:, 0])[0]
        xCoefRight = numpy.linalg.lstsq(calibrationData[:, rightCols],
                                        calibrationData[:, 0])[0]
        yCoefLeft = numpy.linalg.lstsq(calibrationData[:, leftCols],
                                       calibrationData[:, 1])[0]
        yCoefRight = numpy.linalg.lstsq(calibrationData[:, rightCols],
                                        calibrationData[:, 1])[0]
        xError, yError, totError = getErrors(calibrationData, xCoefLeft,
                                             xCoefRight, yCoefLeft, yCoefRight,
                                             leftCols, rightCols)
        showMessage('Calibration results:\nx = ' + str(xError) + '\ny = ' +
                    str(yError) + '\nz = ' + str(totError) +
                    '\nPress any key to validate calibration.')
        validationData = getCalibrationData()
        xError, yError, totError = getErrors(validationData, xCoefLeft,
                                             xCoefRight, yCoefLeft, yCoefRight,
                                             leftCols, rightCols)
        done2 = False
        while not done2:
            response = showMessage(
                'Validation results:\nx = ' + str(xError) + '\ny = ' +
                str(yError) + '\nz = ' + str(totError) +
                '\nExperimenter: Press "a" to accept calibration, or "r" to repeat calibration.'
            )
            if response[0] == 'a':
                qFrom.put([
                    'calibrationCoefs',
                    [xCoefLeft, xCoefRight, yCoefLeft, yCoefRight]
                ])
                done = True
                done2 = True
            elif response[0] == 'r':
                done2 = True
    exitSafely()
Esempio n. 16
0
sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)

#This will return a handle to an open 'Notepad.exe' window.
window_handle = get_windows_bytitle("Untitled", False)

#Create a window so that the hint below can be set
a = sdl2.SDL_CreateWindow("test window", sdl2.SDL_WINDOWPOS_UNDEFINED,
                          sdl2.SDL_WINDOWPOS_UNDEFINED, 200, 200, 0)
#Set hint as recommended by SDL documentation: https://wiki.libsdl.org/SDL_CreateWindowFrom#Remarks
result = sdl2.SDL_SetHint(sdl2.SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT,
                          hex(id(a)))
print(sdl2.SDL_GetError())

np_window = sdl2.SDL_CreateWindowFrom(window_handle[0])
print(sdl2.SDL_GetError())

np_sur = sdl2.SDL_GetWindowSurface(np_window)
print(sdl2.SDL_GetError())

save_sur = sdl2.SDL_CreateRGBSurface(0, np_sur[0].w, np_sur[0].h, 32, 0, 0, 0,
                                     0)
print(sdl2.SDL_GetError())
r = sdl2.SDL_BlitSurface(np_sur, None, save_sur, None)
print(sdl2.SDL_GetError())

result = sdl2.SDL_SaveBMP(save_sur, 'test.bmp')
print(sdl2.SDL_GetError())
sdl2.SDL_FreeSurface(save_sur)
print(sdl2.SDL_GetError())
Esempio n. 17
0
def stamperChildFunction(qTo,
                         qFrom,
                         windowSize=[200, 200],
                         windowPosition=[0, 0],
                         windowColor=[255, 255, 255],
                         doBorder=True):
    import sdl2
    import sdl2.ext
    import sys
    import time
    try:
        import appnope
        appnope.nope()
    except:
        pass
    sdl2.SDL_Init(sdl2.SDL_INIT_TIMER)
    timeFreq = 1.0 / sdl2.SDL_GetPerformanceFrequency()
    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
    if doBorder:
        flags = sdl2.SDL_WINDOW_SHOWN
    else:
        flags = sdl2.SDL_WINDOW_BORDERLESS | sdl2.SDL_WINDOW_SHOWN
    window = sdl2.ext.Window("pyStamper",
                             size=windowSize,
                             position=windowPosition,
                             flags=flags)
    windowID = sdl2.SDL_GetWindowID(window.window)
    windowSurf = sdl2.SDL_GetWindowSurface(window.window)
    red = sdl2.pixels.SDL_Color(r=255, g=0, b=0, a=255)
    green = sdl2.pixels.SDL_Color(r=0, g=255, b=0, a=255)
    black = sdl2.pixels.SDL_Color(r=0, g=0, b=0, a=255)
    white = sdl2.pixels.SDL_Color(r=255, g=255, b=255, a=255)
    if doBorder:
        sdl2.ext.fill(windowSurf.contents, green)
    else:
        sdl2.ext.fill(
            windowSurf.contents,
            sdl2.pixels.SDL_Color(r=windowColor[0],
                                  g=windowColor[1],
                                  b=windowColor[2],
                                  a=255))
    window.refresh()

    for i in range(10):
        sdl2.SDL_PumpEvents()  #to show the windows

    sdl2.SDL_Init(
        sdl2.SDL_INIT_JOYSTICK)  #uncomment if you want joystick input
    sdl2.SDL_JoystickOpen(0)  #uncomment if you want joystick input
    lostFocus = True
    lostColors = [red, black, red, white]
    lastRefreshTime = time.time()
    while True:
        if lostFocus and doBorder:
            if time.time() > (lastRefreshTime + (2.0 / 60)):
                sdl2.ext.fill(windowSurf.contents, lostColors[0])
                window.refresh()
                lostColors.append(lostColors.pop(0))
                lastRefreshTime = time.time()
        sdl2.SDL_PumpEvents()
        if not qTo.empty():
            message = qTo.get()
            if message == 'quit':
                sys.exit()
            elif message == 'raise':
                sdl2.SDL_RaiseWindow(window.window)
        for event in sdl2.ext.get_events():
            if event.type == sdl2.SDL_WINDOWEVENT:
                if event.window.windowID == windowID:
                    if (event.window.event == sdl2.SDL_WINDOWEVENT_CLOSE):
                        qFrom.put({
                            'type': 'key',
                            'time': event.window.timestamp * timeFreq,
                            'value': 'escape'
                        })
                        sys.exit()
                    elif event.window.event == sdl2.SDL_WINDOWEVENT_FOCUS_LOST:
                        lostFocus = True
                    elif event.window.event == sdl2.SDL_WINDOWEVENT_FOCUS_GAINED:
                        lostFocus = False
                        if doBorder:
                            sdl2.ext.fill(windowSurf.contents, green)
                            window.refresh()
            else:
                message = {}
                if event.type == sdl2.SDL_KEYDOWN:
                    message['type'] = 'key'
                    message['time'] = event.key.timestamp * timeFreq
                    message['value'] = sdl2.SDL_GetKeyName(
                        event.key.keysym.sym).lower()
                    message['keysym'] = event.key.keysym
                    qFrom.put(message)
                elif event.type == sdl2.SDL_JOYAXISMOTION:
                    message['type'] = 'axis'
                    message['axis'] = event.jaxis.axis
                    message['time'] = event.jaxis.timestamp * timeFreq
                    message['value'] = event.jaxis.value
                    qFrom.put(message)
                elif event.type == sdl2.SDL_JOYBUTTONDOWN:
                    message['type'] = 'button'
                    message['time'] = event.jbutton.timestamp * timeFreq
                    message['value'] = event.jbutton.button
                    qFrom.put(message)
Esempio n. 18
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Rain Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_MULTISAMPLEBUFFERS, 1)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_MULTISAMPLESAMPLES, 4)
        gl.glClearColor(0.8, 0.8, 0.8, 0.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # gl.glDisable(gl.GL_DEPTH)
        gl.glDisable(gl.GL_DEPTH_TEST)
        # load Textures
        self.txPaving = loadTexture(b'res/paving.bmp',
                                    gl.GL_RGB,
                                    gl.GL_REPEAT,
                                    mipmap=True)
        txSplash = loadTexture(b'res/waterdrops.bmp', gl.GL_ALPHA, gl.GL_CLAMP)
        # init fog
        gl.glEnable(gl.GL_FOG)
        gl.glFogi(gl.GL_FOG_MODE, gl.GL_EXP2)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        self.sizeRatio = self.width / 1440
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        dropRenderer = GLPointRenderer.create()
        dropRenderer.setType(spk.POINT_CIRCLE)
        dropRenderer.setSize(2.0 * self.sizeRatio)
        dropRenderer.enableBlending(True)
        self.dropRenderer = dropRenderer
        rainRenderer = GLLineRenderer.create()
        rainRenderer.setLength(-0.1)
        rainRenderer.enableBlending(True)
        self.rainRenderer = rainRenderer
        splashRenderer = GLQuadRenderer.create()
        splashRenderer.setScale(0.05, 0.05)
        splashRenderer.setTexturingMode(spk.TEXTURE_2D)
        splashRenderer.setTexture(txSplash)
        splashRenderer.enableBlending(True)
        splashRenderer.enableRenderingHint(spk.DEPTH_WRITE, False)
        self.splashRenderer = splashRenderer
        # create Model
        rain_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | spk.FLAG_MASS
        rain_mutable = spk.FLAG_NONE
        rain_random = spk.FLAG_MASS
        rainModel = spk.Model.create(rain_enable, rain_mutable, rain_random)
        rainModel.setParam(spk.PARAM_ALPHA, 0.2)
        rainModel.setImmortal(True)
        self.rainModel = rainModel
        dropModel = spk.Model.create(rain_enable, rain_mutable,
                                     rain_random)  # same as rain
        dropModel.setParam(spk.PARAM_ALPHA, 0.6)
        self.dropModel = dropModel
        splash_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | spk.FLAG_SIZE | spk.FLAG_ANGLE
        splash_mutable = spk.FLAG_SIZE | spk.FLAG_ALPHA
        splash_random = spk.FLAG_SIZE | spk.FLAG_ANGLE
        splashModel = spk.Model.create(splash_enable, splash_mutable,
                                       splash_random)
        splashModel.setParam(spk.PARAM_ANGLE, 0.0, 2.0 * math.pi)
        splashModel.setParam(spk.PARAM_ALPHA, 1.0, 0.0)
        self.splashModel = splashModel
        # create Emitter
        rainZone = spk.Ring.create(spk.Vector3D(0.0, 5.0, 0.0))
        self.rainZone = rainZone
        rainEmitter = spk.SphericEmitter.create(spk.Vector3D(0.0, -1.0, 0.0),
                                                0.0, 0.03 * math.pi)
        rainEmitter.setZone(rainZone)
        self.rainEmitter = rainEmitter
        self.dropEmitter = spk.SphericEmitter.create(
            spk.Vector3D(0.0, 1.0, 0.0), 0.0, 0.2 * math.pi)
        # create Group
        gravity = spk.Vector3D(0.0, -2.0, 0.0)
        rainGroup = spk.Group.create(rainModel, 8000)
        rainGroup.setCustomUpdate(lambda p, t: self.killRain(p, t))
        rainGroup.setRenderer(rainRenderer)
        rainGroup.addEmitter(rainEmitter)
        rainGroup.setFriction(0.7)
        rainGroup.setGravity(gravity)
        self.rainGroup = rainGroup
        dropGroup = spk.Group.create(dropModel, 16000)
        dropGroup.setRenderer(dropRenderer)
        dropGroup.setFriction(0.7)
        dropGroup.setGravity(gravity)
        self.dropGroup = dropGroup
        splashGroup = spk.Group.create(splashModel, 2400)
        splashGroup.setRenderer(splashRenderer)
        self.splashGroup = splashGroup
        # create System
        system = spk.System.create()
        system.addGroup(splashGroup)
        system.addGroup(dropGroup)
        system.addGroup(rainGroup)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.renderEnv = True
        self.angleY = 0.0
        self.angleX = 12.0
        self.posX = 0.0
        self.posZ = 0.0
        self.rainRatio = 0.5
        self.recompute = True
        self.nbParticles = ''
        self.fps = ''
        self.strRainRate = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 19
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Fountain Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.68, 0.85, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
        # init fog
        gl.glEnable(gl.GL_FOG)
        gl.glFogi(gl.GL_FOG_MODE, gl.GL_EXP2)
        gl.glFogfv(gl.GL_FOG_COLOR, [0.0, 0.68, 0.85, 1.0])
        gl.glFogf(gl.GL_FOG_DENSITY, 0.04)
        gl.glHint(gl.GL_PERSPECTIVE_CORRECTION_HINT, gl.GL_NICEST)
        # load Textures
        self.txGrass = loadTexture(b'res/grass.bmp',
                                   gl.GL_RGB,
                                   gl.GL_REPEAT,
                                   mipmap=True)
        self.txFountain = loadTexture(b'res/tile.bmp',
                                      gl.GL_RGB,
                                      gl.GL_REPEAT,
                                      mipmap=True)
        self.txWater = loadTexture(b'res/water.bmp',
                                   gl.GL_RGB,
                                   gl.GL_REPEAT,
                                   mipmap=True)
        txSplash = loadTexture(b'res/waterdrops.bmp', gl.GL_ALPHA, gl.GL_CLAMP)
        # create display lists
        self.createDisplayLists()

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        renderer = GLQuadRenderer.create(1.0)  # type: GLQuadRenderer
        renderer.setScale(0.06, 0.06)
        renderer.setTexturingMode(spk.TEXTURE_2D)
        renderer.setTexture(txSplash)
        renderer.setBlending(spk.BLENDING_ALPHA)
        renderer.enableRenderingHint(spk.DEPTH_WRITE, False)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_ALPHA | spk.FLAG_SIZE | spk.FLAG_ANGLE
        model_mutable = spk.FLAG_ALPHA | spk.FLAG_SIZE | spk.FLAG_ANGLE
        model_random = spk.FLAG_SIZE | spk.FLAG_ANGLE
        model = spk.Model.create(model_enable, model_mutable,
                                 model_random)  # type: spk.Model
        model.setParam(spk.PARAM_ALPHA, 0.2, 0.0)
        model.setParam(spk.PARAM_SIZE, 1.0, 1.0, 2.0, 8.0)
        model.setParam(spk.PARAM_ANGLE, 0.0, 4.0 * math.pi, 0.0, 4.0 * math.pi)
        model.setLifeTime(1.6, 2.2)
        self.model = model
        # create Emitter
        self.emitterZones = []
        self.emitters = []
        # splash to just above(x1)
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(0.0, 1.0, 0.0)))
        # splash from center of fountain(x4)
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1, 0.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.0, 3.0, 1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.0, 3.0, -1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.0, 3.0, 1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.0, 3.0, -1.0)))
        # splash from the side of fountain(x8)
        self.emitterZones.append(
            spk.Point.create(spk.Vector3D(-1.6, 0.1, -1.6)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(1.6, 0.1, 1.6)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(1.6, 0.1,
                                                               -1.6)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(-1.6, 0.1,
                                                               1.6)))
        self.emitterZones.append(
            spk.Point.create(spk.Vector3D(-2.26, 0.1, 0.0)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(2.26, 0.1,
                                                               0.0)))
        self.emitterZones.append(
            spk.Point.create(spk.Vector3D(0.0, 0.1, -2.26)))
        self.emitterZones.append(spk.Point.create(spk.Vector3D(0.0, 0.1,
                                                               2.26)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.0, 2.0, 1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.0, 2.0, -1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.0, 2.0, 1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.0, 2.0, -1.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(1.41, 2.0, 0.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(-1.41, 2.0, 0.0)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(0.0, 2.0, 1.41)))
        self.emitters.append(
            spk.StraightEmitter.create(spk.Vector3D(0.0, 2.0, -1.41)))
        self.flow = [
            500.0, 600.0, 600.0, 600.0, 600.0, 900.0, 900.0, 900.0, 900.0,
            900.0, 900.0, 900.0, 900.0
        ]
        self.flowLow = [
            150.0, 200.0, 200.0, 200.0, 200.0, 250.0, 250.0, 250.0, 250.0,
            250.0, 250.0, 250.0, 250.0
        ]
        for i in range(len(self.emitters)):
            self.emitters[i].setZone(self.emitterZones[i])
            self.emitters[i].setFlow(self.flow[i])
            self.emitters[i].setForce(2.5, 4.0)
        self.emitters[0].setForce(3.0, 3.5)
        # no Modifier
        # create Group
        group = spk.Group.create(model, 20000)  # type: spk.Group
        for emitter in self.emitters:
            group.addEmitter(emitter)
        group.setRenderer(renderer)
        group.setCustomUpdate(self.splash)
        group.setGravity(spk.Vector3D(0.0, -2.2, 0.0))
        group.setFriction(0.7)
        self.group = group
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.totalTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.renderEnv = True
        self.highGraphics = True
        self.angleY = 25.0
        self.angleX = 25.0
        self.camPosZ = 8.0
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 20
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Collision Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load Texture
        txParticle = loadTexture(b'res/ball2.bmp', gl.GL_RGBA, gl.GL_CLAMP)
        self.txCrate = loadTexture(b'res/crate.bmp', gl.GL_RGB, gl.GL_REPEAT)
        self.txFloor = loadTexture(b'res/floor.bmp', gl.GL_RGB, gl.GL_REPEAT)
        self.txWall = loadTexture(b'res/wall.bmp', gl.GL_RGB, gl.GL_REPEAT)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # create Renderer
        spk.setRandomSeed(int(time.time()))
        renderer = GLPointRenderer.create(1.0)  # type: GLPointRenderer
        renderer.setType(
            spk.POINT_SPRITE)  # using Point Sprite(require >=OpenGL2.0)
        renderer.setTexture(txParticle)  # use the texture on drawing
        renderer.enableWorldSize(
            True
        )  # true: unit is adjusted with the screen, false: unit is pixel(fixed)
        GLPointRenderer.setPixelPerUnit(45.0 * math.pi / 180.0, self.height)
        renderer.setSize(0.05)
        renderer.setBlending(
            spk.BLENDING_NONE
        )  # blending method between particles(no blending)
        renderer.enableRenderingHint(spk.ALPHA_TEST,
                                     True)  # notifying not to use depth info
        renderer.setAlphaTestThreshold(0.8)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE  # use color channels(RGB)
        model = spk.Model.create(model_enable)  # type: spk.Model
        model.setLifeTime(10.0, 10.0)  # particle's life time is 10[sec]
        self.model = model
        # create Emitter
        emit_dir = spk.Vector3D(0.0, 0.0, -1.0)
        emit_center = spk.Vector3D(0.0, 2.0, 4.475)
        minangle = 0.0 * math.pi  # zenith angle(min)
        maxangle = 0.5 * math.pi  # zenith angle(max)
        emitter = spk.SphericEmitter.create(
            emit_dir, minangle, maxangle)  # type: spk.SphericEmitter
        emitter.setZone(
            spk.Point.create(emit_center),
            True)  # particles are randomly placed in the specified zone
        emitter.setFlow(300)  # max number of particles
        emitter.setForce(1.5, 2.5)  # emittion power
        # create Group
        maxparticle = 3100  # upper limit number of particles
        group = spk.Group.create(model, maxparticle)  # type: spk.Group
        group.addEmitter(emitter)
        group.setRenderer(renderer)
        group.setCustomBirth(self.assignColor)
        group.setGravity(spk.Vector3D(0.0, -0.8, 0.0))
        group.setFriction(0.2)
        self.group = group
        # create Room objects
        self.ROOM_X = 7.0
        self.ROOM_Y = 3.0
        self.ROOM_Z = 9.0
        self.boxes = []
        self.partitions = []
        self.initRoom(group)  # obstacles
        self.createDisplayLists()  # display list for OpenGL drawing
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.enableBoxDrawing = False
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.renderEnv = True
        self.angleY = 90.0
        self.angleX = 45.0
        self.camPosZ = 10.0
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 21
0
    def __init__(self,
                 *,
                 width=SCR_W,
                 height=SCR_H,
                 framerate=FPS,
                 show_fps=True,
                 show_play_time=False,
                 scene=None,
                 test=False,
                 scene_args=None,
                 opacity=255,
                 window_color=None):
        """Initialization.

        Args:
            opacity (int): a number from 0 to 255, where 0 will make the
            window fully transparent (invisible) and 255 fully opaque (
            opacity value will be ignored in that case)
        """
        self.alive = False
        self._scene = None
        self.text_input = False

        self.show_fps = show_fps
        self.width = width
        self.height = height
        self.fps = framerate
        self.test = test

        sdl2.ext.init()

        window = sdl2.ext.Window("Tiles",
                                 size=(SCR_W, SCR_H),
                                 flags=sdl2.SDL_WINDOW_BORDERLESS)
        if opacity < 255:
            sdl2.video.SDL_SetWindowOpacity(window.window, opacity / 255)
        sfc = sdl2.SDL_GetWindowSurface(window.window).contents
        opf = sfc.format.contents

        self._window = window
        self.opacity = opacity
        self.window_color = window_color or (0, 0, 0, 255)
        self.colors = data_handler.get_colors()

        renderer = sdl2.ext.Renderer(window)
        self.renderer = renderer

        factory = SpriteFactory(sdl2.ext.TEXTURE, renderer=renderer)
        factory.opf = opf
        self.factory = factory

        sdl2.sdlttf.TTF_Init()
        self.fonts = FontsManager(factory)

        self.tile_size = TILE_W

        self.spriterenderer = self.factory.create_sprite_render_system(window)

        window.show()
        # self.renderer.clear()
        scene_args = scene_args or {}
        if scene:
            self.set_scene(scene, **scene_args)

        sdl2.SDL_RaiseWindow(window.window)
        self.alive = True
        self.get_mouse_state()
        self.clock = time.Clock()
Esempio n. 22
0
def trackerChildFunction(qTo,
                         qFrom,
                         camIndex=0,
                         camRes=[1920, 1080],
                         previewDownsize=2,
                         previewLoc=[0, 0],
                         faceDetectionScale=10,
                         eyeDetectionScale=5,
                         timestampMethod=0,
                         viewingDistance=100,
                         stimDisplayWidth=100,
                         stimDisplayRes=[1920, 1080],
                         stimDisplayPosition=[0, 0],
                         mirrorDisplayPosition=[0, 0],
                         mirrorDownSize=2,
                         manualCalibrationOrder=True,
                         calibrationDotSizeInDegrees=.5):
    import fileForker
    import numpy
    import cv2
    import scipy.ndimage.filters
    # import scipy.interpolate
    import sys
    import sdl2
    import sdl2.ext
    import sdl2.sdlmixer

    #define a class for a clickable text UI
    class clickableText:
        def __init__(self, x, y, text, rightJustified=False, valueText=''):
            self.x = x
            self.y = y
            self.text = text
            self.rightJustified = rightJustified
            self.valueText = valueText
            self.isActive = False
            self.clicked = False
            self.updateSurf()

        def updateSurf(self):
            if self.isActive:
                self.surf = sdl2.sdlttf.TTF_RenderText_Blended_Wrapped(
                    font, self.text + self.valueText,
                    sdl2.pixels.SDL_Color(r=0, g=255, b=255, a=255),
                    previewWindow.size[0]).contents
            else:
                self.surf = sdl2.sdlttf.TTF_RenderText_Blended_Wrapped(
                    font, self.text + self.valueText,
                    sdl2.pixels.SDL_Color(r=0, g=0, b=255, a=255),
                    previewWindow.size[0]).contents

        def checkIfActive(self, event):
            if self.rightJustified:
                xLeft = self.x - self.surf.w
                xRight = self.x
            else:
                xLeft = self.x
                xRight = self.x + self.surf.w
            if (event.button.x > xLeft) & (event.button.x < xRight) & (
                    event.button.y > self.y) & (event.button.y <
                                                (self.y + fontSize)):
                self.isActive = True
            else:
                self.isActive = False
            self.updateSurf()

        def draw(self, targetWindowSurf):
            if self.rightJustified:
                sdl2.SDL_BlitSurface(
                    self.surf, None, targetWindowSurf,
                    sdl2.SDL_Rect(self.x - self.surf.w, self.y, self.surf.w,
                                  self.surf.h))
            else:
                sdl2.SDL_BlitSurface(
                    self.surf, None, targetWindowSurf,
                    sdl2.SDL_Rect(self.x, self.y, self.surf.w, self.surf.h))

    #define a class for settings
    class settingText(clickableText):
        def __init__(self, value, x, y, text, rightJustified=False):
            self.value = value
            self.valueText = str(value)
            clickableText.__init__(self, x, y, text, rightJustified,
                                   self.valueText)

        def addValue(self, toAdd):
            self.valueText = self.valueText + toAdd
            self.updateSurf()

        def delValue(self):
            if self.valueText != '':
                self.valueText = self.valueText[0:(len(self.valueText) - 1)]
                self.updateSurf()

        def finalizeValue(self):
            try:
                self.value = int(self.valueText)
            except:
                print 'Non-numeric value entered!'

    #define a class for dots
    class dotObj:
        def __init__(self, name, isFid, fid, xPixel, yPixel, radiusPixel,
                     blinkCriterion, blurSize, filterSize):
            self.name = name
            self.isFid = isFid
            self.x = xPixel
            self.y = yPixel
            self.radius = radiusPixel
            self.first = True
            self.last = [self.x, self.y, self.radius]
            self.lost = False
            self.blinkHappened = False
            self.radii = []
            self.SDs = []
            self.lostCount = 0
            self.blinkCriterion = blinkCriterion
            self.blurSize = blurSize
            self.filterSize = filterSize
            self.setPixels()
            if not self.isFid:
                self.makeRelativeToFid(fid)

        def setPixels(self):
            self.xPixel = int(self.x)
            self.yPixel = int(self.y)
            self.radiusPixel = int(self.radius)
            return None

        def makeRelativeToFid(self, fid):
            self.x2 = (self.x - fid.x) / fid.radius
            self.y2 = (self.y - fid.y) / fid.radius
            self.radius2 = self.radius / fid.radius
            return None

        def getDarkEllipse(self, img):
            #if not self.isFid:
            #	#cv2.imwrite(self.name + "_" + "%.2d" % imageNum + "_raw.png" , img)
            try:
                smoothedImg = cv2.GaussianBlur(img,
                                               (self.blurSize, self.blurSize),
                                               0)
                #if not self.isFid:
                #	#cv2.imwrite(self.name + "_" + "%.2d" % imageNum + "_smoothed.png" , img)
            except:
                print 'cv2.GaussianBlur failed'
                # cv2.imwrite('temp.png',img)
                return None
            try:
                dataMin = scipy.ndimage.filters.minimum_filter(
                    smoothedImg, self.filterSize)
            except:
                print 'scipy.ndimage.filters.minimum_filter failed'
                # cv2.imwrite('temp.png',img)
                return None
            if dataMin != None:
                try:
                    minLocs = numpy.where(
                        dataMin < (numpy.min(dataMin) + numpy.std(dataMin)))
                except:
                    print 'numpy.where failed'
                    # cv2.imwrite('temp.png',img)
                    return None
                if len(minLocs[0]) >= 5:
                    try:
                        ellipse = cv2.fitEllipse(
                            numpy.reshape(
                                numpy.column_stack((minLocs[1], minLocs[0])),
                                (len(minLocs[0]), 1, 2)))
                    except:
                        print 'cv2.fitEllipse failed'
                        # cv2.imwrite('temp.png',img)
                        return None
                    return ellipse

        def cropImage(self, img, cropSize):
            xLo = self.xPixel - cropSize
            if xLo < 0:
                xLo = 0
            xHi = self.xPixel + cropSize
            if xHi > img.shape[1]:
                xHi = img.shape[1]
            yLo = self.yPixel - cropSize
            if yLo < 0:
                yLo = 0
            yHi = self.yPixel + cropSize
            if yHi > img.shape[0]:
                yHi = img.shape[0]
            return [img[yLo:yHi, xLo:xHi], xLo, xHi, yLo, yHi]

        def search(self, img):
            if self.first and self.isFid:
                searchSize = 1
            elif self.lost:
                searchSize = 5
            else:
                searchSize = 3
            if self.first:
                self.first = False
            img, xLo, xHi, yLo, yHi = self.cropImage(img=img,
                                                     cropSize=searchSize *
                                                     self.radiusPixel)
            self.ellipse = self.getDarkEllipse(img=img)
            if self.ellipse != None:
                self.ellipse = ((self.ellipse[0][0] + xLo,
                                 self.ellipse[0][1] + yLo), self.ellipse[1],
                                self.ellipse[2])
                self.lost = False
                self.x = self.ellipse[0][0]
                self.y = self.ellipse[0][1]
                self.major = self.ellipse[1][0]
                self.minor = self.ellipse[1][1]
                self.angle = self.ellipse[2]
                self.radius = (self.ellipse[1][0] + self.ellipse[1][1]) / 4
                self.setPixels()
            else:
                self.lost = True

        def checkSearch(self):
            self.medianRadius = numpy.median(self.radii)
            self.critRadius = 10 * ((numpy.median(
                (self.radii - self.medianRadius)**2))**.5)
            #print [self.name, self.radius2,(self.radius2<(1/6)) , (self.radius2>2)]
            if len(self.radii) < 30:
                self.radii.append(self.radius2)
                self.lost = False
            else:
                #fid diameter is 6mm, so range from 1mm to 12mm
                #if (self.radius2<(1/6)) or (self.radius2>2) or (self.radius2<(self.medianRadius - self.critRadius)) or (self.radius2>(self.medianRadius + self.critRadius)):
                if (self.radius2 < (1 / 6)) or (self.radius2 > 2):
                    self.lost = True
                else:
                    self.lost = False
                    self.radii.append(self.radius2)
                if len(self.radii) >= 300:
                    self.radii.pop()

        def checkSD(self, img, fid):
            self.obsSD = numpy.std(
                self.cropImage(img=img, cropSize=5 * fid.radiusPixel)[0])
            self.medianSD = numpy.median(self.SDs)
            self.critSD = self.medianSD * self.blinkCriterion
            #print [self.name,self.obsSD,self.medianSD,self.critSD,self.blinkCriterion]
            if len(self.SDs) < 30:
                self.SDs.append(self.obsSD)
                self.blinkHappened = False
            else:
                if (self.obsSD < self.critSD):
                    self.blinkHappened = True
                else:
                    self.SDs.append(self.obsSD)
                    self.blinkHappened = False
                if len(self.SDs) >= 300:
                    self.SDs.pop()

        def update(self, img, fid, blinkCriterion, blurSize, filterSize):
            self.blinkCriterion = blinkCriterion
            self.blurSize = blurSize
            self.filterSize = filterSize
            self.last = [self.x, self.y, self.radius]
            if self.isFid:
                self.search(img=img)
            else:
                self.checkSD(
                    img=img, fid=fid
                )  #alters the value of self.blinkHappened, amongst other things
                if self.blinkHappened:
                    self.x, self.y, self.radius = self.last
                    self.setPixels()
                    self.makeRelativeToFid(fid)
                else:
                    self.search(
                        img=img
                    )  #alters the value of self.lost, amongst other things
                    if self.lost:
                        self.x, self.y, self.radius = self.last
                        self.setPixels()
                        self.makeRelativeToFid(fid)
                    else:
                        self.makeRelativeToFid(fid=fid)
                        self.checkSearch(
                        )  #alters the value of self.lost, among other things
                        if self.lost:
                            self.x, self.y, self.radius = self.last
                            self.setPixels()
                            self.makeRelativeToFid(fid)
            if self.lost and not self.blinkHappened:
                self.lostCount += 1
            else:
                self.lostCount = 0

    ########
    # Initialize audio and define a class that handles playing sounds in PySDL2
    ########
    sdl2.SDL_Init(sdl2.SDL_INIT_AUDIO)
    sdl2.sdlmixer.Mix_OpenAudio(44100, sdl2.sdlmixer.MIX_DEFAULT_FORMAT, 2,
                                1024)

    class Sound:
        def __init__(self, fileName):
            self.sample = sdl2.sdlmixer.Mix_LoadWAV(
                sdl2.ext.compat.byteify(fileName, "utf-8"))
            self.started = False

        def play(self):
            self.channel = sdl2.sdlmixer.Mix_PlayChannel(-1, self.sample, 0)
            self.started = True

        def stillPlaying(self):
            if self.started:
                if sdl2.sdlmixer.Mix_Playing(self.channel):
                    return True
                else:
                    self.started = False
                    return False

    ########
    # define some useful functions
    ########

    #define a function to exit safely
    def exitSafely():
        qFrom.put('done')
        sys.exit()

    #define a function to rescale
    def rescaleBiggestHaar(detected, scale, addToX=0, addToY=0):
        x, y, w, h = detected[numpy.argmax(
            [numpy.sqrt(w * w + h * h) for x, y, w, h in detected])]
        return [x * scale + addToX, y * scale + addToY, w * scale, h * scale]

    ########
    # Initialize variables
    ########

    #initialize sounds
    blinkSound = Sound('./pytracker/Resources/sounds/beep.wav')
    saccadeSound = Sound('./pytracker/Resources/sounds/stop.wav')

    #specify the getTime function
    if (timestampMethod == 0) or (timestampMethod == 1):
        #initialize timer
        sdl2.SDL_Init(sdl2.SDL_INIT_TIMER)
        if timestampMethod == 0:
            #define a function to use the high-precision timer, returning a float in seconds
            def getTime():
                return sdl2.SDL_GetPerformanceCounter(
                ) * 1.0 / sdl2.SDL_GetPerformanceFrequency()
        elif timestampMethod == 1:
            #use the SDL_GetTicks timer
            def getTime():
                return sdl2.SDL_GetTicks() / 1000.0
    elif timestampMethod == 2:
        #use time.time
        import time
        getTime = time.time

    #initialize font
    fontSize = camRes[1] / previewDownsize / 10
    sdl2.sdlttf.TTF_Init()
    font = sdl2.sdlttf.TTF_OpenFont('./pytracker/Resources/DejaVuSans.ttf',
                                    fontSize)

    #initialize preview video
    sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
    previewWindow = sdl2.ext.Window("Preview",
                                    size=(camRes[0] / previewDownsize,
                                          camRes[1] / previewDownsize),
                                    position=previewLoc,
                                    flags=sdl2.SDL_WINDOW_SHOWN)
    previewWindowSurf = sdl2.SDL_GetWindowSurface(previewWindow.window)
    previewWindowArray = sdl2.ext.pixels3d(previewWindowSurf.contents)
    sdl2.ext.fill(previewWindowSurf.contents,
                  sdl2.pixels.SDL_Color(r=255, g=255, b=255, a=255))
    previewWindow.refresh()
    lastRefreshTime = getTime()

    #initialize the settings window
    settingsWindow = sdl2.ext.Window(
        "Settings",
        size=(camRes[0] / previewDownsize, camRes[1] / previewDownsize),
        position=[
            previewLoc[0] + camRes[0] / previewDownsize + 1, previewLoc[1]
        ])
    settingsWindowSurf = sdl2.SDL_GetWindowSurface(settingsWindow.window)
    settingsWindowArray = sdl2.ext.pixels3d(settingsWindowSurf.contents)
    sdl2.ext.fill(settingsWindowSurf.contents,
                  sdl2.pixels.SDL_Color(r=0, g=0, b=0, a=255))
    settingsWindow.hide()
    settingsWindow.refresh()

    #import the haar cascades
    faceCascade = cv2.CascadeClassifier(
        './pytracker/Resources/cascades/haarcascade_frontalface_alt2.xml')
    eyeLeftCascade = cv2.CascadeClassifier(
        './pytracker/Resources/cascades/LEye18x12.1.xml')
    eyeRightCascade = cv2.CascadeClassifier(
        './pytracker/Resources/cascades/REye18x12.1.xml')

    #create some settings
    settingsDict = {}
    settingsDict['blink'] = settingText(value=75,
                                        x=fontSize,
                                        y=fontSize,
                                        text='Blink (0-100) = ')
    settingsDict['blur'] = settingText(value=3,
                                       x=fontSize,
                                       y=fontSize * 2,
                                       text='Blur (0-; odd only) = ')
    settingsDict['filter'] = settingText(value=3,
                                         x=fontSize,
                                         y=fontSize * 3,
                                         text='Filter (0-; odd only) = ')
    settingsDict['saccade0'] = settingText(value=50,
                                           x=fontSize,
                                           y=fontSize * 4,
                                           text='Saccade (0-) = ')
    settingsDict['saccade'] = settingText(value=1,
                                          x=fontSize,
                                          y=fontSize * 5,
                                          text='Calibrated Saccade (0-) = ')

    #create some text UIs
    clickableTextDict = {}
    clickableTextDict['manual'] = clickableText(x=0, y=0, text='Manual')
    clickableTextDict['auto'] = clickableText(x=0, y=fontSize, text='Auto')
    clickableTextDict['calibrate'] = clickableText(x=0,
                                                   y=previewWindow.size[1] -
                                                   fontSize,
                                                   text='Calibrate')
    clickableTextDict['settings'] = clickableText(x=previewWindow.size[0],
                                                  y=0,
                                                  text='Settings',
                                                  rightJustified=True)
    clickableTextDict['lag'] = clickableText(x=previewWindow.size[0],
                                             y=previewWindow.size[1] -
                                             fontSize * 2,
                                             text='Lag: ',
                                             rightJustified=True)
    clickableTextDict['f2f'] = clickableText(x=previewWindow.size[0],
                                             y=previewWindow.size[1] -
                                             fontSize,
                                             text='Frame-to-frame: ',
                                             rightJustified=True)

    #initialize variables
    previewInFocus = True
    settingsInFocus = False
    lastTime = 0
    dotList = []
    lastLocs = [None, None]
    displayLagList = []
    frameToFrameTimeList = []
    doHaar = False
    clickingForDots = False
    calibrating = False
    doneCalibration = False
    doSounds = True
    queueDataToParent = False

    #set dummy calibration coefficients (yields untransformed pixel locs)
    calibrationCoefs = [[0, 1, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 1, 0]]

    ########
    # Initialize camera
    ########
    vc = cv2.VideoCapture(camIndex)
    vc.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, camRes[0])
    vc.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, camRes[1])
    imageNum = 0

    #start the loop
    while True:

        #poll the camera
        t1 = getTime()  #time right before requesting the image
        _, image = vc.read()  #request the image
        t2 = getTime()  #time right after requesting the image
        imageTime = t1 + (
            t2 - t1
        ) / 2.0  #timestamp the image as halfway between times before and after request
        image = image[:, :, 2]  #grab red channel (image is BGR)
        imageNum += 1  #iterate the image number

        #check for messages from the main process
        if not qTo.empty():
            message = qTo.get()
            if message == 'quit':
                exitSafely()

        #process input
        sdl2.SDL_PumpEvents()
        for event in sdl2.ext.get_events():
            if event.type == sdl2.SDL_WINDOWEVENT:
                targetWindow = sdl2.SDL_GetWindowFromID(event.window.windowID)
                title = sdl2.SDL_GetWindowTitle(targetWindow)
                # if event.window.event==sdl2.SDL_WINDOWEVENT_FOCUS_GAINED:
                # 	print title + "focused"
                # if event.window.event==sdl2.SDL_WINDOWEVENT_ENTER:
                # 	print title + " entered"
                # elif event.window.event==sdl2.SDL_WINDOWEVENT_FOCUS_LOST:
                # 	print title + " lost focus"
                if event.window.event == sdl2.SDL_WINDOWEVENT_LEAVE:
                    if title == 'Preview':
                        previewInFocus = False
                        settingsInFocus = True
                if (event.window.event == sdl2.SDL_WINDOWEVENT_FOCUS_GAINED
                    ) or (event.window.event == sdl2.SDL_WINDOWEVENT_ENTER):
                    if title == 'Preview':
                        previewInFocus = True
                        settingsInFocus = False
                    elif title == 'Settings':
                        previewInFocus = False
                        settingsInFocus = True
                elif (event.window.event == sdl2.SDL_WINDOWEVENT_CLOSE):
                    if title == 'Preview':
                        exitSafely()
                    elif title == 'Settings':
                        previewInFocus = True
                        settingsInFocus = False
                        settingsWindow.hide()
                        previewWindow.show()
            elif settingsInFocus:
                # if event.type==sdl2.SDL_MOUSEBUTTONUP:
                # 	if blinkTextButtonDown:
                # 		blinkTextButtonDown = False
                # if event.type==sdl2.SDL_MOUSEBUTTONDOWN:
                # 	if mouseInBlinkText:
                # 		blinkTextButtonDown = True
                if event.type == sdl2.SDL_MOUSEMOTION:
                    alreadyClicked = False
                    for setting in settingsDict:
                        if (settingsDict[setting].isActive) and (
                                settingsDict[setting].clicked):
                            alreadyClicked = True
                    if not alreadyClicked:
                        for setting in settingsDict:
                            settingsDict[setting].checkIfActive(event)
                elif event.type == sdl2.SDL_MOUSEBUTTONDOWN:
                    alreadyClicked = False
                    for setting in settingsDict:
                        if (settingsDict[setting].isActive) and (
                                settingsDict[setting].clicked):
                            alreadyClicked = True
                    if not alreadyClicked:
                        for setting in settingsDict:
                            if settingsDict[setting].isActive:
                                settingsDict[setting].clicked = True
                elif event.type == sdl2.SDL_KEYDOWN:
                    key = sdl2.SDL_GetKeyName(event.key.keysym.sym).lower()
                    if key == 'backspace':
                        for setting in settingsDict:
                            if (settingsDict[setting].isActive) and (
                                    settingsDict[setting].clicked):
                                settingsDict[setting].delValue()
                    elif key == 'return':
                        for setting in settingsDict:
                            if (settingsDict[setting].isActive) and (
                                    settingsDict[setting].clicked):
                                settingsDict[setting].finalizeValue()
                                settingsDict[setting].clicked = False
                    else:
                        for setting in settingsDict:
                            if (settingsDict[setting].isActive) and (
                                    settingsDict[setting].clicked):
                                settingsDict[setting].addValue(key)
            elif previewInFocus:
                if event.type == sdl2.SDL_KEYDOWN:
                    key = sdl2.SDL_GetKeyName(event.key.keysym.sym).lower()
                    if key == 'escape':  #exit
                        # exitSafely()
                        clickingForDots = False
                        clickingForFid = False
                        definingFidFinderBox = False
                        dotList = []
                if event.type == sdl2.SDL_MOUSEMOTION:
                    if clickingForDots:
                        clickableTextDict[
                            'manual'].isActive = True  #just making sure
                        if definingFidFinderBox:
                            fidFinderBoxSize = abs(fidFinderBoxX -
                                                   (previewWindow.size[0] -
                                                    event.button.x))
                    else:
                        for clickableText in clickableTextDict:
                            if not (clickableText in ['lag', 'f2f']):
                                clickableTextDict[clickableText].checkIfActive(
                                    event)
                if event.type == sdl2.SDL_MOUSEBUTTONDOWN:
                    if clickingForDots:
                        if clickingForFid:
                            if not definingFidFinderBox:
                                definingFidFinderBox = True
                                fidFinderBoxX = previewWindow.size[
                                    0] - event.button.x
                                fidFinderBoxY = event.button.y
                                fidFinderBoxSize = 0
                            else:
                                definingFidFinderBox = False
                                clickingForFid = False
                                fidFinderBoxSize = abs(fidFinderBoxX -
                                                       (previewWindow.size[0] -
                                                        event.button.x))
                                dotList.append(
                                    dotObj(
                                        name='fid',
                                        isFid=True,
                                        fid=None,
                                        xPixel=fidFinderBoxX * previewDownsize,
                                        yPixel=fidFinderBoxY * previewDownsize,
                                        radiusPixel=fidFinderBoxSize *
                                        previewDownsize,
                                        blinkCriterion=settingsDict['blink'].
                                        value / 100.0,
                                        blurSize=settingsDict['blur'].value,
                                        filterSize=settingsDict['filter'].value
                                    ))
                        else:
                            clickX = (previewWindow.size[0] - event.button.x)
                            clickY = event.button.y
                            if len(dotList) == 1:
                                dotList.append(
                                    dotObj(
                                        name='left',
                                        isFid=False,
                                        fid=dotList[0],
                                        xPixel=clickX * previewDownsize,
                                        yPixel=clickY * previewDownsize,
                                        radiusPixel=dotList[0].radiusPixel,
                                        blinkCriterion=settingsDict['blink'].
                                        value / 100.0,
                                        blurSize=settingsDict['blur'].value,
                                        filterSize=settingsDict['filter'].value
                                    ))
                            else:
                                dotList.append(
                                    dotObj(
                                        name='right',
                                        isFid=False,
                                        fid=dotList[0],
                                        xPixel=clickX * previewDownsize,
                                        yPixel=clickY * previewDownsize,
                                        radiusPixel=dotList[1].radiusPixel,
                                        blinkCriterion=settingsDict['blink'].
                                        value / 100.0,
                                        blurSize=settingsDict['blur'].value,
                                        filterSize=settingsDict['filter'].value
                                    ))
                                clickingForDots = False
                                manTextSurf = sdl2.sdlttf.TTF_RenderText_Blended_Wrapped(
                                    font, 'Manual',
                                    sdl2.pixels.SDL_Color(r=0,
                                                          g=0,
                                                          b=255,
                                                          a=255),
                                    previewWindow.size[0]).contents
                    else:
                        if clickableTextDict['settings'].isActive:
                            if (sdl2.SDL_GetWindowFlags(settingsWindow.window)
                                    & sdl2.SDL_WINDOW_SHOWN):
                                settingsWindow.hide()
                            else:
                                settingsWindow.show()
                        elif clickableTextDict['auto'].isActive:
                            waitingforHaar = False
                            doHaar = True  #triggers haar detection for next frame
                            dotList = []
                        elif clickableTextDict['manual'].isActive:
                            clickingForDots = True
                            clickingForFid = True
                            definingFidFinderBox = False
                            dotList = []
                        elif clickableTextDict['calibrate'].isActive:
                            doneCalibration = False
                            calibrationChild = fileForker.childClass(
                                childFile='calibrationChild')
                            calibrationChild.initDict[
                                'timestampMethod'] = timestampMethod
                            calibrationChild.initDict[
                                'viewingDistance'] = viewingDistance
                            calibrationChild.initDict[
                                'stimDisplayWidth'] = stimDisplayWidth
                            calibrationChild.initDict[
                                'stimDisplayRes'] = stimDisplayRes
                            calibrationChild.initDict[
                                'stimDisplayPosition'] = stimDisplayPosition
                            calibrationChild.initDict[
                                'mirrorDisplayPosition'] = mirrorDisplayPosition
                            calibrationChild.initDict[
                                'mirrorDownSize'] = mirrorDownSize
                            calibrationChild.initDict[
                                'calibrationDotSizeInDegrees'] = calibrationDotSizeInDegrees
                            calibrationChild.initDict[
                                'manualCalibrationOrder'] = manualCalibrationOrder
                            calibrationChild.start()
                            calibrating = True
                            checkCalibrationStopTime = False
                            queueDataToCalibrationChild = False

        #do haar detection if requested
        if doHaar:
            doHaar = False  #only enter this section once
            faceDetectionImage = cv2.resize(
                image,
                dsize=(image.shape[1] / faceDetectionScale,
                       image.shape[0] / faceDetectionScale),
                interpolation=cv2.INTER_NEAREST)
            detectedFaces = faceCascade.detectMultiScale(
                faceDetectionImage
            )  #,scaleFactor=1.1,minNeighbors=3,minSize=(10,10))
            if len(detectedFaces) == 0:  #no faces found!
                print 'no faces found!'  #do something here
            else:
                faceX, faceY, faceW, faceH = rescaleBiggestHaar(
                    detected=detectedFaces,
                    scale=faceDetectionScale,
                    addToX=0,
                    addToY=0)
                leftFaceImage = image[faceY:(faceY + faceH),
                                      faceX:(faceX + faceW / 2)]
                eyeLeftDetectionImage = cv2.resize(
                    leftFaceImage,
                    dsize=(leftFaceImage.shape[1] / eyeDetectionScale,
                           leftFaceImage.shape[0] / eyeDetectionScale),
                    interpolation=cv2.INTER_NEAREST)
                detectedEyeLefts = eyeLeftCascade.detectMultiScale(
                    eyeLeftDetectionImage
                )  #,minSize=(leftFaceImage.shape[0]/8,leftFaceImage.shape[0]/8))
                rightFaceImage = image[faceY:(faceY + faceH),
                                       (faceX + faceW / 2):(faceX + faceW)]
                eyeRightDetectionImage = cv2.resize(
                    rightFaceImage,
                    dsize=(rightFaceImage.shape[1] / eyeDetectionScale,
                           rightFaceImage.shape[0] / eyeDetectionScale),
                    interpolation=cv2.INTER_NEAREST)
                detectedEyeRights = eyeRightCascade.detectMultiScale(
                    eyeRightDetectionImage
                )  #,minSize=(rightFaceImage.shape[0]/8,rightFaceImage.shape[0]/8))
                if (len(detectedEyeLefts)
                        == 0) | (len(detectedEyeRights)
                                 == 0):  #at least one eye is missing!
                    if (len(detectedEyeLefts) == 0):
                        print 'left eye missing'  #do something here
                    else:
                        print 'right eye missing'  #do something here
                else:
                    eyeLeftX, eyeLeftY, eyeLeftW, eyeLeftH = rescaleBiggestHaar(
                        detected=detectedEyeLefts,
                        scale=eyeDetectionScale,
                        addToX=faceX,
                        addToY=faceY)
                    eyeRightX, eyeRightY, eyeRightW, eyeRightH = rescaleBiggestHaar(
                        detected=detectedEyeRights,
                        scale=eyeDetectionScale,
                        addToX=faceX + faceW / 2,
                        addToY=faceY)
                    #initialize fid
                    dotList.append(
                        dotObj(name='fid',
                               isFid=True,
                               fid=None,
                               xPixel=faceX + faceW / 2,
                               yPixel=(faceY + (eyeLeftY + eyeRightY) / 2) / 2,
                               radiusPixel=(eyeLeftH + eyeRightH) / 4,
                               blinkCriterion=settingsDict['blink'].value /
                               100.0,
                               blurSize=settingsDict['blur'].value,
                               filterSize=settingsDict['filter'].value))
                    #initialize left
                    dotList.append(
                        dotObj(name='left',
                               isFid=False,
                               fid=dotList[0],
                               xPixel=eyeLeftX + eyeLeftW / 2,
                               yPixel=eyeLeftY + eyeLeftH / 2,
                               radiusPixel=eyeLeftH / 2,
                               blinkCriterion=settingsDict['blink'].value /
                               100.0,
                               blurSize=settingsDict['blur'].value,
                               filterSize=settingsDict['filter'].value))
                    #initialize right
                    dotList.append(
                        dotObj(name='right',
                               isFid=False,
                               fid=dotList[0],
                               xPixel=eyeRightX + eyeRightW / 2,
                               yPixel=eyeRightY + eyeRightH / 2,
                               radiusPixel=eyeRightH / 2,
                               blinkCriterion=settingsDict['blink'].value /
                               100.0,
                               blurSize=settingsDict['blur'].value,
                               filterSize=settingsDict['filter'].value))

        #update the dots given the latest image
        for i in range(len(dotList)):
            dotList[i].update(img=image,
                              fid=dotList[0],
                              blinkCriterion=settingsDict['blink'].value /
                              100.0,
                              blurSize=settingsDict['blur'].value,
                              filterSize=settingsDict['filter'].value)
            # print 'ok'

        #some post-processing
        blinkHappened = False
        saccadeHappened = False
        if len(dotList) == 3:
            if dotList[0].lost:
                dotList = []
                print 'fid lost'
            elif (dotList[1].lostCount > 30) or (dotList[2].lostCount > 30):
                print "lost lots"
                if (not dotList[1].blinkHappened) and (
                        not dotList[2].blinkHappened
                ):  #only reset if not blinking
                    dotList = []
            elif dotList[1].blinkHappened and dotList[2].blinkHappened:
                blinkHappened = True
            else:
                #compute gaze location to check for saccades
                xCoefLeft, xCoefRight, yCoefLeft, yCoefRight = calibrationCoefs
                if dotList[1].lost:  #left missing, use right
                    xLoc = xCoefRight[0] + xCoefRight[1] * dotList[
                        2].x2 + xCoefRight[2] * dotList[2].y2 + xCoefRight[
                            3] * dotList[2].y2 * dotList[2].x2
                    yLoc = yCoefRight[0] + yCoefRight[1] * dotList[
                        2].x2 + yCoefRight[2] * dotList[2].y2 + yCoefRight[
                            3] * dotList[2].y2 * dotList[2].x2
                elif dotList[2].lost:  #right missing, use left
                    xLoc = xCoefLeft[0] + xCoefLeft[1] * dotList[
                        1].x2 + xCoefLeft[2] * dotList[1].y2 + xCoefLeft[
                            3] * dotList[2].y2 * dotList[1].x2
                    yLoc = yCoefLeft[0] + yCoefLeft[1] * dotList[
                        1].x2 + yCoefLeft[2] * dotList[1].y2 + yCoefLeft[
                            3] * dotList[2].y2 * dotList[1].x2
                elif dotList[1].lost and dotList[
                        2].lost:  #both missing, use last
                    xLoc = lastLocs[0]
                    yLoc = lastLocs[1]
                else:  #both present, use average
                    xLocLeft = xCoefLeft[0] + xCoefLeft[1] * dotList[
                        1].x2 + xCoefLeft[2] * dotList[1].y2 + xCoefLeft[
                            3] * dotList[1].y2 * dotList[1].x2
                    yLocLeft = yCoefLeft[0] + yCoefLeft[1] * dotList[
                        1].x2 + yCoefLeft[2] * dotList[1].y2 + yCoefLeft[
                            3] * dotList[1].y2 * dotList[1].x2
                    xLocRight = xCoefRight[0] + xCoefRight[1] * dotList[
                        2].x2 + xCoefRight[2] * dotList[2].y2 + xCoefRight[
                            3] * dotList[2].y2 * dotList[2].x2
                    yLocRight = yCoefRight[0] + yCoefRight[1] * dotList[
                        2].x2 + yCoefRight[2] * dotList[2].y2 + yCoefRight[
                            3] * dotList[2].y2 * dotList[2].x2
                    xLoc = (xLocLeft + xLocRight) / 2.0
                    yLoc = (yLocLeft + yLocRight) / 2.0
                if None not in lastLocs:
                    locDiff = (((xLoc - lastLocs[0])**2) +
                               ((yLoc - lastLocs[1])**2))**.5
                    if doneCalibration:
                        saccadeCriterion = settingsDict['saccade'].value
                    else:
                        saccadeCriterion = settingsDict[
                            'saccade0'].value / 100.0
                    if locDiff > saccadeCriterion:
                        saccadeHappened = True
                lastLocs = [xLoc, yLoc]
                if queueDataToParent:
                    qFrom.put([
                        'eyeData',
                        [
                            str.format('{0:.3f}', imageTime), xLoc, yLoc,
                            dotlist[1].radius2, dotlist[2].radius2,
                            saccadeHappened, blinkHappened, dotList[1].lost,
                            dotList[2].lost, dotList[1].blinkHappened,
                            dotList[2].blinkHappened
                        ]
                    ])

        #play sounds as necessary
        if doSounds:
            if (not saccadeSound.stillPlaying()) and (
                    not blinkSound.stillPlaying()):
                if blinkHappened:
                    blinkSound.play()
                elif saccadeHappened:
                    saccadeSound.play()

        #do drawing
        if previewDownsize != 1:
            image = cv2.resize(image,
                               dsize=previewWindow.size,
                               interpolation=cv2.INTER_NEAREST)
        image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
        if clickingForDots:
            if clickingForFid:
                if definingFidFinderBox:
                    cv2.circle(image, (fidFinderBoxX, fidFinderBoxY),
                               fidFinderBoxSize,
                               color=(255, 0, 0, 255),
                               thickness=1)
        for dot in dotList:
            ellipse = ((dot.ellipse[0][0] / previewDownsize,
                        dot.ellipse[0][1] / previewDownsize),
                       (dot.ellipse[1][0] / previewDownsize,
                        dot.ellipse[1][1] / previewDownsize), dot.ellipse[2])
            if dot.blinkHappened or dot.lost:
                dotColor = (0, 0, 255, 255)
            else:
                dotColor = (0, 255, 0, 255)
            cv2.ellipse(image, ellipse, color=dotColor, thickness=1)
        image = numpy.rot90(image)
        previewWindowArray[:, :, 0:3] = image
        frameToFrameTimeList.append(imageTime - lastTime)
        lastTime = imageTime
        displayLagList.append(getTime() - imageTime)
        if len(displayLagList) > 30:
            displayLagList.pop(0)
            frameToFrameTimeList.pop(0)
        clickableTextDict['lag'].valueText = str(
            int(numpy.median(displayLagList) * 1000))
        clickableTextDict['lag'].updateSurf()
        clickableTextDict['f2f'].valueText = str(
            int(numpy.median(frameToFrameTimeList) * 1000))
        clickableTextDict['f2f'].updateSurf()
        for clickableText in clickableTextDict:
            clickableTextDict[clickableText].draw(previewWindowSurf)
        previewWindow.refresh()
        thisRefreshTime = getTime()
        # print (thisRefreshTime - lastRefreshTime)*1000
        lastRefreshTime = thisRefreshTime
        if (sdl2.SDL_GetWindowFlags(settingsWindow.window)
                & sdl2.SDL_WINDOW_SHOWN):
            sdl2.ext.fill(settingsWindowSurf.contents,
                          sdl2.pixels.SDL_Color(r=0, g=0, b=0, a=255))
            for setting in settingsDict:
                settingsDict[setting].draw(settingsWindowSurf)
            settingsWindow.refresh()

        #calibration stuff
        if calibrating:
            if not calibrationChild.qFrom.empty():
                message = calibrationChild.qFrom.get()
                if message == 'startQueing':
                    queueDataToCalibrationChild = True
                elif message[0] == 'stopQueing':
                    calibrationStopTime = message[1]
                    checkCalibrationStopTime = True
                elif message[0] == 'calibrationCoefs':
                    calibrationCoefs = message[1]
                    calibrating = False
                    doneCalibration = True
                    calibrationChild.stop()
                    del calibrationChild
                    lastLocs = []
                    qFrom.put(['calibrationComplete', message])
                    queueDataToParent = True
                else:
                    print message
            if checkCalibrationStopTime:
                if imageTime > calibrationStopTime:
                    queueDataToCalibrationChild = False
                    calibrationChild.qTo.put('doneQueing')
                    checkCalibrationStopTime = False
            if queueDataToCalibrationChild:
                if len(dotList) > 0:
                    calibrationChild.qTo.put([
                        imageTime, dotList[1].x2, dotList[1].y2, dotList[2].x2,
                        dotList[2].y2
                    ])
Esempio n. 23
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Writing Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load texture
        texture = loadTexture(b'res/point.bmp', gl.GL_ALPHA, gl.GL_CLAMP)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        renderer = GLQuadRenderer.create(1.0)  # type: GLQuadRenderer
        renderer.enableBlending(True)
        renderer.setBlendingFunctions(gl.GL_SRC_ALPHA, gl.GL_ONE)
        renderer.setTexturingMode(spk.TEXTURE_2D)
        renderer.setTexture(texture)
        renderer.setTextureBlending(gl.GL_MODULATE)
        renderer.setScale(0.05, 0.05)
        renderer.enableRenderingHint(spk.DEPTH_TEST, False)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | spk.FLAG_SIZE
        model_mutable = spk.FLAG_ALPHA | spk.FLAG_SIZE
        model = spk.Model.create(model_enable,
                                 model_mutable)  # type: spk.Model
        model.setParam(spk.PARAM_ALPHA, 5.0,
                       0.0)  # the particles will fade as the die
        model.setParam(spk.PARAM_SIZE, 1.0,
                       15.0)  # the particles will enlarge over time
        model.setLifeTime(5.0, 6.0)
        self.model = model
        # create Emitter
        # We set up a spheric emitter that emits in all direction with a very small force
        # in order to slightly displace the particles
        emitter = spk.RandomEmitter.create()
        emitter.setForce(0.01, 0.01)
        self.emitter = emitter  # uses it at later directly
        # create Group
        group = spk.Group.create(model, 14000)  # type: spk.Group
        group.setRenderer(renderer)
        group.setFriction(
            -0.3)  # negative friction: The particles will accelerate over time
        self.group = group
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.angleY = 0.0
        self.angleX = 0.0
        self.camPosZ = 5.0
        self.add = False
        self.oldX = 0
        self.oldY = 0
        self.oldZ = 0
        self.offset = 0.0
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]

        # This computes the ratio to go from screen coordinates to universe coordinates
        self.screenToUniverse = 2.0 * self.camPosZ * math.tan(
            45.0 * 0.5 * math.pi / 180.0) / self.height
Esempio n. 24
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Flakes Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        renderer = GLPointRenderer.create(1.0)  # type: GLPointRenderer
        renderer.setBlending(
            spk.BLENDING_ADD
        )  # blending method between particles(additive blending)
        renderer.enableRenderingHint(spk.DEPTH_TEST,
                                     False)  # notifying not to use depth info
        renderer.setAlphaTestThreshold(0.8)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA  # use color channels(RGBA)
        model = spk.Model.create(model_enable)  # type: spk.Model
        model.setParam(spk.PARAM_RED, 1.0)
        model.setParam(spk.PARAM_GREEN, 0.8)
        model.setParam(spk.PARAM_BLUE, 0.3)
        model.setParam(spk.PARAM_ALPHA, 0.4)
        model.setImmortal(True)  # particle is immortal
        self.model = model
        # no Emitter
        # create Modifier
        self.sphere = spk.Sphere.create(spk.Vector3D(), 1.0)
        obstacle = spk.Obstacle.create(self.sphere)  # type: spk.Obstacle
        obstacle.setFriction(0.9)
        obstacle.setBouncingRatio(0.9)
        self.obstacle = obstacle
        # create Group
        self.NB_PARTICLES = [10000, 25000, 50000, 100000, 200000, 500000]
        group = spk.Group.create(model,
                                 self.NB_PARTICLES[-1])  # type: spk.Group
        group.addModifier(obstacle)
        group.setRenderer(renderer)
        group.setGravity(spk.Vector3D(0.0, -0.5, 0.0))
        group.setFriction(0.2)
        self.group = group
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.angleX = 0.0
        self.angleZ = 0.0
        self.camPosZ = 2.75
        self.particleIndex = 2
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 25
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Fire Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load textures
        txFire = loadTexture(b'res/fire2.bmp',
                             gl.GL_ALPHA,
                             gl.GL_CLAMP,
                             mipmap=True)
        txSmoke = loadTexture(b'res/explosion.bmp', gl.GL_ALPHA, gl.GL_CLAMP)
        # lighting
        light_ambient = [0.15, 0.15, 0.25, 1.0]
        light_diffuse = [1.0, 0.75, 0.25, 1.0]
        gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, light_ambient)
        gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, light_diffuse)
        gl.glLightf(gl.GL_LIGHT0, gl.GL_QUADRATIC_ATTENUATION, 20.0)
        mat_ambient = [0.2, 0.2, 0.2, 1.0]
        mat_diffuse = [1.0, 1.0, 1.0, 1.0]
        gl.glMaterialfv(gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT, mat_ambient)
        gl.glMaterialfv(gl.GL_FRONT_AND_BACK, gl.GL_DIFFUSE, mat_diffuse)
        gl.glLightModelfv(gl.GL_LIGHT_MODEL_AMBIENT, light_ambient)
        gl.glLightModelf(gl.GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init PyWavefront
        self.scene = pywavefront.Wavefront('./res/SceneFireCamp.obj')

        # init SPARK(pyspk)
        # random seed initialization
        spk.setRandomSeed(int(time.time()))
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)

        # create Renderer
        fireRenderer = GLQuadRenderer.create()  # type: GLQuadRenderer
        fireRenderer.setScale(0.3, 0.3)
        fireRenderer.setTexturingMode(spk.TEXTURE_2D)
        fireRenderer.setTexture(txFire)
        fireRenderer.setTextureBlending(gl.GL_MODULATE)
        fireRenderer.setBlending(spk.BLENDING_ADD)
        fireRenderer.enableRenderingHint(spk.DEPTH_WRITE, False)
        fireRenderer.setAtlasDimensions(2, 2)
        self.fireRenderer = fireRenderer
        smokeRenderer = GLQuadRenderer.create()  # type: GLQuadRenderer
        smokeRenderer.setScale(0.3, 0.3)
        smokeRenderer.setTexturingMode(spk.TEXTURE_2D)
        smokeRenderer.setTexture(txSmoke)
        smokeRenderer.setTextureBlending(gl.GL_MODULATE)
        smokeRenderer.setBlending(spk.BLENDING_ALPHA)
        smokeRenderer.enableRenderingHint(spk.DEPTH_WRITE, False)
        smokeRenderer.setAtlasDimensions(2, 2)
        self.smokeRenderer = smokeRenderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)

        # create Model
        fire_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | \
            spk.FLAG_SIZE | spk.FLAG_ANGLE | spk.FLAG_TEXTURE_INDEX
        fire_mutable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_ALPHA | spk.FLAG_ANGLE
        fire_random = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_TEXTURE_INDEX | spk.FLAG_ANGLE
        fire_interpolated = spk.FLAG_SIZE
        fireModel = spk.Model.create(fire_enable, fire_mutable, fire_random,
                                     fire_interpolated)  # type: spk.Model
        fireModel.setParam(spk.PARAM_RED, 0.8, 0.9, 0.8,
                           0.9)  # [min,max]on birth, [min,max]on death
        fireModel.setParam(spk.PARAM_GREEN, 0.5, 0.6, 0.5, 0.6)
        fireModel.setParam(spk.PARAM_BLUE, 0.3)
        fireModel.setParam(spk.PARAM_ALPHA, 0.4, 0.0)  # on birth, on death
        minAngle, maxAngle = 0.0, 2.0 * math.pi
        fireModel.setParam(spk.PARAM_ANGLE, minAngle, maxAngle, minAngle,
                           maxAngle)
        fireModel.setParam(spk.PARAM_TEXTURE_INDEX, 0.0, 4.0)
        fireModel.setLifeTime(1.0, 1.5)
        ip_size = fireModel.getInterpolator(spk.PARAM_SIZE)
        ip_size.addEntry(0.5, 2.0, 5.0)
        ip_size.addEntry(1.0, 0.0)
        self.fireModel = fireModel
        smoke_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA | \
            spk.FLAG_SIZE | spk.FLAG_ANGLE | spk.FLAG_TEXTURE_INDEX
        smoke_mutable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_SIZE | spk.FLAG_ANGLE
        smoke_random = spk.FLAG_TEXTURE_INDEX | spk.FLAG_ANGLE
        smoke_interpolated = spk.FLAG_ALPHA
        smokeModel = spk.Model.create(smoke_enable, smoke_mutable,
                                      smoke_random,
                                      smoke_interpolated)  # type: spk.Model
        smokeModel.setParam(spk.PARAM_RED, 0.3, 0.2)
        smokeModel.setParam(spk.PARAM_GREEN, 0.25, 0.2)
        smokeModel.setParam(spk.PARAM_BLUE, 0.2)
        smokeModel.setParam(spk.PARAM_ALPHA, 0.2, 0.0)
        smokeModel.setParam(spk.PARAM_SIZE, 5.0, 10.0)
        smokeModel.setParam(spk.PARAM_TEXTURE_INDEX, 0.0, 4.0)
        smokeModel.setParam(spk.PARAM_ANGLE, 0.0, 2.0 * math.pi, 0.0,
                            2.0 * math.pi)
        smokeModel.setLifeTime(5.0, 5.0)
        ip_alpha = smokeModel.getInterpolator(spk.PARAM_ALPHA)
        ip_alpha.addEntry(0.0, 0.0)
        ip_alpha.addEntry(0.2, 0.2)
        ip_alpha.addEntry(1.0, 0.0)
        self.smokeModel = smokeModel

        # create Emitter
        fireEmitter1 = spk.StraightEmitter.create(spk.Vector3D(0.0, 1.0, 0.0))
        fireEmitter1.setZone(
            spk.Sphere.create(spk.Vector3D(0.0, -1.0, 0.0), 0.5))
        fireEmitter1.setFlow(40)
        fireEmitter1.setForce(1.0, 2.5)
        fireEmitter2 = spk.StraightEmitter.create(spk.Vector3D(1.0, 0.6, 0.0))
        fireEmitter2.setZone(
            spk.Sphere.create(spk.Vector3D(0.15, -1.2, 0.075), 0.1))
        fireEmitter2.setFlow(15)
        fireEmitter2.setForce(0.5, 1.5)
        fireEmitter3 = spk.StraightEmitter.create(spk.Vector3D(
            -0.6, 0.8, -0.8))
        fireEmitter3.setZone(
            spk.Sphere.create(spk.Vector3D(-0.375, -1.15, -0.375), 0.3))
        fireEmitter3.setFlow(15)
        fireEmitter3.setForce(0.5, 1.5)
        fireEmitter4 = spk.StraightEmitter.create(spk.Vector3D(-0.8, 0.5, 0.2))
        fireEmitter4.setZone(
            spk.Sphere.create(spk.Vector3D(-0.255, -1.2, 0.225), 0.2))
        fireEmitter4.setFlow(10)
        fireEmitter4.setForce(0.5, 1.5)
        fireEmitter5 = spk.StraightEmitter.create(spk.Vector3D(0.1, 0.8, -1.0))
        fireEmitter5.setZone(
            spk.Sphere.create(spk.Vector3D(-0.075, -1.2, -0.3), 0.2))
        fireEmitter5.setFlow(10)
        fireEmitter5.setForce(0.5, 1.5)
        smokeEmitter = spk.SphericEmitter.create(spk.Vector3D(0.0, 1.0, 0.0),
                                                 0.0, 0.5 * math.pi)
        smokeEmitter.setZone(spk.Sphere.create(spk.Vector3D(), 1.2))
        smokeEmitter.setFlow(25)
        smokeEmitter.setForce(0.5, 1.0)

        # no Modifier

        # create Group
        fireGroup = spk.Group.create(fireModel, 135)  # type: spk.Group
        fireGroup.addEmitter(fireEmitter1)
        fireGroup.addEmitter(fireEmitter2)
        fireGroup.addEmitter(fireEmitter3)
        fireGroup.addEmitter(fireEmitter4)
        fireGroup.addEmitter(fireEmitter5)
        fireGroup.setRenderer(fireRenderer)
        fireGroup.setGravity(spk.Vector3D(0.0, 3.0, 0.0))
        self.fireGroup = fireGroup
        smokeGroup = spk.Group.create(smokeModel, 135)  # type: spk.Group
        smokeGroup.addEmitter(smokeEmitter)
        smokeGroup.setRenderer(smokeRenderer)
        smokeGroup.setGravity(spk.Vector3D(0.0, 0.4, 0.0))
        self.smokeGroup = smokeGroup

        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(fireGroup)
        system.addGroup(smokeGroup)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.renderEnv = True
        self.angleY = 30.0
        self.angleX = 25.0
        self.camPosZ = 12.0
        self.smoke = True
        self.lightTime = 0
        self.nbParticles = ''
        self.fps = ''
        self.strSmoke = 'SMOKE: ON'
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 26
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Basic Demo", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load Texture
        texture = loadTexture(b'res/point.bmp', gl.GL_ALPHA, gl.GL_CLAMP)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        renderer = GLPointRenderer.create(1.0)  # type: GLPointRenderer
        renderer.setType(
            spk.POINT_SPRITE)  # using Point Sprite(require >=OpenGL2.0)
        renderer.setTexture(texture)  # use the texture on drawing
        renderer.setTextureBlending(gl.GL_MODULATE)
        renderer.enableWorldSize(
            True
        )  # true: unit is adjusted with the screen, false: unit is pixel(fixed)
        GLPointRenderer.setPixelPerUnit(45.0 * math.pi / 180.0, self.height)
        renderer.setSize(0.05)
        renderer.setBlending(
            spk.BLENDING_ADD
        )  # blending method between particles(additive blending)
        renderer.enableRenderingHint(spk.DEPTH_WRITE,
                                     False)  # notifying not to use depth info
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA  # use color channels(RGBA)
        model = spk.Model.create(model_enable)  # type: spk.Model
        model.setParam(spk.PARAM_ALPHA,
                       1.0)  # alpha is fixed(RGB are changed later)
        model.setLifeTime(8.0, 8.0)  # particle's life time is 8.0[sec]
        self.model = model
        # create Emitter
        emit_dir = spk.Vector3D(0.0, 1.0, 0.0)
        emit_center = spk.Vector3D(0.0, 0.015, 0.0)
        minangle = 0.1 * math.pi  # zenith angle(min)
        maxangle = 0.1 * math.pi  # zenith angle(max)
        emitter = spk.SphericEmitter.create(
            emit_dir, minangle, maxangle)  # type: spk.SphericEmitter
        emitter.setZone(
            spk.Point.create(emit_center),
            True)  # particles are randomly placed in the specified zone
        emitter.setFlow(1000)  # max number of particles
        emitter.setForce(1.5, 1.5)  # emittion power
        # create Modifier
        groundplane = spk.Plane.create()
        bouncing = 0.6  # bouncing ratio(coefficient of restitution)
        friction = 1.0  # coefficient of friction
        obstacle = spk.Obstacle.create(groundplane, spk.INTERSECT_ZONE,
                                       bouncing, friction)
        # create Group
        maxparticle = 5000  # upper limit number of particles
        group = spk.Group.create(model, maxparticle)  # type: spk.Group
        group.addEmitter(emitter)
        group.addModifier(obstacle)
        group.setRenderer(renderer)
        group.setGravity(spk.Vector3D(0.0, -0.8, 0.0))
        self.group = group
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.angleY = 0.0
        self.angleX = 45.0
        self.camPosZ = 5.0
        self.nbParticles = ''
        self.fps = ''
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 27
0
    def __init__(self, width, height):
        self.width = width
        self.height = height

        # init SDL
        sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING)
        sdl2.SDL_GL_SetAttribute(sdl2.SDL_GL_DOUBLEBUFFER, 1)
        self.window = sdl2.SDL_CreateWindow(
            b"SPARK(&pyspk) Collision Demo2", sdl2.SDL_WINDOWPOS_UNDEFINED,
            sdl2.SDL_WINDOWPOS_UNDEFINED, width, height,
            sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_OPENGL)
        sdl2.SDL_CaptureMouse(True)

        # init OpenGL
        self.context = sdl2.SDL_GL_CreateContext(self.window)
        sdl2.SDL_GL_SetSwapInterval(0)
        gl.glClearColor(0.0, 0.0, 0.0, 1.0)
        surface = sdl2.SDL_GetWindowSurface(self.window)
        gl.glViewport(0, 0, surface.contents.w, surface.contents.h)
        # load Texture
        texture = loadTexture(b'res/ball.bmp', gl.GL_RGBA, gl.GL_CLAMP)

        # init FTGL
        if not notext:
            font = FTGL.TextureFont('res/font.ttf')
            font.FaceSize(24)
            self.font = font

        # init SPARK(pyspk)
        # step configuration
        spk.System.setClampStep(True, 0.1)  # clamp the step to 100 ms
        spk.System.useAdaptiveStep(
            0.001,
            0.01)  # use an adaptive step from 1ms to 10ms (1000fps to 100fps)
        # create Renderer
        renderer = GLPointRenderer.create(1.0)  # type: GLPointRenderer
        renderer.setType(
            spk.POINT_SPRITE)  # using Point Sprite(require >=OpenGL2.0)
        renderer.setTexture(texture)  # use the texture on drawing
        renderer.enableWorldSize(
            True
        )  # true: unit is adjusted with the screen, false: unit is pixel(fixed)
        GLPointRenderer.setPixelPerUnit(45.0 * math.pi / 180.0, self.height)
        renderer.setSize(0.15)
        renderer.setBlending(
            spk.BLENDING_NONE
        )  # blending method between particles(no blending)
        renderer.enableRenderingHint(spk.ALPHA_TEST, True)
        renderer.setAlphaTestThreshold(0.8)
        self.renderer = renderer
        self.basicRenderer = GLPointRenderer.create(
            1.0)  # bare renderer for comparison(F4)
        # create Model
        model_enable = spk.FLAG_RED | spk.FLAG_GREEN | spk.FLAG_BLUE | spk.FLAG_ALPHA  # use color channels(RGBA)
        model = spk.Model.create(model_enable)  # type: spk.Model
        model.setImmortal(True)  # particle is immortal
        self.model = model
        # no Emitter
        # create Modifier
        self.sphere = spk.Sphere.create(spk.Vector3D(), 1.0 - 0.15 / 2.0)
        self.cube = spk.AABox.create(spk.Vector3D(),
                                     spk.Vector3D(1.2, 1.2, 1.2))
        self.obstacle = spk.Obstacle.create(self.sphere, spk.EXIT_ZONE, 0.9,
                                            0.9)  # type: spk.Obstacle
        self.obstacle.setZone(self.sphere)
        collision = spk.Collision.create(0.15, 0.9)
        # create Group
        self.NB_PARTICLES = 250
        group = spk.Group.create(model, self.NB_PARTICLES)  # type: spk.Group
        group.addModifier(self.obstacle)
        group.addModifier(collision)
        group.setRenderer(renderer)
        group.setGravity(spk.Vector3D())
        group.setFriction(0.1)
        self.group = group
        # create System
        system = spk.System.create()  # type: spk.System
        system.addGroup(group)
        self.system = system

        print('SPARK FACTORY AFTER INIT :')
        spk.Factory.getInstance().traceAll()

        # init Variables
        self.running = True
        self.paused = False
        self.deltaTime = 0
        self.step = 0
        self.text = 2
        self.renderValue = 0
        self.angleX = 0.0
        self.angleZ = 0.0
        self.camPosZ = 2.75
        self.nbParticles = ''
        self.fps = ''
        self.strZone = 'ZONE: SPHERE'
        self.frames = [sdl2.SDL_GetTicks() - 1]
        self.lasttime = self.frames[-1]
Esempio n. 28
0
 def __init__(self, width, height, scale=1):
     sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
     self.window = sdl2.SDL_CreateWindow(b"Subway Time", sdl2.SDL_WINDOWPOS_CENTERED, sdl2.SDL_WINDOWPOS_CENTERED,
                                         width * scale, height * scale, sdl2.SDL_WINDOW_SHOWN)
     self.window_surface = sdl2.SDL_GetWindowSurface(self.window)
     self.scale = scale