BPyMesh_redux: Fixed a rare bug in mesh redux's, collapsed location.

BPyMesh_redux:  made redux support non UV Meshes.
vertexpaint_selfshadow_ao:  turned vertex selfshadow scale into radius.
This commit is contained in:
Campbell Barton 2006-05-13 05:24:58 +00:00
parent 50a1d9fc8b
commit 2bcf11defb
2 changed files with 30 additions and 23 deletions

@ -4,9 +4,11 @@ Ang= Blender.Mathutils.AngleBetweenVecs
LineIntersect= Blender.Mathutils.LineIntersect LineIntersect= Blender.Mathutils.LineIntersect
import BPyMesh import BPyMesh
try:
#import psyco import psyco
#psyco.full() psyco.full()
except:
pass
def uv_key(uv): def uv_key(uv):
return round(uv.x, 5), round(uv.y, 5) return round(uv.x, 5), round(uv.y, 5)
@ -42,7 +44,6 @@ def redux(ob, factor=0.5):
# Select all verts, de-select as you collapse. # Select all verts, de-select as you collapse.
for v in me.verts: for v in me.verts:
v.sel=0 v.sel=0
# Store new locations for collapsed edges here # Store new locations for collapsed edges here
edge_new_locations= [None] * len(me.edges) edge_new_locations= [None] * len(me.edges)
@ -249,21 +250,23 @@ def redux(ob, factor=0.5):
ed_between= (ed_user.v1.co+ed_user.v2.co) * 0.5 ed_between= (ed_user.v1.co+ed_user.v2.co) * 0.5
v1_scale= ed_between + ((ed_user.v1.co-ed_between) * 100) v1_scale= ed_between + ((ed_user.v1.co-ed_between) * 100)
v2_scale= ed_between + ((ed_user.v2.co-ed_between) * 100) v2_scale= ed_between + ((ed_user.v2.co-ed_between) * 100)
line1x, line2x= LineIntersect(between-nor, between+nor, v1_scale, v2_scale) line_xs= LineIntersect(between-nor, between+nor, v1_scale, v2_scale)
if line_xs: # did we intersect? - None if we didnt
new_location_count += 1
new_location+= line_xs[0]
new_location_count += 1 # Failed to generate a new location or x!=X (NAN)
new_location+= line1x # or, out new location is crazy and further away from the edge center then the edge length.
if not new_location_count or\
if not new_location_count: new_location.x!=new_location.x or\
(new_location-between).length > (length/2):
new_location= between new_location= between
else: else:
new_location= new_location * (1.0/new_location_count) new_location= new_location * (1.0/new_location_count)
new_location = (new_location + between) * 0.5 new_location = (new_location + between) * 0.5
if new_location.x!=new_location.x:
# NAN
new_location= between
# NEW NEW LOCATUON # NEW NEW LOCATUON
# print 'loop', len(me.faces)
# Store the collapse location to apply later # Store the collapse location to apply later
edge_new_locations[i] = new_location edge_new_locations[i] = new_location

