separat task to access the GLX methods;
authorca
Fri, 06 Mar 1998 10:30:58 +0100
changeset 803 5ff79f80245e
parent 802 c8848a173815
child 804 ad94311c8698
separat task to access the GLX methods; -> implements: invalidate
GraphColumnView3D.st
--- a/GraphColumnView3D.st	Thu Mar 05 20:43:24 1998 +0100
+++ b/GraphColumnView3D.st	Fri Mar 06 10:30:58 1998 +0100
@@ -7,9 +7,9 @@
 !
 
 GLXView subclass:#GLXGraph
-	instanceVariableNames:'graph colorMap glxObjGraphs glxObjFcts glxObjRefs glxObjGrid
-		glxObjAxis maxY minY removeGraphs removeFcts removeRefs
-		removeGrid removeAxis redrawLock'
+	instanceVariableNames:'graph colorMap maxY minY loVCols loVRefs glxObjFunc glxObjRefs
+		glxObjGrid glxObjAxis removeFunc removeRefs removeGrid removeAxis
+		isInvalid lockCriticalTask criticalTask'
 	classVariableNames:''
 	poolDictionaries:''
 	privateIn:GraphColumnView3D
@@ -95,48 +95,6 @@
     view := GraphColumnView3D origin:0@0 extent:1.0@1.0 in:top.
     list := OrderedCollection new.
 
-    top label:'2D-View'.
-
-    #(  red green yellow blue 
-     ) keysAndValuesDo:[:idx :aColor|
-        |col|
-
-        col := GraphColumn name:idx.
-        col foregroundColor:(Color perform:aColor).
-
-        col functionYblock:[:start :anArray|
-            x := (start - 1) * 0.2.
-            (idx == 1 or:[idx == 3]) ifTrue:[
-                1 to:(anArray size) do:[:i| anArray at:i put:20 * (x sin). x := x + 0.2 ].
-            ] ifFalse:[
-                1 to:(anArray size) do:[:i| anArray at:i put:20 * (x cos). x := x + 0.2 ].
-            ].
-            anArray
-        ].
-        list add:col
-    ].
-"/    view rotateX:0.
-"/    view rotateY:0.
-    view showGrid:true.
-    view columns:list.
-    top open.
-
-
-
-
-
-!
-
-test1
-"
-self test1
-"
-    |top list view x|
-
-    top  := StandardSystemView extent:800 @ 400.
-    view := GraphColumnView3D origin:0@0 extent:1.0@1.0 in:top.
-    list := OrderedCollection new.
-
     top label:'3D-View'.
 
     #(  red green yellow blue 
@@ -162,19 +120,25 @@
     view showDefaultMenu:true.
     top openAndWait.
 
-    [   |o i|
+    [   |o i t c|
 
         i := 0.
+        t := 0.
+        c := 0.
 
         [top shown] whileTrue:[
-            view rotateX:i.
-            i := i + 10.
-            o := view removeFirst.
-            view add:o.
-            Delay waitForSeconds:0.2.
+            t := t + (Time millisecondsToRun:[ view rotateY:i]).
+            i := i + 1.
+            c := c + 1.
+            c == 90 ifTrue:[
+                Transcript showCR:'Time: ', t printString.
+                t := 0.
+                c := 0.
+            ].
+            Delay waitForSeconds:0.05.
         ]
 
-    ] forkAt:7.
+    ] forkAt:8.
 
 
 
@@ -195,7 +159,7 @@
     "
     showAxis ~~ aBool ifTrue:[
         showAxis := aBool.
-        self doInvalidateGraph.
+        glxView invalidate.
     ].
 !
 
@@ -212,7 +176,7 @@
     "
     showGraph ~~ aBool ifTrue:[
         showGraph := aBool.
-        self doInvalidateGraph.
+        glxView invalidate.
     ].
 !
 
@@ -234,7 +198,7 @@
 
     zZ = zoomZ ifFalse:[
         zoomZ := zZ.
-        self doInvalidateGraph
+        glxView invalidate.
     ]
 ! !
 
@@ -387,7 +351,7 @@
 doInvalidateGraph
     "set graph to invalidate
     "
-    glxView redraw
+    glxView invalidate
 !
 
 doRecomputeGraph
@@ -395,7 +359,6 @@
      graph to invalidate
     "
     glxView deleteAllObjects.
-    self doInvalidateGraph
 !
 
 updateColumns:what with:oldValue from:aColumn
