Package pyffi :: Package utils :: Module trianglestripifier :: Class TriangleStrip
[hide private]
[frames] | no frames]

Class TriangleStrip

source code

object --+
         |
        TriangleStrip

A heavily specialized oriented strip of faces.

Heavily adapted from NvTriStrip and RuneBlade. Originals can be found at http://developer.nvidia.com/view.asp?IO=nvtristrip_library and http://techgame.net/projects/Runeblade/browser/trunk/RBRapier/RBRapier/Tools/Geometry/Analysis/TriangleStripifier.py?rev=760

Instance Methods [hide private]
 
__init__(self, stripped_faces=None, faces=None, vertices=None, reversed_=False)
Initialise the triangle strip.
source code
 
__repr__(self)
repr(x)
source code
 
get_unstripped_adjacent_face(self, face, vi)
Get adjacent face which is not yet stripped.
source code
 
traverse_faces(self, start_vertex, start_face, forward)
Builds a strip traveral of faces starting from the start_face and the edge opposite start_vertex.
source code
 
build(self, start_vertex, start_face)
Builds the face strip forwards, then backwards.
source code
 
get_strip(self)
Get strip in forward winding.
source code

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __setattr__, __sizeof__, __str__, __subclasshook__

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, stripped_faces=None, faces=None, vertices=None, reversed_=False)
(Constructor)

source code 
Initialise the triangle strip.
Overrides: object.__init__

__repr__(self)
(Representation operator)

source code 
repr(x)
Overrides: object.__repr__
(inherited documentation)

traverse_faces(self, start_vertex, start_face, forward)

source code 
Builds a strip traveral of faces starting from the start_face and the edge opposite start_vertex. Returns number of faces added.

build(self, start_vertex, start_face)

source code 

Builds the face strip forwards, then backwards. Returns index of start_face.

Check case of single triangle

>>> m = Mesh()
>>> face = m.add_face(0, 1, 2)
>>> m.lock()
>>> t = TriangleStrip()
>>> t.build(0, face)
0
>>> t
TriangleStrip(stripped_faces=set([0]), faces=[Face(0, 1, 2)], vertices=[0, 1, 2], reversed_=False)
>>> t.get_strip()
[0, 1, 2]
>>> t = TriangleStrip()
>>> t.build(1, face)
0
>>> t
TriangleStrip(stripped_faces=set([0]), faces=[Face(0, 1, 2)], vertices=[1, 2, 0], reversed_=False)
>>> t.get_strip()
[1, 2, 0]
>>> t = TriangleStrip()
>>> t.build(2, face)
0
>>> t
TriangleStrip(stripped_faces=set([0]), faces=[Face(0, 1, 2)], vertices=[2, 0, 1], reversed_=False)
>>> t.get_strip()
[2, 0, 1]

Check case of two triangles, with special strip winding fix

>>> m = Mesh()
>>> face0 = m.add_face(0, 1, 2)
>>> face1 = m.add_face(2, 1, 3)
>>> m.lock()
>>> t = TriangleStrip()
>>> t.build(0, face0)
0
>>> t
TriangleStrip(stripped_faces=set([0, 1]), faces=[Face(0, 1, 2), Face(1, 3, 2)], vertices=[0, 1, 2, 3], reversed_=False)
>>> t.get_strip()
[0, 1, 2, 3]
>>> t = TriangleStrip()
>>> t.build(1, face0)
1
>>> t
TriangleStrip(stripped_faces=set([0, 1]), faces=[Face(1, 3, 2), Face(0, 1, 2)], vertices=[3, 1, 2, 0], reversed_=True)
>>> t.get_strip()
[3, 2, 1, 0]
>>> t = TriangleStrip()
>>> t.build(2, face1)
1
>>> t
TriangleStrip(stripped_faces=set([0, 1]), faces=[Face(0, 1, 2), Face(1, 3, 2)], vertices=[0, 2, 1, 3], reversed_=True)
>>> t.get_strip()
[0, 1, 2, 3]
>>> t = TriangleStrip()
>>> t.build(3, face1)
0
>>> t
TriangleStrip(stripped_faces=set([0, 1]), faces=[Face(1, 3, 2), Face(0, 1, 2)], vertices=[3, 2, 1, 0], reversed_=False)
>>> t.get_strip()
[3, 2, 1, 0]

