#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os, sys
import tkinter, tkinter.filedialog
from pyffi.formats.nif import NifFormat

#■Bytesを文字列に変換■
def BytesToStr(bytes):
	bytesStr = ""
	for i in bytes:
		bytesStr += chr(i)
	return bytesStr

#■メッシュノードを取得■
def GetMeshNode(nif):
	nodes = []
	for block in nif.roots[0].tree():
		if (isinstance(block, NifFormat.NiTriStrips) or isinstance(block, NifFormat.NiTriShape)):
			nodes.append(block)
	return nodes

#■メイン処理関数■
def main():
	#作業ディレクトリ変更
	os.chdir(os.path.dirname(sys.argv[0]) or '.')
	
	#ファイル選択ウィンドウを表示する
	print(u"ファイル選択ウィンドウを表示します")
	#メインウィンドウを消す
	root=tkinter.Tk()
	root.withdraw()
	#ファイル選択画面を表示
	filePath = sys.argv[1]#tkinter.filedialog.askopenfilename(initialdir=os.getcwd(), filetypes=[("Nif File", (".nif"))], title=u"整理するNifを選択")
	#キャンセルされた時の処理
	if (filePath == ""):
		print(u"キャンセルが押されたので終了します")
		return
	#ウィンドウ消去
	root.destroy()
	
	#ファイル読み込み
	file = open(filePath, "rb")
	nif = NifFormat.Data()
	nif.read(file)
	file.close()
	print(u"Nifファイルを読み込みました")
	
	#バージョン変更
	nif.user_version = 12
	nif.user_version_2 = 83
	print(u"バージョンを変更しました")
	
	#タンジェントスペースの更新
	for block in nif.roots[0].tree():
		if (isinstance(block, NifFormat.NiTriStrips) or isinstance(block, NifFormat.NiTriShape)):
			block.update_tangent_space()
	print(u"全てのタンジェントスペースが更新されました")

	#シェーダーの追加
	'''
	for block in nif.roots[0].tree():
		if (isinstance(block, NifFormat.NiTriStrips) or isinstance(block, NifFormat.NiTriShape)):
			shader = NifFormat.BSLightingShaderProperty()
			shader.skyrim_shader_type = 6
			shader.shader_flags_1.slsf_1_specular = 1
			shader.shader_flags_1.slsf_1_skinned = 1
			shader.shader_flags_1.slsf_1_vertex_alpha = 1
			shader.shader_flags_1.slsf_1_recieve_shadows = 1
			shader.shader_flags_1.slsf_1_cast_shadows = 1
			shader.shader_flags_1.slsf_1_hair_soft_Lighting = 1
			shader.shader_flags_1.slsf_1_own_emit = 1
			shader.shader_flags_1.slsf_1_remappable_textures = 1
			shader.shader_flags_1.slsf_1_z_buffer_test = 1
			shader.shader_flags_2.slsf_2_z_buffer_write = 1
			shader.shader_flags_2.slsf_2_double_sided = 1
			shader.shader_flags_2.slsf_2_vertex_colors = 1
			shader.shader_flags_2.slsf_2_assume_shadowmask = 1
			shader.shader_flags_2.slsf_2_env_map_light_fade = 1
			shader.shader_flags_2.slsf_2_anisotropic_lighting = 1
			shader.uv_scale.u = 1.0
			shader.uv_scale.v = 1.0
			shader.texture_set = NifFormat.BSShaderTextureSet()
			shader.texture_set.num_textures = 9
			shader.texture_set.textures.append(NifFormat.ByteArray())
			shader.texture_set.textures.append(NifFormat.ByteArray())
			shader.texture_set.textures.append(NifFormat.ByteArray())
			shader.texture_set.textures.textures = "textures\actors\character\hair\sala hairs\salahair_001.dds"
			shader.emissive_multiple = 1.0
			shader.glossiness = 10.0
			shader.specular_color.r = 1.0
			shader.specular_color.g = 1.0
			shader.specular_color.b = 1.0
			block.bs_properties[0] = shader
	print(u"シェーダーが追加されました")
	'''
	#アルファの追加
	for block in nif.roots[0].tree():
		if (isinstance(block, NifFormat.NiTriStrips) or isinstance(block, NifFormat.NiTriShape)):
			alpha = NifFormat.NiAlphaProperty()
			alpha.flags = 4844
			alpha.threshold = 200
			block.bs_properties[1] = alpha
	print(u"アルファが追加されました")
	
	#パーティションの変更
	flag = False
	for block in nif.roots[0].tree():
		if (isinstance(block, NifFormat.BSDismemberSkinInstance)):
			for partition in block.partitions:
                                partition.body_part = 131
	print(u"パーティションが変更されました")
	
	#ファイル書き出し
	file = open(filePath, "wb")
	nif.write(file)
	file.close()
	print(u"ファイルが書き出されました")

#■最初に実行されmain関数に移動■
if __name__ == '__main__':
	main()
