import random #リフレクションシェーダー #2015.07.15 #ポストエフェクト処理で、XY法線画像情報を使って、レンダリング後の画像の全部あるいは特定の表面材質形状に、 #光沢や反射、照明効果などを加えてオブジェクトの質感調整ができます。 #表面材質IDのカラーはカラーピッカーなどで表面材質IDレイヤーを自分で調べて #似たような値を入力する必要があります。 #(「データパスにアンチエイリアスをかけない」がOFFの場合はぴったりの数値を入力します) #マルチパスの「XY法線画像」が必要なため、standard版以上のグレードでしか使えません #レンダリング画像を書き換えるので、「レンダリング画像のコピーと復帰」スクリプトなどでレンダリング画像を保存しておいてからスクリプトを実行してください。 #動作条件 #レンダリングでマルチパスがON、「表面材質IDレイヤー」と「XY法線レイヤー」がONになっており、選択中のパートのマッピングレイヤー1に画像をセットしている事 #選択形状はパートで、「リフレク:」と頭についたパートを選択した #状態でスクリプトを起動すると、各種設定数値を読み込みできます。 #また、値を入力してレンダリングを行うと、設定値は「リフレク:」というパートに #書き込まれます。(パートを選択してない場合は起動しない。中身のない空のパート選択時はパート名が強制的に書き換えられる) def convert_to_hls(rrr,ggb,bbb): #rgb(1.0,1.0,1.0)をhls(360、1.0,1.0)に変換して返す if rrr>1: rrr=1 if ggb>1: ggb=1 if bbb>1: bbb=1 #RGBを比較してmax、minを決定 rgbcopy=[rrr,ggb,bbb] rgbcopy.sort() min=rgbcopy[0] max=rgbcopy[2] lll=(max+min)/2 if max==min: hhh=0 sss=0 else: if lll<=0.5: sss=(max-min)/(max+min) else: sss=(max-min)/(2-max-min) crr=(max-rrr)/(max-min) cgg=(max-ggb)/(max-min) cbb=(max-bbb)/(max-min) if max==rrr:hhh=cbb-cgg if max==ggb:hhh=2+crr-cbb if max==bbb:hhh=4+cgg-crr hhh=60*hhh if hhh<0:hhh=hhh+360 return (hhh,lll,sss) def convert_to_rgb(hhh,lll,sss): #hls(360、1.0,1.0)をrgb(1.0,1.0,1.0)に変換して返す while(hhh<0): hhh+=360 while(hhh>360): hhh-=360 if lll<=0.5: max=lll*(1+sss) else: max=lll*(1-sss)+sss min=2*lll-max if sss==0: rrr=lll ggb=lll bbb=lll else: h1=hhh+120 if h1>=360: h1=h1-360 if 0<=h1<60: rrr=min+(max-min)*h1/60.0 if 60<=h1<180: rrr=max if 180<=h1<240: rrr=min+(max-min)*(240-h1)/60.0 if 240<=h1<360: rrr=min h1=hhh if h1>=360:h1=h1-360 if 0<=h1<60: ggb=min+(max-min)*h1/60.0 if 60<=h1<180: ggb=max if 180<=h1<240: ggb=min+(max-min)*(240-h1)/60.0 if 240<=h1<360: ggb=min h1=hhh-120 if h1<0: h1+=360 if 0<=h1<60: bbb=min+(max-min)*h1/60.0 if 60<=h1<180: bbb=max if 180<=h1<240: bbb=min+(max-min)*(240-h1)/60.0 if 240<=h1<360: bbb=min return (rrr,ggb,bbb) dousasuru=0 normalari=0 sfidari=0 mapari=0 layernum=xshade.scene().rendering.number_of_image_layers()#現在のレイヤーの数 if xshade.scene().rendering.multipass_rendering==True and layernum>0: for i in range(layernum): if xshade.scene().rendering.image_layer_by_index(i).id_name=='XYNormal': normalari=1 if xshade.scene().rendering.image_layer_by_index(i).id_name=='SurfaceID': sfidari=1 try: if xshade.scene().active_shape().surface.mapping_layer(0).image.size[1]>0:mapari=1 except: mapari=0 ashape=xshade.scene().active_shape() if normalari==1 and sfidari==1 and mapari==1 and xshade.scene().active_shape().type==2 : if ashape.has_son==False: dousasuru=1 if dousasuru!=1: print ('レンダリングオプションの「マルチパスを保持する」をONにして') print ('「データ:XY法線」をON  「データ:表面材質ID」をONにして') print ('レンダリングし、さらに空のパートを作ってから') print ('その表面材質のマッピングレイヤー1に球画像をセットしてください') #if dousasuru==1: # spemapari=0 # try: # if xshade.scene().active_shape().surface.mapping_layer(1).image.size==xshade.scene().rendering.image.size: # spemapari=1 # except: # spemapari=0 if dousasuru==1: #ここでデフォルトの数値を設定 renzoku=1#キャンセルしたらウインドウが出てやり直し # hanten=0#1なら反転 allorpart=1# 0なら全ての形状、1なら特定の表面材質のみにエフェクトを加える bairitu=1# この値で半径の微調整 contrastb=1#コントラスト倍率 tekiyouritu=1# 適用率 colmode=0#0は書き換え 1は書き換え後に明度を乗算、2は加算、3は減算、4は1.何倍、5は乗算 anbuon=0#暗部は残すのONとOFF(デフォルトではOFF) anbuti=0.2 #暗部閾値 antia=0#0は無し、1はなんちゃってアンチエイリアスあり idcol=(0,0,0) #表面材質IDカラーR,G,Bは1が最大値 # col1=(0,0,0) #第一(輪郭色) # col2=(0,0,0) #第二(正面色) # pownum=1 #カーブタイプ「数値」の場合のpow関数 # mapsiyou=0 #グラディエントに画像を使う 0では使わない # speccol=(1,1,1) #光沢に乗算する色 # inputtype=0 #0の時は視線との角度、1の時は元画像の明度 motiage=0 #「元画像の明度を」の場合の持ち上げ量 # spegazou=0 #1の場合はマッピングレイヤー2に設定した画像を光沢画像として使う colbit=xshade.scene().rendering.image.pixel_depth #レンダリング画像の色深度(32、64、128ビット) # curvtype=0#0なら直線、1なら二乗、2ならルート(平方根) 3なら三乗 4なら三乗根(8の三乗根は2)5は数値 testsize=0#0なら400、1なら800、2なら1200以下におさまるように縮小 antion=0#0なら擬似アンチエイリアスOFF、1ならon akyoudo=1#アンチエイリアスの比重 #選択している形状がパートで、名前の頭に「リフレク:」とついていたら、ここで各種データを読み込む if xshade.scene().active_shape().type==2 and xshade.scene().active_shape().name[:12]=='リフレク': #設定値の読み込み idcol=xshade.scene().active_shape().surface.diffuse_color xshade.scene().active_shape().surface.diffuse_color=idcol surf4=xshade.scene().active_shape().surface # col1=xshade.scene().active_shape().surface.glow_color # col2=xshade.scene().active_shape().surface.highlight_color_2 anbuon=int(surf4.transparency) anbuti=surf4.diffuse # spegazou=int(surf4.transparency) # if spemapari==0:spegazou=0 # pownum=surf4.anisotropic contrastb=surf4.anisotropic colmode=int(surf4.backlight) # hanten=int(surf4.diffuse) antion=int(surf4.glow) motiage=surf4.reflection allorpart=int(surf4.highlight_2) bairitu=surf4.highlight tekiyouritu=surf4.highlight_size # mapsiyou=int(surf4.highlight_2) # if mapari==0:mapsiyou=0 # speccol=surf4.backlight_color # curvtype=int(surf4.highlight) # pownum=surf4.anisotropic # inputtype=int(surf4.highlight_size) # tekiyouritu=surf4.highlight_2 # henkaritu=surf4.highlight_size testsize=int(surf4.highlight_size_2) # akyoudo=float(surf4.soft_glow) #選択してるのがパートで、名前の頭に「リフレク」とついていたら、表面材質の拡散反射の色を表面材質IDのカラーとして取得 #さらに各種設定数値を変換マトリクスから取得してデフォルトの数値と置き換える while(renzoku==1): pout=0#0ならテスト用のウインドウに出力、1ならレンダリング画像に上書き parame=1#パラメータをメッセージウインドウに出力する tempwari=0 #テスト用ウインドウの識別ID名を作成 wname=str(random.randint(0,100))+'_'+str(random.randint(0,100)) #表面材質IDレイヤーを調べ、ダイアログで聞いたカラーと一番近い色を1パス目で調べる。2パス目ではその色のピクセルだけを1残りは0としたリスト作成 dialog=xshade.create_dialog() dialog.begin_group() idx444=dialog.append_radio_button('対象/全ての形状/指定の表面材質のみ') idx4=dialog.append_rgb('操作する箇所の表面材質IDカラー') # idx39=dialog.append_radio_button('入力/視線との角度/元画像の明度/視線との角度x元画像の明度') # idx39=dialog.append_radio_button('入力/視線との角度/元画像の明度') idx555=dialog.append_float('球画像の半径の倍率(0〜1)') idx999=dialog.append_float('画像のコントラスト調整(0より大)') idx5=dialog.append_float('適用率(0〜1)') # idx6=dialog.append_radio_button('操作箇所/明度/彩度/色相/彩度と明度') # idx5=dialog.append_rgb('第一色') # idx6=dialog.append_rgb('第二色') # if mapari==1: # idx28=dialog.append_bool('グラデーション画像を使う') # idx7=dialog.append_radio_button('モード/描き換え/結果を元画像に乗算/描き換え後、元画像の明度を乗算/光沢部分のみ描き換え') # idx7=dialog.append_radio_button('モード/描き換え/結果を元画像に乗算/描き換え後、元画像の明度を乗算/描き変え後、元画像の明るさを付加する') idx7=dialog.append_radio_button('モード/描き換え/描き換え後、元画像の明度を乗算/加算/減算/1.何倍/乗算') idx71=dialog.append_float('明度の持ち上げ量(1が最大)') # idx12=dialog.append_radio_button('カーブタイプ/通常/二乗/ルート/三乗/三乗根') # idx12=dialog.append_selection('カーブタイプ/通常/二乗/ルート/三乗/三乗根/数値') # idx8=dialog.append_float('変化率(0以上)') # idx8=dialog.append_float('「数値の場合」(0より大8以下)') # idx49=dialog.append_rgb('光沢に乗算する色') # if spemapari==1: # idx549=dialog.append_bool('光沢はレイヤー2の画像を使う') # idx9=dialog.append_bool('反転') idx111=dialog.append_bool('暗部は残す') idx112=dialog.append_float('暗部閾値(0〜1)') idx14=dialog.append_bool('擬似アンチエイリアス(slow)') # idx21=dialog.append_float('アンチエイリアスの比重(0〜)') dialog.end_group() dialog.begin_group() idx10=dialog.append_radio_button('出力先/別ウインドウ(テストレンダ)/レンダリング画像') idx11=dialog.append_bool('テストレンダ時パラメータも出力する') # idx13=dialog.append_radio_button('テストレンダのサイズ/400以下/800以下/1600以下') idx13=dialog.append_selection('テストレンダのサイズ/400以下/800以下/1600以下') dialog.end_group() # dialog.set_value(idx39,inputtype) dialog.set_value(idx555,bairitu) dialog.set_value(idx999,contrastb) dialog.set_value(idx444,allorpart) dialog.set_value(idx5,tekiyouritu) dialog.set_value(idx111,anbuon) dialog.set_value(idx112,anbuti) dialog.set_value(idx4,idcol) # dialog.set_value(idx5,col1) # dialog.set_value(idx6,col2) dialog.set_value(idx7,colmode) # dialog.set_value(idx8,pownum) # dialog.set_value(idx9,hanten) dialog.set_value(idx10,pout) dialog.set_value(idx11,parame) # dialog.set_value(idx12,curvtype) dialog.set_value(idx13,testsize) dialog.set_value(idx14,antion) dialog.set_value(idx71,motiage) # dialog.set_value(idx49,speccol) # dialog.set_value(idx21,akyoudo) # if spemapari==1: # dialog.set_value(idx549,spegazou) # if mapari==1: # dialog.set_value(idx28,mapsiyou) kekka=dialog.ask('リフレクションシェーダー') # inputtype=dialog.get_value(idx39) idcol=dialog.get_value(idx4) # col1=dialog.get_value(idx5) # col2=dialog.get_value(idx6) colmode=dialog.get_value(idx7) # speccol=dialog.get_value(idx49) # if spemapari==1: # spegazou=dialog.get_value(idx549) bairitu=dialog.get_value(idx555) if bairitu<0:bairitu=0 if bairitu>1:bairitu=1 anbuon=dialog.get_value(idx111) anbuti=dialog.get_value(idx112) if anbuti<0:anbuti=0 if anbuti>1:anbuti=1 allorpart=dialog.get_value(idx444) tekiyouritu=dialog.get_value(idx5) if tekiyouritu<0:tekiyouritu=0 if tekiyouritu>1:tekiyouritu=1 motiage=dialog.get_value(idx71) if motiage>1:motiage=1 # pownum=dialog.get_value(idx8) # if mapari==1: # mapsiyou=dialog.get_value(idx28) # if pownum<=0:pownum=1 # if pownum>8:pownum=8 # if henkaritu<0:henkaritu=henkaritu*(-1) # hanten=dialog.get_value(idx9) pout=dialog.get_value(idx10) parame=dialog.get_value(idx11) # curvtype=dialog.get_value(idx12) contrastb=dialog.get_value(idx999) if contrastb<=0:contrastb=0.01 testsize=dialog.get_value(idx13) if testsize==0: rendersize=400 if testsize==1: rendersize=800 if testsize==2: rendersize=1600 antion=dialog.get_value(idx14) if allorpart==0:antion=0 # akyoudo=dialog.get_value(idx21) # if akyoudo<0:akyoudo=0 #XY法線画像のコピーイメージを作成 imgcopymae=xshade.scene().rendering.image_layer('XYNormal').image.duplicate(None,True,colbit) if pout==0 and imgcopymae.size[0]>rendersize: tempwidth=imgcopymae.size[0] while(tempwidth>rendersize): tempwidth=tempwidth/2 tempwari+=1 imgcopy=imgcopymae.duplicate((int(imgcopymae.size[0]/(tempwari*2)),int(imgcopymae.size[1]/(tempwari*2))), True, colbit) else: imgcopy=imgcopymae.duplicate(None,True,colbit) tempwari=0.5 width=imgcopy.size[0] height=imgcopy.size[1] #参照用のマッピングレイヤー1画像を取得し、半径の設定もする map1=xshade.scene().active_shape().surface.mapping_layer(0).image tempsize1=map1.size if tempsize1[0]>tempsize1[1]: hankei=tempsize1[1]/2 else: hankei=tempsize1[0]/2 #スペキュラー画像のコピーイメージを作成 # spimgcopy=xshade.scene().rendering.image_layer('Specular').image.duplicate(None,True,colbit) # if pout==0 and tempwari2!=0: # spimgcopy2=spimgcopy.duplicate((int(imgcopymae.size[0]/(tempwari*2)),int(imgcopymae.size[1]/(tempwari*2))), True, colbit) # else: # spimgcopy2=spimgcopy.duplicate(None,True,colbit) # spimgcopy2=spimgcopy.duplicate((width,height),True,colbit) #影画像のコピーイメージを作成 # shimgcopy=xshade.scene().rendering.image_layer('Shadow').image.duplicate((width,height),True,colbit) #レイヤー画像のコピーイメージを作成 # if mapari==1: # mapimgcopy=xshade.scene().active_shape().surface.mapping_layer(0).image.duplicate(None,True,colbit) # mapheight=mapimgcopy.size[1]-1 # if mapheight<0:mapheight=0 imairo=(0,0,0) if kekka==False:renzoku=0 if kekka==True: ashape=xshade.scene().active_shape() #ここで各種設定データを「リフレク:」パートに書き込む。選択しているのが空のパートなら、名前を変更する if xshade.scene().active_shape().type!=2 or xshade.scene().active_shape().name[:12]!='リフレク' and ashape.has_son==False: # xshade.scene().create_part('グラデ:') ashape.name='リフレク:' xshade.scene().active_shape().has_surface_attributes=True #設定値の書き込み xshade.scene().active_shape().surface.diffuse_color=idcol surf4=xshade.scene().active_shape().surface surf4.reflection=motiage # surf4.anisotropic=pownum surf4.backlight=colmode # surf4.backlight_color=speccol surf4.highlight=bairitu surf4.highlight_size=tekiyouritu surf4.highlight_2=allorpart surf4.anisotropic=contrastb surf4.diffuse=anbuti surf4.transparency=anbuon # surf4.diffuse=hanten surf4.glow=antion # surf4.highlight=curvtype # surf4.highlight_2=mapsiyou # surf4.highlight_color_2=col2 # surf4.glow_color=col1 # surf4.highlight_size=inputtype # surf4.transparency=spegazou # surf4.highlight_size=henkaritu surf4.highlight_size_2=testsize # surf4.soft_glow=akyoudo #「光沢にレイヤー2の画像を使用」がONの場合 # if spegazou==1: # spimgcopy2=xshade.scene().active_shape().surface.mapping_layer(1).image.duplicate((width,height), True, colbit) # xshade.scene().inhibit_update() #表面材質IDレイヤーからマスクを作成 sfimgmae=xshade.scene().rendering.image_layer('SurfaceID').image #テストモードで画像サイズが大きい時は縮小 if tempwari>0: sfimg=sfimgmae.duplicate((width,height), True, colbit) else: sfimg=sfimgmae.duplicate(None, True, colbit) # sfimg=xshade.scene().rendering.image_layer('SurfaceID').image masklist=[] for i in range(width): tempc=[] for j in range(height): tempc.append(0) masklist.append(tempc) for i in range(width): for j in range(height): tempcol=sfimg.get_pixel(i,j) if (tempcol[0]-idcol[0])**2+(tempcol[1]-idcol[1])**2+(tempcol[2]-idcol[2])**2<(imairo[0]-idcol[0])**2+(imairo[1]-idcol[1])**2+(imairo[2]-idcol[2])**2: imairo=tempcol for i in range(width): for j in range(height): if allorpart==0: masklist[i][j]=1 else: tempcol=sfimg.get_pixel(i,j) if tempcol==imairo: masklist[i][j]=1 #ここでアンチエイリアスをかける場所のリストを作成[x座標、y座標、(r,g,b)] if antion==1: antialist=[] for i in range(width): for j in range(height): if masklist[i][j]==0: ahantei=0 #上下左右のピクセルを検査 kumi1=[[0,-1],[0,1],[-1,0],[1,0]] for ggg in kumi1: tempx33=ggg[0]+i tempy33=ggg[1]+j if -10: antialist.append([i,j,(0,0,0)]) masklist[i][j]=-1 #マスクの値が1のピクセルの法線画像の色をモノクロ化(は、このスクリプトではやらない) #1 for i in range(width): #1 for j in range(height): # if masklist[i][j]==1: #1 if masklist[i][j]>0: # tempcol=imgcopy.get_pixel(i,j) #1 tempcol=imgcopymae.get_pixel(i*tempwari*2,j*tempwari*2) # tempvalue=((tempcol[0]-0.5)**2+(tempcol[1]-0.5)**2)/((0.5)**2+(0.5)**2) #1 tempvalue=(tempcol[0])**2+(tempcol[1])**2 # if hanten==True:tempvalue=0.5-tempvalue #1 if hanten==True:tempvalue=1-tempvalue # imgcopy.set_pixel(i,j,(tempvalue*2*masklist[i][j],tempvalue*2*masklist[i][j],tempvalue*2*masklist[i][j])) #1 imgcopy.set_pixel(i,j,(tempvalue*masklist[i][j],tempvalue*masklist[i][j],tempvalue*masklist[i][j])) # imgcopy.set_pixel(i,j,(tempvalue*2,tempvalue*2,tempvalue*2)) # imgcopy.create_window('テスト法線') #レンダリングイメージに加工を行う if tempwari>0: imgcopy2=xshade.scene().rendering.image.duplicate((width,height), True, colbit) motoimg=xshade.scene().rendering.image.duplicate((width,height), True, colbit) #あとで戻すためのイメージ else: imgcopy2=xshade.scene().rendering.image.duplicate(None, True, colbit)#加工するイメージ motoimg=xshade.scene().rendering.image.duplicate(None, True, colbit) #あとで戻すためのイメージ if pout==1: motoimg=xshade.scene().rendering.image.duplicate(None, True, colbit) #あとで戻すためのイメージ # imgcopy2.create_window('元画像') # sfimg.create_window('表面材質') #for debug maxwd=0 minwd=0 for i in range(width): for j in range(height): if masklist[i][j]>0: tempcol3=motoimg.get_pixel(i,j) #グレー法線情報読み取り # tempvalue=imgcopy.get_pixel(i,j)[0] #XY法線情報読み取り # tempcol4=imgcopy.get_pixel(i,j) tempcol4=imgcopymae.get_pixel(i*tempwari*2,j*tempwari*2) #入力タイプが「視線との角度x元画像の明度」の場合書き換え # if inputtype==2: # temp233=motoimg.get_pixel(i,j) # temp233=convert_to_hls(temp233[0],temp233[1],temp233[2]) # tempvalue=temp233[1]*tempvalue # if hanten==1:tempvalue=1-tempvalue #入力タイプが「元画像の明度」の場合書き換え # if inputtype==1: # temp233=motoimg.get_pixel(i,j) # temp233=convert_to_hls(temp233[0],temp233[1],temp233[2]) # tempvalue=temp233[1] # if hanten==1:tempvalue=1-tempvalue # #カーブタイプで変化量を変換 # if curvtype==1:tempvalue=(tempvalue)**2 # if curvtype==2: # if tempvalue<0:tempvalue=0 # if tempvalue>0:tempvalue=pow(tempvalue,0.5) # if curvtype==3:tempvalue=(tempvalue)**3 # if curvtype==4: # if tempvalue<0:tempvalue=0 # if tempvalue>0:tempvalue=pow(tempvalue,0.333333) # if curvtype==5: # if tempvalue<0:tempvalue=0 # if tempvalue>0:tempvalue=pow(tempvalue,pownum) #変化率をかけあわせ # tempvalue=tempvalue*henkaritu #適用率を適用 # tekiyouritu2=masklist[i][j]*tekiyouritu # if colmode==0: # tempval3=tekiyouritu2*tempvalue+1-tekiyouritu2 # else: # tempval3=tekiyouritu2*tempvalue # tempval3=tempvalue #XY法線画像からベクターを計算し、そのベクターを元に球画像から色を取得 # tempvec471=((tempcol4[0]-0.5)*2,(tempcol4[1]-0.5)*2,(tempcol4[2]-0.5)*2) tempvec471=((tempcol4[0]),(-tempcol4[1]),(tempcol4[2])) tempvec471=(tempvec471[0]*hankei*bairitu,tempvec471[1]*hankei*bairitu,tempvec471[2]*hankei*bairitu) width2=map1.size[0] height2=map1.size[1] tempcolcol=(0,0,0) #for debug # if tempvec471[1]>maxwd:maxwd=tempvec471[1] # if tempvec471[1]1:kakekake=1 tempcolcol=(tempcolcol[0]*kakekake,tempcolcol[1]*kakekake,tempcolcol[2]*kakekake) imgcopy2.set_pixel(i,j,tempcolcol) #「加算」の場合 if colmode==2: tempcolcol=(tempcolcol[0]*tekiyouritu,tempcolcol[1]*tekiyouritu,tempcolcol[2]*tekiyouritu) tempcolcol2=imgcopy2.get_pixel(i,j) tempcolcol=(tempcolcol[0]+tempcolcol2[0],tempcolcol[1]+tempcolcol2[1],tempcolcol[2]+tempcolcol2[2]) imgcopy2.set_pixel(i,j,tempcolcol) #「減算」の場合 if colmode==3: tempcolcol=(tempcolcol[0]*tekiyouritu,tempcolcol[1]*tekiyouritu,tempcolcol[2]*tekiyouritu) tempcolcol2=imgcopy2.get_pixel(i,j) tempcolcol=(tempcolcol2[0]-tempcolcol[0],tempcolcol2[1]-tempcolcol[1],tempcolcol2[2]-tempcolcol[2]) imgcopy2.set_pixel(i,j,tempcolcol) #「1.何倍」の場合 if colmode==4: tempcolcol=(tempcolcol[0]*tekiyouritu,tempcolcol[1]*tekiyouritu,tempcolcol[2]*tekiyouritu) tempcolcol2=imgcopy2.get_pixel(i,j) tempcolcol=(tempcolcol2[0]*(1+tempcolcol[0]),tempcolcol2[1]*(1+tempcolcol[1]),tempcolcol2[2]*(1+tempcolcol[2])) imgcopy2.set_pixel(i,j,tempcolcol) #「乗算」の場合 if colmode==5: tempcolcol=(tempcolcol[0]*tekiyouritu+1-tekiyouritu,tempcolcol[1]*tekiyouritu+1-tekiyouritu,tempcolcol[2]*tekiyouritu+1-tekiyouritu) tempcolcol2=imgcopy2.get_pixel(i,j) tempcolcol=(tempcolcol2[0]*tempcolcol[0],tempcolcol2[1]*tempcolcol[1],tempcolcol2[2]*tempcolcol[2]) imgcopy2.set_pixel(i,j,tempcolcol) #1 imgcopy2.set_pixel(i,j,tempcol3) #for debug # print minwd,maxwd #ここでエッジアンチエイリアス処理を行う if antion==1: numnum=0 for aaa in antialist: kumia=[[-1,0],[1,0],[0,1],[0,-1],[1,1],[-1,-1],[1,-1],[-1,1]] wari=0 # temprgb=imgcopy2.get_pixel(aaa[0],aaa[1]) # rsum=temprgb[0] # gsum=temprgb[1] # bsum=temprgb[2] rsum=0 gsum=0 bsum=0 for kk in kumia: if (0<=(aaa[0]+kk[0])0: antialist[numnum][2]=(rsum/wari,gsum/wari,bsum/wari) else: antialist[numnum][2]=imgcopy2.get_pixel(aaa[0],aaa[1]) numnum+=1 for aaa in antialist: imgcopy2.set_pixel(aaa[0],aaa[1],aaa[2]) #出力 if pout==0: xshade.scene().allow_update() # win23=spimgcopy2.create_window('ウインドウID:'+wname) # win23.bring_to_front() win22=imgcopy2.create_window('ウインドウID:'+wname) win22.bring_to_front() if parame==1: #ウインドウIDと各種パラメータを出力する print '「ウインドウID」'+wname if allorpart==0: temptextex='対象:全形状' else: temptextex='対象:指定の表面材質' print temptextex rgbout=(int(idcol[0]*255),int(idcol[1]*255),int(idcol[2]*255)) print '表面材質IDカラー'+'R'+str(rgbout[0])+'G'+str(rgbout[1])+'B'+str(rgbout[2]),' 適用率:'+str(tekiyouritu) # print '表面材質IDカラー'+'R'+str(rgbout[0])+'G'+str(rgbout[1])+'B'+str(rgbout[2]), print '球画像の半径の倍率:'+str(bairitu) print '画像のコントラスト調整:'+str(contrastb) # if mapsiyou==0: # rgbout2=(int(col1[0]*255),int(col1[1]*255),int(col1[2]*255)) # print '第一色'+'R'+str(rgbout2[0])+'G'+str(rgbout2[1])+'B'+str(rgbout2[2]), # rgbout3=(int(col2[0]*255),int(col2[1]*255),int(col2[2]*255)) # print '第二色'+'R'+str(rgbout3[0])+'G'+str(rgbout3[1])+'B'+str(rgbout3[2]) # else: # print 'グラデーション画像を使用:ON' # if kasyo==0:temptex1='明度' # if kasyo==1:temptex1='彩度' # if kasyo==2:temptex1='色相' # if kasyo==3:temptex1='彩度と明度' if colmode==0:temptex2='描き換え' if colmode==1:temptex2='描き変え後、元画像の明度を乗算 (持ち上げ量'+str(motiage)+')' if colmode==2:temptex2='加算' if colmode==3:temptex2='減算' if colmode==4:temptex2='1.何倍' if colmode==5:temptex2='乗算' # if colmode==3:temptex2='1.○倍' # if curvtype==0:temptex3='通常' # if curvtype==1:temptex3='二乗' # if curvtype==2:temptex3='ルート' # if curvtype==3:temptex3='三乗' # if curvtype==4:temptex3='三乗根' # if curvtype==5:temptex3='数値'+str(pownum) # temptex4='OFF' # if hanten==1:temptex4='ON' # temptex5='OFF' if antion==1:temptex5='ON' else:temptex5='OFF' # temptex6='' # temptex39='視線との角度' # if inputtype==1:temptex39='元画像の明度' # if inputtype==2:temptex39='視線との角度x元画像の明度' # if antion==1:temptex6=' AA比重'+str(akyoudo) # print '操作箇所:'+temptex1,' モード:'+temptex2 # print '入力:'+temptex39,' モード:'+temptex2 print 'モード:'+temptex2 # print '入力:'+temptex39,' モード:'+temptex2 temptex66='OFF' if anbuon==1:temptex66='ON' print '暗部は残す:'+temptex66+' 暗部閾値:'+str(anbuti) print 'アンチエイリアス:'+temptex5 # print 'カーブタイプ:'+temptex3,' 変化率:'+str(henkaritu),' 反転:'+temptex4,' アンチエイリアス:'+temptex5,temptex6 # print 'カーブタイプ:'+temptex3,' 反転:'+temptex4,' アンチエイリアス:'+temptex5,temptex6 # temptexspe='OFF' # if spemapari==1: # if spegazou==1:temptexspe='ON' # print '光沢はレイヤー2の画像を使用:'+str(temptexspe) # print '明度の持ち上げ量:'+str(motiage),' 光沢に乗算する色:R'+str(int(speccol[0]*255))+'G'+str(int(speccol[1]*255))+'B'+str(int(speccol[2]*255)) if pout==1: #本レンダの場合はレンダリング画像を書き換えてからダイアログ開いて結果を確定するか確認 for tt in range(width): for ss in range(height): if masklist[tt][ss]>0: xshade.scene().rendering.image.set_pixel(tt,ss,imgcopy2.get_pixel(tt,ss)) #ここでエッジアンチエイリアス処理を行う if antion==1: for aaa in antialist: xshade.scene().rendering.image.set_pixel(aaa[0],aaa[1],aaa[2]) xshade.scene().allow_update() xshade.scene().rendering.update_image() xshade.image_view().show() xshade.image_view().bring_to_front() #ダイアログ dialog4=xshade.create_dialog() idx1=dialog4.append_push_button('処理を確定しますか?') xshade.idle(120) kekka5=dialog4.ask('リフレクションシェーダー') if kekka5==True:renzoku=0 if kekka5==False: xshade.scene().inhibit_update() for tt in range(width): for ss in range(height): if masklist[tt][ss]!=0: xshade.scene().rendering.image.set_pixel(tt,ss,motoimg.get_pixel(tt,ss)) xshade.scene().allow_update() xshade.scene().rendering.update_image() xshade.idle(120)