Commit 4407a915bbb835c97a22b1e3b12045c0312319ca

Authored by Pavel Govyadinov
1 parent 25fa0bfe

working with new vispy

GraphCanvas.py
... ... @@ -13,6 +13,7 @@ from vispy.gloo import set_viewport, set_state, clear, set_blend_color, context
13 13 from vispy.util.transforms import perspective, translate, rotate, scale
14 14 import vispy.gloo.gl as glcore
15 15 from vispy import app
  16 +import copy
16 17  
17 18 import numpy as np
18 19 import math
... ... @@ -91,7 +92,6 @@ class GraphCanvas(scene.SceneCanvas):
91 92 self.moving = False
92 93 self.moving_cluster = False
93 94 self.selection = False
94   -
95 95 n = 10
96 96 ne = 10
97 97 #Init dummy structures
... ... @@ -209,6 +209,9 @@ class GraphCanvas(scene.SceneCanvas):
209 209  
210 210  
211 211 self.timer = app.Timer('auto', connect=self.on_timer, start=False)
  212 + #self.constant = app.Timer('auto', connect=self.update, start=True)
  213 + self.num=0
  214 + print(self.context.config)
212 215  
213 216 def on_timer(self, event):
214 217 #get the temporary positions of the vertices (and edges)
... ... @@ -285,7 +288,7 @@ class GraphCanvas(scene.SceneCanvas):
285 288 self.program_s.bind(self.vbo_s)
286 289 self.program_e_s.bind(self.vbo_cluster_lines)
287 290  
288   - self.update()
  291 + self.refresh()
289 292  
290 293 """
291 294 Function that recolors vertices based on the selected statistic
... ... @@ -306,7 +309,7 @@ class GraphCanvas(scene.SceneCanvas):
306 309 self.vbo = gloo.VertexBuffer(self.data)
307 310 self.program.bind(self.vbo)
308 311 #self.program_e.bind(self.vbo)
309   - self.update()
  312 + self.refresh()
310 313  
311 314 def update_color_buffers(self):
312 315 color = self.G.vertex_properties["RGBA"].get_2d_array(range(4)).T
... ... @@ -352,7 +355,7 @@ class GraphCanvas(scene.SceneCanvas):
352 355 self.vbo = gloo.VertexBuffer(self.data)
353 356 self.program.bind(self.vbo)
354 357 #self.program_e.bind(self.vbo)
355   - self.update()
  358 + self.refresh()
356 359  
357 360  
358 361 """
... ... @@ -461,7 +464,7 @@ class GraphCanvas(scene.SceneCanvas):
461 464 self.vbo_line = gloo.VertexBuffer(self.line_data)
462 465 self.program.bind(self.vbo)
463 466 self.program_e.bind(self.vbo_line)
464   - self.update()
  467 + self.refresh()
465 468  
466 469 """
467 470 Sets the edge color based on the the cluster the vertices belongs to
... ... @@ -480,10 +483,10 @@ class GraphCanvas(scene.SceneCanvas):
480 483 Test function that only binds the buffer
481 484 """
482 485 def gen_vertex_vbo_minimalist(self):
483   - self.update()
  486 + self.refresh()
484 487 self.vbo.set_data(self.data)
485 488 self.program.bind(self.vbo)
486   - self.update()
  489 + self.refresh()
487 490  
488 491 """
489 492 Helper function that generates the framebuffer object that stores the vertices
... ... @@ -540,7 +543,7 @@ class GraphCanvas(scene.SceneCanvas):
540 543 self.program_s.bind(self.vbo_s)
541 544 if DEBUG:
542 545 print(self.view)
543   - self.update()
  546 + self.refresh()
544 547  
545 548 """
546 549 Helper function that creates colored "block" lines based on the edges
... ... @@ -898,7 +901,7 @@ class GraphCanvas(scene.SceneCanvas):
898 901 # self.program_s.bind(self.vbo_s)
899 902 # if DEBUG:
900 903 # print(self.view)
901   -# self.update()
  904 +# self.refresh()