@@ -412,7 +375,7 @@
 
     (what == #color or:[what == #foregroundColor]) ifTrue:[
         glxView deleteColumns.
-      ^ self doInvalidateGraph.
+      ^ glxView invalidate.
     ].
 
     (   aColumn isNil
@@ -432,7 +395,7 @@
     what == #color ifTrue:[
         glxView deleteGrid
     ].
-    self doInvalidateGraph.
+    glxView invalidate.
 !
 
 updateReferences:what atRelX:aPhysX
@@ -447,7 +410,7 @@
     what == #state ifFalse:[
         glxView deleteReferences
     ].
-    self doInvalidateGraph
+    glxView invalidate.
 ! !
 
 !GraphColumnView3D methodsFor:'rotation'!
@@ -466,7 +429,7 @@
 
     (r := self rotateValueFrom:aValue) ~~ rotateX ifTrue:[
         rotateX := r.
-        self doInvalidateGraph
+        glxView invalidate.
     ]
 !
 
@@ -484,7 +447,7 @@
 
     (r := self rotateValueFrom:aValue) ~~ rotateY ifTrue:[
         rotateY := r.
-        self doInvalidateGraph
+        glxView invalidate.
     ]
 
 !
@@ -503,27 +466,81 @@
 
     (r := self rotateValueFrom:aValue) ~~ rotateZ ifTrue:[
         rotateZ := r.
-        self doInvalidateGraph
+        glxView invalidate.
     ]
 
 ! !
 
-!GraphColumnView3D::GLXGraph methodsFor:'drawing'!
+!GraphColumnView3D::GLXGraph methodsFor:'event handling'!
 
-redraw
-    "redraw
+buttonPress:button x:x y:y
+    "delegate button to graph
     "
-    shown ifTrue:[
-        self freeObjectsDo:[
-            self redrawInBackBuffer.
-            self swapBuffers.
-        ]
-    ]
+    graph buttonPress:button x:x y:y
+! !
+
+!GraphColumnView3D::GLXGraph methodsFor:'initialization'!
+
+destroy
+    "remove dependencies
+    "
+    super destroy.
+    self  deleteAllObjects.
 
 !
 
-redrawAxisFor:aListOfVisibleCols
+for:aGraph
+    graph := aGraph
+!
+
+initialize
+    "setup default values
+    "
+    super initialize.
+
+    type     := #colorIndexDoubleBuffer.      "/ works on any device
+    colorMap := Dictionary new.
+    maxY     :=  1.0.
+    minY     := -1.0.
+
+    removeFunc := false.
+    removeRefs := false.
+    removeGrid := false.
+    removeAxis := false.
+    isInvalid  := false.
+    lockCriticalTask := Semaphore forMutualExclusion.
+!
 
+realize
+    "define orthogonal projection; switch to back buffer drawing
+    "
+    super realize.
+    device glxOrthoLeft:-1.0 right:1.0 bottom:-1.0 top:1.0 near:10.0 far:-10.0 in:drawableId.
+    self backBuffer.
+
+!
+
+unrealize
+    "clear colorMap and objects
+    "
+    super unrealize.
+    self deleteAllObjects.
+! !
+
+!GraphColumnView3D::GLXGraph methodsFor:'making objects'!
+
+make:aSelector
+
+    |id|
+
+    id := self newObjectId.
+    self makeObject:id.
+    self perform:aSelector.
+    self closeObject.
+  ^ id
+!
+
+makeAxis
     |y0 x0 z0 x1 y1 z1|
 
     x0 := 0.0.
@@ -531,7 +548,7 @@
     y0 := minY asFloat.
     y1 := maxY asFloat.
     x1 := graph windowSize asFloat.
-    z1 := aListOfVisibleCols size - 1.0.
+    z1 := loVCols size - 1.0.
 
     self setColor:(Color red).
 
@@ -553,7 +570,7 @@
 
 !
 
-redrawGraphFor:aListOfCols
+makeFunc
     "draw the graph and spawn the grid dependend on the enabled
      attributes
     "
@@ -570,7 +587,7 @@
     data   := Array new:noRows.
     maxY   := nil.
 
-    aListOfCols do:[:aCol|
+    loVCols do:[:aCol|
         yVal := aCol yValuesStartAt:firstX into:data.
         x    := 0.0.
         r    := 1.
@@ -579,6 +596,7 @@
             maxY := minY := yVal at:r
         ].
         self setColor:(aCol foregroundColor).
+
         device glxBeginLineIn:drawableId.
 
         noRows timesRepeat:[
@@ -590,13 +608,12 @@
             x := x + 1.0.
             r := r + 1.
         ].
-
         device glxEndLineIn:drawableId.
         z := z + 1.0.
     ]
 !
 
