def shade(self, stroke): # save the location and attribute of stroke vertices buffer = tuple( (Vector(sv.point), StrokeAttribute(sv.attribute)) for sv in stroke) nverts = len(buffer) if nverts < 2: return # calculate the number of additional vertices to form caps caplen_beg = sum(stroke[0].attribute.thickness) / 2.0 nverts_beg = 1 caplen_end = sum(stroke[-1].attribute.thickness) / 2.0 nverts_end = 1 # adjust the total number of stroke vertices stroke.resample(nverts + nverts_beg + nverts_end) # restore the location and attribute of the original vertices for i, (p, attr) in zip(range(nverts), buffer): stroke[nverts_beg + i].point = p stroke[nverts_beg + i].attribute = attr # reshape the cap at the beginning of the stroke q, attr = buffer[1] p, attr = buffer[0] stroke[0].point += (p - q).normalized() * caplen_beg stroke[0].attribute = attr # reshape the cap at the end of the stroke q, attr = buffer[-2] p, attr = buffer[-1] stroke[-1].point += (p - q).normalized() * caplen_end stroke[-1].attribute = attr # update the curvilinear 2D length of each vertex stroke.update_length()
def shade(self, stroke): originalSize = stroke.stroke_vertices_size() if originalSize < 4: return verticesToRemove = [] oldAttributes = [] it = stroke.stroke_vertices_begin() while not it.is_end: v = it.object if v.curvilinear_abscissa < self._l or v.stroke_length - v.curvilinear_abscissa < self._l: verticesToRemove.append(v) oldAttributes.append(StrokeAttribute(v.attribute)) it.increment() if originalSize - len(verticesToRemove) < 2: return for sv in verticesToRemove: stroke.remove_vertex(sv) stroke.update_length() stroke.resample(originalSize) if stroke.stroke_vertices_size() != originalSize: print("pyTipRemover: Warning: resampling problem") it = stroke.stroke_vertices_begin() for a in oldAttributes: if it.is_end: break it.object.attribute = a it.increment() stroke.update_length()
def shade(self, stroke): # save the location and attribute of stroke vertices buffer = tuple( (Vector(sv.point), StrokeAttribute(sv.attribute)) for sv in stroke) nverts = len(buffer) if nverts < 2: return # calculate the number of additional vertices to form caps thickness_beg = sum(stroke[0].attribute.thickness) caplen_beg = thickness_beg / 2.0 nverts_beg = max(5, int(thickness_beg)) thickness_end = sum(stroke[-1].attribute.thickness) caplen_end = (thickness_end) / 2.0 nverts_end = max(5, int(thickness_end)) # adjust the total number of stroke vertices stroke.resample(nverts + nverts_beg + nverts_end) # restore the location and attribute of the original vertices for i, (p, attr) in enumerate(buffer): stroke[nverts_beg + i].point = p stroke[nverts_beg + i].attribute = attr # reshape the cap at the beginning of the stroke q, attr = buffer[1] p, attr = buffer[0] direction = (p - q).normalized() * caplen_beg n = 1.0 / nverts_beg R, L = attr.thickness for t, svert in zip(range(nverts_beg, 0, -1), stroke): r = self.round_cap_thickness((t + 1) * n) svert.point = p + direction * t * n svert.attribute = attr svert.attribute.thickness = (R * r, L * r) # reshape the cap at the end of the stroke q, attr = buffer[-2] p, attr = buffer[-1] direction = (p - q).normalized() * caplen_beg n = 1.0 / nverts_end R, L = attr.thickness for t, svert in zip(range(nverts_end, 0, -1), reversed(stroke)): r = self.round_cap_thickness((t + 1) * n) svert.point = p + direction * t * n svert.attribute = attr svert.attribute.thickness = (R * r, L * r) # update the curvilinear 2D length of each vertex stroke.update_length()
def shade(self, stroke): n = len(stroke) if n < 4: return verticesToRemove = tuple(svert for svert in stroke if self.check_vertex(svert, self._l)) # explicit conversion to StrokeAttribute is needed oldAttributes = (StrokeAttribute(svert.attribute) for svert in stroke) if n - len(verticesToRemove) < 2: return for sv in verticesToRemove: stroke.remove_vertex(sv) stroke.update_length() stroke.resample(n) if len(stroke) != n and bpy.app.debug_freestyle: print("pyTipRemover: Warning: resampling problem") for svert, a in zip(stroke, oldAttributes): svert.attribute = a stroke.update_length()