def render_one(cls, notification): notification.show() w = 500 h = 100 x = START_X y = cls.y z = 0.9 y -= h gl.glDisable(gl.GL_DEPTH_TEST) fs_emu_texturing(False) fs_emu_blending(True) gl.glBegin(gl.GL_QUADS) gl.glColor(1.0, 1.0, 0.5, 0.8) gl.glVertex3f(x, y, z) gl.glVertex3f(x + w, y, z) gl.glVertex3f(x + w, y + h, z) gl.glVertex3f(x, y + h, z) gl.glEnd() lines = notification.text.split("\n") y += h - 23 for line in lines: tw, th = Render.get().measure_text(line, cls.font) y -= th Render.get().text( line, cls.font, x + 23, y, color=(0.2, 0.2, 0.0, 1.0) ) y -= 2 # cls.y += h + 15 cls.y -= h + 20 gl.glEnable(gl.GL_DEPTH_TEST)
def swap_buffers(): # global fps_str # # Render.get().ortho_perspective() # #glPushMatrix() # #glTranslatef(0.0, 0.0, 0.5) # # #if not fps_str: # # fps_str = "WHY?" # # if Render.get().display_fps or True: # if fps_str: # Render.get().text(fps_str, Font.main_path_font, # -1.74, 0.82, h=0.1, color=(0.25, 0.25, 0.25, 1.0)) # #glPopMatrix() # # # FIXME: Why does not minimize from fullscreen work on ATI unless we # render # # something here? # glBindTexture(GL_TEXTURE_2D, 0) # glPushMatrix() # glTranslate(2000.0, 0.0, 0.0) # glBegin(GL_QUADS) # glVertex2f(0.0, 0.0) # glVertex2f(1.0, 0.0) # glVertex2f(1.0, 1.0) # glVertex2f(0.0, 1.0) # glEnd() # glPopMatrix() # # #fs_emu_blending(False) # #glEnable(GL_DEPTH_TEST) # # #if Render.get().display_sync: # # glFinish() # # #pygame.display.flip() # print("FIXME: not flipping") # # if Render.get().display_sync: # # give up time slice # time.sleep(0.001) # glFinish() # # if Render.get().display_fps: # t = get_current_time() # render_times.append(t) # t0 = render_times.popleft() # if t0 > 0 and State.get().frame_number % 5 == 0: # time_diff = t - t0 # #print("{0:0.2f}".format(300.0 / time_diff)) # fps = FPS_FRAMES / time_diff # if fps >= 100: # fps_str = "FPS: {0:0.0f}".format(fps) # else: # fps_str = "FPS: {0:0.1f}".format(fps) # #Render.get().text(fps_str, Font.title_font, # # -1.0, 0.90, 2.0, shadow=True) State.get().frame_number += 1 Render.get().delete_textures()
def render_config_menu(): if not State.get().config_menu: return Render.get().ortho_perspective() config_menu = State.get().config_menu # text = config_menu.items[config_menu.index] # otw, th = Render.get().text(text, title_font, # -1.0, -0.93, 2.0, color=(1.0, 1.0, 1.0, 0.36 * strength)) # x = 0.0 + otw / 2 + CONFIG_SEPARATION # for i in range(config_menu.index + 1, len(config_menu.items)): # text = config_menu.items[i] # tw, th = Render.get().text(text, title_font, # x, -0.93, color=(1.0, 1.0, 1.0, 0.36 * strength)) # x += tw + CONFIG_SEPARATION # x = 0.0 - otw / 2 - CONFIG_SEPARATION x = -0.55 y = 0.8 for i in range(len(config_menu.items)): text = config_menu.items[i].upper() # tw, th = Render.get().measure_text(text, title_font) # x -= tw + CONFIG_SEPARATION y -= 0.15 if i == config_menu.index and config_menu == State.get().navigatable: color = (1.0, 1.0, 1.0, 1.0) else: color = (1.0, 1.0, 1.0, 0.33) Render.get().text(text, Font.subtitle_font, x, y, color=color)
def render_global_fade(): t = State.get().time if State.get().fade_end >= t >= State.get().fade_start: a = (t - State.get().fade_start) / ( State.get().fade_end - State.get().fade_start) if a < 0.0: a = 0.0 elif a > 1.0: a = 1.0 Render.get().hd_perspective() gl.glPushMatrix() gl.glTranslatef(0.0, 0.0, 0.99999) fs_emu_blending(True) fs_emu_texturing(True) if State.get().fade_splash: Texture.splash.render( (1920 - Texture.splash.w) // 2, (1080 - Texture.splash.h) // 2, Texture.splash.w, Texture.splash.h, opacity=(1.0 - a)) c = [0, 0, 0, (1.0 - a)] # for i in range(4): # c[i] = State.get().fade_from[i] + \ # (State.get().fade_to[i] - State.get().fade_from[i]) * a # * (a) render_fade(*c) gl.glPopMatrix() Render.get().dirty = True
def render_item_shadows(itemdata, front=False, back=True): Render.get().standard_perspective() # glEnable(GL_STENCIL_TEST) # glStencilFunc(GL_EQUAL, 1, 1) if front: gl.glPolygonOffset(0.0, -4.0) gl.glEnable(gl.GL_POLYGON_OFFSET_FILL) elif back: gl.glPolygonOffset(0.0, 4.0) gl.glEnable(gl.GL_POLYGON_OFFSET_FILL) gl.glDepthMask(False) fs_emu_blending(True) fs_emu_texturing(True) gl.glBindTexture(gl.GL_TEXTURE_2D, Texture.shadow2) for type_, menu, item_index, pos, rotation, scale, ratio, brightness, \ area in reversed(itemdata): gl.glPushMatrix() gl.glTranslate(*pos) gl.glRotate(rotation, 0.0, 1.0, 0.0) gl.glScalef(scale, scale, 1.0) render_item_shadow(ratio=ratio, brightness=brightness, area=area) gl.glScalef(1.0, -1.0, 1.0) gl.glTranslatef(0.0, 0.5, 0.0) # render_item_shadow(ratio=ratio, # brightness=brightness * 0.33, area=area) render_item_shadow(ratio=ratio, brightness=brightness, area=area) gl.glPopMatrix() gl.glPolygonOffset(0.0, 0.0) gl.glDisable(gl.GL_POLYGON_OFFSET_FILL) gl.glDepthMask(True)
def render_one(cls, notification): notification.show() w = 500 h = 100 x = 1920 - w y = cls.y z = 0.9 fs_emu_texturing(False) fs_emu_blending(True) gl.glBegin(gl.GL_QUADS) gl.glColor(1.0, 1.0, 0.5, 0.8) gl.glVertex3f(x, y, z) gl.glVertex3f(x + w, y, z) gl.glVertex3f(x + w, y + h, z) gl.glVertex3f(x, y + h, z) gl.glEnd() lines = notification.text.split("\n") y += h - 23 for line in lines: tw, th = Render.get().measure_text(line, cls.font) y -= th Render.get().text(line, cls.font, x + 23, y, color=(0.2, 0.2, 0.0, 1.0)) y -= 2 cls.y += h + 15
def render(self): Render.get().hd_perspective() if self.throbber_start_time == 0: self.throbber_start_time = State.get().time dt = State.get().time - self.throbber_start_time # run animation with 15 fps self.throbber_progress = int(dt * 15) bg_fade = (State.get().time - State.get().dialog_time) / 0.5 if bg_fade > 1.0: bg_fade = 1.0 elif bg_fade < 0.0: bg_fade = 0.0 fs_emu_texturing(False) fs_emu_blending(True) gl.glDisable(gl.GL_DEPTH_TEST) gl.glDepthMask(False) gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, bg_fade) gl.glVertex2f(0, 0) gl.glVertex2f(1920, 0) gl.glVertex2f(1920, 1020) gl.glVertex2f(0, 1020) gl.glEnd() gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, bg_fade * 0.5) gl.glVertex2f(0, 1020) gl.glVertex2f(1920, 1020) gl.glVertex2f(1920, 1080) gl.glVertex2f(0, 1080) gl.glEnd() # y = 0.0 # tw, th = Render.get().text("LAUNCHING GAME", self.title_font, # 0.0, y, w=32 / 9, h=self.height, # color=(1.0, 1.0, 1.0, 1.0), halign=0.0) # fs_emu_blending(True) # if bg_fade > 0.5: # self.throbber_opacity = (bg_fade - 0.5) / 0.5 # #self.throbber_opacity = bg_fade # self.render_throbber() # if bg_fade == 1.0: if State.get().time - State.get().dialog_time > 1.0: # gradually show over 1/4 second self.throbber_opacity = (State.get().time - State.get().dialog_time - 1.0) * 4 if self.throbber_opacity > 1.0: self.throbber_opacity = 1.0 self.render_throbber() gl.glEnable(gl.GL_DEPTH_TEST) gl.glDepthMask(True) # fs_emu_texturing(1) # fs_emu_blending(0) # print("Setting dirty..") Render.get().dirty = True
def render(self): Render.get().hd_perspective() if self.throbber_start_time == 0: self.throbber_start_time = State.get().time dt = State.get().time - self.throbber_start_time # run animation with 15 fps self.throbber_progress = int(dt * 15) bg_fade = (State.get().time - State.get().dialog_time) / 0.5 if bg_fade > 1.0: bg_fade = 1.0 elif bg_fade < 0.0: bg_fade = 0.0 fs_emu_texturing(False) fs_emu_blending(True) gl.glDisable(gl.GL_DEPTH_TEST) gl.glDepthMask(False) gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, bg_fade) gl.glVertex2f(0, 0) gl.glVertex2f(1920, 0) gl.glVertex2f(1920, 1020) gl.glVertex2f(0, 1020) gl.glEnd() gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, bg_fade * 0.5) gl.glVertex2f(0, 1020) gl.glVertex2f(1920, 1020) gl.glVertex2f(1920, 1080) gl.glVertex2f(0, 1080) gl.glEnd() # y = 0.0 # tw, th = Render.get().text("LAUNCHING GAME", self.title_font, # 0.0, y, w=32 / 9, h=self.height, # color=(1.0, 1.0, 1.0, 1.0), halign=0.0) # fs_emu_blending(True) # if bg_fade > 0.5: # self.throbber_opacity = (bg_fade - 0.5) / 0.5 # #self.throbber_opacity = bg_fade # self.render_throbber() # if bg_fade == 1.0: if State.get().time - State.get().dialog_time > 1.0: # gradually show over 1/4 second self.throbber_opacity = ( State.get().time - State.get().dialog_time - 1.0) * 4 if self.throbber_opacity > 1.0: self.throbber_opacity = 1.0 self.render_throbber() gl.glEnable(gl.GL_DEPTH_TEST) gl.glDepthMask(True) # fs_emu_texturing(1) # fs_emu_blending(0) # print("Setting dirty..") Render.get().dirty = True
def show(): global current_menu # fade_from is used on init_display, so we initialize this # color here. Set alpha to 2.0 to force 1 second of solid # color in combination with 2 sec. animation below if False and windows and not Settings.fullscreen_menu: State.get().fade_from = (1.0, 1.0, 1.0, 2.0) State.get().fade_to = (1.0, 1.0, 1.0, 0.0) else: State.get().fade_from = (0.0, 0.0, 0.0, 2.0) State.get().fade_to = (0.0, 0.0, 0.0, 0.0) init_display() if LIGHTING: init_lighting() init_textures() init_fonts() if USE_MENU_TRANSITIONS: compile_programs() InputHandler.open() on_resize((Render.get().display_width, Render.get().display_height)) image_loader = ImageLoader.get() image_loader.start() new_menu = create_main_menu() State.get().history.append(new_menu) for platform_id in PlatformHandler.get_platform_ids(): if "--" + platform_id in sys.argv: platform_menu = ItemMenu() platform_menu.parent_menu = new_menu platform_item = PlatformItem(platform_id) platform_menu.items.append(platform_item) # platform_menu.set_selected_index(0, immediate=True) new_menu = platform_item.activate(platform_menu) print(new_menu) State.get().history.append(new_menu) break set_current_menu(new_menu) if len(new_menu) == 1: # only n/a item showing, possibly if len(AllMenuItem().activate(None)) == 0: # no games, initiate game scan rescan_games() State.get().fade_start = get_current_time() State.get().fade_end = get_current_time() + 2.000 # # make a timer so that update events are sent to modules at least once # # every second # pygame.time.set_timer(IDLE_EVENT, 1000) State.get().start_time = get_current_time()
def render(self): Render.get().hd_perspective() fs_emu_texturing(True) fs_emu_blending(False) Texture.sidebar_background.render(0, 0, 1920, Texture.sidebar_background.h) if self.state in [STATE_PREPARING, STATE_WAITRUN]: self.throbber.render()
def do_render(): if current_menu is None: return current_menu.update() if RunTransition.value > 0.99: # do not render anything when running a game return if State.get().currently_ingame: # print("currently ingame") return # try to exploit parallelism by uploading texture while rendering TextureManager.get().load_textures(1) # clear mouseover rects -these will be calculated during rendering Mouse.items[:] = [] Render.get().standard_perspective() # scanning = GameScanner.scanning data = current_menu.render() current_menu.render_transparent(data) # if GameScanner.is_scanning(): if False: render_scanning_status() State.get().was_scanning = True else: render_config_menu() if State.get().was_scanning: print("State.get().was_scanning") State.get().was_scanning = False # reload current menu # if current_menu.parent_menu: # result = current_menu.parent_menu.selected_item.activate( # current_menu.parent_menu) # if isinstance(result, Menu): # #if len(result) == 0: # # result.append(NoItem()) # result.parent_menu = current_menu.parent_menu # print("set new menu (rescanned games)") # set_current_menu(result) recreate_main_menu_if_necessary() render_top() if State.get().dialog: State.get().dialog.render() render_global_fade() NotificationRender.render() if RunTransition.value > 0.0: render_fade(a=RunTransition.value)
def render(self): Render.get().hd_perspective() fs_emu_texturing(True) fs_emu_blending(False) Texture.sidebar_background.render( 0, 0, 1920, Texture.sidebar_background.h) if self.state in [STATE_PREPARING, STATE_WAITRUN]: self.throbber.render()
def unload_textures(self): print("TextureManager.unload_textures") with self.lock: for ip in self.image_list: texture = self.texture_dict[ip] if texture is not None: if texture is not Texture.default_item: Render.get().delete_texture_list.append(texture.texture) self.texture_dict[ip] = None
def unload_textures(self): print("TextureManager.unload_textures") with self.lock: for ip in self.image_list: texture = self.texture_dict[ip] if texture is not None: if texture is not Texture.default_item: Render.get().delete_texture_list.append( texture.texture) self.texture_dict[ip] = None
def render(self): Render.get().ortho_perspective() gl.glDisable(gl.GL_DEPTH_TEST) fs_emu_blending(True) gl.glPushMatrix() gl.glTranslatef(-self.width / 2, -self.height / 2, 0.0) self.render_background() self.render_content() gl.glPopMatrix() gl.glEnable(gl.GL_DEPTH_TEST) pass
def render_fade(r=0.0, g=0.0, b=0.0, a=0.0): Render.get().hd_perspective() fs_emu_blending(True) fs_emu_texturing(False) gl.glBegin(gl.GL_QUADS) gl.glColor4f(r * a, g * a, b * a, a) gl.glVertex2f(0, 0) gl.glVertex2f(1920, 0) gl.glVertex2f(1920, 1080) gl.glVertex2f(0, 1080) gl.glEnd()
def render(cls): notifications = Notification.all() if len(notifications) == 0: return Render.get().hd_perspective() cls.y = 0 for i, notification in enumerate(notifications): cls.render_one(notification) Render.get().dirty = True # showing max two notifications if i == 1: break
def render(cls): notifications = Notification.all() if len(notifications) == 0: return Render.get().hd_perspective() cls.y = START_Y for i, notification in enumerate(notifications): cls.render_one(notification) Render.get().dirty = True # showing max four notifications if i > 4: break
def render_bottom_bar_text(item): strength = 0.9 x = 544 y = 290 title = item.title.upper() if title: Render.get().text(title, Font.title_font, x, y, 1920 - x - 170, shadow=True, color=(1.0, 1.0, 1.0, 1.0 * strength)) year_text = str(getattr(State.get().current_menu.selected_item, "year", "") or "").upper() if year_text: tw, th = Render.get().measure_text(year_text, Font.title_font) Render.get().text(year_text, Font.title_font, 1920 - 30 - tw, y, 0, shadow=True, color=(1.0, 1.0, 1.0, 1.0 * strength)) color = (0x6e / 0xff, 0x8b / 0xff, 0x96 / 0xff, 1.0) y = 258 text_str = "" companies = set() publisher_text = (getattr(State.get().current_menu.selected_item, "publisher", "") or "").upper() for text in publisher_text.split("/"): text = text.strip() if text: if text not in companies: text_str = text_str + u" \u00b7 " + text companies.add(text) developer_text = (getattr(State.get().current_menu.selected_item, "developer", "") or "").upper() for text in developer_text.split("/"): text = text.strip() if text: if text not in companies: text_str = text_str + u" \u00b7 " + text companies.add(text) if len(text_str) > 3: text_str = text_str[3:] # remove initial middle dot Render.get().text(text_str, Font.subtitle_font, x, y, 0, shadow=True, color=color) platform_str = str( getattr(State.get().current_menu.selected_item, "platform", "") or "") if platform_str: platform_str = PlatformHandler.get_platform_name(platform_str).upper() if len(platform_str) >= 3: tw, th = Render.get().measure_text(platform_str, Font.subtitle_font) Render.get().text(platform_str, Font.subtitle_font, 1920 - 30 - tw, y, 0, shadow=True, color=color) return
def render(self): # print("GameMenu.render") enter_transition.value = 1.0 if enter_transition.start > 0: enter_transition.value = ( State.get().time - enter_transition.start ) / (enter_transition.end - enter_transition.start) # prevent render from stopping when animating Render.get().dirty = True # transition goes from 1.0 ... 0.0 # enter_transition.value = 1.0 - enter_transition.value # finished = 0 if enter_transition.value >= 1.0: enter_transition.value = 1.0 # finished = 1.0 enter_transition.start = 0 # enter_transition.on_finish() # return exit_transition.value = 0.0 if exit_transition.start > 0: exit_transition.value = ( State.get().time - exit_transition.start ) / (exit_transition.end - exit_transition.start) # prevent render from stopping when animating Render.get().dirty = True # transition goes from 1.0 ... 0.0 exit_transition.value = 1.0 - exit_transition.value # finished = 0 # if exit_transition.value <= 0.0: # exit_transition.value = 0.0 # # finished = 1.0 # exit_transition.start = 0 # exit_transition.on_finish() # return last_menu = State.get().history[-2] self.last_menu_data = last_menu.render() # self.top_menu_transition = transition # glClear(GL_DEPTH_BUFFER_BIT) # print(transition) # glEnable(GL_DEPTH_TEST) # glDepthMask(True) # render_wall(transition) # render_screen(transition) # if finished: # # FIXME: defer to later via an event or similar? return None
def render(self): # print("GameMenu.render") enter_transition.value = 1.0 if enter_transition.start > 0: enter_transition.value = (State.get().time - enter_transition.start ) / (enter_transition.end - enter_transition.start) # prevent render from stopping when animating Render.get().dirty = True # transition goes from 1.0 ... 0.0 # enter_transition.value = 1.0 - enter_transition.value # finished = 0 if enter_transition.value >= 1.0: enter_transition.value = 1.0 # finished = 1.0 enter_transition.start = 0 # enter_transition.on_finish() # return exit_transition.value = 0.0 if exit_transition.start > 0: exit_transition.value = (State.get().time - exit_transition.start ) / (exit_transition.end - exit_transition.start) # prevent render from stopping when animating Render.get().dirty = True # transition goes from 1.0 ... 0.0 exit_transition.value = 1.0 - exit_transition.value # finished = 0 # if exit_transition.value <= 0.0: # exit_transition.value = 0.0 # # finished = 1.0 # exit_transition.start = 0 # exit_transition.on_finish() # return last_menu = State.get().history[-2] self.last_menu_data = last_menu.render() # self.top_menu_transition = transition # glClear(GL_DEPTH_BUFFER_BIT) # print(transition) # glEnable(GL_DEPTH_TEST) # glDepthMask(True) # render_wall(transition) # render_screen(transition) # if finished: # # FIXME: defer to later via an event or similar? return None
def fade_quit(): print("fade_quit") duration = 0.500 alpha = 0.0 start = get_current_time() while True: alpha = min(1.0, (get_current_time() - start) / duration) def render_func(): render_screen() Render.get().ortho_perspective() fs_emu_blending(True) fs_emu_texturing(False) gl.glDisable(gl.GL_DEPTH_TEST) gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, alpha) gl.glVertex2f(-10.0, -1.0) gl.glVertex2f(10.0, -1.0) gl.glVertex2f(10.0, 1.0) gl.glVertex2f(-10.0, 1.0) gl.glEnd() gl.glEnable(gl.GL_DEPTH_TEST) # fs_emu_blending(False) fs_emu_texturing(True) swap_buffers() Render.get().dirty = True Render.get().dirty = True main_loop_iteration(input_func=None, render_func=render_func) if alpha >= 1.0: break
def render_screen(): # set Render.get().dirty to False here, so that render functions can # request a new render frame by setting dirty Render.get().dirty = False # glEnable(GL_SCISSOR_TEST) # can_idle = if SDL_IsMinimized(): time.sleep(0.01) return # Render.get().dirty = True gl.glClearColor(0.0, 0.0, 0.0, 1.0) gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) do_render() if Render.get().display_fps: Render.get().dirty = True if RENDER_DEBUG_SQUARES: render_debug_square()
def default_render_func(): # rendered = False time_str = time.strftime("%H:%M") if time_str != Render.get().last_time_str: # clock must be updated, at least Render.get().dirty = True Render.get().last_time_str = time_str if Render.get().dirty or ALWAYS_RENDER: # print(Render.get().frame_number) render_screen() # rendered = True Render.get().twice = False # Render.get().twice = True else: if not Render.get().twice: Render.get().twice = True render_screen() # rendered = True if RENDER_DEBUG_SQUARES: render_debug_square_2() # if not rendered: # pass # time.sleep(0.01) swap_buffers()
def render_debug_square(): global debug_x Render.get().hd_perspective() fs_emu_texturing(False) gl.glBegin(gl.GL_QUADS) gl.glColor3f(1.0, 1.0, 1.0) x = debug_x debug_x += 1 if debug_x >= 1920: debug_x = 0 y = 989 z = 0.99 gl.glVertex3f(x, y, z) gl.glVertex3f(x + 20, y, z) gl.glVertex3f(x + 20, y + 20, z) gl.glVertex3f(x, y + 20, z) gl.glEnd() fs_emu_texturing(True)
def __init__(self, message, backtrace=None): Dialog.__init__(self) self.width = 16 / 9 * 2 self.height = 2.0 self.message = message self.backtrace = backtrace self.splitted = self.backtrace.split("\n") if not self.splitted[-1]: self.splitted = self.splitted[:-1] self.background_color = (0.0, 0.0, 0.0, 1.0) liberation_mono_bold = resources.resource_filename( "LiberationMono-Regular.ttf") self.detail_font = pygame.font.Font( liberation_mono_bold, int(0.021 * Render.get().display_height)) self.guru_font = pygame.font.Font( liberation_mono_bold, int(0.03 * Render.get().display_height)) self.start_time = time.time()
def render_debug_square_2(): global debug_x_2 Render.get().hd_perspective() fs_emu_texturing(False) gl.glBegin(gl.GL_QUADS) gl.glColor3f(0.2, 0.2, 0.2) x = debug_x_2 debug_x_2 += 1 if debug_x_2 >= 1920: debug_x_2 = 0 y = 989 + 5 z = 0.99 gl.glVertex3f(x, y, z) gl.glVertex3f(x + 20, y, z) gl.glVertex3f(x + 20, y + 10, z) gl.glVertex3f(x, y + 10, z) gl.glEnd() fs_emu_texturing(True)
def __init__(self): self.width = 1.6 self.height = 1.0 self.background_texture = None self.background_texture_offset = [0, 0] self.background_color = (0.4, 0.4, 0.4, 1.0) # make sure that the dialog is rendered at least once # after being created Render.get().dirty = True
def render_func(): render_screen() Render.get().ortho_perspective() fs_emu_blending(True) fs_emu_texturing(False) gl.glDisable(gl.GL_DEPTH_TEST) gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, alpha) gl.glVertex2f(-10.0, -1.0) gl.glVertex2f(10.0, -1.0) gl.glVertex2f(10.0, 1.0) gl.glVertex2f(-10.0, 1.0) gl.glEnd() gl.glEnable(gl.GL_DEPTH_TEST) # fs_emu_blending(False) fs_emu_texturing(True) swap_buffers() Render.get().dirty = True
def render_top(): Render.get().hd_perspective() gl.glPushMatrix() transition = State.get().current_menu.top_menu_transition gl.glTranslate(0.0, (1.0 - transition) * 90, 0.9) gl.glTranslate(0.0, 0.0, 0.05) if State.get().top_menu == State.get().navigatable: selected_index = State.get().top_menu.get_selected_index() else: selected_index = -1 x = State.get().gl_left for item in State.get().top_menu.left: item.update_size_left() item.x = x item.y = 1080 - TOP_HEIGHT item.h = TOP_HEIGHT x += item.w index = len(State.get().top_menu.left) - 1 for item in reversed(State.get().top_menu.left): item.render_top_left(selected=(index == selected_index)) index -= 1 index = len(State.get().top_menu) - 1 x = State.get().gl_right for item in reversed(State.get().top_menu.right): item.update_size_right() x -= item.w item.x = x item.y = 1080 - TOP_HEIGHT item.h = TOP_HEIGHT if Mouse.focus: selected = (Mouse.focus == item) else: selected = (index == selected_index) item.render_top_right(selected=selected) Mouse.items.append(item) index -= 1 gl.glPopMatrix()
def load_images(self, image_paths): with self.lock: for ip in reversed(image_paths): if ip in self.image_dict: self.image_list.remove(ip) # self.image_list.insert(0, ip) else: # texture = False means not loaded # texture = None means failure loading self.image_dict[ip] = False, None self.texture_dict[ip] = None self.image_list.insert(0, ip) for ip in self.image_list[CACHE_SIZE:]: texture = self.texture_dict[ip] if texture is not None: if texture is not Texture.default_item: Render.get().delete_texture_list.append(texture.texture) del self.image_dict[ip] del self.texture_dict[ip] self.image_list = self.image_list[:CACHE_SIZE]
def back_to_menu_from_game(): print("State.get().currently_ingame = False") State.get().currently_ingame = False set_items_brightness(0.66, duration=0.500) RunTransition.value = 0.0 RunTransition.anim = None LogoStrength.anim = None LogoStrength.value = 1.0 Render.get().zoom = 1.0 Render.get().offset_x = 0.0 Render.get().offset_y = 0.0 State.get().fade_splash = True State.get().fade_start = State.get().time State.get().fade_end = State.get().time + 2.0 # Use 2.0 here to force full black for 1 second State.get().fade_from = (0.0, 0.0, 0.0, 2.0) State.get().fade_to = (0.0, 0.0, 0.0, 0.0)
def render_wall(): # brightness=1.0): # glClearColor(0.1, 0.1, 0.1, 1.0) # glClear(GL_DEPTH_BUFFER_BIT); Render.get().hd_perspective() # fs_emu_ortho(); # fs_emu_blending(FALSE); # fs_emu_texturing(FALSE); z = -0.999 # glPushMatrix() # glTranslate(0.0, 0.0, 1.0) # transition y-coordinate between floor and wall split = 361 fs_emu_blending(False) fs_emu_texturing(False) gl.glBegin(gl.GL_QUADS) gl.glColor3f(39.0 / 255.0, 44.0 / 255.0, 51.0 / 255.0) gl.glVertex3f(0, split, z) gl.glVertex3f(1920, split, z) color = 0 gl.glColor3f(color, color, color) gl.glVertex3f(1920, 1020, z) gl.glVertex3f(0, 1020, z) gl.glVertex3f(0, 1020, z) gl.glVertex3f(1920, 1020, z) gl.glVertex3f(1920, 1080, z) gl.glVertex3f(0, 1080, z) color = 0 gl.glColor3f(color, color, color) gl.glVertex3f(0, 0, z) gl.glVertex3f(1920, 0, z) gl.glColor3f(20.0 / 255.0, 22.0 / 255.0, 26.0 / 255.0) gl.glVertex3f(1920, split, z) gl.glVertex3f(0, split, z) gl.glEnd()
def render_wall(): # brightness=1.0): # glClearColor(0.1, 0.1, 0.1, 1.0) # glClear(GL_DEPTH_BUFFER_BIT); Render.get().hd_perspective() # fs_emu_ortho(); # fs_emu_blending(FALSE); # fs_emu_texturing(FALSE); z = -0.999 # glPushMatrix() # glTranslate(0.0, 0.0, 1.0) # transition y-coordinate between floor and wall splt = 361 fs_emu_blending(False) fs_emu_texturing(False) gl.glBegin(gl.GL_QUADS) gl.glColor3f(39.0 / 255.0, 44.0 / 255.0, 51.0 / 255.0) gl.glVertex3f(0, splt, z) gl.glVertex3f(1920, splt, z) color = 0 gl.glColor3f(color, color, color) gl.glVertex3f(1920, 1020, z) gl.glVertex3f(0, 1020, z) gl.glVertex3f(0, 1020, z) gl.glVertex3f(1920, 1020, z) gl.glVertex3f(1920, 1080, z) gl.glVertex3f(0, 1080, z) color = 0 gl.glColor3f(color, color, color) gl.glVertex3f(0, 0, z) gl.glVertex3f(1920, 0, z) gl.glColor3f(20.0 / 255.0, 22.0 / 255.0, 26.0 / 255.0) gl.glVertex3f(1920, splt, z) gl.glVertex3f(0, splt, z) gl.glEnd()
def load_images(self, image_paths): with self.lock: for ip in reversed(image_paths): if ip in self.image_dict: self.image_list.remove(ip) # self.image_list.insert(0, ip) else: # texture = False means not loaded # texture = None means failure loading self.image_dict[ip] = False, None self.texture_dict[ip] = None self.image_list.insert(0, ip) for ip in self.image_list[CACHE_SIZE:]: texture = self.texture_dict[ip] if texture is not None: if texture is not Texture.default_item: Render.get().delete_texture_list.append( texture.texture) del self.image_dict[ip] del self.texture_dict[ip] self.image_list = self.image_list[:CACHE_SIZE]
def render_bottom_bar_screens(item): global last_item_id global item_time if id(item) != last_item_id: last_item_id = id(item) item_time = State.get().time gl.glColor3f(1.0, 1.0, 1.0) fs_emu_texturing(True) fs_emu_blending(False) for i in range(3, -1, -1): if State.get().time - item_time > 0.1 + 0.05 * i: texture = item.get_screen_texture(2 + i) else: texture = None if texture: # coords = (0, texture.w, texture.h, 0) coords = COORDS else: texture, coords = static() # While rendering static, we must continue rendering. Render.get().dirty = True texture.bind() texture_rectangle(4 + 539 + 345 * i, 34, 308, 193, 0.2, *coords) if State.get().time - item_time > 0.1: texture = item.get_screen_texture(1) else: texture = None if texture: coords = COORDS else: texture, coords = static() # While rendering static, we must continue rendering. Render.get().dirty = True texture.bind() texture_rectangle(34, 34, 472, 295, 0.2, *coords)
def render_transparent(self, data): last_menu = State.get().history[-2] last_menu.render_transparent(self.last_menu_data) if Transition.value < 1.0: opacity = 1.0 - Transition.value opacity *= 1.25 if opacity > 1.0: opacity = 1.0 Render.get().hd_perspective() gl.glDisable(gl.GL_DEPTH_TEST) fs_emu_texturing(False) fs_emu_blending(True) gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, opacity) gl.glVertex2f(0.0, 0.0) gl.glVertex2f(1920.0, 0.0) gl.glVertex2f(1920.0, 1020.0) gl.glVertex2f(0.0, 1020.0) gl.glEnd() gl.glEnable(gl.GL_DEPTH_TEST) self.config_list.render(Transition.value)
def set_current_menu(menu): if not isinstance(menu, SearchResultsMenu): menu.search_text = "" global current_menu if len(menu) == 0: menu.append(NoItem()) current_menu = menu State.get().current_menu = menu if menu.navigatable: State.get().navigatable = menu.navigatable else: State.get().navigatable = menu State.get().top_menu = menu.top State.get().down_navigatable = None Render.get().dirty = True
def render_menu(menu, what=None, skip_center_item=False): if what is None: what = ["ITEMS", "SHADOWS"] Render.get().standard_perspective() item_data = _render_menu(menu, what, skip_center_item) return item_data
def load(cls, im, mipmap=False, min_filter=None, wrap_s=gl.GL_CLAMP_TO_EDGE, wrap_t=gl.GL_CLAMP_TO_EDGE, target=gl.GL_TEXTURE_2D, size=None, out_data=None): if size is None: size = [0, 0] # type = "RGB" # gl_type = gl.GL_RGB # if im.mode == "RGBA": # # convert to premultiplied alpha # #pix = im.load() # #for x in range(im.size[0]): # # for y in range(im.size[1]): # # r, g, b, a = pix[x, y] # # if a: # # pix[x, y] = r * 255 // a, g * 255 // a, \ # # b * 255 // a, a # # else: # # pix[x, y] = 0, 0, 0, 0 # a = numpy.fromstring(im.tostring(), dtype=numpy.uint8) # alpha_layer = a[3::4] / 255.0 # a[0::4] *= alpha_layer # a[1::4] *= alpha_layer # a[2::4] *= alpha_layer # #im = Image.fromstring("RGBA", im.size, a.tostring()) # im_data = a.tostring() # # type = "RGBA" # gl_type = gl.GL_RGBA # else: # im_data = im.tostring("raw", "RGB") # # size[0] = im.size[0] # size[1] = im.size[1] # #texture = glGenTextures(1) internal_format = gl.GL_RGBA texture_format = gl.GL_BGRA if im.format() != QImage.Format_ARGB32_Premultiplied: im = im.convertToFormat(QImage.Format_ARGB32_Premultiplied) bits = im.bits() try: pixels = bits.tobytes() except AttributeError: bits.setsize(im.byteCount()) pixels = bytes(bits) size[0] = im.width() size[1] = im.height() from arcade.glui.render import Render texture = Render.get().create_texture() gl.glBindTexture(target, texture) gl.glTexImage2D(target, 0, internal_format, size[0], size[1], 0, texture_format, gl.GL_UNSIGNED_BYTE, pixels) if mipmap: gl.glGenerateMipmap(target) if min_filter is None: min_filter = gl.GL_LINEAR_MIPMAP_LINEAR else: if min_filter is None: min_filter = gl.GL_LINEAR gl.glTexParameteri(target, gl.GL_TEXTURE_MIN_FILTER, min_filter) gl.glTexParameteri(target, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(target, gl.GL_TEXTURE_WRAP_S, wrap_s) gl.glTexParameteri(target, gl.GL_TEXTURE_WRAP_T, wrap_t) if out_data is not None: out_data["im_data"] = pixels out_data["type"] = internal_format return texture
def render(self): if self.first_shown_at == 0: self.first_shown_at = State.get().time # FIXME: # from .gamemenu import render_wall, render_screen # glClear(GL_DEPTH_BUFFER_BIT) # render_wall() # render_screen() Render.get().hd_perspective() if len(self.controller.ports) == 0: color = (1.0, 0.0, 0.0, 1.0) text = "No input configuration needed" Render.get().text(text, Font.main_path_font, 200, 730, 400, color=color, halign=0) text = "Press enter or primary key to start game" Render.get().text(text, Font.main_path_font, 200, 670, 400, color=color, halign=0) return if self.device_list_version != InputDevices.device_list_version: print(" -- device list version changed") # self.devices, info = InputDevice.get_input_devices("", 0, 100, # version=2) self.devices = DeviceManager.instance().get_devices() self.device_list_version = InputDevices.device_list_version # [{"index": 0} for x in self.devices] device_ids = set() for device in self.devices: device_ids.add(device.id) try: self.device_data[device.id]["device"] = device except KeyError: print(" -- add device info for", device.id) self.device_data[device.id] = {"port": 0, "device": device} self.check_device(self.device_data[device.id]) for data_key in self.device_data.keys(): if not data_key in device_ids: print(" -- removing device_data for", data_key) del self.device_data[data_key] for input in self.controller.ports: if not input["device_id"] in device_ids: print(" -- removing device from input", input.device_id) input["device_id"] = None for port, input in enumerate(self.controller.ports): center_x = 400 + 400 * port text = input.name.upper() color = (1.0, 0.0, 0.0, 1.0) Render.get().text(text, Font.main_path_font, center_x - 200, 760, 400, color=color, halign=0) text = input.description.upper() color = (1.0, 0.0, 0.0, 1.0) Render.get().text(text, Font.main_path_font, center_x - 200, 730, 400, color=color, halign=0) if input.device_id: device = self.device_data[input.device_id]["device"] color = (1.0, 0.5, 0.5, 1.0) text = device.name.upper() Render.get().text(text, Font.main_path_font, center_x - 200, 680, 400, color=color, halign=0) for j, device in enumerate(self.devices): device_data = self.device_data[device.id] # print(1, repr(device)) if device_data["port"] != port: continue text = device.name.upper() if device_data["ok"]: color = (1.0, 1.0, 1.0, 1.0) else: color = (0.5, 0.5, 0.5, 1.0) Render.get().text(text, Font.main_path_font, center_x - 200, 600 - j * 40, 400, color=color, halign=0) fade = 1.0 - (State.get().time - self.first_shown_at) * 3.0 if fade > 0.0: Render.get().dirty = True fs_emu_blending(True) fs_emu_texturing(False) gl.glDisable(gl.GL_DEPTH_TEST) Render.get().hd_perspective() gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, fade) gl.glVertex2f(0, 0) gl.glVertex2f(1920, 0) gl.glVertex2f(1920, 1080) gl.glVertex2f(0, 1080) gl.glEnd() gl.glEnable(gl.GL_DEPTH_TEST)
def render(self, transition=1.0): Render.get().hd_perspective() # w = 560 # h = 92 # x = 1920 - w * transition # y = 1080 - 60 - h # y = 1080 - 60 - h - 44 # z = -0.9 # item_top = 1080 - 90 - 50 # item_left = 1920 - 560 + 40 dx = Texture.sidebar_background_shadow.w * (1.0 - transition) gl.glPushMatrix() gl.glTranslate(0.0, 0.0, 0.7) # glTranslated((1.0 - transition) * g_tex_sidebar_background->width, # 0, 0) # fs_emu_set_texture(g_tex_sidebar_background) # fs_emu_render_texture_with_size(g_tex_sidebar_background, # 1920 - g_tex_sidebar_background->width, # 0, g_tex_sidebar_background->width, # g_tex_sidebar_background->height) # fs_emu_render_sidebar() fs_emu_blending(True) fs_emu_texturing(True) gl.glDepthMask(False) Texture.sidebar_background_shadow.render( 1920 - Texture.sidebar_background_shadow.w * transition, 0, Texture.sidebar_background_shadow.w, Texture.sidebar_background_shadow.h, ) if transition > 1.0: padding = 1920 Texture.sidebar_background.render( 1920 - Texture.sidebar_background_shadow.w * transition + Texture.sidebar_background_shadow.w, 0, 1920 + padding, Texture.sidebar_background.h, ) gl.glDepthMask(True) gl.glPopMatrix() y = SIDEBAR_START_Y for i, item in enumerate(self.items): if item.group: if i > 0: y -= GROUP_SPACING selected = i == self.index and State.get().navigatable == self # z = 0.71 fs_emu_texturing(False) gl.glDisable(gl.GL_DEPTH_TEST) if selected: fg_color = [1.0, 1.0, 1.0, 1.0] # gl.glBegin(gl.GL_QUADS) # # gl.glColor3f(0.00, 0x99 / 0xff, 0xcc / 0xff) # gl.glVertex3f(x, y - 18, z) # gl.glVertex3f(x + w, y - 18, z) # gl.glVertex3f(x + w, y + h - 4, z) # gl.glVertex3f(x, y + h - 4, z) # # glColor3f(0.6, 0.6, 0.6) # # glVertex3f(x, y + 4, z) # # glVertex3f(x + w, y + 4, z) # # glVertex3f(x + w, y + h, z) # # glVertex3f(x, y + h, z) # gl.glEnd() fs_emu_blending(True) fs_emu_texturing(True) gl.glDepthMask(False) Texture.item_background.render(1920 - 540 + 13 + dx, y - 18) gl.glDepthMask(True) else: fg_color = [1.0, 1.0, 1.0, 1.0] # glBegin(GL_QUADS) # glColor3f(0.4, 0.4, 0.4) # glVertex3f(x, y, z) # glVertex3f(x + w, y, z) # glVertex3f(x + w, y + 4, z) # glVertex3f(x, y + 4, z) # glEnd() # fs_emu_texturing(True) if i > 0: fg_color[3] *= 0.35 text = item.title # FIXME: REMOVE # fs_emu_blending(False) # fs_emu_blending(True) if item.group: BitmapFont.menu_font.render( text, HEADING_TEXT_LEFT + dx, y + 14, r=0.0, g=0x99 / 0xFF, b=0xCC / 0xFF, ) x, _ = BitmapFont.menu_font.measure(text) x += HEADING_TEXT_LEFT + 12 fs_emu_blending(True) fs_emu_texturing(True) # gl.glDepthMask(False) Texture.heading_strip.render(x + dx, y + 14, 1920 - x, 32) else: BitmapFont.menu_font.render(text, ITEM_TEXT_LEFT + dx, y + 14) gl.glEnable(gl.GL_DEPTH_TEST) # text = item.title.upper() # tw, th = Render.get().text(text, Font.main_path_font, # x + 40, y + 43, color=fg_color) # text = item.subtitle.upper() # fg_color[3] = fg_color[3] * 0.4 # text = item.title.upper() # tw, th = Render.get().text(text, Font.list_subtitle_font, # x + 40, y + 18, color=fg_color) y -= 54 # Gradually erase menu items when transitioning if transition > 1.0: gl.glDisable(gl.GL_DEPTH_TEST) # tr = (transition - 1.0) / 3.0 alpha = max(0.0, (transition - 1.0) / 2.0) Texture.sidebar_background.render( 1920 - Texture.sidebar_background_shadow.w * transition + 200, 0, 1920, Texture.sidebar_background.h, opacity=alpha, ) gl.glEnable(gl.GL_DEPTH_TEST)
def render_bottom_bar_text(item): strength = 0.9 x = 544 y = 290 title = item.title.upper() title = title.strip() if "[" in title: title, subtitle = title.rsplit("[", 1) title = title.strip() subtitle = subtitle.strip() if subtitle.endswith("]"): subtitle = subtitle[:-1] else: subtitle = "" if title: Render.get().text(title, Font.title_font, x, y, 1920 - x - 170, shadow=True, color=(1.0, 1.0, 1.0, 1.0 * strength)) if subtitle: color = (0x6e / 0xff, 0x8b / 0xff, 0x96 / 0xff, 0.75) tw, th = Render.get().measure_text(title, Font.title_font) Render.get().text(subtitle, Font.title_font, x + tw + 20, y, 1920 - x - 170, shadow=True, color=color) color = (0xc4 / 0xff, 0xd7 / 0xff, 0xde / 0xff, 1.0) year_text = str( getattr(State.get().current_menu.selected_item, "year", "") or "").upper() if year_text: tw, th = Render.get().measure_text(year_text, Font.title_font) Render.get().text(year_text, Font.title_font, 1920 - 30 - tw, y, 0, shadow=True, color=color) color = (0x6e / 0xff, 0x8b / 0xff, 0x96 / 0xff, 1.0) y = 258 text_str = "" companies = set() publisher_text = (getattr(State.get().current_menu.selected_item, "publisher", "") or "").upper() for text in publisher_text.split("/"): text = text.strip() if text: if text not in companies: text_str = text_str + u" \u00b7 " + text companies.add(text) developer_text = (getattr(State.get().current_menu.selected_item, "developer", "") or "").upper() for text in developer_text.split("/"): text = text.strip() if text: if text not in companies: text_str = text_str + u" \u00b7 " + text companies.add(text) if len(text_str) > 3: text_str = text_str[3:] # remove initial middle dot tw, th = Render.get().measure_text(text_str, Font.subtitle_font) Render.get().text(text_str, Font.subtitle_font, 1920 - 30 - tw, y, 0, shadow=True, color=color) platform_str = str( getattr(State.get().current_menu.selected_item, "platform", "") or "") if platform_str: platform_str = PlatformHandler.get_platform_name(platform_str).upper() if len(platform_str) >= 3: # tw, th = Render.get().measure_text(platform_str, Font.subtitle_font) Render.get().text(platform_str, Font.subtitle_font, x, y, 0, shadow=True, color=color) return
def render_transparent(self, data): # print("GameMenu.render_transparent") last_menu = State.get().history[-2] last_menu.render_transparent(self.last_menu_data) if exit_transition.value < 1.0: opacity = 1.0 - exit_transition.value opacity *= 1.25 if opacity > 1.0: opacity = 1.0 Render.get().hd_perspective() gl.glDisable(gl.GL_DEPTH_TEST) fs_emu_texturing(False) fs_emu_blending(True) gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, opacity) gl.glVertex2f(0.0, 0.0) gl.glVertex2f(1920.0, 0.0) gl.glVertex2f(1920.0, 1020.0) gl.glVertex2f(0.0, 1020.0) gl.glEnd() gl.glEnable(gl.GL_DEPTH_TEST) alpha = enter_transition.value * 0.75 Render.get().hd_perspective() gl.glDisable(gl.GL_DEPTH_TEST) fs_emu_texturing(False) fs_emu_blending(True) gl.glBegin(gl.GL_QUADS) gl.glColor4f(0.0, 0.0, 0.0, alpha) # Covers, left gl.glVertex2f(0.0, 366.0) gl.glVertex2f(746.0, 366.0) gl.glVertex2f(746.0, 1020.0) gl.glVertex2f(0.0, 1020.0) # Covers, right gl.glVertex2f(1920.0 - 746.0, 366.0) gl.glVertex2f(1920.0, 366.0) gl.glVertex2f(1920.0, 1020.0) gl.glVertex2f(1920.0 - 746.0, 1020.0) # Bottom gl.glColor4f(0.0, 0.0, 0.0, 0.50) gl.glVertex2f(0.0, 0.0) gl.glVertex2f(1920.0, 0.0) gl.glVertex2f(1920.0, 366.0) gl.glVertex2f(0.0, 366.0) gl.glEnd() gl.glEnable(gl.GL_DEPTH_TEST) transition = enter_transition.value if exit_transition.value < 1.0: # transition = exit_transition.value transition = 1.0 + 3.0 - exit_transition.value * 3.0 # print("render, transition = ", transition) self.config_list.render(transition) if exit_transition.value <= 0.0: exit_transition.value = 0.0 # finished = 1.0 exit_transition.start = 0 exit_transition.on_finish()
def render_bottom_bar_transparent(): Render.get().hd_perspective() fs_emu_blending(True) Texture.bottom_bar.render(0, 0, 1920, 380, 0.3, opacity=1.0) item = State.get().current_menu.selected_item render_bottom_bar_text(item)
def render_content(self): Render.get().dirty = True # #x1 = -16 / 9 + 0.1 # x1 = 0.1 # #x2 = 16 / 9 - 0.1 # x2 = self.width - 0.1 # #y1 = 0.7 # #y2 = 0.9 # y1 = 1.6 # y2 = 1.9 x1 = 0 x2 = self.width y1 = 1.7 y2 = 2.0 w = 0.03 # t = (pygame.time.get_ticks() - self.start_time) // 1000 alert_color = (1.0, 0.8, 0.0) t = int((time.time() - self.start_time * 1.6)) if t % 2 == 0: gl.glBegin(gl.GL_QUADS) gl.glColor3f(*alert_color) gl.glVertex2f(x1, y1) gl.glVertex2f(x2, y1) gl.glVertex2f(x2, y2) gl.glVertex2f(x1, y2) gl.glColor3f(0.0, 0.0, 0.0) gl.glVertex2f(x1 + w, y1 + w) gl.glVertex2f(x2 - w, y1 + w) gl.glVertex2f(x2 - w, y2 - w) gl.glVertex2f(x1 + w, y2 - w) gl.glEnd() text = "Software Failure. Press BACKSPACE or back button to continue." Render.get().text(text, self.guru_font, 0.2, 1.85, color=alert_color) text = self.splitted[-1] text = "Guru Meditation #{0}".format(text) Render.get().text(text, self.guru_font, 0.2, 1.77, color=alert_color) x = 0.2 y = 0.15 tw, th = Render.get().measure_text("M", self.detail_font) y += th lines = [] max_line_size = 129 for line in self.splitted: line = line.rstrip() while len(line) > max_line_size: lines.append(line[:max_line_size]) line = line[max_line_size:] lines.append(line) for i, line in enumerate(reversed(lines)): if i == MAX_LINE: break s = (MAX_LINE - i) / MAX_LINE tw, th = Render.get().text( line, self.detail_font, x, y, color=(s, s, s, 1.0) ) y += th
def render_bottom_bar(): Render.get().hd_perspective() item = State.get().current_menu.selected_item render_bottom_bar_screens(item)
def render(self, transition=1.0): Render.get().hd_perspective() # w = 560 # h = 92 # x = 1920 - w * transition # y = 1080 - 60 - h # y = 1080 - 60 - h - 44 # z = -0.9 item_top = 1080 - 90 item_left = 1920 - 560 + 40 item_left += Texture.sidebar_background_shadow.w * (1.0 - transition) gl.glPushMatrix() gl.glTranslate(0.0, 0.0, 0.7) # glTranslated((1.0 - transition) * g_tex_sidebar_background->width, # 0, 0) # fs_emu_set_texture(g_tex_sidebar_background) # fs_emu_render_texture_with_size(g_tex_sidebar_background, # 1920 - g_tex_sidebar_background->width, # 0, g_tex_sidebar_background->width, # g_tex_sidebar_background->height) # fs_emu_render_sidebar() fs_emu_blending(True) fs_emu_texturing(True) gl.glDepthMask(False) Texture.sidebar_background_shadow.render( 1920 - Texture.sidebar_background_shadow.w * transition, 0, Texture.sidebar_background_shadow.w, Texture.sidebar_background_shadow.h) gl.glDepthMask(True) gl.glPopMatrix() # x = x + 70 # w = w - 70 x = item_left y = item_top - 60 w = 560 - 40 - 40 h = 60 for i, item in enumerate(self.items): if item.group: if i > 0: # skip one half row before group heading y -= h / 2 selected = i == self.index and State.get().navigatable == self z = 0.71 fs_emu_texturing(False) if selected: fg_color = [1.0, 1.0, 1.0, 1.0] gl.glBegin(gl.GL_QUADS) gl.glColor3f(0.00, 0x99 / 0xff, 0xcc / 0xff) gl.glVertex3f(x, y + 4, z) gl.glVertex3f(x + w, y + 4, z) gl.glVertex3f(x + w, y + h - 4, z) gl.glVertex3f(x, y + h - 4, z) # glColor3f(0.6, 0.6, 0.6) # glVertex3f(x, y + 4, z) # glVertex3f(x + w, y + 4, z) # glVertex3f(x + w, y + h, z) # glVertex3f(x, y + h, z) gl.glEnd() else: fg_color = [1.0, 1.0, 1.0, 1.0] # glBegin(GL_QUADS) # glColor3f(0.4, 0.4, 0.4) # glVertex3f(x, y, z) # glVertex3f(x + w, y, z) # glVertex3f(x + w, y + 4, z) # glVertex3f(x, y + 4, z) # glEnd() # fs_emu_texturing(True) if i > 0: fg_color[3] *= 0.35 text = item.title # FIXME: REMOVE # fs_emu_blending(False) # fs_emu_blending(True) gl.glDisable(gl.GL_DEPTH_TEST) if item.group: BitmapFont.menu_font.render(text, x + 20, y + 14, r=0.0, g=0x99 / 0xff, b=0xcc / 0xff) else: BitmapFont.menu_font.render(text, x + 20, y + 14) gl.glEnable(gl.GL_DEPTH_TEST) # text = item.title.upper() # tw, th = Render.get().text(text, Font.main_path_font, # x + 40, y + 43, color=fg_color) # text = item.subtitle.upper() # fg_color[3] = fg_color[3] * 0.4 # text = item.title.upper() # tw, th = Render.get().text(text, Font.list_subtitle_font, # x + 40, y + 18, color=fg_color) y -= h