Exemple #1
0
def make_calpha_arrow_mesh(trace, length=0.7, width=0.35, thickness=0.3):
    arrow = render.Arrow(length, width, thickness)

    n_point = len(trace.points)
    triangle_store = TriangleStore(n_point * len(arrow.indices))

    for i_point in range(n_point):

        orientate = arrow.get_orientate(trace.tangents[i_point],
                                        trace.ups[i_point], 1.0)

        for indices in group(arrow.indices, 3):

            points = [arrow.vertices[i] for i in indices]

            normal = v3.cross(points[1] - points[0], points[0] - points[2])
            normal = v3.transform(orientate, normal)

            for point in points:
                triangle_store.add_vertex(
                    v3.transform(orientate, point) + trace.points[i_point],
                    normal, trace.residues[i_point].color,
                    trace.objids[i_point])

    return triangle_store.vertex_buffer()
Exemple #2
0
def make_cylinder_trace_mesh(pieces, coil_detail=4, radius=0.3):
    cylinder = render.Cylinder(coil_detail)

    n_point = sum(len(piece.points) for piece in pieces)
    triangle_store = TriangleStore(2 * n_point * cylinder.n_vertex)

    for piece in pieces:
        points = piece.points

        for i_point in xrange(len(points) - 1):

            tangent = 0.5 * (points[i_point + 1] - points[i_point])

            up = piece.ups[i_point] + piece.ups[i_point + 1]

            orientate = cylinder.get_orientate(tangent, up, radius)
            triangle_store.setup_next_strip(cylinder.indices)
            for point, normal in zip(cylinder.points, cylinder.normals):
                triangle_store.add_vertex(
                    v3.transform(orientate, point) + points[i_point],
                    v3.transform(orientate, normal),
                    piece.residues[i_point].color, piece.objids[i_point])

            orientate = cylinder.get_orientate(-tangent, up, radius)
            triangle_store.setup_next_strip(cylinder.indices)
            for point, normal in zip(cylinder.points, cylinder.normals):
                triangle_store.add_vertex(
                    v3.transform(orientate, point) + points[i_point + 1],
                    v3.transform(orientate,
                                 normal), piece.residues[i_point + 1].color,
                    piece.objids[i_point + 1])

    return triangle_store.index_buffer(), triangle_store.vertex_buffer()
Exemple #3
0
def make_cylinder_trace_mesh(pieces, coil_detail=4, radius=0.3):
  cylinder = render.Cylinder(coil_detail)

  n_point = sum(len(piece.points) for piece in pieces)
  triangle_store = TriangleStore(2 * n_point * cylinder.n_vertex)

  for piece in pieces:
    points = piece.points

    for i_point in xrange(len(points) - 1):

      tangent = 0.5*(points[i_point+1] - points[i_point])

      up = piece.ups[i_point] + piece.ups[i_point+1]

      orientate = cylinder.get_orientate(tangent, up, radius)
      triangle_store.setup_next_strip(cylinder.indices)
      for point, normal in zip(cylinder.points, cylinder.normals):
        triangle_store.add_vertex(
            v3.transform(orientate, point) + points[i_point],
            v3.transform(orientate, normal), 
            piece.residues[i_point].color, 
            piece.objids[i_point])

      orientate = cylinder.get_orientate(-tangent, up, radius)
      triangle_store.setup_next_strip(cylinder.indices)
      for point, normal in zip(cylinder.points, cylinder.normals):
        triangle_store.add_vertex(
            v3.transform(orientate, point) + points[i_point+1],
            v3.transform(orientate, normal), 
            piece.residues[i_point+1].color, 
            piece.objids[i_point+1])

  return triangle_store.index_buffer(), triangle_store.vertex_buffer()
Exemple #4
0
def make_calpha_arrow_mesh(
    trace, length=0.7, width=0.35, thickness=0.3):
  arrow = render.Arrow(length, width, thickness)

  n_point = len(trace.points)
  triangle_store = TriangleStore(n_point*len(arrow.indices))

  for i_point in range(n_point):

    orientate = arrow.get_orientate(
        trace.tangents[i_point], trace.ups[i_point], 1.0)

    for indices in group(arrow.indices, 3):

      points = [arrow.vertices[i] for i in indices]

      normal = v3.cross(points[1] - points[0], points[0] - points[2])
      normal = v3.transform(orientate, normal)

      for point in points:
        triangle_store.add_vertex(
          v3.transform(orientate, point) + trace.points[i_point],
          normal, 
          trace.residues[i_point].color, 
          trace.objids[i_point])

  return triangle_store.vertex_buffer()