902 905  
903 906  
904 907 """
... ... @@ -928,12 +931,59 @@ class GraphCanvas(scene.SceneCanvas):
928 931  
929 932 #Generate the clusters
930 933 self.labels = nwt.Network.spectral_clustering(G,'length', n_clusters = n_c)
  934 + bb = nwt.AABB(G)
  935 + #print("FLJKKHDFLKJFDLKJFDLKJ ", m)
  936 + pts = []
  937 + x, y, z = bb.project_grid(3)
  938 + for i in range(3):
  939 + for j in range(3):
  940 + for k in range(3):
  941 + pts.append(np.array([x[i], y[j], z[k]]))
  942 +
931 943 #self.labels = nwt.Network.spectral_clustering(G,'length')
932 944  
933 945 #Add clusters as a vertex property
934 946 G.vertex_properties["clusters"] = G.new_vertex_property("int", vals=self.labels)
935 947 num_clusters = len(np.unique(self.labels))
936 948 self.n_c = n_c
  949 + new_indices = []
  950 + pos = G.vertex_properties["p"].get_2d_array(range(3)).T
  951 +
  952 + #for each cluster find the average vertex position and match to closest point
  953 + #in the unique grid.
  954 + for i in range(n_c):
  955 + point = np.sum(pos[np.argwhere(self.labels == i)], axis=0)/len(np.argwhere(self.labels == i))
  956 + d = 100000000.0
  957 + idx = -1
  958 + for j in range(len(pts)):
  959 + dist = np.sqrt(np.power(pts[j][0]-point[0,0],2) + np.power(pts[j][1]-point[0,1],2) + np.power(pts[j][2]-point[0,2],2))
  960 + if dist < d:
  961 + d = dist
  962 + idx = j
  963 + new_indices.append(idx)
  964 + pts[idx] = np.array([100000000.0, 1000000000.0, 100000000.0])
  965 + #since there are more points than clusters, we need to make the indices range from
  966 + #[0, n_c)
  967 + j=0
  968 + unique_indices = np.array(new_indices)
  969 + for i in range(n_c):
  970 + idx = np.argmin(new_indices)
  971 + unique_indices[idx] = j
  972 + j += 1
  973 + new_indices[idx] = 100
  974 +
  975 + lbl = np.zeros(self.labels.shape)
  976 + for i in range(n_c):
  977 + idxs = np.argwhere(self.labels == i)
  978 + new_idx = np.argwhere(unique_indices == i)
  979 + lbl[idxs] = unique_indices[i]
  980 +
  981 + self.labels = lbl
  982 + G.vertex_properties["clusters"] = G.new_vertex_property("int", vals=self.labels)
  983 +
  984 +
  985 +
  986 +
937 987  
938 988 #add colormap
939 989 G.vertex_properties["RGBA"] = nwt.Network.map_property_to_color(G, G.vertex_properties["clusters"])
... ... @@ -1072,7 +1122,7 @@ class GraphCanvas(scene.SceneCanvas):
1072 1122 self.program_s.bind(self.vbo_s)
1073 1123 if DEBUG:
1074 1124 print(self.view)
1075   - self.update()
  1125 + self.refresh()
1076 1126  
1077 1127 """
1078 1128 Loads the data G and generates all the buffers necessary as well as performs
... ... @@ -1143,7 +1193,7 @@ class GraphCanvas(scene.SceneCanvas):
1143 1193 self.program_s.bind(self.vbo_s)
1144 1194 if DEBUG:
1145 1195 print(self.view)
1146   - self.update()
  1196 + self.refresh()
1147 1197  
1148 1198 """
1149 1199 Function that changes and redraws the buffer during a resize event.
... ... @@ -1165,7 +1215,20 @@ class GraphCanvas(scene.SceneCanvas):
1165 1215 if(self.subgraphs):
1166 1216 self.program_e_s.draw('triangles', indices=self.index_clusters_s)
1167 1217 self.program_s.draw('triangles', indices=self.index_s)
  1218 + print("updated ", self.num)
  1219 + self.num += 1
  1220 + #self._u
  1221 + #self._update_pending = True
  1222 + #app.Canvas.update(self)
  1223 + #super(scene.SceneCanvas, self).update() #This forces redrawd
1168 1224  
  1225 + """
  1226 + refreshes the canvas and forces the redraw. A workaround for issue in
  1227 + vispy 0.6.3
  1228 + """
  1229 + def refresh(self):
  1230 + self.update()
  1231 + app.Canvas.update(self)
1169 1232  
1170 1233 # """
1171 1234 # A function to animate from one layout to another layout given a new G.
... ... @@ -1259,7 +1322,7 @@ class GraphCanvas(scene.SceneCanvas):
1259 1322 # print(self.color_dict[tuple(color)])
1260 1323  
1261 1324 #reset the original buffer
1262   - self.update()
  1325 + self.refresh()
