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)
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 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 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)