root/trunk/RBRapier/RBRapier/Renderer/ChangeBaseMgr.py

Revision 702, 5.4 kB (checked in by sholloway, 5 years ago)

Added GL prefix to Execute/Select/Deselect

Line 
1 #!/usr/bin/env python
2 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 ##~ License
4 ##~
5 ##- The RuneBlade Foundation library is intended to ease some
6 ##- aspects of writing intricate Jabber, XML, and User Interface (wxPython, etc.)
7 ##- applications, while providing the flexibility to modularly change the
8 ##- architecture. Enjoy.
9 ##~
10 ##~ Copyright (C) 2002  TechGame Networks, LLC.
11 ##~
12 ##~ This library is free software; you can redistribute it and/or
13 ##~ modify it under the terms of the BSD style License as found in the
14 ##~ LICENSE file included with this distribution.
15 ##~
16 ##~ TechGame Networks, LLC can be reached at:
17 ##~ 3578 E. Hartsel Drive #211
18 ##~ Colorado Springs, Colorado, USA, 80920
19 ##~
20 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21
22 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 #~ Imports
24 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25
26 from RBFoundation.SubObs.Basic import SubjectList
27 from RBFoundation.Objects.Properties import LazyProperty
28
29 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
30 #~ Definitions
31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32
33 class ChangeElementBase(object):
34     pass
35
36 class DynamicChangeElementBase(ChangeElementBase):
37     Trackers = LazyProperty(SubjectList)
38
39 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
40
41 class ChangeTrackerBase(object):
42     def __init__(self):
43         self.TrackedElements = {}
44
45     def SequenceAdd(self, Sequence):
46         Sequence.OnAddElement.Add(self.OnAddElement)
47         Sequence.OnRemoveElement.Add(self.OnRemoveElement)
48
49     def OnAddElement(self, Element):
50         Change = getattr(Element, self._ElementAttributeName, None)
51         if Change is not None:
52             self.TrackedElements[Change] = self.TrackedElements.get(Change, 0) + 1
53             if self.TrackedElements[Change] == 1:
54                 Change.AddTracker(self.OnTrackedChange)
55
56     def OnRemoveElement(self, Element):
57         Change = getattr(Element, self._ElementAttributeName, None)
58         if Change is not None:
59             self.TrackedElements[Change] -= 1
60             if self.TrackedElements[Change] == 0:
61                 del self.TrackedElements[Change]
62                 Change.RemoveTracker(self.OnTrackedChange)
63    
64 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
65
66 class BitmaskChangeElement(ChangeElementBase):
67     """Encapsulates a single collection of bitmask changes"""
68
69     Bitmask = 0
70
71     def __init__(self, Bitmask=0):
72         if Bitmask:
73             self.Bitmask |= Bitmask
74
75     def AddTracker(self, OnChange):
76         OnChange('add', self.Bitmask)
77
78     def RemoveTracker(self, OnChange):
79         OnChange('remove', self.Bitmask)
80
81 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
82
83 class BitmaskChangeTracker(ChangeTrackerBase):
84     """Collects many attribute changes into a single change"""
85
86     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
87     #~ Constants / Variables / Etc.
88     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
89
90     Bitmask = 0
91     BitmaskDefault = 0
92     _BitmaskNeedUpdate = True
93
94     def __init__(self, BitmaskDefault=None):
95         ChangeTrackerBase.__init__(self)
96         if BitmaskDefault is not None:
97             self.Bitmask = self.BitmaskDefault = BitmaskDefault
98
99     def OnTrackedChange(self, ChangeType, Change):
100         if ChangeType == 'add':
101             self.Bitmask |= Change
102         elif ChangeType == 'update':
103             self.Bitmask |= Change # this might overestimate the needed attribute saves
104             # self._BitmaskNeedUpdate = True # this might force unneeded updates.  life is so unfair ;)
105         elif ChangeType == 'remove':
106             self._BitmaskNeedUpdate = True
107         else:
108             raise ValueError, "ChangeType is expected to be one of ['add', 'update', 'remove'], but is '%s'" % ChangeType
109
110     def _UpdateBitmask(self, force=False):
111         if self._BitmaskNeedUpdate or force:
112             Bitmask = self.BitmaskDefault
113             for each in self.TrackedELements:
114                 Bitmask |= each.Bitmask
115             self.Bitmask = Bitmask
116             self._BitmaskNeedUpdate = False
117
118     def GLExecute(self, context):
119         pass
120    
121 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
122
123 class DynamicBitmaskChangeElement(DynamicChangeElementBase):
124     """Encapsulates a single collection of attribute changes"""
125
126     _Bitmask = 0
127
128     def __init__(self, Bitmask=0):
129         if Bitmask:
130             self.Bitmask |= Bitmask
131
132     def AddTracker(self, OnChange):
133         self.Trackers.Add(OnChange)
134         OnChange('add', self.Bitmask)
135
136     def RemoveTracker(self, OnChange):
137         self.Trackers.Remove(OnChange)
138         OnChange('remove', self.Bitmask)
139
140     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141
142     def _getBitmask(self):
143         self._UpdateBitmask()
144         return self._Bitmask
145     def _setBitmask(self, value):
146         self._Bitmask = value
147         self.Trackers.Update('update', self._Bitmask)
148     def _delBitmask(self):
149         del self._Bitmask
150         self.Trackers.Update('update', self._Bitmask)
151     def _UpdateBitmask(self, force=False):
152         pass
153     Bitmask = property(_getBitmask, _setBitmask)
154
155 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
156
157 class DynamicBitmaskChangeTracker(BitmaskChangeTracker, DynamicBitmaskChangeElement):
158     def SequenceAdd(self, Sequence):
159         result = BitmaskChangeTracker.SequenceAdd(self, Sequence)
160         setattr(Sequence, self._ElementAttributeName, self)
161         return result
162
Note: See TracBrowser for help on using the browser.