Check that extra vertex is appended to fix winding

>>> m = Mesh()
>>> face0 = m.add_face(1, 3, 2)
>>> face1 = m.add_face(2, 3, 4)
>>> face2 = m.add_face(4, 3, 5)
>>> face3 = m.add_face(4, 5, 6)
>>> m.lock()
>>> t = TriangleStrip()
>>> t.build(2, face1)
1
>>> t
TriangleStrip(stripped_faces=set([0, 1, 2, 3]), faces=[Face(1, 3, 2), Face(2, 3, 4), Face(3, 5, 4), Face(4, 5, 6)], vertices=[1, 2, 3, 4, 5, 6], reversed_=True)
>>> t.get_strip()
[1, 1, 2, 3, 4, 5, 6]

Check that strip is reversed to fix winding

>>> m = Mesh()
>>> face0 = m.add_face(1, 3, 2)
>>> face1 = m.add_face(2, 3, 4)
>>> face2 = m.add_face(4, 3, 5)
>>> m.lock()
>>> t = TriangleStrip()
>>> t.build(2, face1)
1
>>> t
TriangleStrip(stripped_faces=set([0, 1, 2]), faces=[Face(1, 3, 2), Face(2, 3, 4), Face(3, 5, 4)], vertices=[1, 2, 3, 4, 5], reversed_=True)
>>> t.get_strip()
[5, 4, 3, 2, 1]

More complicated mesh

>>> m = Mesh()
>>> face0 = m.add_face(0, 1, 2)
>>> face1 = m.add_face(2, 1, 7)
>>> face2 = m.add_face(2, 7, 4)
>>> face3 = m.add_face(5, 3, 2)
>>> face4 = m.add_face(2, 1, 9)
>>> face5 = m.add_face(4, 7, 10)
>>> face6 = m.add_face(4, 10, 11)
>>> face7 = m.add_face(11, 10, 12)
>>> face8 = m.add_face(1, 0, 13)
>>> m.lock()
>>> t = TriangleStrip()
>>> t.build(7, face1)
4
>>> t.faces[4] == face1 # check result from build
True
>>> t.stripped_faces
set([0, 1, 2, 5, 6, 7, 8])
>>> t.faces
[Face(10, 12, 11), Face(4, 10, 11), Face(4, 7, 10), Face(2, 7, 4), Face(1, 7, 2), Face(0, 1, 2), Face(0, 13, 1)]
>>> t.vertices
[12, 11, 10, 4, 7, 2, 1, 0, 13]
>>> t.reversed_
False
>>> t.get_strip()
[12, 11, 10, 4, 7, 2, 1, 0, 13]

Mesh which has more than a single strip

>>> m = Mesh()
>>> tmp = m.add_face(2, 1, 7) # in strip
>>> start_face = m.add_face(0, 1, 2) # in strip
>>> tmp = m.add_face(2, 7, 4) # in strip
>>> tmp = m.add_face(4, 7, 11) # in strip
>>> tmp = m.add_face(5, 3, 2)
>>> tmp = m.add_face(1, 0, 8) # in strip
>>> tmp = m.add_face(0, 8, 9) # bad orientation!
>>> tmp = m.add_face(8, 0, 10) # in strip
>>> m.lock()
>>> t = TriangleStrip()
>>> t.build(0, start_face)
2
>>> t.vertices
[10, 8, 0, 1, 2, 7, 4, 11]
>>> t.get_strip()
[10, 8, 0, 1, 2, 7, 4, 11]