1263 1326  
1264 1327 #Return the element under the click.
1265 1328 if clusters == False:
... ... @@ -1343,7 +1406,7 @@ class GraphCanvas(scene.SceneCanvas):
1343 1406 def update_vbo(self):
1344 1407 self.vbo = gloo.VertexBuffer(self.data)
1345 1408 self.program.bind(self.vbo)
1346   - self.update()
  1409 + self.refresh()
1347 1410  
1348 1411 def update_vertex_alpha(self, vertex, alpha):
1349 1412 temp = self.G.vertex_properties["RGBA"][vertex]
... ... @@ -1605,7 +1668,7 @@ class GraphCanvas(scene.SceneCanvas):
1605 1668 self.program_e.bind(self.vbo_line)
1606 1669 #self.program.draw('points')
1607 1670 self.location = event.pos
1608   - self.update()
  1671 + self.refresh()
1609 1672 elif(self.moving == True and self.moving_cluster == True):
1610 1673 if(len(self.c_id) < 2):
1611 1674 #Project into GLSpace and get before and after move coordinates
... ... @@ -1640,7 +1703,7 @@ class GraphCanvas(scene.SceneCanvas):
1640 1703 self.vbo_s = gloo.VertexBuffer(self.clusters)
1641 1704 self.program_s.bind(self.vbo_s)
1642 1705 self.update_cluster_line_vbo()
1643   - self.update()
  1706 + self.refresh()
1644 1707  
1645 1708  
1646 1709 else:
... ... @@ -1660,7 +1723,7 @@ class GraphCanvas(scene.SceneCanvas):
1660 1723 self.program_s['u_view'] = self.view
1661 1724 self.program_e_s['u_view'] = self.view
1662 1725 self.location = event.pos
1663   - self.update()
  1726 + self.refresh()
1664 1727  
1665 1728 """
1666 1729 Handles the mouse wheel zoom event.
... ... @@ -1687,4 +1750,4 @@ class GraphCanvas(scene.SceneCanvas):
1687 1750 self.program_s['u_view'] = self.view
1688 1751 self.program_e_s['u_view'] = self.view
1689 1752 #print(event.delta[1])
1690   - self.update()
  1753 + self.refresh()
... ...
GraphWidget.py
... ... @@ -7,7 +7,7 @@ Created on Mon Aug 5 15:42:19 2019
7 7 """
8 8  
9 9 from GraphCanvas import GraphCanvas
10   -from pyqtgraph.Qt import QtCore, QtGui, QtWidgets
  10 +from PyQt5 import QtCore, QtGui, QtWidgets
11 11 import network_dep as nwt
12 12  
13 13 import numpy as np
... ... @@ -19,14 +19,16 @@ Initializes the entire QTlayout and sets the mouse press events.
19 19 These are connected to the slots such that each is processes by this class
20 20 and the class it wraps.
21 21 """
22   -class GraphWidget(QtGui.QWidget):
  22 +#class GraphWidget(QtGui.QWidget):
  23 +class GraphWidget(QtWidgets.QWidget):
23 24 select = QtCore.pyqtSignal(list)
24 25 def __init__(self):
25 26 super(GraphWidget, self).__init__()
26   - box = QtGui.QVBoxLayout(self)
  27 + box = QtWidgets.QVBoxLayout(self)
27 28 self.resize(500,500)
28 29 self.setLayout(box)
29 30 self.canvas = GraphCanvas()
  31 + self.setUpdatesEnabled(True)
30 32 #self.canvas.create_native()
31 33 box.addWidget(self.canvas.native)
32 34 self.color = True
... ... @@ -37,8 +39,9 @@ class GraphWidget(QtGui.QWidget):
37 39 self.canvas.events.mouse_release.connect(self.on_mouse_release)
38 40 self.canvas.events.mouse_move.connect(self.on_mouse_move)
39 41 self.canvas.events.mouse_double_click.connect(self.on_mouse_double_click)
40   -
  42 + #self.canvas.events.
41 43 #self.show()
  44 + #self.repaint()
42 45  
43 46 """
44 47 Handles the right click mouse event at the QWidget level.
... ... @@ -49,11 +52,16 @@ class GraphWidget(QtGui.QWidget):
49 52 The context menu level actions are also coded in this section of the code.
50 53 """
51 54 def on_mouse_press(self, event):
  55 + self.canvas.set_current(event)
52 56 if event.button == 2:
53 57 if self.canvas.view[0][0] >= 0.0010:
  58 + self.canvas.update()
54 59 c_id = self.canvas.get_clicked_id(event)
  60 + self.canvas.update()
55 61 else:
  62 + self.canvas.update()
56 63 c_id = self.canvas.get_clicked_id(event, clusters=True)
  64 + self.canvas.update()
57 65 #right click
58 66 if(c_id == None):
59 67 menu = QtWidgets.QMenu(self)
... ... @@ -178,15 +186,16 @@ class GraphWidget(QtGui.QWidget):
178 186 Handles the mouse double click event.
179 187 Pass-through function.
180 188 """
  189 +
