Exemplo n.º 1
0
 def create(self, o):
     context = self.context
     
     obj = createMeshObject(self.name)
     #obj.hide_select = True
     context.scene.prk.areaName = obj.name
     obj["t"] = self.type
     group = o["g"]
     # remember the group for the first vertex
     obj["last"] = group
     bm = getBmesh(obj)
     # create a deform layer to store vertex groups
     layer = bm.verts.layers.deform.new()
     vert = bm.verts.new(self.getLocation(o))
     
     assignGroupToVerts(obj, layer, group, vert)
     bm.to_mesh(obj.data)
     bm.free()
     
     # without scene.update() hook modifiers will not work correctly
     context.scene.update()
     # perform parenting
     self.parent_set(o.parent, obj)
     # one more update
     context.scene.update()
     
     addHookModifier(obj, group, o, group)
Exemplo n.º 2
0
    def create(self, controls, parent, profile):
        context = self.context

        profile, closed, clockwise = self.getProfileData(profile)

        obj = createMeshObject("extruded")
        obj["t"] = "extruded"

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

        numVerts = len(profile)
        numControls = len(controls)
        for i in range(numControls):
            c = controls[i]
            corner = Corner(c.location,
                            pVert=controls[i - 1].location,
                            nVert=controls[(i + 1) % numControls].location)
            group = c["g"]
            for p in profile:
                v = bm.verts.new(corner.inset(p[0], p[1]))
                assignGroupToVerts(obj, layer, group, v)

        # create faces
        bm.verts.ensure_lookup_table()
        for i in range(numControls):
            offset1 = (i - 1) * numVerts
            offset2 = offset1 + numVerts
            v1_1 = bm.verts[offset1]
            v2_1 = bm.verts[offset2]
            for p in range(1, numVerts):
                v1_2 = bm.verts[offset1 + p]
                v2_2 = bm.verts[offset2 + p]
                bm.faces.new((v2_2, v1_2, v1_1,
                              v2_1) if clockwise else (v2_2, v2_1, v1_1, v1_2))
                v1_1 = v1_2
                v2_1 = v2_2
            if closed:
                v1_2 = bm.verts[offset1]
                v2_2 = bm.verts[offset2]
                bm.faces.new((v2_2, v1_2, v1_1,
                              v2_1) if clockwise else (v2_2, v2_1, v1_1, v1_2))

        bm.to_mesh(obj.data)
        bm.free()

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

        # add hook modifiers
        for c in controls:
            group = c["g"]
            addHookModifier(obj, group, c, group)
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 create(self, controls, parent, profile):
     context = self.context
     
     profile, closed, clockwise = self.getProfileData(profile)
     
     obj = createMeshObject("extruded")
     obj["t"] = "extruded"
     
     bm = getBmesh(obj)
     # vertex groups are in the deform layer, create one before any operation with bmesh:
     layer = bm.verts.layers.deform.new()
     
     numVerts = len(profile)
     numControls = len(controls)
     for i in range(numControls):
         c = controls[i]
         corner = Corner(c.location, pVert = controls[i-1].location, nVert = controls[(i+1)%numControls].location)
         group = c["g"]
         for p in profile:
             v = bm.verts.new(corner.inset(p[0], p[1]))
             assignGroupToVerts(obj, layer, group, v)
     
     # create faces
     bm.verts.ensure_lookup_table()
     for i in range(numControls):
         offset1 = (i-1)*numVerts
         offset2 = offset1+numVerts
         v1_1 = bm.verts[offset1]
         v2_1 = bm.verts[offset2]
         for p in range(1, numVerts):
             v1_2 = bm.verts[offset1+p]
             v2_2 = bm.verts[offset2+p]
             bm.faces.new((v2_2, v1_2, v1_1, v2_1) if clockwise else (v2_2, v2_1, v1_1, v1_2))
             v1_1 = v1_2
             v2_1 = v2_2
         if closed:
             v1_2 = bm.verts[offset1]
             v2_2 = bm.verts[offset2]
             bm.faces.new((v2_2, v1_2, v1_1, v2_1) if clockwise else (v2_2, v2_1, v1_1, v1_2))
     
     bm.to_mesh(obj.data)
     bm.free()
     
     # without scene.update() hook modifiers will not work correctly
     context.scene.update()
     # perform parenting
     parent_set(parent, obj)
     # one more update
     context.scene.update()
     
     # add hook modifiers
     for c in controls:
         group = c["g"]
         addHookModifier(obj, group, c, group)
