Changeset 339

Show
Ignore:
Timestamp:
10/29/02 23:20:20 (6 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBRapier/RBRapier/Renderer/BufferMgr.py

    r338 r339  
    2020##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2121 
     22#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     23#~ Imports  
     24#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2225 
     26from OpenGL import GL 
     27from Foundation.AOSubjectObserver.StandardSubjects import SubjectList 
     28 
     29#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     30#~ Definitions  
     31#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     32 
     33class BufferChangeElement(object): 
     34    """Encapsulates a single collection of attribute changes""" 
     35 
     36    Bitmask = 0 
     37 
     38    def __init__(self, Bitmask): 
     39        self.Bitmask |= Bitmask 
     40 
     41    def AddTracker(self, OnChange): 
     42        OnChange('add', self.Bitmask) 
     43 
     44    def RemoveTracker(self, OnChange): 
     45        OnChange('remove', self.Bitmask) 
     46 
     47#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     48 
     49class DynamicAttributeChangeElement(object): 
     50    """Encapsulates a single collection of attribute changes""" 
     51 
     52    _Bitmask = 0 
     53 
     54    def __init__(self, Bitmask): 
     55        self.Trackers = SubjectList() 
     56        self.Bitmask |= Bitmask 
     57 
     58    def AddTracker(self, OnChange): 
     59        self.Trackers.Add(OnChange) 
     60        OnChange('add', self.Bitmask) 
     61 
     62    def RemoveTracker(self, OnChange): 
     63        self.Trackers.Remove(OnChange) 
     64        OnChange('remove', self.Bitmask) 
     65 
     66    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     67 
     68    def _getBitmask(self): 
     69        return self._Bitmask 
     70    def _setBitmask(self, value): 
     71        self._Bitmask = value 
     72        self.Trackers.Update('update', self._Bitmask) 
     73    def _delBitmask(self): 
     74        del self._Bitmask 
     75        self.Trackers.Update('update', self._Bitmask) 
     76 
     77    Bitmask = property(_getBitmask, _setBitmask) 
     78 
     79#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     80 
     81class BufferTrackerBase(object): 
     82    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     83    #~ Constants / Variables / Etc.  
     84    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     85 
     86    Bitmask = 0 
     87    _ElementAttributeName = 'BufferClear' 
     88    _NeedUpdate = 1 
     89 
     90    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     91    #~ Public Methods  
     92    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     93 
     94    def __init__(self): 
     95        self.TrackedElements = [] 
     96 
     97    def SequenceAdd(self, Sequence): 
     98        Sequence.OnAddELement.Add(self.OnAddElement) 
     99        Sequence.OnRemoveELement.Add(self.OnRemoveElement) 
     100 
     101    def OnAddElement(self, Element): 
     102        Change = getattr(Element, self._ElementAttributeName, None) 
     103        if Change is not None: 
     104            self.TrackedElements.append(Element) 
     105            Change.AddTracker(self.OnTrackedChange) 
     106 
     107    def OnRemoveElement(self, Element): 
     108        Change = getattr(Element, self._ElementAttributeName, None) 
     109        if Change is not None: 
     110            self.TrackedElements.remove(Element) 
     111            Change.RemoveTracker(self.OnTrackedChange) 
     112     
     113    def OnTrackedChange(self, ChangeType, Change): 
     114        if ChangeType == 'add': 
     115            self.Bitmask |= Change 
     116        elif ChangeType == 'update': 
     117            self.Bitmask |= Change # this might overestimate the needed attribute saves 
     118            # self._NeedsUpdate = 1 # this might force unneeded updates.  life is so unfair ;) 
     119        elif ChangeType == 'remove': 
     120            self._NeedsUpdate = 1 
     121        else:  
     122            raise ValueError, "ChangeType is expected to be one of ['add', 'update', 'remove'], but is '%s'" % ChangeType 
     123 
     124    def UpdateAttributes(self): 
     125        if self._NeedUpdate: 
     126            for each in self.TrackedELements: 
     127                self.Bitmask |= each.Bitmask 
     128            self._NeedUpdate = 0 
     129 
     130    def Execute(self, context): 
     131        pass 
     132     
     133#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     134 
     135class BufferTracker(BufferTrackerBase): 
     136    def SequenceAdd(self, Sequence): 
     137        AttributeTrackerBase.SequenceAdd(self, Sequence) 
     138        setattr(Sequence, self._ElementAttributeName, self) 
     139 
     140#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     141 
     142class BufferEffector(BufferTrackerBase): 
     143    def Execute(self, context): 
     144        GL.glClear(self.Bitmask) 
     145