181 190 def on_mouse_double_click(self, event):
182 191 self.canvas.update_path(event)
183 192 self.select.emit(self.canvas.get_path())
184   - old_pos = self.canvas.G.vertex_properties["pos"].get_2d_array(range(3)).T
185   - nG = nwt.Network.gen_new_fd_layout(self.canvas.G)
  193 +# old_pos = self.canvas.G.vertex_properties["pos"].get_2d_array(range(3)).T
  194 +# nG = nwt.Network.gen_new_fd_layout(self.canvas.G)
186 195 # def animate(self, new_G):
187 196 #
188   - new_pos = nG.vertex_properties["pos"].get_2d_array(range(3)).T
189   - self.canvas.animate(old_pos, new_pos)
  197 +# new_pos = nG.vertex_properties["pos"].get_2d_array(range(3)).T
  198 +# self.canvas.animate(old_pos, new_pos)
190 199  
191 200 """
192 201 Handles the mouse release event.
... ...
GuiVisPy_tube.py
... ... @@ -7,35 +7,39 @@ Created on Thu Jan 31 15:29:40 2019
7 7 `"""
8 8  
9 9 from vispy import app
10   -
  10 +import vispy
11 11  
12 12 import network_dep as nwt
13 13  
14   -from pyqtgraph.Qt import QtCore, QtGui, QtWidgets
15   -import pyqtgraph as pg
  14 +#from pyqtgraph.Qt import QtCore, QtGui, QtWidgets
  15 +from PyQt5 import QtCore, QtGui, QtWidgets
  16 +#import pyqtgraph as pg
16 17 import numpy as np
17 18 import math
18 19  
19 20 from mpl_toolkits.mplot3d import Axes3D
20   -import matplotlib
21   -import matplotlib.pyplot as plt
22   -matplotlib.use('Qt5Agg')
  21 +#import matplotlib
  22 +#import matplotlib.pyplot as plt
  23 +#matplotlib.use('Qt5Agg')
23 24  
24 25 from GraphWidget import GraphWidget
25 26 from TubeWidget import TubeWidget
  27 +#vispy.use(app='egl')
26 28  
27 29  
28 30 DEBUG = False
29 31  
30   -
31 32 #set the backend. for different versions of PyQt
32 33 app.use_app(backend_name='PyQt5')
33 34  
  35 +app.set_interactive(True)
  36 +
34 37 #Define a top level application
35   -appMain = QtGui.QApplication([])
  38 +appMain = QtWidgets.QApplication([])
  39 +#QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts, True)
36 40  
37 41 ##Define a toplevel Widget
38   -top = QtGui.QWidget()
  42 +top = QtWidgets.QWidget()
39 43 top.resize(900, 900)
40 44  
41 45  
... ... @@ -46,7 +50,7 @@ fibers.canvas.create_native()
46 50  
47 51 #plt = hist.addPlot()
48 52  
49   -layout = QtGui.QGridLayout()
  53 +layout = QtWidgets.QGridLayout()
50 54 graph = GraphWidget()
51 55 graph.canvas.create_native()
52 56  
... ... @@ -54,14 +58,15 @@ graph.connect(fibers)
54 58 fibers.connect(graph)
55 59  
56 60 #initialize the layout
57   -layout.addWidget(graph, 0, 0, 2, 3)
58   -layout.addWidget(fibers, 0, 2, 2, 3)
  61 +layout.addWidget(graph.canvas.native, 0, 0, 2, 3)
  62 +layout.addWidget(fibers.canvas.native, 0, 2, 2, 3)
