NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

billboardsystem.py (5020B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\billboards\billboardsystem.py
      2 import uthread2
      3 import logging
      4 logger = logging.getLogger(__name__)
      5 try:
      6     from videoplayer import resource
      7 except ImportError:
      8     resource = None
      9 
     10 DYNAMIC_PATH = 'dynamic:/{resourceName}/?video_local={videoResPath}&resource_name={resourceName}'
     11 NO_RESOURCE_PATH = ''
     12 
     13 class BillboardResource(object):
     14 
     15     def __init__(self, name, resPathPlaylist):
     16         self.name = name
     17         self.resource_path_playlist = [ DYNAMIC_PATH.format(resourceName=name, videoResPath=resPath) for resPath in resPathPlaylist ]
     18         self.texture_parameters_by_item_id = {}
     19         self.current_play_index = 0
     20         resource.register_resource_constructor(name)
     21         logger.info('Billboard resource %s created', self.name)
     22 
     23     def add_texture_parameters_for_item_id(self, itemID, textureParameters):
     24         self.texture_parameters_by_item_id[itemID] = textureParameters
     25         self._set_texture_parameter_resource_paths(self._get_current_resource_path(), textureParameters)
     26 
     27     def remove_texture_parameters_for_item_id(self, itemID):
     28         self._set_texture_parameter_resource_paths(NO_RESOURCE_PATH, self.texture_parameters_by_item_id[itemID])
     29         del self.texture_parameters_by_item_id[itemID]
     30 
     31     def reset_video_playback(self):
     32         self._set_all_texture_parameter_resource_paths(NO_RESOURCE_PATH)
     33 
     34     def play_current_video(self):
     35         resourcePath = self._get_current_resource_path()
     36         self._set_all_texture_parameter_resource_paths(resourcePath)
     37 
     38     def _set_all_texture_parameter_resource_paths(self, resourcePath):
     39         for textureParameters in self.texture_parameters_by_item_id.values():
     40             self._set_texture_parameter_resource_paths(resourcePath, textureParameters)
     41 
     42     def _set_texture_parameter_resource_paths(self, resourcePath, textureParameters):
     43         for textureParameter in textureParameters:
     44             textureParameter.resourcePath = resourcePath
     45 
     46     def _get_current_resource_path(self):
     47         return self.resource_path_playlist[self.current_play_index]
     48 
     49     def _set_next_resource_path(self):
     50         self.current_play_index = (self.current_play_index + 1) % len(self.resource_path_playlist)
     51 
     52     def is_unassigned(self):
     53         return len(self.texture_parameters_by_item_id) == 0
     54 
     55     def play_next_in_playlist(self):
     56         self._set_next_resource_path()
     57         self.reset_video_playback()
     58         self.play_current_video()
     59         logger.info("resource %s play next video in playlist. new video is number %s '%s'", self.name, self.current_play_index, self._get_current_resource_path())
     60 
     61 
     62 class BillboardSystem(object):
     63 
     64     def __init__(self):
     65         self.resources_by_name = {}
     66         resource.register_state_change_handler(self._on_video_state_change)
     67 
     68     def register_billboard_resource(self, name, playlist, itemId, textureParameters):
     69         billboard_resource = self.get_billboard_resource(name)
     70         if billboard_resource is None:
     71             billboard_resource = BillboardResource(name, playlist)
     72             self.resources_by_name[name] = billboard_resource
     73             logging.info("Created a new billboard resourced named '%s'", name)
     74         billboard_resource.add_texture_parameters_for_item_id(itemId, textureParameters)
     75         billboard_resource.play_current_video()
     76         return billboard_resource
     77 
     78     def get_billboard_resource(self, name):
     79         return self.resources_by_name.get(name)
     80 
     81     def _on_video_state_change(self, videoPlayer, construction_parameters, texture):
     82         logging.info('video state change. construction params=%s', construction_parameters)
     83         try:
     84             if videoPlayer.state != resource.videoplayer.State.DONE:
     85                 logging.warn('not done. construction params=%s', construction_parameters)
     86                 return
     87             name = construction_parameters.get('resource_name')
     88             if name is None:
     89                 logging.warning('could not find resource in construction parameters %s', construction_parameters)
     90                 return
     91             logging.info('found dynamic resource name %s', name)
     92             billboard_resource = self.get_billboard_resource(name)
     93             if not billboard_resource:
     94                 logging.warning("unable to locate billboard resource named '%s'" % name)
     95                 return
     96             uthread2.start_tasklet(billboard_resource.play_next_in_playlist)
     97         except Exception:
     98             logger.exception('something is wrong. construction parameters %s', construction_parameters)
     99 
    100     def unregister_billboard_resource(self, name, itemId):
    101         billboard_resource = self.get_billboard_resource(name)
    102         billboard_resource.remove_texture_parameters_for_item_id(itemId)
    103         if billboard_resource.is_unassigned():
    104             self._remove_billboard_resource(name)
    105 
    106     def _remove_billboard_resource(self, name):
    107         if name in self.resources_by_name:
    108             del self.resources_by_name[name]