Exemplo 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)
Exemplo n.º 2
0
    def createFromArea(self, area):
        context = self.context
        controls = area.getControls()

        obj = createMeshObject(area.obj.name + "_finish")
        obj["t"] = self.type
        self.obj = obj

        bm = getBmesh(obj)
        # vertex groups are in the deform layer, create one before any operation with bmesh:
        layer = bm.verts.layers.deform.new()

        # a vector along z-axis with the length equal to the wall height
        height = getLevelHeight(context, area.obj) * zAxis
        numControls = len(controls)
        for c in controls:
            group = c["g"]
            # the vert at the bottom
            v_b = bm.verts.new(c.location)
            # the vert at the top
            v_t = bm.verts.new(c.location + height)
            assignGroupToVerts(obj, layer, group, v_b, v_t)
            # assign vertex group for the top vertex
            assignGroupToVerts(obj, layer, "t", v_t)

        # create faces
        bm.verts.ensure_lookup_table()
        v1_b = bm.verts[-2]
        v1_t = bm.verts[-1]
        for i in range(numControls):
            # <2> is the number of vertices (of the just created wall surface) per control point
            v2_b = bm.verts[i * 2]
            v2_t = bm.verts[i * 2 + 1]
            bm.faces.new((v1_b, v1_t, v2_t, v2_b))
            v1_b = v2_b
            v1_t = v2_t
        setBmesh(obj, bm)

        # without scene.update() hook modifiers will not work correctly
        context.scene.update()
        # perform parenting
        parent_set(area.obj.parent, obj)
        # one more update
        context.scene.update()

        # add HOOK modifiers
        for c in controls:
            group = c["g"]
            addHookModifier(obj, group, c, group)
        # add a HOOK modifier controlling the top vertices
        addHookModifier(obj, "t", getNextLevelParent(context, obj), "t")
        # add a SOLIDIFY modifier
        addSolidifyModifier(obj, "solidify", thickness=0.001, offset=1.)
        self.treatInsertions(controls)
Exemplo n.º 3
0
 def createFromArea(self, area):
     context = self.context
     controls = area.getControls()
     
     obj = createMeshObject(area.obj.name+"_finish")
     obj["t"] = self.type
     self.obj = obj
     
     bm = getBmesh(obj)
     # vertex groups are in the deform layer, create one before any operation with bmesh:
     layer = bm.verts.layers.deform.new()
     
     # a vector along z-axis with the length equal to the wall height
     height = getLevelHeight(context, area.obj)*zAxis
     numControls = len(controls)
     for c in controls:
         group = c["g"]
         # the vert at the bottom
         v_b = bm.verts.new(c.location)
         # the vert at the top
         v_t = bm.verts.new(c.location+height)
         assignGroupToVerts(obj, layer, group, v_b, v_t)
         # assign vertex group for the top vertex
         assignGroupToVerts(obj, layer, "t", v_t)
     
     # create faces
     bm.verts.ensure_lookup_table()
     v1_b = bm.verts[-2]
     v1_t = bm.verts[-1]
     for i in range(numControls):
         # <2> is the number of vertices (of the just created wall surface) per control point
         v2_b = bm.verts[i*2]
         v2_t = bm.verts[i*2+1]
         bm.faces.new((v1_b, v1_t, v2_t, v2_b))
         v1_b = v2_b
         v1_t = v2_t
     setBmesh(obj, bm)
     
     # without scene.update() hook modifiers will not work correctly
     context.scene.update()
     # perform parenting
     parent_set(area.obj.parent, obj)
     # one more update
     context.scene.update()
     
     # add HOOK modifiers
     for c in controls:
         group = c["g"]
         addHookModifier(obj, group, c, group)
     # add a HOOK modifier controlling the top vertices
     addHookModifier(obj, "t", getNextLevelParent(context, obj), "t")
     # add a SOLIDIFY modifier
     addSolidifyModifier(obj, "solidify", thickness=0.001, offset=1.)
     self.treatInsertions(controls)
Exemplo n.º 4
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)