59 63 layout.setColumnStretch(0, 2)
60 64 layout.setRowStretch(0, 2)
61 65 layout.setColumnStretch(2, 1)
62 66 layout.setRowStretch(0, 1)
63 67  
64 68 top.setLayout(layout)
  69 +
65 70 top.show()
66 71  
67 72  
... ... @@ -95,8 +100,8 @@ G, bbl, bbu = load_nwt(&quot;/home/pavel/Documents/Python/GraphGuiQt/network_4.nwt&quot;)
95 100  
96 101 #G, bbl, bbu = load_nwt("/home/pavel/Documents/Python/GraphGuiQt/net`````````work_test_251_1kx3_short_NEW.nwt")
97 102 #ret = nwt.Network.get_affinity_matrix(G, "length")
98   -node_image = QtGui.QImage("/home/pavel/Documents/Python/GraphGuiQt/node_tex.jpg")
99   -node_tex = QtGui.QBitmap.fromImage(node_image)
  103 +#node_image = QtGui.QImage("/home/pavel/Documents/Python/GraphGuiQt/node_tex.jpg")
  104 +#node_tex = QtGui.QBitmap.fromImage(node_image)
100 105  
101 106 if DEBUG:
102 107 print(node_tex.depth())
... ... @@ -109,10 +114,12 @@ graph.canvas.set_data(G, bbl, bbu)
109 114 fibers.canvas.set_data(G, bbl, bbu, 16)
110 115 #fibers.draw_all(G, center, fibers, graph, node_tex)
111 116 graph.set_g_view(fibers)
  117 +
112 118 ## Start Qt event loop unless running in interactive mode.
113 119 if __name__ == '__main__':
114   - import sys
115   - if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
116   - QtGui.QApplication.instance().exec_()
117   -
  120 + #import sys
  121 + #if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
  122 + #QtGui.QApplication.instance().exec_()
  123 + app.set_interactive(enabled=True)
  124 + app.run()
118 125  
... ...
TubeCanvas.py
... ... @@ -10,7 +10,7 @@ Created on Mon Aug 5 15:56:47 2019
10 10 Class that extends the vispy SceneCanvas to draw 3D tubes
11 11 """
12 12  
13   -from vispy import gloo, scene
  13 +from vispy import gloo, scene, app
14 14 from vispy.gloo import set_viewport, set_state, clear, set_blend_color, context
15 15 from vispy.gloo import gl
16 16 from vispy.util.transforms import perspective, translate, rotate, scale
... ... @@ -47,6 +47,7 @@ class TubeDraw(scene.SceneCanvas):
47 47 self.cylinder_data = np.zeros(5*5, dtype=[('a_position', np.float32, 3),
48 48 ('a_normal', np.float32, 3),
49 49 ('a_fg_color', np.float32, 4),
  50 + ('a_selection', np.float32, 1),
50 51 #('a_linewidth', np.float32, 1),
51 52 ])
52 53 self.triangle_data = np.random.randint(size=(5, 3), low=0,
... ... @@ -82,6 +83,8 @@ class TubeDraw(scene.SceneCanvas):
82 83 self.program['u_eye'] = self.camera
83 84 self.program['u_up'] = self.up
84 85 self.program['u_target'] = np.asarray([0., 0., 0.], dtype=np.float32)
  86 +# self.bb = np.ones((26, 3), dtype=np.float32)
  87 +# self.program['u_bb'] = self.bb
85 88  
86 89  
87 90  
... ... @@ -170,6 +173,10 @@ class TubeDraw(scene.SceneCanvas):
170 173 self.projection = perspective(90.0, self.physical_size[0]/self.physical_size[1], 1.0, 1000.0)
171 174 self.program['u_projection'] = self.projection
172 175  
  176 +
  177 + def refresh(self):
  178 + self.update()
  179 + app.Canvas.update(self)
173 180 #Creates a cylinder around ever segment in the microvascular network.
174 181 def gen_cylinder_vbo(self, G, num_sides = 32):
175 182 i = 0
... ... @@ -417,7 +424,8 @@ class TubeDraw(scene.SceneCanvas):
417 424 #gloo.set_depth_func('lequal')
418 425 #clear(color='white', depth=True)
419 426 #print(gloo.wrappers.get_gl_configuration())
420   - self.update()
  427 + self.refresh()
  428 +
421 429 #print(self.canvas.edge_dict[(e[1], e[0])])
422 430 #Handles the mouse wheel event, i.e., zoom
423 431 def on_mouse_wheel(self, event):
... ... @@ -456,7 +464,8 @@ class TubeDraw(scene.SceneCanvas):
456 464 self.program['u_eye'] = self.camera
457 465 #print(self.view)
458 466 #print(event.delta[1])
459   - self.update()
  467 + self.refresh()
  468 +
460 469  
461 470  
462 471  
... ... @@ -534,7 +543,7 @@ class TubeDraw(scene.SceneCanvas):
534 543 self.program['u_eye'] = self.camera
535 544 self.program['u_up'] = self.up
536 545 #self.program['u_LightPos'] = [self.camera[0], self.camera[1], self.camera[2]]
537   - self.update()
  546 + self.refresh()
538 547  
539 548 #reverts the mouse state during release.
540 549 def on_mouse_release(self, event):
... ...
TubeWidget.py
... ... @@ -11,19 +11,20 @@ Created on Mon Aug 5 15:53:16 2019
11 11 methods necessary to use the QT signals and slots API.
12 12 """
13 13  
14   -from pyqtgraph.Qt import QtCore, QtGui, QtWidgets
  14 +#from pyqtgraph.Qt import QtCore, QtGui, QtWidgets
  15 +from PyQt5 import QtCore, QtGui, QtWidgets
