PhotographPanel = class("PhotographPanel", ContainerView)
autoImport("PhotographSingleFilterText")
autoImport("CarrierSubView")
autoImport("SceneRoleTopSymbol")
autoImport("FlyMessageView")
PhotographPanel.ViewType = UIViewType.FocusLayer

--聚焦
--任務拍照（景點 npc 固定點)
--普通、載具拍照 (景點)


PhotographPanel.FOCUS_VIEW_PORT_RANGE = {x={0.1,0.9},y={0.1,0.9}}
PhotographPanel.NEAR_FOCUS_DISTANCE = GameConfig.PhotographPanel and GameConfig.PhotographPanel.Near_Focus_Distance or 15
PhotographPanel.FAR_FOCUS_DISTANCE = GameConfig.PhotographPanel and GameConfig.PhotographPanel.Far_Focus_Distance or 40
-- PhotographPanel.TAKE_NEAR_FOCUS_DISTANCE = 15
PhotographPanel.ChangeCompositionDuration = 0.3

local PHOTOGRAPHER_StickArea = Rect(0,0,1,1)

PhotographPanel.taskCellRes = TaskCell

PhotographPanel.filterType ={
	Text = 1,
	Faction = 2,
	Team = 3,
	All = 4,
}

PhotographPanel.DefaultMode ={
	SELFIE = 1,
	PHOTOGRAPHER = 2,
}

PhotographPanel.TickType ={
	Zoom = 1,
	CheckFocus = 4,
	CheckIfHasFocusCreature = 3,
	CheckAnim = 5,
	UpdateAxis = 2,
}

PhotographPanel.FocusStatus ={
	Fit = 1,
	Less = 2,
	FarMore = 3,
}

PhotographPanel.PhotographMode ={
	SELFIE = 1,
	PHOTOGRAPHER = 2,
}

-- *顯示自己
-- *顯示隊友
-- *顯示公會
-- *顯示路人
-- *顯示魔物
-- *顯示NPC
-- *顯示界面[不勾選]

PhotographPanel.filters = {
	{id=GameConfig.FilterType.PhotoFilter.Self},
	{id=GameConfig.FilterType.PhotoFilter.Team},
	{id=GameConfig.FilterType.PhotoFilter.Guild},
	{id=GameConfig.FilterType.PhotoFilter.PassBy},
	{id=GameConfig.FilterType.PhotoFilter.Monster},
	{id=GameConfig.FilterType.PhotoFilter.Npc},
	{id=GameConfig.FilterType.PhotoFilter.Text},
	{id=FunctionSceneFilter.AllEffectFilter,text = ZhString.PhotoFilter_Effect},
	{id=GameConfig.FilterType.PhotoFilter.PetTalk},
	{id=GameConfig.FilterType.PhotoFilter.HunterPet},
}

local tempVector3 = LuaVector3.zero
local tempArray = {}

function PhotographPanel:Init()
	self.compositionIndex = 1
	self:initView()
	self:initData()
	self:addEventListener()
end

function PhotographPanel:changeTakeTypeBtnView(  )
	-- body
	if(self.curPhotoMode == PhotographPanel.PhotographMode.SELFIE and self.hasLearnTakePicSkill)then
		self:Show(self.takeTypeBtn)
	else
		self:Hide(self.takeTypeBtn)
	end
	-- printRed("changeTakeTypeBtnView",self.curPhotoMode,self.hasLearnTakePicSkill,PhotographPanel.PhotographMode.SELFIE)
end

function PhotographPanel:changeCameraDisView(  )
	-- body
	if(self.curPhotoMode == PhotographPanel.PhotographMode.SELFIE and self.hasLearnChangeCameraSkill)then
		self:Show(self.disScrollBar)
	else
		self:Hide(self.disScrollBar)
	end
	-- printRed("changeCameraDisView",self.curPhotoMode,self.hasLearnTakePicSkill,PhotographPanel.PhotographMode.SELFIE)
end

function PhotographPanel:initView(  )
	-- body
	self.carrierSubView = self:AddSubView("CarrierSubView",CarrierSubView)

	self.flyMessageView = self:AddSubView("FlyMessageView",FlyMessageView)
	local filtersBg = self:FindChild("filterContentBg"):GetComponent(UISprite)
	filtersBg.height = 49.15 * #PhotographPanel.filters+16
	local girdView = self:FindChild("Grid"):GetComponent(UIGrid)
	self.filterGridList = UIGridListCtrl.new(girdView,PhotographSingleFilterText,"PhotographSingleFilterText")
	self.screenShotHelper = self.gameObject:GetComponent(ScreenShotHelper)
	self.filterGridList:AddEventListener(MouseEvent.MouseClick,self.filterCellClick,self)
	self.filterGridList:ResetDatas(PhotographPanel.filters)

	self.filterBtn = self:FindChild("filterBtn")
	self.quitBtn = self:FindChild("quitBtn")
	self.takePicBtn = self:FindChild("takePicBtn")

	self.fovScrollBar = self:FindChild("FovScrollBar")
	self.fovScrollBarCpt = self:FindGO("BackGround",self.fovScrollBar):GetComponent(UICustomScrollBar)

	self.disScrollBar = self:FindChild("DisScrollBar")
	self.disScrollBarCpt = self:FindGO("BackGround",self.disScrollBar):GetComponent(UICustomScrollBar)

	self.turnRightBtn =  self:FindChild("turnRightBtn")
	self.turnLeftBtn =  self:FindChild("turnLeftBtn")

	self.focusFrame = self:FindGO("focusFrame")
	self.playRotating = self.focusFrame:GetComponent(BoxCollider)

	self.photographResult = self:FindChild("photographResult")
	self.whiteMask = self:FindChild("whiteMask")

	self.focalLen = self:FindGO("focalLen")
	self.focalLenLabel = self:FindGO("Label",self.focalLen):GetComponent(UILabel)
	self:Hide(self.focalLen)

	self.cameraDis = self:FindGO("Distance")
	self.cameraDisLabel = self:FindGO("Label",self.cameraDis):GetComponent(UILabel)
	self:Hide(self.cameraDis)

	self.boliSp = self:FindComponent("boli", UISprite);
	-- self.chatLabel=self:FindGO("chatLabel"):GetComponent(UILabel);
	self:AddButtonEvent("filterBtn",nil)

	-- self.watermarkLabel = self:FindGO("watermark"):GetComponent(UILabel)

	self.emojiButton = self:FindGO("EmojiButton");
	FunctionUnLockFunc.Me():RegisteEnterBtnByPanelID(PanelConfig.ChatEmojiView.id, self.emojiButton)

	self.questPanel = self:FindGO("TaskQuestPanel")

	self.takeTypeBtn = self:FindGO("takeTypeBtn")
	self.callServentBtn = self:FindGO("callServentBtn")
	self.servantEmojiButton = self:FindGO("ServantEmojiButton")
	self:Hide(self.questPanel)
end

