3
3
Name: 'Self Shadow VCols (AO)...'
6
6
Tooltip: 'Generate Fake Ambient Occlusion with vertex colors.'
9
__author__ = ["Campbell Barton"]
10
__url__ = ("blender", "elysiun", "http://members.iinet.net.au/~cpbarton/ideasman/")
9
__author__ = "Campbell Barton aka ideasman42"
10
__url__ = ["www.blender.org", "blenderartists.org", "www.python.org"]
11
11
__version__ = "0.1"
38
38
# ***** END GPL LICENCE BLOCK *****
39
39
# --------------------------------------------------------------------------
41
from Blender import Scene, Draw, sys, Window, Mathutils, Mesh
45
46
def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY):
46
47
Window.WaitCursor(1)
48
DotVecs = Mathutils.DotVecs
49
49
Ang= Mathutils.AngleBetweenVecs
51
51
BPyMesh.meshCalcNormals(me)
54
53
vert_tone= [0.0] * len(me.verts)
55
54
vert_tone_count= [0] * len(me.verts)
57
ed_face_users = [ [] for i in xrange(len(me.edges)) ]
59
fcent= [f.cent for f in me.faces]
64
59
for i, f in enumerate(me.faces):
68
64
vno=v.no # get a scaled down normal.
70
l1= (c-(v.co-vno)).length
71
l2= (c-(v.co+vno)).length
66
dot= DotVecs(vno, v.co) - DotVecs(vno, fc)
73
67
vert_tone_count[v.index]+=1
74
if abs(l1-l2) < 0.0000001:
75
a= min(PREF_CLAMP_CONVEX, a)
76
if not PREF_SHADOW_ONLY:
77
vert_tone[v.index] += a
85
a= min(PREF_CLAMP_CONVEX, a)
86
if not PREF_SHADOW_ONLY:
87
vert_tone[v.index] += a
89
a= min(PREF_CLAMP_CONCAVE, a)
90
vert_tone[v.index] -= a
79
a= min(PREF_CLAMP_CONCAVE, a)
80
vert_tone[v.index] -= a
93
82
# average vert_tone_list into vert_tonef
94
83
for i, tones in enumerate(vert_tone):
95
vert_tone[i] = vert_tone[i] / vert_tone_count[i]
84
if vert_tone_count[i]:
85
vert_tone[i] = vert_tone[i] / vert_tone_count[i]
116
105
if not len_vert_tone_list_i1: len_vert_tone_list_i1=1
117
106
if not len_vert_tone_list_i2: len_vert_tone_list_i2=1
119
vert_tone[i1]+= (orig_vert_tone[i2]/len_vert_tone_list_i1)/ f
120
vert_tone[i2]+= (orig_vert_tone[i1]/len_vert_tone_list_i2)/ f
108
val1= (orig_vert_tone[i2]/len_vert_tone_list_i1)/ f
109
val2= (orig_vert_tone[i1]/len_vert_tone_list_i2)/ f
123
115
min_tone= min(vert_tone)
124
116
max_tone= max(vert_tone)
126
print min_tone, max_tone
118
#print min_tone, max_tone
128
120
tone_range= max_tone-min_tone
129
121
if max_tone==min_tone:
131
SELFLAG= Mesh.FaceFlags.SELECT
132
124
for f in me.faces:
133
if not PREF_SEL_ONLY or f.flag & SELFLAG:
134
for i, v in enumerate(f.v):
125
if not PREF_SEL_ONLY or f.sel:
127
for i, v in enumerate(f):
135
129
tone= vert_tone[v.index]
130
tone= (tone-min_tone)/tone_range
138
f.col[i].r= f.col[i].g= f.col[i].b= int((tone/tone_range)*255)
132
col.r= int(tone*col.r)
133
col.g= int(tone*col.g)
134
col.b= int(tone*col.b)
140
136
Window.WaitCursor(0)
143
scn= Scene.GetCurrent()
144
ob= scn.getActiveObject()
139
sce= bpy.data.scenes.active
140
ob= sce.objects.active
146
if not ob or ob.getType() != 'Mesh':
142
if not ob or ob.type != 'Mesh':
147
143
Draw.PupMenu('Error, no active mesh object, aborting.')
152
148
PREF_BLUR_ITERATIONS= Draw.Create(1)
153
149
PREF_BLUR_RADIUS= Draw.Create(0.05)
154
150
PREF_MIN_EDLEN= Draw.Create(0.01)
155
PREF_CLAMP_CONCAVE= Draw.Create(180)
156
PREF_CLAMP_CONVEX= Draw.Create(180)
151
PREF_CLAMP_CONCAVE= Draw.Create(90)
152
PREF_CLAMP_CONVEX= Draw.Create(20)
157
153
PREF_SHADOW_ONLY= Draw.Create(0)
158
154
PREF_SEL_ONLY= Draw.Create(0)
179
175
PREF_SHADOW_ONLY= PREF_SHADOW_ONLY.val
180
176
PREF_SEL_ONLY= PREF_SEL_ONLY.val
178
if not me.vertexColors:
186
182
vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY)
187
#print 'done in %.6f' % (sys.time()-t)
183
print 'done in %.6f' % (sys.time()-t)
188
184
if __name__=='__main__':