15 16 from TubeCanvas import TubeDraw
16 17 import numpy as np
17 18 #import trimesh as tm
18 19  
19 20 DEBUG = False
20 21  
21   -class TubeWidget(QtGui.QWidget):
  22 +class TubeWidget(QtWidgets.QWidget):
22 23 sigUpdate = QtCore.pyqtSignal(float, float, float)
23 24 #Initializes the QT wrapper class.
24 25 def __init__(self):
25 26 super(TubeWidget, self).__init__()
26   - box = QtGui.QVBoxLayout(self)
  27 + box = QtWidgets.QVBoxLayout(self)
27 28 self.resize(500,500)
28 29 self.setLayout(box)
29 30 self.canvas = TubeDraw()
... ...
graph_shaders.py
... ... @@ -11,7 +11,7 @@ from vispy import gloo, app, scene
11 11 #shaders for drawing nodes
12 12  
13 13 vert = """
14   -#version 120
  14 +
15 15 // Uniforms
16 16 // ------------------------------------
17 17 uniform float u_size;
... ... @@ -58,7 +58,7 @@ void main (void) {
58 58 """
59 59  
60 60 frag = """
61   -#version 120
  61 +
62 62 // Constants
63 63 // ------------------------------------
64 64 uniform mat4 u_model;
... ... @@ -90,8 +90,9 @@ void main()
90 90 {
91 91 float size = v_size + 2*(v_linewidth + 1.5*v_antialias);
92 92 float t = v_linewidth/2.0-v_antialias;
93   - // The marker function needs to be linked with this shader
94   - float r = marker(gl_PointCoord, size);
  93 + vec2 p = (gl_PointCoord.xy - vec2(0.5,0.5))*size;
  94 + float r = length(p);
  95 + r -= v_size/2;
95 96 float d = abs(r) - t;
96 97 if( r > (v_linewidth/3.0+v_antialias))
97 98 {
... ... @@ -103,7 +104,7 @@ void main()
103 104 {
104 105 float alpha = d/v_antialias;
105 106 alpha = new_alpha(v_zoom_level);
106   - gl_FragColor = mix(vec4(1,1,1,0.9), v_bg_color, max(1.0-alpha, 0.3));
  107 + gl_FragColor = mix(vec4(1,1,1,0.9), v_bg_color, max(1.0-alpha, 0.3));
107 108 }
108 109 else
109 110 {
... ... @@ -132,7 +133,14 @@ void main()
132 133 else
133 134 gl_FragColor = vec4(gl_Color.rgb, max(1.0-alpha, 0.1));
134 135 else
135   - gl_FragColor = mix(v_bg_color, v_fg_color, alpha);
  136 + {
  137 + //gl_FragColor = mix(v_bg_color, v_fg_color, alpha); vec3 color = vec3(1.0, 0.0, 0.0);
  138 + vec3 normal = normalize(vec3(p.xy, d));
  139 + vec3 direction = normalize(vec3(1.0, 1.0, 5.0));
  140 + float diffuse = max(0.0, dot(direction, normal));
  141 + float specular = pow(diffuse, 24.0);
  142 + gl_FragColor = mix(vec4(max(diffuse*v_bg_color.rgb, specular*vec3(0.7)), 1.0), v_fg_color, alpha);
  143 + }
136 144 }
137 145  
138 146  
... ... @@ -177,7 +185,7 @@ float new_alpha(float zoom_level)
177 185  
178 186  
179 187 vs = """
180   -#version 120
  188 +