function PhotographPanel:initData(  )
	FunctionCameraEffect.Me():Pause()
	-- body
	self.cameraController = CameraController.Instance
	if(not self.cameraController)then
		printRed("cameraController is nil")
		LeanTween.cancel(self.gameObject)
   		LeanTween.delayedCall(self.gameObject,0.1,function (  )
     		self:CloseSelf()
    		end)
		return
	end
	local viewdata = self.viewdata.viewdata
	if(viewdata)then
		local id = viewdata.cameraId
		if(id)then
			printRed("PhotographPanel:from carrier cameraId:",id)
			self.cameraId =  id
		end
	end
	self:checkQuest()

	local skillid = GameConfig.PhotographAdSkill.copSkill

	local skillData = Table_Skill[skillid]

	if(skillData and SkillProxy.Instance:HasLearnedSkill(skillid))then
		self.hasLearnTakePicSkill = true
	end

	skillid = GameConfig.PhotographAdSkill.cgDisSkill

	skillData = Table_Skill[skillid]

	if(skillData and SkillProxy.Instance:HasLearnedSkill(skillid))then
		self.hasLearnChangeCameraSkill = true
	end

	self.channelNames=ChatRoomProxy.Instance.channelNames

	Game.AreaTriggerManager:SetIgnore(true)
	self:changeTurnBtnState(false)
	self.focusSuccess = false
	self.isShowFocalLen = false
	self.hasNotifyServer = false
	self.charid = nil

	self.screenShotWidth = -1
	self.screenShotHeight = 1080
	self.textureFormat = TextureFormat.RGB24
	self.texDepth = 24
	self.antiAliasing = ScreenShot.AntiAliasing.None

	self.photoSkillId = GameConfig.NewRole.flashskill
	self.uiCm = NGUIUtil:GetCameraByLayername("SceneUI");

	local servantID = Game.Myself.data.userdata:Get(UDEnum.SERVANTID)
	if servantID ~= 0 then
		self:Show(self.callServentBtn)
		self:LoadServant()
	else
		self:Hide(self.callServentBtn)
	end

	self:initCameraData()
	TimeTickManager.Me():CreateTick(0,100,self.updateScrollBar,self,PhotographPanel.TickType.Zoom)
	TimeTickManager.Me():CreateTick(500,3000,self.checkIfHasFocusCreature,self,PhotographPanel.TickType.CheckIfHasFocusCreature)

	TimeTickManager.Me():CreateTick(0,100,self.setTargetPositionAndSymbol,self,PhotographPanel.TickType.CheckFocus)

	self.myId = Game.Myself.data.id
end

function PhotographPanel:checkQuest(  )
	-- body
	-- self.viewdata.viewdata = {}
	-- self.viewdata.viewdata.questData = QuestProxy.Instance:getQuestDataByIdAndType(40002)
	if(self.viewdata.viewdata)then
		self.questData = self.viewdata.viewdata.questData
		-- printRed(self.questData)
		if(self.questData)then
			self.creatureId = self.questData.params.npc
			self.questScenicSpotID = self.questData.params.spotId
			local tarpos = self.questData.params.tarpos
			if(not self.creatureId and tarpos)then
				self.questTargetPosition = LuaVector3(tarpos[1],tarpos[2],tarpos[3])
			end
			local id = self.questData.params.cameraId
			if(id)then
				printRed("PhotographPanel:from quest cameraId:",id)
				self.cameraId = id
			end
			self:showQuestTrace()
		end
	end
end

function PhotographPanel:showQuestTrace(  )
	-- body
	self:Show(self.questPanel)
	local taskCell = self:FindGO("TaskCell")
	local taskCellObj = Game.AssetManager_UI:CreateAsset(ResourcePathHelper.UICell("TaskQuestCell"), taskCell);
	taskCellObj.transform.localPosition = LuaVector3.zero
	local questCell = TaskQuestCell.new(taskCellObj)
	questCell:AddEventListener(MouseEvent.MouseClick,self.questCellClick,self)
	questCell:SetData(self.questData)
end

function PhotographPanel:questCellClick(  )
	-- body
	-- printRed("PhotographPanel:questCellClick(  )")
	Game.InputManager.photograph:Exit()
	-- self.cameraController:
	self:setForceRotation()
	if(self.curPhotoMode == PhotographPanel.PhotographMode.SELFIE)then
		Game.InputManager.photograph:Enter(PhotographMode.SELFIE)
	else
		Game.InputManager.photograph:Enter(PhotographMode.PHOTOGRAPHER)
	end
end

function PhotographPanel:calFOVValue( zoom )
	-- body
	local value = 2*math.atan(21.635/zoom)*180/math.pi
	return value
end

function PhotographPanel:calZoom( del )
	-- body
	local value = 21.635/math.tan(del/2/180*math.pi)
	return value
end

function PhotographPanel:SetCompositionIndex(index)
	self.compositionIndex = index
end

function PhotographPanel:MoveCompositionIndexToNext()
	local index = self.compositionIndex + 1
	if nil == self:GetComposition(index) then
		index = 1
	end
	MsgManager.ShowMsgByIDTable(853, tostring(index))
	self:SetCompositionIndex(index)
end

function PhotographPanel:GetComposition(index)
	index = index or self.compositionIndex
	if nil == self.cameraData or nil == self.cameraData.Composition then
		return nil
	end
	return self.cameraData.Composition[index]
end

function PhotographPanel:ApplyComposition()
	local composition = self:GetComposition()
	if nil == composition then
		return
	end
	if nil == self.cameraController then
		return
	end

	local fo = self.cameraController.targetFocusOffset
	local fvp = self.cameraController.targetFocusViewPort

	fvp.x = composition[1]
	fvp.y = composition[2]

	self.cameraController:FocusTo(fo, fvp, PhotographPanel.ChangeCompositionDuration, nil)
end