Exemple #5
0
def make_ball_and_stick_mesh(
    rendered_soup, sphere_stack=5, sphere_arc=5, 
    tube_arc=5, radius=0.2):

  sphere = render.Sphere(sphere_stack, sphere_arc)
  cylinder = render.Cylinder(4)

  n_vertex = len(rendered_soup.draw_to_screen_atoms)*sphere.n_vertex
  n_vertex += len(rendered_soup.bonds)*cylinder.n_vertex
  triangle_store = render.TriangleStore(n_vertex)

  for atom in rendered_soup.draw_to_screen_atoms:
    triangle_store.setup_next_strip(sphere.indices)
    orientate = sphere.get_orientate(radius)
    for point in sphere.points:
      triangle_store.add_vertex(
          v3.transform(orientate, point) + atom.pos,
          point, # same as normal!
          atom.residue.color, 
          atom.residue.objid)

  for bond in rendered_soup.bonds:
    orientate = cylinder.get_orientate(bond.tangent, bond.up, radius)
    triangle_store.setup_next_strip(cylinder.indices)
    for point, normal in zip(cylinder.points, cylinder.normals):
      triangle_store.add_vertex(
          v3.transform(orientate, point) + bond.atom1.pos,
          v3.transform(orientate, normal), 
          bond.atom1.residue.color, 
          bond.atom1.residue.objid)

  return triangle_store.index_buffer(), triangle_store.vertex_buffer()
def test_matrix_combination():
  n = 4
  x = v3.random_vector()
  y1 = v3.vector(x)
  matrix = v3.identity()
  for i in range(4):
    r_matrix = v3.random_matrix()
    y1 = v3.transform(r_matrix, y1)
    matrix = v3.combine(r_matrix, matrix)
  y2 = v3.transform(matrix, x)
  assert v3.is_similar_vector(y1, y2)
Exemple #7
0
def test_matrix_combination():
    n = 4
    x = v3.random_vector()
    y1 = v3.vector(x)
    matrix = v3.identity()
    for i in range(4):
        r_matrix = v3.random_matrix()
        y1 = v3.transform(r_matrix, y1)
        matrix = v3.combine(r_matrix, matrix)
    y2 = v3.transform(matrix, x)
    assert v3.is_similar_vector(y1, y2)
def test_orthogonality():
  x = v3.vector(v3.random_mag(), 0, 0)
  y = v3.vector(0, v3.random_mag(), 0)
  z = v3.vector(0, 0, v3.random_mag())
  ry_x = v3.transform(v3.rotation(y, v3.radians(90)), x)
  assert v3.is_similar_vector(v3.norm(ry_x), -v3.norm(z))
  assert v3.is_similar_mag(v3.mag(ry_x), v3.mag(x))
  ry_z = v3.transform(v3.rotation(y, v3.radians(90)), z)
  assert v3.is_similar_vector(v3.norm(ry_z), v3.norm(x))
  cross_x_y = v3.cross(x, y)
  assert v3.is_similar_vector(v3.norm(cross_x_y), v3.norm(z))
  cross_y_x = v3.cross(y, x)
  assert v3.is_similar_vector(v3.norm(cross_y_x), -v3.norm(z))
Exemple #9
0
def test_orthogonality():
    x = v3.vector(v3.random_mag(), 0, 0)
    y = v3.vector(0, v3.random_mag(), 0)
    z = v3.vector(0, 0, v3.random_mag())
    ry_x = v3.transform(v3.rotation(y, v3.radians(90)), x)
    assert v3.is_similar_vector(v3.norm(ry_x), -v3.norm(z))
    assert v3.is_similar_mag(v3.mag(ry_x), v3.mag(x))
    ry_z = v3.transform(v3.rotation(y, v3.radians(90)), z)
    assert v3.is_similar_vector(v3.norm(ry_z), v3.norm(x))
    cross_x_y = v3.cross(x, y)
    assert v3.is_similar_vector(v3.norm(cross_x_y), v3.norm(z))
    cross_y_x = v3.cross(y, x)
    assert v3.is_similar_vector(v3.norm(cross_y_x), -v3.norm(z))
Exemple #10
0
def make_ball_and_stick_mesh(rendered_soup,
                             sphere_stack=5,
                             sphere_arc=5,
                             tube_arc=5,
                             radius=0.2):

    sphere = render.Sphere(sphere_stack, sphere_arc)
    cylinder = render.Cylinder(4)

    n_vertex = len(rendered_soup.draw_to_screen_atoms) * sphere.n_vertex
    n_vertex += 2 * len(rendered_soup.bonds) * cylinder.n_vertex
    triangle_store = TriangleStore(n_vertex)

    for atom in rendered_soup.draw_to_screen_atoms:
        triangle_store.setup_next_strip(sphere.indices)
        orientate = sphere.get_orientate(radius)
        for point in sphere.points:
            triangle_store.add_vertex(
                v3.transform(orientate, point) + atom.pos,
                point,  # same as normal!
                atom.residue.color,
                atom.objid)

    for bond in rendered_soup.bonds:
        tangent = 0.5 * bond.tangent

        orientate = cylinder.get_orientate(tangent, bond.up, radius)
        triangle_store.setup_next_strip(cylinder.indices)
        for point, normal in zip(cylinder.points, cylinder.normals):
            triangle_store.add_vertex(
                v3.transform(orientate, point) + bond.atom1.pos,
                v3.transform(orientate, normal), bond.atom1.residue.color,
                bond.atom1.objid)

        orientate = cylinder.get_orientate(-tangent, bond.up, radius)
        triangle_store.setup_next_strip(cylinder.indices)
        for point, normal in zip(cylinder.points, cylinder.normals):
            triangle_store.add_vertex(
                v3.transform(orientate, point) + bond.atom2.pos,
                v3.transform(orientate, normal), bond.atom2.residue.color,
                bond.atom2.objid)

    return triangle_store.index_buffer(), triangle_store.vertex_buffer()