181 189  
182 190 // Uniforms
183 191 // ------------------------------------
... ... @@ -215,7 +223,7 @@ void main() {
215 223 """
216 224  
217 225 fs = """
218   -#version 120
  226 +
219 227 // Varying
220 228 // ------------------------------------
221 229 varying vec4 v_fg_color;
... ...
subgraph_shaders.py
... ... @@ -8,7 +8,6 @@ Created on Mon Aug 5 15:35:04 2019
8 8  
9 9 #shaders for drawing supernodes
10 10 vert_s = """
11   -#version 120
12 11 // Uniforms
13 12 // ------------------------------------
14 13 uniform mat4 u_model;
... ... @@ -50,7 +49,6 @@ void main (void) {
50 49 """
51 50  
52 51 frag_s = """
53   -#version 120
54 52 const float pi = 3.1415926535897932384626433832795;
55 53 // Varyings
56 54 // ------------------------------------
... ... @@ -99,6 +97,12 @@ void main()
99 97 if(dist < 0.25)
100 98 {
101 99 //gl_FragColor = v_cluster_color;
  100 +// vec2 p = (gl_FragCoord.xy - v_value);
  101 +// vec3 normal = normalize(vec3(p.xy, dist));
  102 +// vec3 direction = normalize(vec3(1.0, 1.0, 5.0));
  103 +// float diffuse = max(0.0, dot(direction, normal));
  104 +// float specular = pow(diffuse, 24.0);
  105 +// gl_FragColor = vec4(max(diffuse*v_cluster_color.rgb, specular*vec3(1.0)), 1.0);
102 106 gl_FragColor = vec4(v_cluster_color.rgb, n_alpha);
103 107 }
104 108 if(dist > 0.3 && 0.55 > dist)
... ... @@ -139,28 +143,6 @@ void main()
139 143 gl_FragColor = vec4(0.93, 0.949, 0.329, n_alpha);
140 144 //gl_FragColor = vec4(1.0, 1.0, 0.0, n_alpha);
141 145 }
142   - //else
143   - //{
144   - // discard;
145   - //}
146   -
147   -// if(angle > -pi && angle < -pi/4.0)
148   -// {
149   -// //gl_FragColor = vec4(0.32, 0.61, 0.93, n_alpha);
150   -// gl_FragColor = vec4(1.0, 0.0, 0.0, n_alpha);
151   -// }
152   -// else if(angle > -pi/4.0 && angle < 0.0)
153   -// {
154   -// gl_FragColor = vec4(0.0, 1.0, 0.0, n_alpha);
155   -// }
156   -// else if(angle > 0.0 && angle < pi/2.0)
157   -// {
158   -// gl_FragColor = vec4(0.0, 0.0, 1.0, n_alpha);
159   -// }
160   -// else if(angle > pi/2.0 && angle < pi)
161   -// {
162   -// gl_FragColor = vec4(1.0, 1.0, 0.0, n_alpha);
163   -// }
164 146 }
165 147 }
166 148 else
... ... @@ -200,7 +182,6 @@ float new_alpha(float zoom_level)
200 182 """
201 183  
202 184 vs_s = """
203   -#version 120
204 185  
205 186 // Uniforms
206 187 // ------------------------------------
... ... @@ -237,7 +218,7 @@ void main() {
237 218 """
238 219  
239 220 fs_s = """
240   -#version 120
  221 +
241 222 // Varying
242 223 // ------------------------------------
243 224 varying vec4 v_fg_color;
... ...