@ -43,7 +43,7 @@ import BPyMesh
# reload(BPyMesh) # reload(BPyMesh)
def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_SCALE, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY): def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY):
Window.WaitCursor(1) Window.WaitCursor(1)
V=Mathutils.Vector V=Mathutils.Vector
M=Mathutils.Matrix M=Mathutils.Matrix
@ -98,7 +98,7 @@ def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_SCALE, PREF_CLAMP_CONCAVE,
# BLUR TONE # BLUR TONE
edge_lengths= [ ((ed.v1.co-ed.v2.co).length + 1) / PREF_BLUR_SCALE for ed in me.edges] edge_lengths= [ ed.length for ed in me.edges]
for i in xrange(PREF_BLUR_ITERATIONS): for i in xrange(PREF_BLUR_ITERATIONS):
orig_vert_tone= list(vert_tone) orig_vert_tone= list(vert_tone)
@ -107,14 +107,18 @@ def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_SCALE, PREF_CLAMP_CONCAVE,
i2= ed.v2.index i2= ed.v2.index
l= edge_lengths[ii] l= edge_lengths[ii]
f=1.0
if l < PREF_BLUR_RADIUS:
f= l/PREF_BLUR_RADIUS
len_vert_tone_list_i1 = vert_tone_count[i1] len_vert_tone_list_i1 = vert_tone_count[i1]
len_vert_tone_list_i2 = vert_tone_count[i2] len_vert_tone_list_i2 = vert_tone_count[i2]
if not len_vert_tone_list_i1: len_vert_tone_list_i1=1 if not len_vert_tone_list_i1: len_vert_tone_list_i1=1
if not len_vert_tone_list_i2: len_vert_tone_list_i2=1 if not len_vert_tone_list_i2: len_vert_tone_list_i2=1
vert_tone[i1]+= (orig_vert_tone[i2]/len_vert_tone_list_i1)/ l vert_tone[i1]+= (orig_vert_tone[i2]/len_vert_tone_list_i1)/ f
vert_tone[i2]+= (orig_vert_tone[i1]/len_vert_tone_list_i2)/ l vert_tone[i2]+= (orig_vert_tone[i1]/len_vert_tone_list_i2)/ f
min_tone= min(vert_tone) min_tone= min(vert_tone)
@ -148,16 +152,16 @@ def main():
Draw.PupMenu('Error, The active mesh does not have texface/vertex colors. aborting') Draw.PupMenu('Error, The active mesh does not have texface/vertex colors. aborting')
return return
PREF_BLUR_ITERATIONS= Draw.Create(0) PREF_BLUR_ITERATIONS= Draw.Create(1)
PREF_BLUR_SCALE= Draw.Create(1.0) PREF_BLUR_RADIUS= Draw.Create(0.05)
PREF_CLAMP_CONCAVE= Draw.Create(180) PREF_CLAMP_CONCAVE= Draw.Create(180)
PREF_CLAMP_CONVEX= Draw.Create(180) PREF_CLAMP_CONVEX= Draw.Create(180)
PREF_SHADOW_ONLY= Draw.Create(0) PREF_SHADOW_ONLY= Draw.Create(0)
PREF_SEL_ONLY= Draw.Create(0) PREF_SEL_ONLY= Draw.Create(0)
pup_block= [\ pup_block= [\
'Post AO Blur',\ 'Post AO Blur',\
(' Iterations:', PREF_BLUR_ITERATIONS, 1, 40, 'Number times to blur the colors. (higher blurs more)'),\ (' Iterations:', PREF_BLUR_ITERATIONS, 0, 40, 'Number times to blur the colors. (higher blurs more)'),\
(' Blur Radius:', PREF_BLUR_SCALE, 0.1, 10.0, 'How much distance effects blur transfur (higher blurs more).'),\ (' Blur Radius:', PREF_BLUR_RADIUS, 0.01, 40.0, 'How much distance effects blur transfur (higher blurs more).'),\
'Angle Clipping',\ 'Angle Clipping',\
(' Highlight Angle:', PREF_CLAMP_CONVEX, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\ (' Highlight Angle:', PREF_CLAMP_CONVEX, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\
(' Shadow Angle:', PREF_CLAMP_CONCAVE, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\ (' Shadow Angle:', PREF_CLAMP_CONCAVE, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\
@ -169,14 +173,14 @@ def main():
return return
PREF_BLUR_ITERATIONS= PREF_BLUR_ITERATIONS.val PREF_BLUR_ITERATIONS= PREF_BLUR_ITERATIONS.val
PREF_BLUR_SCALE= PREF_BLUR_SCALE.val PREF_BLUR_RADIUS= PREF_BLUR_RADIUS.val
PREF_CLAMP_CONCAVE= PREF_CLAMP_CONCAVE.val PREF_CLAMP_CONCAVE= PREF_CLAMP_CONCAVE.val
PREF_CLAMP_CONVEX= PREF_CLAMP_CONVEX.val PREF_CLAMP_CONVEX= PREF_CLAMP_CONVEX.val
PREF_SHADOW_ONLY= PREF_SHADOW_ONLY.val PREF_SHADOW_ONLY= PREF_SHADOW_ONLY.val
PREF_SEL_ONLY= PREF_SEL_ONLY.val PREF_SEL_ONLY= PREF_SEL_ONLY.val
#t= sys.time() #t= sys.time()
vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_SCALE, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY) vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY)
#print 'done in %.6f' % (sys.time()-t) #print 'done in %.6f' % (sys.time()-t)
if __name__=='__main__': if __name__=='__main__':
main() main()