PreviewSystem.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. local PreviewSystem = class("PreviewSystem")
  2. local GameObject = UnityEngine.GameObject
  3. local Object = UnityEngine.Object
  4. local Camera = UnityEngine.Camera
  5. local RenderTexture = UnityEngine.RenderTexture
  6. local CameraClearFlags = UnityEngine.CameraClearFlags
  7. local RenderTextureDescriptor = UnityEngine.RenderTextureDescriptor
  8. local RenderTextureFormat = UnityEngine.RenderTextureFormat
  9. local previewLayer = 15
  10. local hideLayer = 12
  11. local preivewCullingMask = 32768 -- 1 << 15
  12. local DefaultRTW = 512
  13. local DefaultRTH = 512
  14. local DefaultHDRTW = 1024
  15. local DefaultHDRTH = 1024
  16. --- 当前启用的PreivewSystem列表
  17. local PreviewSystemList = {}
  18. local PreviewSystemListDiff = false
  19. --- 存储正在预览的对象
  20. local PreviewSystemGos = {}
  21. local NeedCheckDiff = false
  22. local function SetTransformLayer(trans, layer)
  23. if not trans then return end
  24. trans.gameObject.layer = layer
  25. for i = 0, trans.childCount - 1 do
  26. SetTransformLayer(trans:GetChild(i), layer)
  27. end
  28. end
  29. local function SetGoLayer(modelGo, layer)
  30. if not modelGo then return end
  31. if tolua.isnull(modelGo) then return end
  32. SetTransformLayer(modelGo.transform, layer)
  33. end
  34. local function SetRenderersEnable(renderers, enable)
  35. if not renderers then return end
  36. for i = 0, renderers.Length - 1 do
  37. if renderers[i] and not tolua.isnull(renderers[i]) then
  38. renderers[i].enabled = enable
  39. end
  40. end
  41. end
  42. local function AddPreviewSystemGo(go)
  43. if not go then return end
  44. NeedCheckDiff = true
  45. local previewSystemGo = PreviewSystemGos[go]
  46. if not previewSystemGo then
  47. previewSystemGo = {}
  48. PreviewSystemGos[go] = previewSystemGo
  49. previewSystemGo.layer = go.layer
  50. previewSystemGo.previewNum = 1
  51. previewSystemGo.renderers = go:GetComponentsInChildren(typeof(UnityEngine.Renderer))
  52. else
  53. previewSystemGo.previewNum = previewSystemGo.previewNum + 1
  54. end
  55. SetGoLayer(go, previewLayer)
  56. if PreviewSystemListDiff then
  57. SetRenderersEnable(previewSystemGo.renderers, false)
  58. end
  59. end
  60. local function UpdatePreviewSystemGo(go)
  61. if not go then return end
  62. local previewSystemGo = PreviewSystemGos[go]
  63. if not previewSystemGo then
  64. previewSystemGo = {}
  65. PreviewSystemGos[go] = previewSystemGo
  66. previewSystemGo.layer = go.layer
  67. previewSystemGo.previewNum = 1
  68. end
  69. previewSystemGo.renderers = go:GetComponentsInChildren(typeof(UnityEngine.Renderer))
  70. SetGoLayer(go, previewLayer)
  71. if PreviewSystemListDiff then
  72. SetRenderersEnable(previewSystemGo.renderers, false)
  73. end
  74. end
  75. local function RemovePreviewSystemGo(go)
  76. if not go then return end
  77. NeedCheckDiff = true
  78. local previewSystemGo = PreviewSystemGos[go]
  79. if not previewSystemGo then return end
  80. previewSystemGo.previewNum = previewSystemGo.previewNum - 1
  81. if previewSystemGo.previewNum > 0 then return end
  82. SetGoLayer(go, hideLayer)
  83. SetRenderersEnable(previewSystemGo.renderers, true)
  84. previewSystemGo = nil
  85. PreviewSystemGos[go] = nil
  86. end
  87. local function ResetPreviewSystemGos(isResetLayer)
  88. for go, previewSystemGo in pairs(PreviewSystemGos) do
  89. if go and previewSystemGo then
  90. if isResetLayer then SetGoLayer(go, previewSystemGo.layer) end
  91. SetRenderersEnable(previewSystemGo.renderers, true)
  92. end
  93. end
  94. end
  95. local function ClearPreviewSystemGos()
  96. if #PreviewSystemList > 0 then return end
  97. ResetPreviewSystemGos(true)
  98. PreviewSystemGos = {}
  99. PreviewSystemListDiff = false
  100. ManagerContainer.LuaGameMgr:DisableAntiAliasing()
  101. end
  102. local function CheckDiff()
  103. if not NeedCheckDiff then return end
  104. NeedCheckDiff = false
  105. local lastPreviewSystemListDiff = PreviewSystemListDiff
  106. PreviewSystemListDiff = false
  107. local previewSystemNum = #PreviewSystemList
  108. if previewSystemNum > 1 then
  109. for go, info in pairs(PreviewSystemGos) do
  110. if go and info then
  111. if info.previewNum ~= previewSystemNum then
  112. PreviewSystemListDiff = true
  113. break
  114. end
  115. end
  116. end
  117. end
  118. if lastPreviewSystemListDiff == PreviewSystemListDiff then
  119. return
  120. end
  121. lastPreviewSystemListDiff = PreviewSystemListDiff
  122. if PreviewSystemListDiff then
  123. for go, previewSystemGo in pairs(PreviewSystemGos) do
  124. if go and previewSystemGo then
  125. SetRenderersEnable(previewSystemGo.renderers, false)
  126. end
  127. end
  128. else
  129. -- 重置默认值
  130. ResetPreviewSystemGos(false)
  131. end
  132. end
  133. function PreviewSystem:ctor(name, rtW, rtH, camera)
  134. local previewCameraGo, previewCamera,isSelfCamera
  135. if camera then
  136. previewCameraGo = camera.gameObject
  137. previewCamera = camera
  138. isSelfCamera = false
  139. else
  140. if not name or name == '' then
  141. name = "Camera"
  142. end
  143. previewCameraGo = GameObject(name .. "(preivewCamera)")
  144. previewCamera = previewCameraGo:AddComponent(typeof(Camera))
  145. isSelfCamera = true
  146. if ManagerContainer.LuaModelMgr and ManagerContainer.LuaModelMgr.ModelRoot then
  147. previewCameraGo.transform:SetParent(ManagerContainer.LuaModelMgr.ModelRoot.transform)
  148. end
  149. end
  150. previewCamera.useOcclusionCulling = false
  151. previewCamera.cullingMask = preivewCullingMask
  152. previewCamera.clearFlags = CameraClearFlags.SolidColor
  153. previewCamera.nearClipPlane = 0.01
  154. previewCamera.allowHDR = false
  155. --previewCamera.orthographic = true
  156. --previewCamera.orthographicSize = 1.3
  157. if ManagerContainer.LuaGameMgr.IsGoodDevice then
  158. self.rtW = rtW or DefaultHDRTW
  159. self.rtH = rtH or DefaultHDRTH
  160. else
  161. self.rtW = DefaultRTW
  162. self.rtH = DefaultRTH
  163. end
  164. -- 设置 RenderTexture
  165. local renderTexture = RenderTexture.GetTemporary(self:InitRTDescriptor())
  166. previewCamera.targetTexture = renderTexture
  167. -- 设置PreviewCameraEvent
  168. local PreviewCameraEventType = typeof(PreviewCameraEvent)
  169. local previewCameraEvent = previewCameraGo:GetComponent(PreviewCameraEventType)
  170. if not previewCameraEvent then
  171. previewCameraEvent = previewCameraGo:AddComponent(PreviewCameraEventType)
  172. end
  173. previewCameraEvent:SetBindEvent(self, self._OnPreCull, self._OnPostRender)
  174. self.isSelfCamera = isSelfCamera
  175. self.previewCameraGo = previewCameraGo
  176. self.previewCamera = previewCamera
  177. self.renderTexture = renderTexture
  178. self.previewCameraEvent = previewCameraEvent
  179. self.showGos = {}
  180. ClearPreviewSystemGos()
  181. if ManagerContainer.LuaGameMgr.IsBadDevice then
  182. previewCamera.allowMSAA = false
  183. else
  184. ManagerContainer.LuaGameMgr:EnableAntiAliasing()
  185. previewCamera.allowMSAA = true
  186. end
  187. --previewCamera.allowMSAA = false
  188. table.insert(PreviewSystemList, self)
  189. end
  190. function PreviewSystem:Dispose()
  191. self:RemoveAllGo()
  192. if self.previewCamera then
  193. self.previewCamera.targetTexture = nil
  194. end
  195. if self.isSelfCamera then
  196. if self.previewCameraEvent then
  197. self.previewCameraEvent:SetBindEvent(nil, nil, nil)
  198. end
  199. if self.previewCameraGo then
  200. GameObject.Destroy(self.previewCameraGo)
  201. end
  202. else
  203. if self.previewCameraEvent then
  204. self.previewCameraEvent:SetBindEvent(nil, nil, nil)
  205. Object.Destroy(self.previewCameraEvent)
  206. end
  207. end
  208. if self.renderTexture then
  209. RenderTexture.ReleaseTemporary(self.renderTexture)
  210. end
  211. self.rtW = nil
  212. self.rtH = nil
  213. self.previewCameraGo = nil
  214. self.previewCamera = nil
  215. self.previewCameraEvent = nil
  216. self.renderTexture = nil
  217. self.showGos = nil
  218. self.previewLayer = nil
  219. self.preivewCullingMask = nil
  220. for i = #PreviewSystemList, 1, -1 do
  221. if PreviewSystemList[i] == self then
  222. table.remove(PreviewSystemList, i)
  223. break
  224. end
  225. end
  226. ClearPreviewSystemGos()
  227. end
  228. function PreviewSystem:InitRTDescriptor(rtw, rth)
  229. local descriptor
  230. if rtw and rth then
  231. self.rtW = rtw
  232. self.rtH = rth
  233. end
  234. descriptor = RenderTextureDescriptor(self.rtW, self.rtH, RenderTextureFormat.ARGB32, 32)
  235. descriptor.autoGenerateMips = false
  236. if ManagerContainer.LuaGameMgr.IsBadDevice then
  237. descriptor.msaaSamples = 1
  238. else
  239. descriptor.msaaSamples = 4
  240. end
  241. return descriptor
  242. end
  243. function PreviewSystem:ReinitCameraRTSize(rtw, rth)
  244. if rtw and rth then
  245. local renderTexture = RenderTexture.GetTemporary(self:InitRTDescriptor(rtw, rth))
  246. if ManagerContainer.LuaGameMgr.IsBadDevice then
  247. renderTexture.antiAliasing = 0
  248. else
  249. renderTexture.antiAliasing = 4
  250. end
  251. self.previewCamera.targetTexture = renderTexture
  252. if self.renderTexture then
  253. RenderTexture.ReleaseTemporary(self.renderTexture)
  254. end
  255. self.renderTexture = renderTexture
  256. end
  257. end
  258. function PreviewSystem:GetRenderTexture()
  259. return self.renderTexture
  260. end
  261. function PreviewSystem:GetCamera()
  262. return self.previewCamera
  263. end
  264. function PreviewSystem:GetCameraGo()
  265. return self.previewCameraGo
  266. end
  267. function PreviewSystem:SetView(pos, rot)
  268. local transform = self.previewCameraGo.transform
  269. transform:SetPositionAndRotation(pos, rot)
  270. end
  271. function PreviewSystem:AddGo(go)
  272. if not go then return false end
  273. if not self.showGos then return false end
  274. local instanceID = go:GetInstanceID()
  275. if self.showGos[instanceID] then
  276. return false
  277. end
  278. self.showGos[instanceID] = go
  279. AddPreviewSystemGo(go)
  280. return true
  281. end
  282. function PreviewSystem:UpdateGo(go)
  283. if self:AddGo(go) then
  284. return
  285. end
  286. UpdatePreviewSystemGo(go)
  287. end
  288. function PreviewSystem:RemoveGo(go)
  289. if not go then return end
  290. if not self.showGos then return end
  291. local instanceID = go:GetInstanceID()
  292. if not self.showGos[instanceID] then
  293. return
  294. end
  295. self.showGos[instanceID] = nil
  296. RemovePreviewSystemGo(go)
  297. end
  298. function PreviewSystem:RemoveAllGo()
  299. for instanceID, go in pairs(self.showGos) do
  300. RemovePreviewSystemGo(go)
  301. end
  302. self.showGos = {}
  303. end
  304. function PreviewSystem:_OnPreCull()
  305. CheckDiff()
  306. if not PreviewSystemListDiff then return end
  307. for instanceID, go in pairs(self.showGos) do
  308. if go then
  309. local previewSystemGo = PreviewSystemGos[go]
  310. if previewSystemGo then
  311. SetRenderersEnable(previewSystemGo.renderers, true)
  312. end
  313. end
  314. end
  315. end
  316. function PreviewSystem:_OnPostRender()
  317. if not PreviewSystemListDiff then return end
  318. for instanceID, go in pairs(self.showGos) do
  319. if go then
  320. local previewSystemGo = PreviewSystemGos[go]
  321. if previewSystemGo then
  322. SetRenderersEnable(previewSystemGo.renderers, false)
  323. end
  324. end
  325. end
  326. end
  327. return PreviewSystem