68 lines
1.6 KiB
Python
68 lines
1.6 KiB
Python
from OpenGL.GL import *
|
|
from OpenGL.GL.ARB.vertex_buffer_object import *
|
|
from pymol.callback import Callback
|
|
from pymol import cmd
|
|
|
|
# this is an example of creating a callback object which
|
|
# uses GL arrays. Requires Numeric Python:
|
|
|
|
# NOTE: NUMERIC NOT SUPPORTED BY PYMOL 1.1 and up
|
|
|
|
from numpy import *
|
|
|
|
# define a callback object
|
|
|
|
class myCallback(Callback):
|
|
|
|
def __init__(self):
|
|
self.vert = zeros([126,3],float)
|
|
self.norm = zeros([126,3],float)
|
|
|
|
for a in range(0,63):
|
|
x = a/10.0
|
|
self.vert[2*a][0]=x
|
|
self.vert[2*a][1]=math.sin(x)
|
|
self.vert[2*a][2]=0.0
|
|
|
|
self.vert[2*a+1][0]=self.vert[2*a][0]
|
|
self.vert[2*a+1][1]=self.vert[2*a][1]
|
|
self.vert[2*a+1][2]=1.0
|
|
|
|
dydx = -math.cos(x)*sqrt(2)/2.0# is this right? I can't remember...
|
|
self.norm[2*a][0]=dydx
|
|
self.norm[2*a][1]=math.sqrt(1.0-dydx*dydx)
|
|
self.norm[2*a][2]=0.0
|
|
|
|
self.norm[2*a+1][0]=self.norm[2*a][0]
|
|
self.norm[2*a+1][1]=self.norm[2*a][1]
|
|
self.norm[2*a+1][2]=self.norm[2*a][2]
|
|
|
|
def __call__(self):
|
|
glColor3f(1.0,1.0,1.0)
|
|
glVertexPointer(3, GL_FLOAT,0,self.vert)
|
|
glNormalPointer(GL_FLOAT,0,self.norm)
|
|
|
|
glEnableClientState(GL_VERTEX_ARRAY)
|
|
glEnableClientState(GL_NORMAL_ARRAY)
|
|
glDisableClientState(GL_COLOR_ARRAY)
|
|
glDrawArrays(GL_TRIANGLE_STRIP,0,126)
|
|
|
|
def get_extent(self):
|
|
return [[0.0,0.0,-1.0],
|
|
[6.3,1.0,1.0]]
|
|
|
|
|
|
# load it into PyMOL
|
|
|
|
cmd.load_callback(myCallback(),'gl02')
|
|
|
|
|
|
# give us a nice view
|
|
|
|
cmd.turn('z',20)
|
|
cmd.turn('y',20)
|
|
cmd.turn('x',20)
|
|
|
|
|
|
|