-redrawGridFor:aListOfCols
+makeGrid
     "draw the graph and spawn the grid dependend on the enabled
      attributes
     "
@@ -605,14 +622,11 @@
      r      "{ Class:SmallInteger }"
     |
 
-    aListOfCols size < 2 ifTrue:[
-        ^ self
-    ].
     noRows := graph windowSize.
     x      := 0.0.
     r      := graph graphOriginX.
     data   := Array new:1.
-    maxY   := minY := (aListOfCols at:1) yValueAt:1.
+    maxY   := minY := (loVCols at:1) yValueAt:1.
 
     self setColor:(graph gridColor).
 
@@ -620,7 +634,7 @@
         device glxBeginLineIn:drawableId.
         z := 0.0.
 
-        aListOfCols do:[:aCol|
+        loVCols do:[:aCol|
             y    := aCol yValueAt:r.
             maxY := maxY max:y.
             minY := minY min:y.
@@ -639,49 +653,133 @@
 
 !
 
+makeRefs
+    "redraw current visible references
+    "
+    |y0 y1 z0 z1 x0|
+
+    y0 := minY asFloat.
+    y1 := maxY asFloat.
+    z0 := -0.1.
+    z1 := loVCols size - 0.9.
+
+    self setColor:(graph referenceColor).
+
+    loVRefs do:[:anIndex|
+        x0 := anIndex asFloat.
+
+        device glxBeginLineIn:drawableId.
+        device glxV3fX:x0  y:y1  z:z0  in:drawableId.
+        device glxV3fX:x0  y:y0  z:z0  in:drawableId.
+        device glxEndLineIn:drawableId.
+
+        device glxBeginLineIn:drawableId.
+        device glxV3fX:x0  y:y1  z:z1  in:drawableId.
+        device glxV3fX:x0  y:y0  z:z1  in:drawableId.
+        device glxEndLineIn:drawableId.
+
+        loVCols do:[:aCol||y|
+            y := (aCol yValueAt:anIndex) asFloat.
+
+            device glxBeginLineIn:drawableId.
+            device glxV3fX:x0  y:y  z:z0   in:drawableId.
+            device glxV3fX:x0  y:y  z:z1   in:drawableId.
+            device glxEndLineIn:drawableId.
+        ]
+    ]
+        
+! !
+
+!GraphColumnView3D::GLXGraph methodsFor:'private redraw'!
+
+criticalRedrawRoutine
+    "update all critical resources
+    "
+    removeFunc ifTrue:[
+        loVCols := nil.
+        loVRefs := nil.
+
+        glxObjFunc notNil ifTrue:[
+            self deleteObject:glxObjFunc.
+            glxObjFunc := nil
+        ].
+        removeFunc := false.
+    ].
+
+    removeRefs ifTrue:[
+        loVRefs := nil.
+
+        glxObjRefs notNil ifTrue:[
+            self deleteObject:glxObjRefs.
+            glxObjRefs := nil.
+        ].
+        removeRefs := false.
+    ].
+
+    removeGrid ifTrue:[
+        glxObjGrid notNil ifTrue:[
+            self deleteObject:glxObjGrid.
+            glxObjGrid := nil.
+        ].
+        removeGrid := false.
+    ].
+
+    removeAxis ifTrue:[
+        glxObjAxis notNil ifTrue:[
+            self deleteObject:glxObjAxis.
+            glxObjAxis := nil.
+        ].
+        removeAxis := false.
+    ].
+
+    shown ifTrue:[
+        self redrawInBackBuffer.
+        self swapBuffers.
+    ] ifFalse:[
+        colorMap := Dictionary new
+    ].
+
+
+!
+
 redrawInBackBuffer
     "redraw in back
     "
-    |sY sX sZ noCols dY winSize w2 refList loCols|
+    |sY sX sZ noCols dY winSize w2 showRefs showGrid showFunc showAxis|
 
     self setColor:(graph backgroundColor).
     self clear.
 
-    (loCols := graph listOfVisibleColumns) isEmpty ifTrue:[       "/ no shown columns
+    loVCols isNil ifTrue:[
+        loVCols := graph listOfVisibleColumns
+    ].
+
+    (noCols := loVCols size) == 0 ifTrue:[
         ^ self
     ].
 
-    noCols  := loCols size.
-    winSize := graph windowSize.
-
-    (graph showGrid and:[glxObjGrid isNil]) ifTrue:[
-        self makeObject:(glxObjGrid := self newObjectId).
-        self redrawGridFor:loCols.
-        self closeObject.
+    ((showGrid := graph showGrid) and:[glxObjGrid isNil]) ifTrue:[
+        noCols > 1 ifTrue:[glxObjGrid := self make:#makeGrid]
+                  ifFalse:[showGrid   := false]
     ].
 
-    (graph showGraph and:[glxObjFcts isNil]) ifTrue:[
-        self makeObject:(glxObjFcts := self newObjectId).
-        self redrawGraphFor:loCols.
-        self closeObject.
+    ((showFunc := graph showGraph) and:[glxObjFunc isNil]) ifTrue:[
+        glxObjFunc := self make:#makeFunc
     ].
 
-    (graph showAxis and:[glxObjAxis isNil]) ifTrue:[
-        self makeObject:(glxObjAxis := self newObjectId).
-        self redrawAxisFor:loCols.
-        self closeObject.
+    ((showAxis := graph showAxis) and:[glxObjAxis isNil]) ifTrue:[
+        glxObjAxis := self make:#makeAxis
     ].
 
-    (graph showReferences and:[glxObjRefs isNil]) ifTrue:[
-        refList := graph listOfVisibleRefIndices.
-
-        refList notEmpty ifTrue:[
-            self makeObject:(glxObjRefs := self newObjectId).
-            self redrawReferences:refList for:loCols.
-            self closeObject.
-        ]
+    ((showRefs := graph showReferences) and:[glxObjRefs isNil]) ifTrue:[
+        loVRefs isNil ifTrue:[
+            loVRefs := graph listOfVisibleRefIndices
+        ].
+        loVRefs notEmpty ifTrue:[ glxObjRefs := self make:#makeRefs ]
+                        ifFalse:[ showRefs   := false ]
     ].
 
+    winSize := graph windowSize.
     sZ := graph zoomZ * (1.0 / noCols).
     w2 := width // 2.
 
@@ -693,7 +791,6 @@
     sX := sX / (width / winSize).
     sX := 2.0 / (winSize + sX).
 
-
     dY := (maxY - minY) / 2.
     sY := ((0.5 / (dY max:2.0)) min:sX) * graph zoomY.
 
@@ -706,142 +803,12 @@
                   y:(dY - maxY)                 "/ translate to center
                   z:(noCols - 1 / -2.0).        "/ rotate center line
 
-    graph showGrid       ifTrue:[ self callObject:glxObjGrid ].
-    graph showGraph      ifTrue:[ self callObject:glxObjFcts ].
-    graph showAxis       ifTrue:[ self callObject:glxObjAxis ].
-    graph showReferences ifTrue:[ self callObject:glxObjRefs ].
+    showGrid ifTrue:[ self callObject:glxObjGrid ].
+    showFunc ifTrue:[ self callObject:glxObjFunc ].
+    showAxis ifTrue:[ self callObject:glxObjAxis ].
+    showRefs ifTrue:[ self callObject:glxObjRefs ].
 
     self popMatrix.
-!
-
-redrawReferences:aListOfReferences for:aListOfCols
-    "redraw current visible references
-    "
-    |y0 y1 z0 z1 x0|
-
-    y0 := minY asFloat.
-    y1 := maxY asFloat.
-    z0 := -0.1.
-    z1 := aListOfCols size - 0.9.
-
-    self setColor:(graph referenceColor).
-
-    aListOfReferences do:[:anIndex|
-        x0 := anIndex asFloat.
-
-        device glxBeginLineIn:drawableId.
-        device glxV3fX:x0  y:y1  z:z0  in:drawableId.
-        device glxV3fX:x0  y:y0  z:z0  in:drawableId.
-        device glxEndLineIn:drawableId.
-
-        device glxBeginLineIn:drawableId.
-        device glxV3fX:x0  y:y1  z:z1  in:drawableId.
-        device glxV3fX:x0  y:y0  z:z1  in:drawableId.
-        device glxEndLineIn:drawableId.
-
-        aListOfCols do:[:aCol||y|
-            y := (aCol yValueAt:anIndex) asFloat.
-
-            device glxBeginLineIn:drawableId.
-            device glxV3fX:x0  y:y  z:z0   in:drawableId.
-            device glxV3fX:x0  y:y  z:z1   in:drawableId.
-            device glxEndLineIn:drawableId.
-        ]
-    ]
-        
-! !
-
-!GraphColumnView3D::GLXGraph methodsFor:'event handling'!
-
-buttonPress:button x:x y:y
-    "delegate button to graph
-    "
-    graph buttonPress:button x:x y:y
-! !
-
-!GraphColumnView3D::GLXGraph methodsFor:'initialization'!
-
-destroy
-    "remove dependencies
-    "
-    super destroy.
-    self  deleteAllObjects.
-    self  freeObjectsDo:nil.
-!
-
-for:aGraph
-    graph := aGraph
-!
-
-initialize
-    "setup default values
-    "
-    super initialize.
-
-    type     := #colorIndexDoubleBuffer.      "/ works on any device
-    colorMap := Dictionary new.
-    maxY     :=  1.0.
-    minY     := -1.0.
-    removeFcts := false.
-    removeRefs := false.
-    removeGrid := false.
-    removeAxis := false.
-
-    redrawLock := Semaphore forMutualExclusion.
-!
-
-realize
-    "define orthogonal projection; switch to back buffer drawing
-    "
-    super realize.
-    device glxOrthoLeft:-1.0 right:1.0 bottom:-1.0 top:1.0 near:10.0 far:-10.0 in:drawableId.
-    self backBuffer.
-
-!
-
-unrealize
-    "clear colorMap and objects
-    "
-    super unrealize.
-
-    self deleteAllObjects.
-    self freeObjectsDo:[
-        colorMap := Dictionary new.
-    ].
-
-! !
-
-!GraphColumnView3D::GLXGraph methodsFor:'private'!
-
-freeObjectsDo:aBlock
-    |id|
-
-    redrawLock critical:[
-        id := glxObjFcts printString.
-
-        (removeFcts and:[glxObjFcts notNil]) ifTrue:[
-            self deleteObject:glxObjFcts.
-            glxObjFcts := nil.
-        ].
-
-        (removeRefs and:[glxObjRefs notNil]) ifTrue:[
-            self deleteObject:glxObjRefs.
-            glxObjRefs := nil.
-        ].
-
-        (removeGrid and:[glxObjGrid notNil]) ifTrue:[
-            self deleteObject:glxObjGrid.
-            glxObjGrid := nil.
-        ].
-
-        (removeAxis and:[glxObjAxis notNil]) ifTrue:[
-            self deleteObject:glxObjAxis.
-            glxObjAxis := nil.
-        ].
-
-        removeAxis := removeGrid := removeRefs := removeFcts := false.
-        aBlock value.
-    ]
 
 !
 
@@ -866,10 +833,38 @@
     self color:index.
 
 
+! !
+
+!GraphColumnView3D::GLXGraph methodsFor:'redraw'!
+
+invalidate
+
+    lockCriticalTask critical:[
+        isInvalid := true.
+
+        criticalTask isNil ifTrue:[
+            criticalTask := [
+                [   |repeat|
+
+                    lockCriticalTask critical:[
+                        (repeat := isInvalid) ifTrue:[isInvalid    := false]
+                                             ifFalse:[criticalTask := nil]
+                    ].
+                    repeat ifTrue:[ self criticalRedrawRoutine ].
+                    repeat
+
+                ] whileTrue:[ Processor yield ].
+
+            ] forkAt:( Processor activePriority - 1 ).
+        ]
+    ]
+
 !
 
-stepZ
-    ^ 1.0
+redraw
+    "redraw
+    "
+    self invalidate
 ! !
 
 !GraphColumnView3D::GLXGraph methodsFor:'removing'!
@@ -877,8 +872,8 @@
 deleteAllObjects
     "delete all graphical objects
     "
-    removeGrid := removeAxis := removeFcts := removeRefs := true.
-
+    removeGrid := removeAxis := removeFunc := removeRefs := true.
+    self invalidate.
 !
 
 deleteAxis
@@ -888,7 +883,7 @@
 deleteColumns
     "delete the columns
     "
-    removeFcts := true.
+    removeFunc := true.
 !
 
 deleteGrid
@@ -906,5 +901,5 @@
 !GraphColumnView3D class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg2/GraphColumnView3D.st,v 1.4 1998-03-05 19:43:24 ca Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/GraphColumnView3D.st,v 1.5 1998-03-06 09:30:58 ca Exp $'
 ! !