2025-06-04 05:02:57 +08:00

578 lines
18 KiB
Plaintext

PictureWallManager = class("PictureWallManager")
autoImport("UnionWallPhotoNew")
autoImport("UnionWallPhotoHelper")
local tempVector3 = LuaVector3.zero
local dataArray = {}
--TODO: 本次重新整理清除上一次同步的照片新
function PictureWallManager:Launch()
if self.running then
return
end
self.running = true
if(self.serverDataArray)then
TableUtility.ArrayClear(self.serverDataArray)
end
self.serverDataArray = {}
if(self.TextureArray_ServerData)then
TableUtility.ArrayClear(self.TextureArray_ServerData)
end
self.TextureArray_ServerData = {}
if(self.toBeDownload)then
TableUtility.ArrayClear(self.toBeDownload)
end
self.toBeDownload = {}
if(self.delayDelArray)then
TableUtility.ArrayClear(self.delayDelArray)
end
self.delayDelArray = {}
if(self.LRUTextureCache)then
TableUtility.ArrayClear(self.LRUTextureCache)
end
self.LRUTextureCache = {}
self.maxCache = 7
self.maxThumbnailSize = 100
self.enableLog = false
self.isDownloading = false
end
function PictureWallManager:log(...)
if(self.enableLog)then
helplog(...)
end
end
function PictureWallManager:deleteTextureByPhotoData(photoData)
for i=1,#self.TextureArray_ServerData do
local single = self.TextureArray_ServerData[i]
if(self:checkSamePicture(single.photoData,photoData))then
table.remove(self.TextureArray_ServerData,i)
Object.DestroyImmediate(single.texture)
self:StopDownloadAndClean(photoData)
-- self:StopDownloadOrigin(photoData)
break
end
end
end
function PictureWallManager:removeDelayArray(frameId)
for j=1,#self.delayDelArray do
local single = self.delayDelArray[j]
if(frameId == single.frameId)then
-- self:log("removeDelayArray frameId:",frameId)
Game.GameObjectManagers[Game.GameObjectType.ScenePhotoFrame]:SetPhoto(single.frameId, nil)
self:removeDownloadTexture(single.photoData)
self:removeBytesBySceneryId(single.photoData)
table.remove(self.delayDelArray,j)
break
end
end
end
function PictureWallManager:StopDownloadAndClean( photoData)
-- body
if(photoData.source == ProtoCommon_pb.ESOURCE_PHOTO_SELF)then
UnionWallPhotoNew.Ins():Clear_Personal(photoData.charid,photoData.sourceid)
elseif(photoData.source == ProtoCommon_pb.ESOURCE_PHOTO_SCENERY)then
if(photoData.isBelongAccPic)then
UnionWallPhotoNew.Ins():Clear_ScenicSpot_Account(photoData.charid,photoData.sourceid)
else
UnionWallPhotoNew.Ins():Clear_ScenicSpot(photoData.charid,photoData.sourceid)
end
end
end
-- function PictureWallManager:StopDownloadOrigin( photoData)
-- -- body
-- if(photoData.source == ProtoCommon_pb.ESOURCE_PHOTO_SELF)then
-- if(photoData.source == ProtoCommon_pb.ESOURCE_PHOTO_SELF)then
-- UnionWallPhotoNew.Ins():StopDownloadOriginImage_Personal(photoData.charid,photoData.sourceid)
-- elseif(photoData.source == ProtoCommon_pb.ESOURCE_PHOTO_SCENERY)then
-- UnionWallPhotoNew.Ins():StopDownloadOriginImage_ScenicSpot(photoData.charid,photoData.sourceid)
-- end
-- end
function PictureWallManager:checkIfDeleteThumbnail( photoData)
end
function PictureWallManager:GetBytes( photoData)
-- body
local bytes = self:GetBytesBySceneryId(photoData,true)
if(bytes)then
return bytes
end
end
function PictureWallManager:GetBytesBySceneryId( photoData,rePos )
-- body
for i=1,#self.LRUTextureCache do
local single = self.LRUTextureCache[i]
if(self:checkSamePicture(single.photoData,photoData))then
if(rePos)then
table.remove(self.LRUTextureCache,i)
table.insert(self.LRUTextureCache,1,single)
end
return single.bytes
end
end
end
function PictureWallManager:removeBytesBySceneryId( photoData )
-- body
for i=1,#self.LRUTextureCache do
local single = self.LRUTextureCache[i]
if(self:checkSamePicture(single.photoData,photoData))then
table.remove(self.LRUTextureCache,i)
break
end
end
end
function PictureWallManager:addOriginBytesBySceneryId( photoData ,bytes)
-- body
if(not self:GetBytesBySceneryId(photoData))then
if(#self.LRUTextureCache > self.maxCache)then
table.remove(self.LRUTextureCache)
end
local data = {}
data.photoData = photoData
data.bytes = bytes
table.insert(self.LRUTextureCache,1,data)
else
self:log("addOriginBytesBySceneryId:exsit ")
end
end
function PictureWallManager:removeDownloadTexture(photoData)
for j=1,#self.toBeDownload do
local data = self.toBeDownload[j]
if(self:checkSamePicture(photoData,data))then
table.remove(self.toBeDownload,j)
break
end
end
end
function PictureWallManager:checkSamePicture( exsitData,serverData )
-- body
if( exsitData and serverData)then
if(exsitData.charid == serverData.charid and exsitData.sourceid == serverData.sourceid
and exsitData.source == serverData.source and exsitData.time == serverData.time )then
return true
end
else
self:log("checkSamePicture data is nil!!!!!!!!")
end
end
function PictureWallManager:AddPictureInfos(list)
-- list = {{charid = 4294992297,sceneryid = 14,frameid = 108},{charid = 4294992297,sceneryid = 55,frameid = 109}}
local tempTable = {}
for i=1,#self.serverDataArray do
local single = self.serverDataArray[i]
local find = false
local delayDel = false
local removeTexture = false
for j=1,#list do
local data = list[j]
if(self:checkSamePicture(single.photoData,data.photo))then
find = true
elseif(single.photoData.charid == data.photo.charid and single.photoData.sourceid == data.photo.sourceid
and single.photoData.source == data.photo.source and single.photoData.time ~= data.photo.time )then
removeTexture = true
end
if(single.frameId == data.frameid)then
delayDel = true
end
end
if(find)then
-- self:log("exsitData",single.charId,single.sceneryId,single.frameId)
tempTable[#tempTable+1] = single
if(not delayDel)then
Game.GameObjectManagers[Game.GameObjectType.ScenePhotoFrame]:SetPhoto(single.frameId, nil)
end
elseif(delayDel)then
-- self:log("delayDelArray",single.charId,single.sceneryId,single.frameId)
self.delayDelArray[#self.delayDelArray+1] = single
else
-- self:log("delete:",single.charId,single.sceneryId,single.frameId)
Game.GameObjectManagers[Game.GameObjectType.ScenePhotoFrame]:SetPhoto(single.frameId, nil)
self:removeDownloadTexture(single.photoData)
self:removeBytesBySceneryId(single.photoData)
end
if(removeTexture)then
self:deleteTextureByPhotoData(single.photoData)
end
end
self.serverDataArray = tempTable
for i=1,#list do
self:AddPictureInfo(list[i])
end
self:startTryGenThumbnail()
end
function PictureWallManager:getServerData(photoData)
for i=1,#self.serverDataArray do
local single = self.serverDataArray[i]
if(self:checkSamePicture(single.photoData,photoData))then
return single
end
end
end
function PictureWallManager:getTextureByPhotoData(photoData,rePos)
for i=1,#self.TextureArray_ServerData do
local single = self.TextureArray_ServerData[i]
if(self:checkSamePicture(single.photoData,photoData))then
if(rePos)then
table.remove(self.TextureArray_ServerData,i)
table.insert(self.TextureArray_ServerData,1,single)
end
return single.texture
end
end
end
function PictureWallManager:getServerDataByFrameId(frameId)
for i=1,#self.serverDataArray do
local single = self.serverDataArray[i]
if(single.frameId == frameId)then
return single
end
end
end
function PictureWallManager:AddPictureInfo(serverData)
-- local charId = tonumber(data.charid)
-- local sceneryId = tonumber(data.sceneryid)
local frameId = tonumber(serverData.frameid)
self:log("AddPictureInfo",frameId,serverData.photo.sourceid,serverData.photo.source,serverData.photo.time,serverData.photo.anglez)
self:log(serverData.photo.charid,serverData.photo.accid)
if(frameId == 0)then
return
end
local exsitData = self:getServerData(serverData.photo)
if(exsitData)then
if(frameId == exsitData.frameId)then
self:trySetThumbnailTexture(exsitData.photoData)
return
else
exsitData.frameId = frameId
end
self:trySetThumbnailTexture(exsitData.photoData)
else
local photoData = PhotoData.new(serverData.photo)
local data = {photoData = photoData,frameId= frameId}
self.serverDataArray[#self.serverDataArray+1] = data
self:trySetThumbnailTexture(photoData)
end
end
function PictureWallManager:GetPicThumbnailByCell( cell)
-- body
local data = cell.data
local index = data.index
local time = data.time
local texture = self:getTextureByPhotoData(data,true)
if(texture)then
cell:setTexture(texture)
else
local hasIn = self:HasInToBeDownload(data)
if(not hasIn)then
self.toBeDownload[#self.toBeDownload+1] = data
if(#self.toBeDownload>0)then
self:startTryGenThumbnail()
end
end
end
end
function PictureWallManager:HasInToBeDownload(photoData)
for i=1,#self.toBeDownload do
local single = self.toBeDownload[i]
if(self:checkSamePicture(single,photoData))then
return true
end
end
end
function PictureWallManager:trySetThumbnailTexture( photoData)
-- body
local texture = self:getTextureByPhotoData(photoData,true)
if(texture)then
self:trySetScenePhoto(photoData,texture)
else
local exsit = false
for i=1,#self.toBeDownload do
local single = self.toBeDownload[i]
if(self:checkSamePicture(photoData,single))then
exsit = true
break
end
end
if(not exsit)then
self.toBeDownload[#self.toBeDownload+1] = photoData
end
end
end
function PictureWallManager:addTextureByPhotoData( photoData,texture)
-- body
if(not self:getTextureByPhotoData(photoData))then
if(#self.TextureArray_ServerData > self.maxThumbnailSize)then
local textureData = table.remove(self.TextureArray_ServerData)
Object.DestroyImmediate(textureData.texture)
end
local data = {}
data.photoData = photoData
data.texture = texture
table.insert(self.TextureArray_ServerData,1,data)
else
self:log("addTextureByPhotoData:exsit ")
end
end
function PictureWallManager:startTryGenThumbnail()
if(#self.toBeDownload > 0 and not self.isDownloading)then
local loadData = self.toBeDownload[1]
self:tryGenThumbnail(loadData)
end
end
function PictureWallManager:tryGenThumbnail(photoData)
self:log("tryGenThumbnail",photoData.charid,photoData.sourceid,photoData.time)
self.isDownloading = true
if(photoData.source == ProtoCommon_pb.ESOURCE_PHOTO_SELF)then
UnionWallPhotoHelper.Ins():GetThumbnail_Personal(photoData.charid,photoData.sourceid,photoData.time,function ( progress )
-- body
self:thumbnailProgressCallback(photoData,progress)
end,function ( bytes )
self:thumbnailCompleteCallback(photoData,bytes)
-- body
end,function ( errorMessage )
-- body
self:thumbnailErrorCallback(photoData,errorMessage)
end)
elseif(photoData.source == ProtoCommon_pb.ESOURCE_PHOTO_SCENERY)then
if(photoData.isBelongAccPic)then
UnionWallPhotoHelper.Ins():GetThumbnail_ScenicSpot_Account(photoData.charid,photoData.sourceid,photoData.time,function ( progress )
-- body
self:thumbnailProgressCallback(photoData,progress)
end,function ( bytes )
self:thumbnailCompleteCallback(photoData,bytes)
-- body
end,function ( errorMessage )
-- body
self:thumbnailErrorCallback(photoData,errorMessage)
end)
else
UnionWallPhotoHelper.Ins():GetThumbnail_ScenicSpot(photoData.charid,photoData.sourceid,photoData.time,function ( progress )
-- body
self:thumbnailProgressCallback(photoData,progress)
end,function ( bytes )
self:thumbnailCompleteCallback(photoData,bytes)
-- body
end,function ( errorMessage )
-- body
self:thumbnailErrorCallback(photoData,errorMessage)
end)
end
else
self:log("unknown source")
end
end
function PictureWallManager:thumbnailProgressCallback(photoData,progress )
self:log("thumbnailProgressCallback",charId, sceneryId,progress)
self:WallPicThumbnailDownloadProgressCallback1(photoData,progress)
end
function PictureWallManager:thumbnailErrorCallback(photoData,errorMessage)
-- body
self.isDownloading = false
self:removeDownloadTexture(photoData)
self:log("thumbnailErrorCallback",photoData.charid, errorMessage)
local serverData = self:getServerData(photoData)
if(serverData and serverData.frameId)then
self:removeDelayArray(serverData.frameId)
end
self:WallPicThumbnailDownloadErrorCallback1(photoData,errorMessage)
self:startTryGenThumbnail()
end
function PictureWallManager:thumbnailCompleteCallback(photoData, bytes)
-- body
self:log("thumbnailCompleteCallback:",charId,sceneryId)
self.isDownloading = false
local serverData = self:getServerData(photoData)
if(serverData and serverData.frameId)then
self:removeDelayArray(serverData.frameId)
end
local texture = Texture2D(200,100,TextureFormat.RGB24,false)
local bRet = ImageConversion.LoadImage(texture, bytes)
if(bRet)then
self:trySetScenePhoto(photoData,texture)
self:addTextureByPhotoData(photoData,texture)
self:WallPicThumbnailDownloadCompleteCallback1(photoData,bytes)
self:removeDownloadTexture(photoData)
self:startTryGenThumbnail()
else
self:thumbnailErrorCallback(photoData,"load LoadImage error!")
Object.DestroyImmediate(texture)
end
end
function PictureWallManager:trySetScenePhoto(photoData, texture)
local serverData = self:getServerData(photoData)
if(serverData and serverData.frameId)then
-- self:log("GameObjectManagers:trySetScenePhoto sus",serverData.frameId,texture,texture.width,texture.height,serverData.anglez)
-- self:log("GameObjectManagers:trySetScenePhoto sus",texture.width,texture.height)
Game.GameObjectManagers[Game.GameObjectType.ScenePhotoFrame]:SetPhoto(serverData.frameId, texture, texture.width, texture.height,photoData.anglez)
else
-- self:log("GameObjectManagers:trySetScenePhoto noData")
end
end
function PictureWallManager:tryGetOriginImage( photoData )
-- body
self:log("tryGetOriginImage",photoData.charid, photoData.sourceid,progress)
if(photoData.source == ProtoCommon_pb.ESOURCE_PHOTO_SELF)then
UnionWallPhotoHelper.Ins():GetOriginImage_Personal(photoData.charid,photoData.sourceid,photoData.time,function ( progress )
-- body
self:originProgressCallback(photoData,progress)
end,function ( bytes )
self:originCompleteCallback(photoData,bytes)
-- body
end,function ( errorMessage )
-- body
self:originErrorCallback(photoData,errorMessage)
end)
elseif(photoData.source == ProtoCommon_pb.ESOURCE_PHOTO_SCENERY)then
if(photoData.isBelongAccPic)then
UnionWallPhotoHelper.Ins():GetOriginImage_ScenicSpot_Account(photoData.charid,photoData.sourceid,photoData.time,function ( progress )
-- body
self:originProgressCallback(photoData,progress)
end,function ( bytes )
self:originCompleteCallback(photoData,bytes)
-- body
end,function ( errorMessage )
-- body
self:originErrorCallback(photoData,errorMessage)
end)
else
UnionWallPhotoHelper.Ins():GetOriginImage_ScenicSpot(photoData.charid,photoData.sourceid,photoData.time,function ( progress )
-- body
self:originProgressCallback(photoData,progress)
end,function ( bytes )
self:originCompleteCallback(photoData,bytes)
-- body
end,function ( errorMessage )
-- body
self:originErrorCallback(photoData,errorMessage)
end)
end
else
self:log("tryGetOriginImage unknown source")
end
end
function PictureWallManager:originProgressCallback(photoData,progress )
-- body
self:log("originProgressCallback",photoData.charid, photoData.sourceid,progress)
GameFacade.Instance:sendNotification(PictureWallDataEvent.PhotoProgressCallback,{photoData = photoData,progress = progress})
end
function PictureWallManager:originCompleteCallback(photoData,bytes)
-- body
self:log("originCompleteCallback",photoData.charid, photoData.sourceid,tostring(bytes))
GameFacade.Instance:sendNotification(PictureWallDataEvent.PhotoCompleteCallback,{photoData = photoData,byte = bytes})
end
function PictureWallManager:originErrorCallback(photoData,errorMessage)
-- body
self:log("originErrorCallback",photoData.charid,photoData.sourceid,errorMessage)
end
function PictureWallManager:Shutdown()
GameFacade.Instance:sendNotification(PictureWallDataEvent.MapEnd)
if not self.running then
return
end
self.running = false
self:_DestroyDatas()
end
function PictureWallManager:_DestroyDatas()
for i=1,#self.TextureArray_ServerData do
local single = self.TextureArray_ServerData[i]
if(single and single.texture)then
Object.DestroyImmediate(single.texture)
end
end
TableUtility.ArrayClear(self.TextureArray_ServerData)
TableUtility.ArrayClear(self.serverDataArray)
TableUtility.ArrayClear(self.delayDelArray)
TableUtility.ArrayClear(self.toBeDownload)
TableUtility.ArrayClear(self.LRUTextureCache)
PhotoDataProxy.Instance:clearToSeeDatas()
PhotoDataProxy.Instance:clearSelectedData()
PhotoDataProxy.Instance:clearRemoveData()
PhotoDataProxy.Instance:clearUpPhotos()
PhotoDataProxy.Instance:clearCurFrameList()
end
function PictureWallManager:ShowDetailPicure(frameId,frameObj)
-- local
local serverData = self:getServerDataByFrameId(frameId)
local viewData = {view = PanelConfig.PictureDetailPanel,viewdata = {serverData = serverData,frameId = frameId,trans = frameObj.transform}}
GameFacade.Instance:sendNotification(UIEvent.JumpPanel,viewData)
end
function PictureWallManager:ClickFrame(frameId,frameObj)
self:ShowDetailPicure(frameId,frameObj)
end
PictureWallManager.WallPicThumbnailDownloadProgressCallback = "PictureWallManager_WallPicThumbnailDownloadProgressCallback"
PictureWallManager.WallPicThumbnailDownloadCompleteCallback = "PictureWallManager_WallPicThumbnailDownloadCompleteCallback"
PictureWallManager.WallPicThumbnailDownloadErrorCallback = "PictureWallManager_WallPicThumbnailDownloadErrorCallback"
--download thumbnail
function PictureWallManager:WallPicThumbnailDownloadProgressCallback1(photoData,progress )
-- body
self:log("WallPicThumbnailDownloadProgressCallback",index, time,progress)
GameFacade.Instance:sendNotification(PictureWallManager.WallPicThumbnailDownloadProgressCallback,{photoData = photoData,progress = progress})
end
function PictureWallManager:WallPicThumbnailDownloadCompleteCallback1(photoData,bytes)
-- body
self:log("WallPicThumbnailDownloadCompleteCallback",index, time,tostring(bytes))
GameFacade.Instance:sendNotification(PictureWallManager.WallPicThumbnailDownloadCompleteCallback,{photoData = photoData,byte = bytes})
end
function PictureWallManager:WallPicThumbnailDownloadErrorCallback1(photoData,errorMessage)
-- body
self:log("WallPicThumbnailDownloadErrorCallback",index, time,errorMessage)
GameFacade.Instance:sendNotification(PictureWallManager.WallPicThumbnailDownloadErrorCallback,{photoData = photoData,errorMessage = errorMessage})
end