Exemple #11
0
 def __init__(self, n_arc=10, radius=1.0):
     self.n_arc = n_arc
     tangent = v3.vector(0, 0, 1)
     rotator = v3.vector(0, radius, 0)
     self.arcs = []
     angle = v3.radians(360 / n_arc)
     rotation = v3.rotation(tangent, angle)
     self.arcs.append(v3.vector(rotator))
     for i_segment in range(n_arc - 1):
         rotator = v3.transform(rotation, rotator)
         self.arcs.append(rotator)
     self.normals = calc_cyclic_normals(self.arcs, tangent)
Exemple #12
0
def test_rotation():
  x = v3.random_vector()
  y = v3.transform(v3.random_rotation(), x)
  assert v3.is_similar_mag(v3.mag(x), v3.mag(y))
Exemple #13
0
def test_translation():
  x = v3.vector(v3.random_mag(), 0, 0)
  y = v3.vector(0, v3.random_mag(), 0)
  x_and_y = v3.transform(v3.translation(y), x)
  assert v3.is_similar_vector(x_and_y, x+y)
Exemple #14
0
def test_rotation():
    x = v3.random_vector()
    y = v3.transform(v3.random_rotation(), x)
    assert v3.is_similar_mag(v3.mag(x), v3.mag(y))
Exemple #15
0
def test_translation():
    x = v3.vector(v3.random_mag(), 0, 0)
    y = v3.vector(0, v3.random_mag(), 0)
    x_and_y = v3.transform(v3.translation(y), x)
    assert v3.is_similar_vector(x_and_y, x + y)
Exemple #16
0
    def build_triangles(self, vertex_buffer):
        n_point = len(self.trace.points)
        n_arc = len(self.profile.arcs)

        # draw front face
        indices = []
        for i_arc in range((n_arc - 1) / 2):
            indices.extend([i_arc, i_arc + 1, n_arc - 1 - i_arc])
            indices.extend([n_arc - 1 - i_arc, i_arc + 1, n_arc - 2 - i_arc])
        vertex_buffer.setup_next_strip(indices)

        m = get_xy_face_transform(self.trace.tangents[0], self.trace.ups[0],
                                  1.0)
        arcs = [
            v3.transform(m, a) + self.trace.points[0]
            for a in self.profile.arcs
        ]
        normal = -self.trace.tangents[0]
        for i_arc in range(n_arc):
            vertex_buffer.add_vertex(arcs[i_arc], normal, self.color,
                                     self.trace.objids[0])

        # draw extrusion in tube
        indices = []
        for i_point in range(n_point - 1):
            i_slice_offset = i_point * n_arc
            j_slice_offset = (i_point + 1) * n_arc
            for i_arc in range(n_arc):
                j_arc = (i_arc + 1) % n_arc
                indices.append(i_slice_offset + i_arc)
                indices.append(j_slice_offset + i_arc)
                indices.append(i_slice_offset + j_arc)
                indices.append(i_slice_offset + j_arc)
                indices.append(j_slice_offset + i_arc)
                indices.append(j_slice_offset + j_arc)
        vertex_buffer.setup_next_strip(indices)

        for i in range(n_point):
            m = get_xy_face_transform(self.trace.tangents[i],
                                      self.trace.ups[i], 1.0)
            arcs = [
                v3.transform(m, a) + self.trace.points[i]
                for a in self.profile.arcs
            ]
            normals = [v3.transform(m, n) for n in self.profile.normals]
            for i_arc in range(n_arc):
                vertex_buffer.add_vertex(arcs[i_arc], normals[i_arc],
                                         self.color, self.trace.objids[i])

        # draw back face
        indices = []
        for i_arc in range((n_arc - 1) / 2):
            indices.extend([i_arc, i_arc + 1, n_arc - 1 - i_arc])
            indices.extend([n_arc - 1 - i_arc, i_arc + 1, n_arc - 2 - i_arc])
        vertex_buffer.setup_next_strip(indices)

        i_point = n_point - 1
        m = get_xy_face_transform(self.trace.tangents[i_point],
                                  self.trace.ups[i_point], 1.0)
        arcs = [
            v3.transform(m, a) + self.trace.points[i_point]
            for a in self.profile.arcs
        ]
        normal = self.trace.tangents[i_point]
        for i_arc in reversed(range(n_arc)):
            vertex_buffer.add_vertex(arcs[i_arc], normal, self.color,
                                     self.trace.objids[i_point])