Exemplo n.º 5
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.º 6
0
 def makeFromEmpties(self, empties):
     context = self.context
     
     obj = createMeshObject(self.name)
     #obj.hide_select = True
     # type
     obj["t"] = self.type
     
     bm = getBmesh(obj)
     # create a deform layer to store vertex groups
     layer = bm.verts.layers.deform.new()
     
     for e in empties:
         vert = bm.verts.new(self.getLocation(e))
         assignGroupToVerts(obj, layer, e["g"], vert)
     
     # the face
     face = bm.faces.new(bm.verts)
     
     bm.to_mesh(obj.data)
     if obj.data.polygons[0].normal[2]<-zero:
         bmesh.ops.reverse_faces(bm, faces = (face,))
         bm.to_mesh(obj.data)
     bm.free()
     
     # without scene.update() hook modifiers will not work correctly
     context.scene.update()
     # perform parenting
     self.parent_set(empties[0].parent, obj)
     # one more update
     context.scene.update()
     
     # add HOOK modifiers
     for e in empties:
         group = e["g"]
         addHookModifier(obj, group, e, group)
     return obj
Exemplo n.º 7
0
 def extend(self, empty):
     context = self.context
     
     # get Blender object for the area
     obj = getAreaObject(self.context)
     bm = getBmesh(obj)
     bm.verts.ensure_lookup_table()
     _vert = bm.verts[-1]
     
     # find the Blender object for the empty that controls the last created area vertex
     prevEmpty = obj.modifiers[obj["last"]].object
     
     # If empty and prevEmpty belong to the same wall,
     # check if we need to create in-between verts for the area,
     # i.e. empty and prevEmpty aren't adjacent
     inbetweens = []
     if empty.parent == prevEmpty.parent and empty["m"] == prevEmpty["m"]:
         wall = getWallFromEmpty(context, self.op, empty)
         if not (wall.getNext(empty) == prevEmpty or wall.getPrevious(empty) == prevEmpty):
             # find Blender empty objects for <wall>, located between empty and prevEmpty
             empties = []
             # first searching in the forward direction
             e = prevEmpty
             while True:
                 e = wall.getNext(e)
                 if e == empty or not e:
                     break
                 empties.append(e)
             
             isClosed = wall.isClosed()
             if isClosed:
                 # keep list of empties
                 _empties = empties
             
             if not e or isClosed:
                 # now try in the backward direction
                 empties = []
                 e = prevEmpty
                 while True:
                     e = wall.getPrevious(e)
                     if e == empty:
                         break
                     empties.append(e)
             # for the closed wall check whick path is shorter, in the forward or backward directions
             if isClosed and len(empties) > len(_empties): 
                 empties = _empties
             # finally, create area verts for EMTPYs
             for e in empties:
                 group = e["g"]
                 vert = bm.verts.new(self.getLocation(e))
                 assignGroupToVerts(obj, bm.verts.layers.deform[0], group, vert)
                 _vert = vert
                 inbetweens.append((e, group))
             
     group = empty["g"]
     obj["last"] = group
     vert = bm.verts.new(self.getLocation(empty))
     assignGroupToVerts(obj, bm.verts.layers.deform[0], group, vert)
     
     bm.to_mesh(obj.data)
     bm.free()
     
     # without scene.update() hook modifiers will not work correctly
     # this step is probably optional here, however it's required in AreaBegin.execute()
     context.scene.update()
     if inbetweens:
         for e,g in inbetweens:
             addHookModifier(obj, g, e, g)
     addHookModifier(obj, group, empty, group)