function PhotographPanel:initCameraData(  )
	-- body
	self.originFovMin = nil
	self.originFovMax = nil
	self.originAllowLowerThanFocus = nil
	if(not self.cameraId)then
		local currentMap = SceneProxy.Instance.currentScene
		if(currentMap)then
			self.cameraId = Table_Map[currentMap.mapID].Camera
		end
	end
	if(not self.cameraId)then
		self.cameraId = 1
	end
	self.cameraData = Table_Camera[self.cameraId]
	if(not self.cameraData or not self.cameraController)then
		return
	end

	local layer = LayerMask.NameToLayer("UI");
	if(layer)then
		self.uiCemera = UICamera.FindCameraForLayer(layer)
		if(self.uiCemera)then
			self.originUiCmTouchDragThreshold = self.uiCemera.touchDragThreshold
			self.uiCemera.touchDragThreshold = 1
		end
	end

	self.originInputTouchSenseInch = Game.InputManager.touchSenseInch
	Game.InputManager.touchSenseInch = 0
	Game.InputManager:ResetParams()

	Game.InputManager.model = InputManager.Model.PHOTOGRAPH
	self.originNearClipPlane = self.cameraController.activeCamera.nearClipPlane
	self.originFarClipPlane = self.cameraController.activeCamera.farClipPlane
	self.cameraController.activeCamera.nearClipPlane = self.cameraData.ClippingPlanes[1]
	self.cameraController.activeCamera.farClipPlane = self.cameraData.ClippingPlanes[2]

	self.originAllowLowerThanFocus = self.cameraController.allowLowerThanFocus
	if(self.cameraData.Y_Limit == 1)then
		self.cameraController.allowLowerThanFocus = false
	elseif(self.cameraData.Y_Limit == 0)then
		self.cameraController.allowLowerThanFocus = true
	else
	end

	self.originFovMin = Game.InputManager.cameraFieldOfViewMin
	self.originFovMax = Game.InputManager.cameraFieldOfViewMax
	local minskillId = GameConfig.PhotographAdSkill.minViewPortSkill
	local maxskillId = GameConfig.PhotographAdSkill.maxViewPortSkill

	local skillData = Table_Skill[minskillId]
	if(SkillProxy.Instance:HasLearnedSkill(minskillId) and skillData)then
		self.fovMin = skillData.Logic_Param.minfov
		self.fovMin = self.fovMin and self.fovMin  or self.cameraData.Zoom[1]
	else
		self.fovMin = self.cameraData.Zoom[1]
	end

	skillData = Table_Skill[maxskillId]
	if(SkillProxy.Instance:HasLearnedSkill(maxskillId) and skillData)then
		self.fovMax = skillData.Logic_Param.maxfov
		self.fovMax = self.fovMax and self.fovMax  or self.cameraData.Zoom[2]
	else
		self.fovMax = self.cameraData.Zoom[2]
	end
	self.fovMinValue = self:calFOVValue(self.fovMax)
	self.fovMaxValue = self:calFOVValue(self.fovMin)
	Game.InputManager.cameraFieldOfViewMin = self.fovMinValue
	Game.InputManager.cameraFieldOfViewMax = self.fovMaxValue

	local danmaku = self.cameraData.Danmaku
	if(not (danmaku == 1))then
		self.flyMessageView:CloseUIWidgets()
	end

	local nearChat = self.cameraData.NearChat
	if(not (nearChat == 1))then

	end

	local close = self.cameraData.Close
	if(not (close == 1))then
		self:Hide(self.quitBtn)
		self.forbiddenClose = true
	else
		self:Show(self.quitBtn)
	end

	local Emoji = self.cameraData.Emoji or 0
	local action = self.cameraData.Act or 0
	self.actEmoj = Emoji*2 + action
	if(self.actEmoj == 0)then
		self:Hide(self.emojiButton)
	end

	local ferrisItem = self.cameraData.FerrisItem
	if(not (ferrisItem == 1))then

	else

	end

	local switchMode = self.cameraData.SwitchMode
	local switchBtn = self:FindGO("modeSwitch")
	if(switchMode ~= 1)then
		self:Hide(switchBtn)
	else
		self:Show(switchBtn)
	end

	self:SetCompositionIndex(1)
	local pgInfo = self.cameraController.photographInfo
	if(pgInfo)then
		self.originFocusViewPort = pgInfo.focusViewPort
		local composition = self:GetComposition()
		if nil ~= composition then
			tempVector3:Set(composition[1],composition[2],self.cameraData.Radius)
		else
			tempVector3:Set(self.originFocusViewPort.x,self.originFocusViewPort.y,self.cameraData.Radius)
		end
		pgInfo.focusViewPort = tempVector3

		local defaultZoom = self.cameraData.DefaultZoom
		-- printRed("defaultZoom"..defaultZoom)
		if(defaultZoom)then
			self.originFieldOfView = pgInfo.fieldOfView
			local fieldOfView = self:calFOVValue(defaultZoom)
			-- printRed("fieldOfView"..fieldOfView)
			pgInfo.fieldOfView = fieldOfView
		end
	end
	local defaultDir = self.cameraData.DefaultDir
	--轉向設定
	if(#defaultDir == 0)then
		if(self.questData)then
			self:setTargetPositionAndSymbol()
			self:calFOVByPos()
		end
	else
		if(not self.forceRotation)then
			self.forceRotation = LuaVector3.zero
		end
		self.forceRotation = LuaVector3( defaultDir[1],defaultDir[2],defaultDir[3])
	end


	local defaultRoleDir = self.cameraData.DefaultRoleDir
	if(defaultRoleDir and #defaultRoleDir ~=0)then
		local x,y,z = Game.Myself.assetRole:GetEulerAnglesXYZ()
		local cx = defaultRoleDir[1] or 0
		local cy = defaultRoleDir[2] or 0
		local cz = defaultRoleDir[3] or 0
		x = x+cx
		y = y+cy
		z = z+cz
		self.forceRotation = LuaVector3( 0,y,z)
	end

	--是否儲存遮蔽設定
	self.isNeedSaveSetting = self.cameraData.SaveSetting
	self.isNeedSaveSetting = self.isNeedSaveSetting and self.isNeedSaveSetting ~= 0 or false
	-- printRed("PhotographPanel:isNeedSaveSetting",self.isNeedSaveSetting)

	local cells = self.filterGridList:GetCells()
	if(self.isNeedSaveSetting)then
		local filters = LocalSaveProxy.Instance:getPhotoFilterSetting(cells)
		for j=1,#cells do
			local single = cells[j]
			-- printRed("fileid:",single.data.id,isFilter)

			-- local isFilter = FunctionPlayerPrefs.Me():hasKey(key)
			-- if(isFilter)then
			local bFilter = filters[single.data.id]
			single:setIsSelect(bFilter)
			if(not bFilter) then
				self:filterCellClick(single)
			end
			-- end
		end
	else
		--預設遮蔽
		self.defaultHide = self.cameraData.DefaultHide
		if(self.defaultHide and #self.defaultHide>0)then
			for i=1,#self.defaultHide do
				local fileterItem = self.defaultHide[i]
				for j=1,#cells do
					local single = cells[j]
					if(fileterItem == single.data.id)then
						single:setIsSelect(false)
						self:filterCellClick(single)
					end
				end
			end
		end
	end

	self.originStickArea = Game.InputManager.forceJoystickArea

	local StickArea = self.cameraData.StickArea
	if(StickArea and #StickArea>1 and StickArea[1] >0 and StickArea[2]>0)then
		self.selfieStickArea = Rect(0,0,StickArea[1],StickArea[2])
	end

	--controlled by the adventure skill
	local defaultMode = self.cameraData.DefaultMode
	if(defaultMode == PhotographPanel.DefaultMode.PHOTOGRAPHER)then
		self:changePhotoMode(PhotographPanel.PhotographMode.PHOTOGRAPHER)
	else
		self:changePhotoMode(PhotographPanel.PhotographMode.SELFIE)
		LeanTween.delayedCall(self.cameraDis,1,function ( )
			-- body
			self:updateDisScrollBar()
		end)
	end
end

local tempLuaQuaternion = LuaQuaternion.identity

function PhotographPanel:calFOVByPos(  )
	-- body
	-- local topCp = SkillUtils.GetEffectPointGameObject(self.role, SkillConfig.ROLE_CP_HAIR);

	local position
	if(self.creatureGuid)then
		local creatureObj = SceneCreatureProxy.FindCreature(self.creatureGuid)
		if(creatureObj)then
			local topFocusUI = creatureObj:GetSceneUI().roleTopUI.topFocusUI
			position = topFocusUI:getPosition()
			-- LogUtility.InfoFormat("calFOVByPos creatureGuid Pos = {0}",LogUtility.ToString(position))
		end
	elseif(self.symbol)then
		position = self.symbol:getTarPosition()
		-- LogUtility.InfoFormat("calFOVByPos self.symbol Pos = {0}",LogUtility.ToString(position))
	end
	if(position)then
		local cpTransform = Game.Myself.assetRole:GetCPOrRoot(RoleDefines_CP.Hair)
	-- if(cpTransform)then
		tempVector3:Set(LuaGameObject.GetPosition(cpTransform))
		LuaVector3.Better_Sub(position,tempVector3,tempVector3)
		LuaQuaternion.Better_LookRotation(tempVector3,LuaVector3.up,tempLuaQuaternion)
		if(not self.forceRotation)then
			self.forceRotation = LuaVector3.zero
		end
		tempLuaQuaternion:Better_GetEulerAngles(tempVector3)
		self.forceRotation = tempVector3:Clone()
	end
end

function PhotographPanel:resetCameraData(  )
	-- body

	local cameraMode = FunctionPerformanceSetting.Me():GetCameraMode()
	if cameraMode == 0 then
		Game.InputManager.model = InputManager.Model.DEFAULT
	elseif cameraMode == 1 then
		Game.InputManager.model = InputManager.Model.FREE
	else
		Game.InputManager.model = InputManager.Model.PHOTOGRAPH
	end

	if nil ~= self.cameraController then
		if(self.originAllowLowerThanFocus)then
			self.cameraController.allowLowerThanFocus = self.originAllowLowerThanFocus
		end
		if(self.originNearClipPlane)then
			self.cameraController.activeCamera.nearClipPlane = self.originNearClipPlane
			self.cameraController.activeCamera.farClipPlane = self.originFarClipPlane
		end
		if(self.originFocusViewPort)then
			self.cameraController.photographInfo.focusViewPort = self.originFocusViewPort
		end
		if(self.originFieldOfView)then
			self.cameraController.photographInfo.fieldOfView = self.originFieldOfView
		end
	end

	if(self.originStickArea)then
		Game.InputManager.forceJoystickArea = self.originStickArea
	end

	if(self.originFovMax)then
		Game.InputManager.cameraFieldOfViewMin = self.originFovMin
		Game.InputManager.cameraFieldOfViewMax = self.originFovMax
	end
end

-- function PhotographPanel:getFieldOfView( value )
-- 	-- body
-- 	for i=1,#GameConfig.PhotoFocalLength do
-- 		local single = GameConfig.PhotoFocalLength[i]
-- 		if(value > single.min and value < single.max)then
-- 			local tmp = single.value + (GameConfig.PhotoFocalLength[i-1].value - single.value)*((value - single.max)/(GameConfig.PhotoFocalLength[i-1].max - single.max))
-- 			return tmp
-- 		elseif(value == single.max)then
-- 			return single.value
-- 		end
-- 	end
-- end

function PhotographPanel:changeShowFocalLen( isShow )
	-- body
	if(Slua.IsNull(self.focalLen))then
		return
	end
	local value = self.fovScrollBarCpt.value
	local fieldOfView = (self.fovMax - self.fovMin) * value + self.fovMin
	fieldOfView = math.floor(fieldOfView + 0.5)
	self.focalLenLabel.text = fieldOfView.."mm"

	if(self.isShowFocalLen ~= isShow and self.focalLen)then
		self.focalLen:SetActive(isShow)
		self.isShowFocalLen = isShow
		if(isShow)then
			LeanTween.cancel(self.focalLen)
			LeanTween.delayedCall(self.focalLen,1,function ( )
				-- body
				self.isShowFocalLen = false
				self:Hide(self.focalLen)
			end)
		end
	end
end

function PhotographPanel:changeShowDisLen( isShow )
	-- body
	local value = self.disScrollBarCpt.value
	local cameraDis = (10 - 3) * value + 3
	cameraDis = math.floor(cameraDis + 0.5)
	self.cameraDisLabel.text = string.format(ZhString.PhotoCameraDisTip, cameraDis)
	self.boliSp.height = 75 + value*(430 - 75)
	if(self.isShowcameraDisLabel ~= isShow)then
		self.cameraDis:SetActive(isShow)
		self.isShowcameraDisLabel = isShow
		if(isShow)then
			LeanTween.cancel(self.cameraDis)
			LeanTween.delayedCall(self.cameraDis,1,function ( )
				-- body
				self.isShowcameraDisLabel = false
				self:Hide(self.cameraDis)
			end)
		end
	end
end

function PhotographPanel:addEventListener( )

	self:AddButtonEvent("quitBtn",function ( go )
		-- body
		--SceneUIManager.Instance:ResetFlyingMessage()
		FunctionBarrage.Me():ShutDown()
		self:CloseSelf();
	end)

	self:AddClickEvent(self.takePicBtn,function ( go )
		self:takePic()
		AudioUtility.PlayOneShot2D_Path(ResourcePathHelper.AudioSEUI(AudioMap.UI.Picture));
	end)

	self:AddButtonEvent("modeSwitch",function ( go )
		local mode = self.curPhotoMode == PhotographPanel.PhotographMode.SELFIE and PhotographPanel.PhotographMode.PHOTOGRAPHER or PhotographPanel.PhotographMode.SELFIE

		local isDead = Game.Myself:IsDead()
		if(isDead)then
			MsgManager.ShowMsgByID(2500)
			return
		end

		if(mode == PhotographPanel.PhotographMode.PHOTOGRAPHER)then
			if(not SkillProxy.Instance:HasLearnedSkill(GameConfig.PhotographAdSkill.freeViewSkill))then
				MsgManager.ShowMsgByID(557)
				return
			end
		end
		self:changePhotoMode(mode)
	end)

	self:AddClickEvent(self.emojiButton, function (go)
		if(not self.isEmojiShow)then
			self.isEmojiShow = true;
			local forbidAction = self.actEmoj
			if(self.actEmoj == 1 and self.curPhotoMode == PhotographPanel.PhotographMode.PHOTOGRAPHER)then
				forbidAction = 0
			elseif(self.actEmoj == 3 and self.curPhotoMode == PhotographPanel.PhotographMode.PHOTOGRAPHER)then
				forbidAction = 1
			end
			self:sendNotification(UIEvent.JumpPanel, {view = PanelConfig.ChatEmojiView, viewdata = {state = forbidAction}});

		else
			self.isEmojiShow = false;
			self:sendNotification(UIEvent.CloseUI, UIViewType.ChatLayer);
		end
	end);

	self:AddClickEvent(self.takeTypeBtn, function (go)
		self:MoveCompositionIndexToNext()
		self:ApplyComposition()
	end);

	self:AddClickEvent(self.callServentBtn, function (go)
		self:TriggerServant()
	end);

	self:AddPressEvent(self.focusFrame,function ( obj,state )
		-- body
		self:changeTurnBtnState(state)
	end)

	self:AddDragEvent(self.focusFrame,function ( obj,delta )
		-- body
		local toY = Game.Myself:GetAngleY() - delta.x;
		Game.Myself:Client_SetDirCmd(AI_CMD_SetAngleY.Mode.SetAngleY, toY,true)
	end)

	EventDelegate.Add(self.fovScrollBarCpt.onChange, function (  )
		-- body
		if not self.fovScrollBarCpt.isDragging or self:ObjIsNil(self.cameraController) then
			return
		end
		local value = self.fovScrollBarCpt.value
		local zoom = (self.fovMax - self.fovMin) * value + self.fovMin
		local fieldOfView = self:calFOVValue(zoom)
		self.cameraController:ResetFieldOfView(fieldOfView)
		self:changeShowFocalLen(true)
	end);

	EventDelegate.Add(self.disScrollBarCpt.onChange, function (  )
		-- body
		if self:ObjIsNil(self.cameraController) then
			return
		end
		local value = self.disScrollBarCpt.value
		local focusViewPort = self.cameraController.focusViewPort
		-- self:Log(focusViewPort.x,focusViewPort.y,focusViewPort.z)
		local zoom = (10- 3) * value + 3
		local port = LuaVector3(focusViewPort.x,focusViewPort.y,zoom)
		self.cameraController:ResetFocusViewPort(port)
		self:changeShowDisLen(true)
	end);

	self:AddClickEvent(self.servantEmojiButton, function ( go )
		GameFacade.Instance:sendNotification(UIEvent.ShowUI,{viewname = "ServantEmojiView", npc = self.servant, npcId = self.servantId})
	end)

	self:AddListenEvt(SceneUserEvent.SceneAddPets, self.HandleAddServant)
end

function PhotographPanel:checkIfHasFocusCreature(  )
	-- body
	-- printRed("checkIfHasFocusCreature")
	local nearDis = GameConfig.PhotographPanel.Near_Focus_Distance_Monster
	nearDis = nearDis and nearDis or PhotographPanel.NEAR_FOCUS_DISTANCE
	-- self:Log("nearDis",nearDis)
	local nearMonster = NSceneNpcProxy.Instance:FindNearNpcs(Game.Myself:GetPosition(),nearDis,function ( npc )
		-- body
		local pos = npc:GetPosition()
		local cmd = FunctionPhoto.Me():GetCmd(PhotoCommandShowGhost)
		-- self:Log("checkFocus",nearDis)
		if(self:checkFocus(Game.Myself:GetPosition(),pos,nearDis) == PhotographPanel.FocusStatus.Fit)then
			if(cmd and SkillProxy.Instance:HasLearnedSkill(GameConfig.PhotographAdSkill.gostSkill))then
				cmd:GhostInSight(npc)
			end
			return true
		else
			if(cmd and SkillProxy.Instance:HasLearnedSkill(GameConfig.PhotographAdSkill.gostSkill))then
				cmd:GhostOutSight(npc)
			end
		end
	end)
	-- printRed(#nearMonster)
	local data = ReusableTable.CreateArray()
	for i=1,#nearMonster do
		table.insert(data,nearMonster[i].data.id)
		-- printRed("guid----:"..nearMonster[i].id)
	end
	if(#data > 0)then
		-- if(self.curPhotoMode == PhotographPanel.PhotographMode.PHOTOGRAPHER)then
			ServiceNUserProxy.Instance:CallCameraFocus(data)
			ReusableTable.DestroyArray(data)
		-- else
			-- self:playAction(nearMonster)
		-- end
	end
end

function PhotographPanel:getValidScenery( scenicSpotID )
	-- body
	local scenicSpot
	if(scenicSpotID)then
		scenicSpot = FunctionScenicSpot.Me():GetScenicSpot(scenicSpotID)
		if(scenicSpot)then
			local camera = self.cameraController.activeCamera
			local viewport = camera:WorldToViewportPoint(scenicSpot.position)
			-- print(string.format("<color=yellow>GetNearestScenicSpot: </color>[%d] viewPort=(%f,%f,%f)",
			-- 		ss.ID, viewport.x, viewport.y, viewport.z))
			if not( 0 < viewport.x and 1 > viewport.x
				and 0 < viewport.y and 1 > viewport.y
				and camera.nearClipPlane < viewport.z and camera.farClipPlane > viewport.z) then
				scenicSpot = nil
			end
		end
	else
		local cameraPos = self.cameraController.activeCamera.transform.position
		scenicSpot = FunctionScenicSpot.Me():GetNearestScenicSpot(cameraPos, self.cameraController.activeCamera)
	end

	if(scenicSpot)then
		self.charid = scenicSpot.guid
		local result = self:checkFocus(Game.Myself:GetPosition(),scenicSpot.position)
		if(result ~= PhotographPanel.FocusStatus.FarMore )then
			return scenicSpot
		end
	end
end

function PhotographPanel:getValidCreature( )
	-- body
	local creatureObj = NSceneNpcProxy.Instance:FindNearestNpc(Game.Myself:GetPosition(),self.creatureId)
	if(creatureObj)then
		local result = self:checkFocus(Game.Myself:GetPosition(),creatureObj:GetPosition())
		if(result ~= PhotographPanel.FocusStatus.FarMore)then
			return creatureObj
		end
	end
end

function PhotographPanel:removeCreatureTopFocusUI( )
	-- body
	if(self.creatureGuid)then
		local creatureObj = SceneCreatureProxy.FindCreature(self.creatureGuid)
		if(creatureObj)then
			creatureObj:GetSceneUI().roleTopUI:DestroyTopFocusUI()
		end
	end
	self.creatureGuid = nil
end

function PhotographPanel:removeSceneFocusUI( )
	-- body
	if(not self.symbol)then
		return
	end
	if(self.symbol:Alive())then
		ReusableObject.Destroy(self.symbol)
	end
	self.symbol = nil
end

local topFocusUIData = {}

function PhotographPanel:setTargetPositionAndSymbol(  )
	-- body
	local symbol
	if(self.creatureId)then
		if(self.creatureGuid)then
			local creatureObj = SceneCreatureProxy.FindCreature(self.creatureGuid)
			if(creatureObj)then
				local result = self:checkFocus(Game.Myself:GetPosition(),creatureObj:GetPosition())
				if(result == PhotographPanel.FocusStatus.FarMore)then
					--out of focus max distance
					--exsit valid creature remove old focusUI add new focusUI
					--not exsit valid creature
					local validCreatureObj = self:getValidCreature()
					if(validCreatureObj)then
					    self:removeCreatureTopFocusUI()
						self.creatureGuid = validCreatureObj.data.id
						symbol = validCreatureObj:GetSceneUI().roleTopUI:createOrGetTopFocusUI()
					else
						symbol = creatureObj:GetSceneUI().roleTopUI.topFocusUI
					end
				else
					--in focus max distance change focus animation
					symbol = creatureObj:GetSceneUI().roleTopUI.topFocusUI
				end
			else
				--creature has gone !relook
				--remove old focusUI
				self:removeCreatureTopFocusUI()
				creatureObj = self:getValidCreature()
				if(creatureObj)then
					self.creatureGuid = creatureObj.data.id
					symbol = creatureObj:GetSceneUI().roleTopUI:createOrGetTopFocusUI()
				end
			end
		else
			creatureObj = self:getValidCreature()
			if(creatureObj)then
				self.creatureGuid = creatureObj.data.id
				symbol = creatureObj:GetSceneUI().roleTopUI:createOrGetTopFocusUI()
				-- self:Log("find creature by id",self.creatureId,self.creatureGuid)
			else
				-- self:Log("not creature by id",self.creatureId)
			end
		end
	elseif(self.questTargetPosition)then
		local result = self:checkFocus(Game.Myself:GetPosition(),self.questTargetPosition)
		if(result ~= PhotographPanel.FocusStatus.FarMore)then
			if(not self.symbol)then
				TableUtility.ArrayClear(topFocusUIData)
				topFocusUIData[1] = SceneTopFocusUI.FocusType.SceneObject
				self.symbol = SceneTopFocusUI.CreateAsArray(topFocusUIData)
			end
			-- LogUtility.Info("questTargetPosition")

			self.symbol:reSetFollowPos(self.questTargetPosition)
		end
	elseif(self.questScenicSpotID)then
		local scenicSpot = self:getValidScenery(self.questScenicSpotID)
		if(scenicSpot)then
			local pos = scenicSpot.position
			if(not self.symbol)then
				TableUtility.ArrayClear(topFocusUIData)
				topFocusUIData[1] = SceneTopFocusUI.FocusType.SceneObject
				self.symbol = SceneTopFocusUI.CreateAsArray(topFocusUIData)
			end
			self.scenicSpotID = scenicSpot.ID
			self.symbol:reSetFollowPos(pos)
		end
	end
	--no focus target then find scenery around
	if(not symbol)then
		local scenicSpot = self:getValidScenery()
		if(not self.symbol)then
			if(scenicSpot)then
				--no quest target or early scenery and has valid scenery
				--create
				local pos = scenicSpot.position
				TableUtility.ArrayClear(topFocusUIData)
				topFocusUIData[1] = SceneTopFocusUI.FocusType.SceneObject
				self.symbol = SceneTopFocusUI.CreateAsArray(topFocusUIData)
				self.symbol:reSetFollowPos(pos)
				self.scenicSpotID = scenicSpot.ID
				symbol = self.symbol
				LogUtility.InfoFormat("creat 1 x:{0},y:{1},z:{2}",pos.x,pos.y,pos.z)
			end
		else
			if(not self.questScenicSpotID and not self.questTargetPosition)then
				local pos = self.symbol:getPosition()
				if(scenicSpot and not pos:Equal(scenicSpot.position))then
					local oldResult = self:checkFocus(Game.Myself:GetPosition(),pos)
					local newResult = self:checkFocus(Game.Myself:GetPosition(),scenicSpot.position)
					if(oldResult == PhotographPanel.FocusStatus.FarMore)then
						--early target is out of max distance and has valid scenery or use pre symbol
						pos = scenicSpot.position
						self.symbol:reSetFollowPos(pos)
						self.scenicSpotID = scenicSpot.ID
					elseif(oldResult ~= PhotographPanel.FocusStatus.Fit and newResult ~= PhotographPanel.FocusStatus.FarMore)then
						pos = scenicSpot.position
						self.symbol:reSetFollowPos(pos)
						self.scenicSpotID = scenicSpot.ID
					elseif(self.scenicSpotID == scenicSpot.ID)then
						pos = scenicSpot.position
						self.symbol:reSetFollowPos(pos)
					end
					-- LogUtility.InfoFormat("creat 2 x:{0},y:{1},z:{2}",pos.x,pos.y,pos.z)
				elseif(not scenicSpot)then
					self:removeSceneFocusUI()
					self.scenicSpotID = nil
				end
			end
			symbol = self.symbol
		end
	end

	if(symbol)then
		self:changeFocusStatus(symbol)
	end
end

function PhotographPanel:getSceneFocusUI(  )
	-- body
	local symbol
	if(self.creatureGuid)then
		local creatureObj = SceneCreatureProxy.FindCreature(self.creatureGuid)
		if(creatureObj)then
			symbol = creatureObj:GetSceneUI().roleTopUI.topFocusUI
		end
	elseif(self.symbol)then
		symbol = self.symbol
	end
	return symbol
end

function PhotographPanel:checkFocus_N(creature,nearFocus)
	local result
	-- printRed("checkFocus")
	local playerPos = Game.Myself:GetPosition()
	local targetPosition = creature:GetPosition()
	local distance = LuaVector3.Distance(playerPos,targetPosition)
	local dis = nearFocus and nearFocus or PhotographPanel.NEAR_FOCUS_DISTANCE
	local isFit = distance <= dis
	if(isFit)then
		-- local isVisible = viewport.x >0.2 and viewport.x <0.8 and viewport.y>0.2 and viewport.y < 0.8 and npcObj.roleAgent.visible
		local viewportRange = PhotographPanel.FOCUS_VIEW_PORT_RANGE
		local viewport = self.uiCm:WorldToViewportPoint(targetPosition)
		local isVisible = viewport.x > viewportRange.x[1]
					  and viewport.x < viewportRange.x[2]
					  and viewport.y > viewportRange.y[1]
					  and viewport.y < viewportRange.y[2]
					  and viewport.z > self.uiCm.nearClipPlane
					  and viewport.z < self.uiCm.farClipPlane
		-- helplog("0:",viewport.x,viewport.y,viewport.z)

		if(isVisible)then
			--滿足條件
			return PhotographPanel.FocusStatus.Fit
		end
		if(creature.assetRole)then
			local epTransform = creature.assetRole:GetEP(RoleDefines_EP.Middle)
			if nil ~= epTransform then
			    tempVector3:Set(LuaGameObject.GetPosition(epTransform))
				viewport = self.uiCm:WorldToViewportPoint(tempVector3)
				isVisible = viewport.x > viewportRange.x[1]
							  and viewport.x < viewportRange.x[2]
							  and viewport.y > viewportRange.y[1]
							  and viewport.y < viewportRange.y[2]
							  and viewport.z > self.uiCm.nearClipPlane
							  and viewport.z < self.uiCm.farClipPlane
				-- helplog("1:",viewport.x,viewport.y,viewport.z)

				if(isVisible)then
					--滿足條件
					return PhotographPanel.FocusStatus.Fit
				end
			end

			epTransform = creature.assetRole:GetEP(RoleDefines_EP.Top)
			if nil ~= epTransform then
			    tempVector3:Set(LuaGameObject.GetPosition(epTransform))
				viewport = self.uiCm:WorldToViewportPoint(tempVector3)
				isVisible = viewport.x > viewportRange.x[1]
							  and viewport.x < viewportRange.x[2]
							  and viewport.y > viewportRange.y[1]
							  and viewport.y < viewportRange.y[2]
							  and viewport.z > self.uiCm.nearClipPlane
							  and viewport.z < self.uiCm.farClipPlane
				-- helplog("2:",viewport.x,viewport.y,viewport.z)
				if(isVisible)then
					--滿足條件
					return PhotographPanel.FocusStatus.Fit
				end
			end
		end
		return PhotographPanel.FocusStatus.Less
	elseif(distance <= PhotographPanel.FAR_FOCUS_DISTANCE)then --小於40米
		result = PhotographPanel.FocusStatus.Less
	else
		result = PhotographPanel.FocusStatus.FarMore
	end
	return result
end

function PhotographPanel:checkFocus(playerPos ,targetPosition,nearFocus)
	-- body
	local result
	-- printRed("checkFocus")
	local distance = LuaVector3.Distance(playerPos,targetPosition)
	local dis = nearFocus and nearFocus or PhotographPanel.NEAR_FOCUS_DISTANCE
	local isFit = distance <= dis
	if(isFit)then
		local viewport = self.uiCm:WorldToViewportPoint(targetPosition)
		-- local isVisible = viewport.x >0.2 and viewport.x <0.8 and viewport.y>0.2 and viewport.y < 0.8 and npcObj.roleAgent.visible
		local viewportRange = PhotographPanel.FOCUS_VIEW_PORT_RANGE
		local isVisible = viewport.x > viewportRange.x[1]
					  and viewport.x < viewportRange.x[2]
					  and viewport.y > viewportRange.y[1]
					  and viewport.y < viewportRange.y[2]
					  and viewport.z > self.uiCm.nearClipPlane
					  and viewport.z < self.uiCm.farClipPlane
		if(isVisible)then
			--滿足條件
			result = PhotographPanel.FocusStatus.Fit
		else
			result = PhotographPanel.FocusStatus.Less
		end
	elseif(distance <= PhotographPanel.FAR_FOCUS_DISTANCE)then --小於40米
		result = PhotographPanel.FocusStatus.Less
	else
		result = PhotographPanel.FocusStatus.FarMore
	end
	return result
end

function PhotographPanel:changeFocusStatus( symbol )
	-- body
	if(not symbol)then
		return
	end
	local status = self:checkFocus(Game.Myself:GetPosition(),symbol:getPosition())

	if(self.status ~= status)then
		if(status == PhotographPanel.FocusStatus.Fit)then
			symbol:Show()
			symbol:playFocusAnim()
			self.focusSuccess = true
			self:setTakePicEnable(true)
		elseif(status == PhotographPanel.FocusStatus.Less)then
			--聚焦框消失
			self:setTakePicEnable(false)
			symbol:Show()
			symbol:playLostFocusAnim()
			self.focusSuccess = false
		else
			self:setTakePicEnable(false)
			symbol:Hide()
			self.focusSuccess = false
		end
		self.status = status
	end
end

function PhotographPanel:setTakePicEnable( isEnabled )
	-- body
	if(self.questData)then
		local box = self.takePicBtn:GetComponent(BoxCollider)
		local sprite = self.takePicBtn:GetComponent(UISprite)
		local icon = self:FindGO("icon",self.takePicBtn):GetComponent(UISprite)
		local button = self.takePicBtn:GetComponent(UIButton)
		if(isEnabled)then
			button.isEnabled = true
		else
			button.isEnabled = false
		end
	end
end

function PhotographPanel:updateScrollBar(  )
	if self.fovScrollBarCpt.isDragging or self:ObjIsNil(self.cameraController) then
		return
	end

	if(Slua.IsNull(self.fovScrollBarCpt))then
		return
	end
	local fieldOfView = self.cameraController.cameraFieldOfView

	fieldOfView = Mathf.Clamp(fieldOfView, self.fovMinValue, self.fovMaxValue)
	local fov = self:calZoom(fieldOfView)
	local sclValue = (fov - self.fovMin)/(self.fovMax - self.fovMin)
	sclValue = (math.floor(sclValue*100+0.5))/100
	local barCptValue = (math.floor(self.fovScrollBarCpt.value*100+0.5))/100
	if(sclValue ~= barCptValue)then
		self.fovScrollBarCpt.value = sclValue
		self:changeShowFocalLen(true)
	end
end

function PhotographPanel:updateDisScrollBar(  )
	if self.disScrollBarCpt.isDragging or self:ObjIsNil(self.cameraController) then
		return
	end
	local dis = self.cameraController.focusViewPort.z
	local sclValue = (dis - 3)/(10 - 3)
	sclValue = (math.floor(sclValue*100+0.5))/100
	local barCptValue = (math.floor(self.disScrollBarCpt.value*100+0.5))/100
	if(sclValue ~= barCptValue)then
		self.disScrollBarCpt.value = sclValue
		self:changeShowDisLen(true)
	end
end

function PhotographPanel:changeTurnBtnState( visible )
	self.turnRightBtn:SetActive(visible)
	self.turnLeftBtn:SetActive(visible)
end

function PhotographPanel:OnEnter()
	FunctionPhoto.Me():Launch()
end

function PhotographPanel:OnExit()
	FunctionPhoto.Me():ShutDown()
	TimeTickManager.Me():ClearTick(self)
	self.needCheckReady = false
	self.focusSuccess = false

	FunctionSceneFilter.Me():EndFilter(GameConfig.FilterType.PhotoFilter)
	FunctionSceneFilter.Me():EndFilter(FunctionSceneFilter.AllEffectFilter)
	if(self.defaultHide)then
		for i=1,#self.defaultHide do
			local fileterItem = self.defaultHide[i]
			FunctionSceneFilter.Me():EndFilter(fileterItem)
		end
	end
	self:removeSceneFocusUI()
	self:removeCreatureTopFocusUI()
	if(self.cameraAxisY)then
		Game.Myself:Client_SetDirCmd(AI_CMD_SetAngleY.Mode.SetAngleY, self.cameraAxisY)

		-- self.role.rotation = Quaternion.Euler(0,self.cameraAxisY,0);
	end

	-- FunctionSceneFilter.Me():EndFilterByGroup(1)
	-- FunctionSceneFilter.Me():EndFilterByGroup(4)
	Game.AreaTriggerManager:SetIgnore(false)
	if(self.isEmojiShow or self.chatroomShow)then
		self:sendNotification(UIEvent.CloseUI, UIViewType.ChatLayer);
	end

	ServiceNUserProxy.Instance:CallStateChange(ProtoCommon_pb.ECREATURESTATUS_MIN)
	self.super.OnExit(self)

	FunctionCameraEffect.Me():Resume()
	self:resetCameraData()

	--SceneUIManager.Instance:ResetFlyingMessage()
	FunctionBarrage.Me():ShutDown()

	if(self.isNeedSaveSetting)then
		local cells = self.filterGridList:GetCells()
		local list = ReusableTable.CreateTable()
		for j=1,#cells do
			local single = cells[j]
			-- printRed("filtersid:",single.data.id,single:getIsSelect())
			local data = {}
			data.id = single.data.id
			data.isSelect = single:getIsSelect()
			table.insert(list,data)
		end
		LocalSaveProxy.Instance:savePhotoFilterSetting(list)
		ReusableTable.DestroyAndClearTable(list)
	end

	if(self.questData and not self.hasNotifyServer)then
		local cmd = Game.AreaTrigger_Mission
		if(cmd)then
			cmd:ForceReCheck(self.questData.id)
		end
		printRed("self.questData and not self.hasNotifyServe")
	end

	if(self.uiCemera)then
		self.uiCemera.touchDragThreshold = self.originUiCmTouchDragThreshold
	end

	if(self.originInputTouchSenseInch)then
	 	Game.InputManager.touchSenseInch = self.originInputTouchSenseInch
		Game.InputManager:ResetParams()
	end

	-- 女僕
	if self.servant then
		ServiceNUserProxy.Instance:CallShowServantUserCmd(false)
	end

	if(self.servantEffect)then
		self.servantEffect:Destroy();
		self.servantEffect = nil
	end

	self:CancelLeanTween()
end

function PhotographPanel:filterCellClick( obj)
	-- body
	local isSelect = obj:getIsSelect()
	local id = obj.data.id
	if(not isSelect) then
		FunctionSceneFilter.Me():StartFilter(id)
		if(id == GameConfig.FilterType.PhotoFilter.Guild or id == GameConfig.FilterType.PhotoFilter.Team) then
			if(FunctionSceneFilter.Me():IsFilterBy(GameConfig.FilterType.PhotoFilter.Guild) and
				FunctionSceneFilter.Me():IsFilterBy(GameConfig.FilterType.PhotoFilter.Team) ) then
				FunctionSceneFilter.Me():StartFilter(GameConfig.FilterType.PhotoFilter.TeamAndGuild)
			end
		end
	else
		FunctionSceneFilter.Me():EndFilter(id)
		if(id == GameConfig.FilterType.PhotoFilter.Guild or id == GameConfig.FilterType.PhotoFilter.Team) then
			FunctionSceneFilter.Me():EndFilter(GameConfig.FilterType.PhotoFilter.TeamAndGuild)
		end
	end
end

function PhotographPanel:setPhotoResultVisible( state )
	-- body
	self.photographResult:SetActive(state)
end

function PhotographPanel:preTakePic(  )
	-- body

	local symbol = self:getSceneFocusUI()
	if(symbol)then
		symbol:Hide()
	end
	local nearDis = GameConfig.PhotographPanel.Near_Focus_Distance_Monster
	nearDis = nearDis and nearDis or PhotographPanel.NEAR_FOCUS_DISTANCE
	local nearMonster = NSceneNpcProxy.Instance:FindNearNpcs(Game.Myself:GetPosition(),nearDis,function ( npc )
	-- body
		if(self:checkFocus_N(npc,nearDis) == PhotographPanel.FocusStatus.Fit)then
			return true
		end
	end)


	local nearPlayers = NSceneUserProxy.Instance:FindNearUsers(Game.Myself:GetPosition(),nearDis,function ( npc )
	-- body
		if(self:checkFocus_N(npc,nearDis) == PhotographPanel.FocusStatus.Fit)then
			return true
		end
	end)

	local selfPos = Game.Myself:GetPosition()
	if(self:checkFocus_N(Game.Myself,nearDis) == PhotographPanel.FocusStatus.Fit)then
		nearPlayers[#nearPlayers+1] =  Game.Myself
	end

	local phaseData = SkillPhaseData.Create(self.photoSkillId)
	for i=1,#nearMonster do
		-- helplog("nearMonster checkFocus_N:",nearMonster[i].data.id)
		phaseData:AddTarget(nearMonster[i].data.id, 1, 1)
	end
	for i=1,#nearPlayers do
		-- helplog("nearPlayers checkFocus_N:",nearPlayers[i].data.id)
		phaseData:AddTarget(nearPlayers[i].data.id, 1, 1)
	end
	phaseData:SetSkillPhase(SkillPhase.Attack)
	Game.Myself:Client_UseSkillHandler(0, phaseData)
	phaseData:Destroy()
	phaseData = nil

	if(self.curPhotoMode == PhotographPanel.PhotographMode.PHOTOGRAPHER)then
		ServiceNUserProxy.Instance:CallPhoto(Game.Myself.data.id)
	end
	if(self.focusSuccess )then
		if(self.questData and not self.hasNotifyServer)then
			local questData = self.questData
			QuestProxy.Instance:notifyQuestState(questData.id,questData.staticData.FinishJump)
			self.hasNotifyServer = true
		end
		-- if(self.scenicSpotID)then
		-- 	FunctionScenicSpot.Me():InvalidateScenicSpot(self.scenicSpotID)
		-- end
	else
	end

	ResourceManager.Instance:GC()
	MyLuaSrv.Instance:LuaManualGC()
end

function PhotographPanel:doneTakePic(  )
	-- body
	local symbol = self:getSceneFocusUI()
	if(symbol)then
		symbol:Show()
	end

	if(symbol and self.focusSuccess )then
		symbol:playStopFocusAnim()
	end
	-- self:Hide(self.watermarkLabel.gameObject)
end

function PhotographPanel:takePic(  )
	-- body
	self:preTakePic()

	local gmCm = NGUIUtil:GetCameraByLayername("Default");
	local bgCm = NGUIUtil:GetCameraByLayername("SceneUIBackground");
	local uiBgCm = NGUIUtil:GetCameraByLayername("UIBackground");
	local _,_,anglez = LuaGameObject.GetEulerAngles(gmCm.transform)
	anglez = GeometryUtils.UniformAngle(anglez)
	local ui = NGUIUtil:GetCameraByLayername("UI");
	-- self.screenShotHelper:Setting()
    -- local cm = GameObject.Instantiate(ui)
    -- cm.name = "PhotographPanel"
    -- local layer = LayerMask.NameToLayer("PhotographPanel")
    -- layer = BitUtil.lshift(1,layer)
    -- cm.cullingMask = layer
    self.screenShotHelper:Setting(self.screenShotWidth, self.screenShotHeight, self. textureFormat, self.texDepth, self.antiAliasing)
	if(self.textInvisible)then
		-- self.screenShotHelper:GetScreenShot(function ( texture )
		-- -- body
			-- self.infoTexture = texture
			self.screenShotHelper:GetScreenShot(function ( texture )
				local viewdata
				if self.focusSuccess then	-- body
					viewdata = {charid = self.charid,forbiddenClose = self.forbiddenClose ,viewname = "PhotographResultPanel",anglez = anglez,cameraData =self.cameraData,questData = self.questData,texture = texture,arg = self.focalLenLabel.text,scenicSpotID = self.scenicSpotID}
				else
					viewdata = {charid = self.charid,forbiddenClose = self.forbiddenClose ,viewname = "PhotographResultPanel",anglez = anglez,cameraData =self.cameraData,texture = texture,arg = self.focalLenLabel.text}
				end
				self:sendNotification(UIEvent.ShowUI,viewdata)

				self:doneTakePic()
				-- GameObject.DestroyImmediate(cm.gameObject)
			end,bgCm,uiBgCm,gmCm)
		-- end,bgCm,uiBgCm,gmCm,cm)
	else
		-- self.screenShotHelper:GetScreenShot(function ( texture )
		-- -- -- body
		-- 	self.infoTexture = texture
			self.screenShotHelper:GetScreenShot(function ( texture )
			-- body
				local viewdata
				if self.focusSuccess then
					viewdata = {charid  = self.charid,forbiddenClose = self.forbiddenClose , viewname = "PhotographResultPanel",anglez = anglez,cameraData =self.cameraData, questData = self.questData,texture = texture,arg = self.focalLenLabel.text,scenicSpotID = self.scenicSpotID}
				else
					viewdata = {charid = self.charid,forbiddenClose = self.forbiddenClose ,viewname = "PhotographResultPanel",anglez = anglez,cameraData =self.cameraData,texture = texture,arg = self.focalLenLabel.text}
				end
				self:sendNotification(UIEvent.ShowUI,viewdata)
				self:doneTakePic()
				-- GameObject.DestroyImmediate(cm.gameObject)
			end,bgCm,uiBgCm,gmCm,self.uiCm)
		-- end,bgCm,uiBgCm,gmCm,self.uiCm,cm)
	end
end

function PhotographPanel:setForceRotation(  )
	-- body
	self:calFOVByPos()
	if nil ~= self.forceRotation then
		Game.InputManager.photograph.useForceRotation = true
		Game.InputManager.photograph.forceRotation = self.forceRotation
	else
		Game.InputManager.photograph.useForceRotation = false
	end
end

function PhotographPanel:changePhotoMode( mode )
	-- body
	if(self.curPhotoMode ~= mode )then
		self.curPhotoMode = mode
		self:setForceRotation()
		if(self.curPhotoMode == PhotographPanel.PhotographMode.SELFIE)then
			if(self.selfieStickArea)then
				Game.InputManager.forceJoystickArea = self.selfieStickArea
			end
			Game.InputManager.photographMode = PhotographMode.SELFIE
			self.curPhotoMode = PhotographPanel.PhotographMode.SELFIE
			self.playRotating.enabled = true
			TimeTickManager.Me():ClearTick(self,PhotographPanel.TickType.UpdateAxis)
			ServiceNUserProxy.Instance:CallStateChange(ProtoCommon_pb.ECREATURESTATUS_SELF_PHOTO)
			if(self.cameraAxisY)then

				Game.Myself:Client_SetDirCmd(AI_CMD_SetAngleY.Mode.SetAngleY, self.cameraAxisY,true)
				-- self.role.rotation = Quaternion.Euler(0,self.cameraAxisY,0);
				self.cameraAxisY = nil
			end
			self.needCheckReady = false
			self:endFilterInSelfieMode()
			self:sendNotification(PhotographModeChangeEvent.ModeChangeEvent,self.actEmoj);
		else
			if(self.selfieStickArea)then
				Game.InputManager.forceJoystickArea = PHOTOGRAPHER_StickArea
			end
			Game.InputManager.photographMode = PhotographMode.PHOTOGRAPHER
			self.curPhotoMode = PhotographPanel.PhotographMode.PHOTOGRAPHER
			self.playRotating.enabled = false
			-- local site = GameConfig.EquipType[12].site
			-- for i=1,#site do
			-- 	local comp = BagProxy.Instance.roleEquip:GetEquipBySite(site[i])
			-- 	if(comp)then
			-- 		ServiceItemProxy.Instance:CallEquip(SceneItem_pb.EEQUIPOPER_OFF, nil, comp.id)
			-- 	end
			-- end
			self.needCheckReady = true
			ServiceNUserProxy.Instance:CallStateChange(ProtoCommon_pb.ECREATURESTATUS_PHOTO)
			local forbidAction = self.actEmoj
			if(self.actEmoj == 1 and self.curPhotoMode == PhotographPanel.PhotographMode.PHOTOGRAPHER)then
				forbidAction = 0
			elseif(self.actEmoj == 3 and self.curPhotoMode == PhotographPanel.PhotographMode.PHOTOGRAPHER)then
				forbidAction = 1
			end
			self:sendNotification(PhotographModeChangeEvent.ModeChangeEvent,forbidAction);
			TimeTickManager.Me():CreateTick(500,100,self.updateCameraAxis,self,PhotographPanel.TickType.UpdateAxis)
		end
		self:changeTakeTypeBtnView()
		self:changeCameraDisView()
	end
end

function PhotographPanel:endFilterInSelfieMode(  )
	-- body
	local cells = self.filterGridList:GetCells()
	for i=1,#cells do
		local single = cells[i]
		if(GameConfig.FilterType.PhotoFilter.Self == single.data.id and single:getIsSelect())then
			FunctionSceneFilter.Me():EndFilter(GameConfig.FilterType.PhotoFilter.Self)
		end
	end
end

function PhotographPanel:updateCameraAxis(  )
	-- body
	local axisY = self.uiCm.transform.rotation.eulerAngles.y%360
	self.cameraAxisY = self.cameraAxisY or 0
	local diff = math.abs(self.cameraAxisY - axisY)
	if(diff > 5)then
		--notify
		ServiceNUserProxy.Instance:CallStateChange(ProtoCommon_pb.ECREATURESTATUS_PHOTO)
		self.cameraAxisY = axisY
		Game.Myself:Client_SetDirCmd(AI_CMD_SetAngleY.Mode.SetAngleY, self.cameraAxisY,true)

		-- self.role.rotation = Quaternion.Euler(0,self.cameraAxisY,0);
	end
	if(self.needCheckReady)then
		if(Game.InputManager.photograph.ready)then
			self.needCheckReady = false
			FunctionSceneFilter.Me():StartFilter(GameConfig.FilterType.PhotoFilter.Self)
		end
	end
end

-- local tempRot = LuaQuaternion();
function PhotographPanel:LoadServant(  )
	-- self.myId = Game.Myself.data.id
	-- if not self.servant then
	-- 	ServiceNUserProxy.Instance:CallShowServantUserCmd(true)
	-- end
end

function PhotographPanel:TriggerServant(  )
	if self.isServantCalled then
		local animParams = Asset_Role.GetPlayActionParams("disappear", nil, 1)
		animParams[6] = true
		animParams[7] = function ()
			-- self:CancelLeanTween()
			-- self.delayHideNpcTween = LeanTween.delayedCall(0.3, function ()

   -- 			end)
   			ServiceNUserProxy.Instance:CallShowServantUserCmd(false)
			self:ShowServantEffect()
		end
		if(self.servant)then
			self.servant:PlayActionRaw(animParams, true)
		end
		self.isServantCalled = false
		self.servantEmojiButton:SetActive(false)
		self.flyMessageView:ResetMainPos(false)
	else
		-- self:ShowServantEffect()
		-- self.isServantCalled = true
		-- self.servantEmojiButton:SetActive(true)
		-- self.flyMessageView:ResetMainPos(true)
		ServiceNUserProxy.Instance:CallShowServantUserCmd(true)
	end
end

function PhotographPanel:HandleAddServant(note)
	local npcs = note.body;
	if(not npcs)then
		return
	end
	for _,npc in pairs(npcs)do
		if(npc.data and npc.data.ownerID == self.myId)then
			self.servant = npc.assetRole
			self.servantId = npc.data.id
			self.isServantCalled = true
			self.servantEmojiButton:SetActive(true)
			self.flyMessageView:ResetMainPos(true)
			self:CancelLeanTween()
			self.delayShowEffectTween =  LeanTween.delayedCall(0.2, function ()
				self:ShowServantEffect()
   			end)
			break
		end
	end
end

function PhotographPanel:ShowServantEffect()
	if self.servant then
		local servantPos = self.servant.completeTransform.localPosition
		local diffpos = LuaVector3(servantPos.x, servantPos.y + 0.5, servantPos.z)
		Asset_Effect.PlayOneShotAt(EffectMap.Maps.ServantShow, diffpos)
		-- self.servant:PlayEffectOneShotOn(EffectMap.Maps.ServantShow, RoleDefines_EP.Middle);
	end
end

function PhotographPanel:CancelLeanTween()
	if(self.delayShowEffectTween)then
		self.delayShowEffectTween:cancel();
	end
	self.delayShowEffectTween = nil;

	if(self.delayHideNpcTween)then
		self.delayHideNpcTween:cancel();
	end
	self.delayHideNpcTween = nil;
end