Esempio n. 1
0
 def assignUv(self, uvMap=None):
     if not uvMap:
         uvMap = defaultUvMap
     o = self.obj
     # create a new UV map if necessary
     if not uvMap in o:
         o.data.uv_textures.new(uvMap)
     
     bm = getBmesh(o)
     # the inital loop
     _loop = self.getInitialLoop(bm)
     # find the open end if the finish sequence isn't a closed sequence
     loop = _loop
     vert = loop.vert
     while True:
         if len(vert.link_loops) == 1:
             # found the open end
             _loop = loop
             break
         loop = (vert.link_loops[1] if vert.link_loops[0] == loop else vert.link_loops[0]).link_loop_prev
         vert = loop.vert
         if loop == _loop:
             break
     
     # finally, assign UV coordinates
     layer = bm.loops.layers.uv[uvMap]
     # the layer for vertex groups
     groupLayer = bm.verts.layers.deform[0]
     h = getLevelHeight(self.context, o)
     offsetU = 0.
     loop = _loop
     vert = loop.vert
     e1 = getControlEmptyFromLoop(loop, groupLayer, o)
     while True:
         # remember the base loop
         _vert = vert
         # remember, we are dealing with rectangles
         # left bottom
         loop[layer].uv = (offsetU, 0.)
         # left top
         loop.link_loop_prev[layer].uv = (offsetU, h)
         # right bottom
         loop = loop.link_loop_next
         e2 = getControlEmptyFromLoop(loop, groupLayer, o)
         offsetU += (e2.location - e1.location).length
         loop[layer].uv = (offsetU, 0.)
         # right top
         loop.link_loop_next[layer].uv = (offsetU, h)
         
         # the step below isn't necessary, we already came to the required loop
         #loop = loop.link_loop_next
         vert = loop.vert
         if len(vert.link_loops) == 1:
             # reached the opposite end (end if the finish sequence isn't a closed sequence)
             break
         loop = vert.link_loops[1] if vert.link_loops[0] == loop else vert.link_loops[0]
         if loop == _loop:
             break
         e1 = e2
     setBmesh(o, bm)
Esempio n. 2
0
 def getControls(self):
     """
     Returns an ordered list of EMPTYs controlling the vertices of the area
     """
     bm = getBmesh(self.obj)
     bm.verts.ensure_lookup_table()
     # All vertex groups are in the deform layer.
     # There can be only one deform layer
     layer = bm.verts.layers.deform[0]
     # building a list of control EMPTYs
     controls = []
     start = bm.verts[0].link_loops[0]
     loop = start
     while True:
         controls.append( getControlEmptyFromLoop(loop, layer, self.obj) )
         loop = loop.link_loop_next
         if loop == start:
             break
     bm.free()
     return controls
Esempio n. 3
0
    def assignUv(self, uvMap=None):
        if not uvMap:
            uvMap = defaultUvMap
        o = self.obj
        # create a new UV map if necessary
        if not uvMap in o:
            o.data.uv_textures.new(uvMap)

        bm = getBmesh(o)
        # the inital loop
        _loop = self.getInitialLoop(bm)
        # find the open end if the finish sequence isn't a closed sequence
        loop = _loop
        vert = loop.vert
        while True:
            if len(vert.link_loops) == 1:
                # found the open end
                _loop = loop
                break
            loop = (vert.link_loops[1] if vert.link_loops[0] == loop else
                    vert.link_loops[0]).link_loop_prev
            vert = loop.vert
            if loop == _loop:
                break

        # finally, assign UV coordinates
        layer = bm.loops.layers.uv[uvMap]
        # the layer for vertex groups
        groupLayer = bm.verts.layers.deform[0]
        h = getLevelHeight(self.context, o)
        offsetU = 0.
        loop = _loop
        vert = loop.vert
        e1 = getControlEmptyFromLoop(loop, groupLayer, o)
        while True:
            # remember the base loop
            _vert = vert
            # remember, we are dealing with rectangles
            # left bottom
            loop[layer].uv = (offsetU, 0.)
            # left top
            loop.link_loop_prev[layer].uv = (offsetU, h)
            # right bottom
            loop = loop.link_loop_next
            e2 = getControlEmptyFromLoop(loop, groupLayer, o)
            offsetU += (e2.location - e1.location).length
            loop[layer].uv = (offsetU, 0.)
            # right top
            loop.link_loop_next[layer].uv = (offsetU, h)

            # the step below isn't necessary, we already came to the required loop
            #loop = loop.link_loop_next
            vert = loop.vert
            if len(vert.link_loops) == 1:
                # reached the opposite end (end if the finish sequence isn't a closed sequence)
                break
            loop = vert.link_loops[1] if vert.link_loops[
                0] == loop else vert.link_loops[0]
            if loop == _loop:
                break
            e1 = e2
        setBmesh(o, bm)