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)
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)
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)
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)
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)
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
def make(self, t, **kwargs): verts = t.bm.verts context = self.context hooksForNodes = kwargs["hooksForNodes"] # template Blender object _o = t.o # Create a Blender EMPTY object to serve as a parent for the window mesh; # its name doesn't have <T_> prefix name = _o.name[2:] # <pt> stands for parent template pt = t.parentTemplate if pt: p = createEmptyObject(name, _o.location-pt.o.location, False, empty_draw_size=0.01) else: # parent for the whole hierarchy of window Blender objects p = t.p t.meshParent = p # start a Blender object for the template o = createMeshObject(name + "_mesh") t.meshObject = o context.scene.update() # perform parenting parent_set(p, o) if t.parentTemplate: parent_set(pt.meshParent, p) context.scene.update() context.scene.objects.active = o t.prepareOffsets() # iterate through the vertices of the template Blender object numVerts = 0 for v in verts: # id of the vertex vid = t.getVid(v) if not (vid in _o and _o[vid] in bpy.data.objects): continue # Blender object for the node at the vertex j = bpy.data.objects[_o[vid]] t.setNode(v, j, o, context, hooksForNodes = hooksForNodes) numVerts += 1 # final operations: bridging or extruding edges loops of the nodes, making surfaces bm = getBmesh(o) t.bridgeOrExtendNodes(o, bm, kwargs["dissolveEndEdges"]) if numVerts == len(verts): t.makeSurfaces(o, bm) setBmesh(o, bm) # remove unneeded vertex group groups = [g for g in o.vertex_groups if g.name[0] in ("e", "s", "c")] for g in groups: o.vertex_groups.remove(g) # add Edge Split modifier if kwargs["addEdgeSplitModifier"]: addEdgeSplitModifier(o, o.name) # set maximum possible range for the shape keys if hooksForNodes and o.data.shape_keys: for kb in o.data.shape_keys.key_blocks: kb.slider_min = -10. kb.slider_max = 10. t.insertAssets(context) # hide the template Blender object and all its children hide(t.o, True)
def make(self, t, **kwargs): verts = t.bm.verts context = self.context hooksForNodes = kwargs["hooksForNodes"] # template Blender object _o = t.o # Create a Blender EMPTY object to serve as a parent for the window mesh; # its name doesn't have <T_> prefix name = _o.name[2:] # <pt> stands for parent template pt = t.parentTemplate if pt: p = createEmptyObject(name, _o.location - pt.o.location, False, empty_draw_size=0.01) else: # parent for the whole hierarchy of window Blender objects p = t.p t.meshParent = p # start a Blender object for the template o = createMeshObject(name + "_mesh") t.meshObject = o context.scene.update() # perform parenting parent_set(p, o) if t.parentTemplate: parent_set(pt.meshParent, p) context.scene.update() context.scene.objects.active = o t.prepareOffsets() # iterate through the vertices of the template Blender object numVerts = 0 for v in verts: # id of the vertex vid = t.getVid(v) if not (vid in _o and _o[vid] in bpy.data.objects): continue # Blender object for the node at the vertex j = bpy.data.objects[_o[vid]] t.setNode(v, j, o, context, hooksForNodes=hooksForNodes) numVerts += 1 # final operations: bridging or extruding edges loops of the nodes, making surfaces bm = getBmesh(o) t.bridgeOrExtendNodes(o, bm, kwargs["dissolveEndEdges"]) if numVerts == len(verts): t.makeSurfaces(o, bm) setBmesh(o, bm) # remove unneeded vertex group groups = [g for g in o.vertex_groups if g.name[0] in ("e", "s", "c")] for g in groups: o.vertex_groups.remove(g) # add Edge Split modifier if kwargs["addEdgeSplitModifier"]: addEdgeSplitModifier(o, o.name) # set maximum possible range for the shape keys if hooksForNodes and o.data.shape_keys: for kb in o.data.shape_keys.key_blocks: kb.slider_min = -10. kb.slider_max = 10. t.insertAssets(context) # hide the template Blender object and all its children hide(t.o, True)
def createEnvelope(self): terrain = self.terrain name = "%s_envelope" % terrain.name if name in bpy.data.objects: # use existing Blender object envelope = bpy.data.objects[name] # delete modifiers for m in reversed(envelope.modifiers): envelope.modifiers.remove(m) else: # create new envelope for the terrain envelope = createMeshObject(name, (0., 0., self.minZ), terrain.data.copy()) # flatten the terrain envelope envelope.scale[2] = 0. envelope.select = True bpy.context.scene.objects.active = envelope bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.select_all(action='DESELECT') bpy.ops.mesh.select_mode(type='FACE') bpy.ops.object.mode_set(mode='OBJECT') for p in envelope.data.polygons: if p.normal[2] < 0.: p.select = True bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.delete(type='FACE') bpy.ops.mesh.select_mode(type='VERT') bpy.ops.mesh.select_all(action='SELECT') bpy.ops.mesh.remove_doubles() bpy.ops.mesh.region_to_loop() bpy.ops.mesh.select_all(action='INVERT') bpy.ops.mesh.dissolve_verts(use_face_split=False, use_boundary_tear=False) bpy.ops.mesh.select_all(action='SELECT') #bpy.ops.mesh.dissolve_limited(angle_limit=math.radians(0.1)) bpy.ops.object.mode_set(mode='OBJECT') bm = getBmesh(envelope) for f in bm.faces: f.smooth = False # ensure all normals point upward pointNormalUpward(f) # inset faces to avoid weird results of the BOOLEAN modifier insetFaces = bmesh.ops.inset_region(bm, faces=bm.faces, use_boundary=True, use_even_offset=True, use_interpolate=True, use_relative_offset=False, use_edge_rail=False, use_outset=False, thickness=self.envelopeInset, depth=0.)['faces'] bmesh.ops.delete(bm, geom=insetFaces, context=5) setBmesh(envelope, bm) self.envelope = envelope envelope.select = False envelope.hide_render = True # hide <envelope> after all Blender operator envelope.hide = True # SOLIDIFY modifier instead of BMesh extrude operator m = envelope.modifiers.new(name="Solidify", type='SOLIDIFY') m.offset = 1. m.thickness = self.maxZ - self.minZ + self.envelopeOffset