Changeset 341
- Timestamp:
- 10/30/02 15:27:20 (6 years ago)
- Files:
-
- trunk/RBRapier/RBRapier/Renderer/Appearance/Accumulation.py (added)
- trunk/RBRapier/RBRapier/Renderer/Appearance/Blending.py (added)
- trunk/RBRapier/RBRapier/Renderer/Appearance/Fog.py (added)
- trunk/RBRapier/RBRapier/Renderer/Appearance/Lighting.py (added)
- trunk/RBRapier/RBRapier/Renderer/Appearance/LineRasterization.py (added)
- trunk/RBRapier/RBRapier/Renderer/Appearance/LogicalOperations.py (added)
- trunk/RBRapier/RBRapier/Renderer/Appearance/Materials.py (added)
- trunk/RBRapier/RBRapier/Renderer/Appearance/PointRasterization.py (added)
- trunk/RBRapier/RBRapier/Renderer/Appearance/PolygonRasterization.py (added)
- trunk/RBRapier/RBRapier/Renderer/AttributeMgr.py (modified) (7 diffs)
- trunk/RBRapier/RBRapier/Renderer/BufferMgr.py (modified) (6 diffs)
- trunk/RBRapier/RBRapier/Renderer/ChangeBaseMgr.py (added)
- trunk/RBRapier/RBRapier/Renderer/Environment/Buffers.py (added)
- trunk/RBRapier/RBRapier/Renderer/Environment/FragmentTests.py (added)
- trunk/RBRapier/RBRapier/Renderer/Environment/Selection.py (added)
- trunk/RBRapier/RBRapier/Renderer/SequenceMgr.py (modified) (2 diffs)
- trunk/RBRapier/RBRapier/Renderer/StateMgr.py (modified) (3 diffs)
- trunk/RBRapier/RBRapier/Renderer/View/ClippingPlane.py (modified) (4 diffs)
- trunk/RBRapier/RBRapier/Renderer/View/TransformationSettings.py (modified) (3 diffs)
- trunk/RBRapier/RBRapier/Renderer/View/Transformations.py (modified) (6 diffs)
- trunk/RBRapier/RBRapier/Renderer/View/Viewport.py (modified) (3 diffs)
- trunk/RBRapier/RBRapier/Tools/RectangleBase.py (added)
- trunk/RBRapier/doc/DesignLayout.xml (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBRapier/RBRapier/Renderer/AttributeMgr.py
r338 r341 25 25 26 26 from OpenGL import GL 27 from Foundation.AOSubjectObserver.StandardSubjects import SubjectList27 from ChangeBaseMgr import ChangeTrackerBase 28 28 29 29 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 31 31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 32 33 class AttributeChangeElement( object):33 class AttributeChangeElement(ChangeElementBase): 34 34 """Encapsulates a single collection of attribute changes""" 35 35 … … 47 47 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 48 48 49 class DynamicAttributeChangeElement( object):49 class DynamicAttributeChangeElement(DynamicChangeElementBase): 50 50 """Encapsulates a single collection of attribute changes""" 51 51 … … 53 53 54 54 def __init__(self, Bitmask): 55 self.Trackers = SubjectList()56 55 self.Bitmask |= Bitmask 57 56 … … 79 78 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 79 81 class AttributeTrackerBase( object):80 class AttributeTrackerBase(ChangeTrackerBase): 82 81 """Collects many attribute changes into a single change""" 83 82 … … 90 89 _NeedUpdate = 1 91 90 92 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 93 #~ Public Methods 94 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 91 def __init__(self, BitmaskDefault): 92 self.Bitmask = self.BitmaskDefault = BitmaskDefault 95 93 96 def __init__(self):97 self.TrackedElements = []98 99 def SequenceAdd(self, Sequence):100 Sequence.OnAddELement.Add(self.OnAddElement)101 Sequence.OnRemoveELement.Add(self.OnRemoveElement)102 103 def OnAddElement(self, Element):104 Change = getattr(Element, self._ElementAttributeName, None)105 if Change is not None:106 self.TrackedElements.append(Element)107 Change.AddTracker(self.OnTrackedChange)108 109 def OnRemoveElement(self, Element):110 Change = getattr(Element, self._ElementAttributeName, None)111 if Change is not None:112 self.TrackedElements.remove(Element)113 Change.RemoveTracker(self.OnTrackedChange)114 115 94 def OnTrackedChange(self, ChangeType, Change): 116 95 if ChangeType == 'add': … … 126 105 def UpdateAttributes(self): 127 106 if self._NeedUpdate: 107 self.Bitmask = self.BitmaskDefault 128 108 for each in self.TrackedELements: 129 109 self.Bitmask |= each.Bitmask trunk/RBRapier/RBRapier/Renderer/BufferMgr.py
r339 r341 31 31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 32 33 class BufferChangeElement( object):33 class BufferChangeElement(ChangeElementBase): 34 34 """Encapsulates a single collection of attribute changes""" 35 35 … … 47 47 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 48 48 49 class DynamicAttributeChangeElement( object):49 class DynamicAttributeChangeElement(DynamicChangeElementBase): 50 50 """Encapsulates a single collection of attribute changes""" 51 51 … … 53 53 54 54 def __init__(self, Bitmask): 55 self.Trackers = SubjectList()56 55 self.Bitmask |= Bitmask 57 56 … … 79 78 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 79 81 class BufferTrackerBase( object):80 class BufferTrackerBase(ChangeTrackerBase): 82 81 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 82 #~ Constants / Variables / Etc. … … 92 91 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 93 92 94 def __init__(self):95 self.TrackedElements = []96 97 93 def SequenceAdd(self, Sequence): 98 94 Sequence.OnAddELement.Add(self.OnAddElement) 99 95 Sequence.OnRemoveELement.Add(self.OnRemoveElement) 100 96 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 97 def OnTrackedChange(self, ChangeType, Change): 114 98 if ChangeType == 'add': … … 124 108 def UpdateAttributes(self): 125 109 if self._NeedUpdate: 110 self.Bitmask = 0 126 111 for each in self.TrackedELements: 127 112 self.Bitmask |= each.Bitmask trunk/RBRapier/RBRapier/Renderer/SequenceMgr.py
r340 r341 52 52 def AddElement(self, Element, priority=0): 53 53 if priority <= 0: 54 idx = bisect.bisect_right(self.Elements, (priority, _MatchAll)) 55 else: idx = bisect.bisect_left(self.Elements, (priority, _MatchAll)) 56 self.Elements.insert(idx, (priority, Element)) 54 idx = bisect.bisect_right(self.Elements, (priority, _MatchAll, _MatchAll)) 55 else: idx = bisect.bisect_left(self.Elements, (priority, _MatchAll, _MatchAll)) 56 if isinstance(Element, types.MethodType): 57 ElementFn, Element = Element, ElementFn.im_self 58 elif isinstance(getattr(Element, 'Execute', None), types.MethodType): 59 ElementFn = Element.Execute 60 self.Elements.insert(idx, (priority, ElementFn, Element)) 57 61 58 62 try: ElementSequenceAdd = self.Element.SequenceAdd … … 63 67 64 68 def RemoveElement(self, Element): 65 idx = self.Elements.index((_MatchAll, Element)) 66 del self.Elements[idx] 69 self.Elements[:] = [x for x in self.Elements if x[-1] != Element] 67 70 self.OnRemoveElement.Update(Element) 68 71 69 72 def Execute(self, context): 70 73 self.OnBeginExecute.Update(context) 71 for priority, element in self.Elements:74 for priority, elementfn, element in self.Elements: 72 75 if getattr(element, 'Active', 1): 73 element .Execute(context)76 elementfn(context) 74 77 self.OnEndExecute.Update(context) 75 78 trunk/RBRapier/RBRapier/Renderer/StateMgr.py
r338 r341 26 26 from OpenGL import GL 27 27 from Foundation.AspectOriented import Aspect 28 from RBRapier.Renderer.AttributeMgr import AttributeChangeElement 28 29 29 30 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 102 103 103 104 class StateManager(StateManagerBase): 105 AttributeChange = AttributeChangeElement(GL.GL_ENABLE_BIT) 106 104 107 def _SetState(self, state, enabled): 105 108 if enable: GL.glEnable(state) … … 109 112 110 113 class ClientStateManager(StateManagerBase): 114 AttributeChange = AttributeChangeElement(GL.GL_CLIENT_ENABLE_BIT) 115 111 116 def _SetState(self, state, enabled): 112 117 if enable: GL.glEnableClientState(state) trunk/RBRapier/RBRapier/Renderer/View/ClippingPlane.py
r340 r341 25 25 26 26 from OpenGL import GL 27 from RBRapier.Renderer.AttributeMgr import AttributeChangeElement 27 28 from RBRapier.Tools import Vector 28 29 … … 36 37 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 38 38 PlaneNumber = None 39 AttributeChange = AttributeChangeElement(GL.GL_TRANSFORM_BIT) 40 41 PlaneNumber = 0 39 42 Equation = Vector.Vector4Property('Equation') 40 41 # TODO: hook up this attribute change thingy42 context.AttributeMgr.Save(GL.GL_TRANSFORM_BIT)43 43 44 44 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 46 46 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 47 47 48 def __init__(self, PlaneNumber= None, Equation=None):48 def __init__(self, PlaneNumber=0, Equation=None): 49 49 self.PlaneNumber = PlaneNumber 50 50 if Equation is not None: … … 52 52 53 53 def Select(self, context): 54 if self.PlaneNumber is not None:55 GL.glClipPlane(GL.GL_CLIP_PLANE0 + self.PlaneNumber, self.Equation.tolist())56 context.StateMgr.Enable(GL.GL_CLIP_PLANE0 + self.PlaneNumber)54 PlaneIdx = GL.GL_CLIP_PLANE0 + self.PlaneNumber 55 GL.glClipPlane(PlaneIdx, self.Equation.tolist()) 56 context.StateMgr.Enable(PlaneIdx) 57 57 58 58 def Deselect(self, context): 59 if self.PlaneNumber is not None:60 context.StateMgr.Disable(GL.GL_CLIP_PLANE0 + self.PlaneNumber)59 PlaneIdx = GL.GL_CLIP_PLANE0 + self.PlaneNumber 60 context.StateMgr.Disable(PlaneIdx) 61 61 trunk/RBRapier/RBRapier/Renderer/View/TransformationSettings.py
r338 r341 25 25 26 26 from OpenGL import GL 27 from RBRapier.Renderer.AttributeMgr import AttributeChangeElement 27 28 28 29 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 30 31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31 32 32 class TransformationSettings(object):33 class Normalization(object): 33 34 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 34 35 #~ Constants / Variables / Etc. 35 36 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36 37 37 Active = 1 38 39 RescaleNormal = None # 0 or 1 40 Normalize = None # 0 or 1 41 PerspectiveHint = None # GL_FASTEST, GL_DONTCARE, GL_NICEST 42 43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 44 #~ Definitions 45 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 47 class _Extensions(object): 48 def __init__(self): 49 from OpenGL.GL.EXT import rescale_normal 50 self.rescale_normal = rescale_normal.glInitRescaleNormalEXT() and rescale_normal or None 51 _extensions = LazyProperty('_extensions', _Extensions) 38 AttributeChange = AttributeChangeElement(GL.GL_TRANSFORM_BIT) 52 39 53 40 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 55 42 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 43 57 def __init__(self, Nomralize=None, PerspectiveHint=None): 58 self.Nomralize = Nomralize 44 def Select(self, context): 45 context.StateMgr.Enable(GL.GL_NORMALIZE) 46 47 def Deselect(self, context): 48 context.StateMgr.Disable(GL.GL_NORMALIZE) 49 50 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 51 52 class PerspectiveHint(object) 53 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 #~ Constants / Variables / Etc. 55 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 57 AttributeChange = AttributeChangeElement(GL.GL_TRANSFORM_BIT) 58 PerspectiveHint = GL_DONT_CARE 59 60 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 #~ Public Methods 62 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 64 def __init__(self, PerspectiveHint=None): 59 65 self.PerspectiveHint = PerspectiveHint 60 66 61 def Setup(self, context): 62 if not self.Active: return 63 context.AttributeMgr.Save(GL.GL_TRANSFORM_BIT) 64 if self.PerspectiveHint is not None: 65 context.AttributeMgr.Save(GL.GL_HINT_BIT) 66 if self.RescaleNormal is not None and self._extensions.rescale_normal: 67 context.StateMgr.SetState(self.RescaleNormal, self._extensions.rescale_normal.GL_RESCALE_NORMAL_EXT) 68 if self.Normalize is not None: 69 context.StateMgr.SetState(self.Normalize, GL.GL_NORMALIZE) 70 71 def Draw(self, context): 72 if not self.Active: return 73 if self.PerspectiveHint is not None: 74 GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, self.PerspectiveHint ) 67 def Execute(self, context): 68 GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, self.PerspectiveHint) 69 Draw = Execute 75 70 trunk/RBRapier/RBRapier/Renderer/View/Transformations.py
r338 r341 27 27 from RBRapier.Tools import Projections 28 28 from RBRapier.Tools import Quaternion 29 from RBRapier.Tools import Vector30 29 31 from Foundation.LazyProperty import LazyProperty32 30 from Numeric import transpose 33 31 from OpenGL import GL, GLU … … 37 35 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 38 36 39 class Composite(Transformations.Composite):37 class ManagedTransformationMixin(object): 40 38 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 41 39 #~ Constants / Variables / Etc. 42 40 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 43 41 44 Active = 145 46 42 _ModeNameTable = {None:"< None >", GL.GL_MODELVIEW:"Model View", GL.GL_PROJECTION:"Projection", GL.GL_TEXTURE_MATRIX:"Texture", GL.GL_COLOR:"Color"} 43 Mode = None 44 Save = 0 47 45 48 46 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 55 53 self.Save = Save 56 54 57 def __repr__(self): 58 return "<%s matrix=%s>" % (self.__class__.__name__, self._ModeNameTable[self.Mode] 55 def Select(self, context): 56 if self.Mode: GL.glMatrixMode(self.Mode) 57 if self.Save: GL.glPushMatrix() 58 self.Execute(context) 59 if self.Mode: GL.glMatrixMode(GL.GL_MODELVIEW) 59 60 60 def Draw(self, context): 61 if not self.Active: return 62 if self.Mode: 63 GL.glMatrixMode(self.Mode) 61 def Deselect(self): 62 if self.Save: 63 if self.Mode: 64 GL.glMatrixMode(self.Mode) 65 GL.glPopMatrix() 66 GL.glMatrixMode(GL.GL_MODELVIEW) 67 else: 68 GL.glPopMatrix() 64 69 65 if self.Save: 66 GL.glPushMatrix() 67 context.AddCleanupCallable(self.Cleanup) 70 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 68 71 72 class Composite(Transformations.Composite): 73 def Execute(self, context): 69 74 for each in self.collection: 70 75 each.Draw(context) 76 Draw = Execute 71 77 72 if self.Mode: 73 GL.glMatrixMode(GL.GL_MODELVIEW) 74 75 def Cleanup(self): 76 if self.Mode: 77 GL.glMatrixMode(self.Mode) 78 GL.glPopMatrix() 79 GL.glMatrixMode(GL.GL_MODELVIEW) 80 else: 81 GL.glPopMatrix() 78 class ManagedComposite(ManagedTransformationMixin, Composite): 79 pass 82 80 83 81 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 86 84 def Draw(self, context): 87 85 GL.glMultMatrixd(transpose(self.matrix).tolist()) 86 Draw = Execute 88 87 89 88 class LoadMatrix(Transformations.Matrix): 90 89 def Draw(self, context): 91 90 GL.glLoadMatrixd(transpose(self.matrix).tolist()) 91 Draw = Execute 92 92 93 93 class Identity(Transformations.Identity): 94 94 def Draw(self, context): 95 95 pass # Uh.... don't use this? 96 Draw = Execute 96 97 97 98 class LoadIdentity(Transformations.Identity): 98 99 def Draw(self, context): 99 100 GL.glLoadIdentity() 101 Draw = Execute 100 102 101 103 class Translate(Transformations.Translate): 102 104 def Draw(self, context): 103 105 GL.glTranslated(*self.Direction[:3]) 106 Draw = Execute 104 107 105 108 class Scale(Transformations.Scale): 106 109 def Draw(self, context): 107 110 GL.glScaled(*self.Scale[:3]) 111 Draw = Execute 108 112 109 113 class Rotate(Transformations.Rotate): 110 114 def Draw(self, context): 111 115 GL.glRotated(self.Angle, *self.Axis[:3]) 116 Draw = Execute 112 117 113 118 class Quaternion(Quaternion.Quaternion): 114 119 def Draw(self, context): 115 120 GL.glMultMatrixd(transpose(self.asArray4x4()).tolist()) 121 Draw = Execute 116 122 117 123 class LinearMappingMatrix(Transformations.LinearMappingMatrix): 118 124 def Draw(self, context): 119 125 GL.glMultMatrixd(transpose(self.asArray4x4()).tolist()) 126 Draw = Execute 120 127 121 128 class LookAt(Transformations.LookAt): … … 123 130 args= self.Eye.tolist() + self.Center.tolist() + self.Up.tolist() 124 131 GLU.gluLookAt(*args) 132 Draw = Execute 125 133 126 134 class SphericalLookAt(Transformations.SphericalLookAt): … … 128 136 args= self.Eye.tolist() + self.Center.tolist() + self.Up.tolist() 129 137 GLU.gluLookAt(*args) 138 Draw = Execute 130 139 131 140 class Shear(Transformations.Shear): 132 141 def Draw(self, context): 133 142 GL.glMultMatrixd(transpose(self.matrix).tolist()) 143 Draw = Execute 134 144 135 145 class Skew(Transformations.Skew): 136 146 def Draw(self, context): 137 147 GL.glMultMatrixd(transpose(self.matrix).tolist()) 148 Draw = Execute 138 149 139 150 class Orthographic(Projections.Orthographic): 140 151 def Draw(self, context): 141 152 GL.glOrtho(self.Left, self.Right, self.Bottom, self.Top, self.Near, self.Far) 153 Draw = Execute 142 154 143 155 class Frustum(Projections.Frustum): 144 156 def Draw(self, context): 145 157 GL.glFrustum(self.Left, self.Right, self.Bottom, self.Top, self.Near, self.Far) 158 Draw = Execute 146 159 147 160 class Perspective(Projections.Perspective): 148 161 def Draw(self, context): 149 162 GL.glFrustum(self.Left, self.Right, self.Bottom, self.Top, self.Near, self.Far) 163 Draw = Execute 150 164 trunk/RBRapier/RBRapier/Renderer/View/Viewport.py
r338 r341 26 26 from OpenGL import GL 27 27 from RBRapier.Tools import RectangleBase 28 from RBRapier.Renderer.AttributeMgr import AttributeChangeElement 28 29 29 30 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 36 37 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 38 38 Active = 1 39 40 SetupPhase = DrawPhase = -2 39 AttributeChange = AttributeChangeElement(GL.GL_VIEWPORT_BIT) 41 40 42 41 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 44 43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 44 46 def __repr__(self): 47 return "<%s rectangle=%s>" % (self.__class__.__name__, self.Rectangle) 45 def Execute(self, context): 46 GL.glViewport(*self.Rectangle) 47 Draw = Execute 48 48 49 def Setup(self, context):50 if not self.Active: return51 context.AttributeMgr.Save(GL.GL_VIEWPORT_BIT)52 53 def Draw(self, context):54 if not self.Active: return55 GL.glViewport(*self.Rectangle)56 trunk/RBRapier/doc/DesignLayout.xml
r340 r341 55 55 56 56 <package name='Appearance'> 57 <module name='Accumulation' /> 57 58 <module name='Lighting and Lights' /> 58 59 <module name='LogicOp'> … … 73 74 74 75 <package name='Environment'> 75 <module name='Accumulation' /> 76 77 <module name='Selection and Picking'> 76 <module name='Selection'> 78 77 Don't Forget this! 79 78 </module>
