BuffEntityPoisonTransparent.lua 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. local BuffEntity = require("buff/BuffEntity")
  2. local BuffEntityPoisonTransparent = class("BuffEntityPoisonTransparent", BuffEntity)
  3. -- FIXME,special blend is not expected in RTT
  4. local function filterSpecialBlendChild(node, filteredTable, isEqual)
  5. local children = node:getChildren()
  6. for _, child in ipairs(children) do
  7. if child.getBlendFunc then
  8. local blendFunc = child:getBlendFunc()
  9. local compareBlend = global.MMO.normal_blend_func
  10. if not isEqual and blendFunc.dst ~= compareBlend.dst and blendFunc.src ~= compareBlend.src then
  11. if child:isVisible() then
  12. filteredTable[#filteredTable + 1] = child
  13. child:setVisible(false)
  14. end
  15. elseif isEqual and blendFunc.dst == compareBlend.dst and blendFunc.src == compareBlend.src then
  16. if child:isVisible() then
  17. filteredTable[#filteredTable + 1] = child
  18. child:setVisible(false)
  19. end
  20. end
  21. end
  22. filterSpecialBlendChild(child, filteredTable, isEqual)
  23. end
  24. end
  25. local function rebackSpecialBlendChild(filteredTable)
  26. for _, node in ipairs(filteredTable) do
  27. node:setVisible(true)
  28. end
  29. end
  30. function BuffEntityPoisonTransparent:ctor(data)
  31. BuffEntityPoisonTransparent.super.ctor(self, data)
  32. end
  33. function BuffEntityPoisonTransparent:OnEnter()
  34. BuffEntityPoisonTransparent.super.OnEnter(self)
  35. self:CoverSeparateActor()
  36. end
  37. function BuffEntityPoisonTransparent:Tick( dt )
  38. BuffEntityPoisonTransparent.super.Tick( self, dt )
  39. if not self:IsInvalid() then
  40. self:visitRenderTextureActor()
  41. end
  42. end
  43. function BuffEntityPoisonTransparent:CoverSeparateActor( opacity )
  44. local opacity = self._param
  45. local actor = global.actorManager:GetActor(self._actorID)
  46. if not actor or not opacity or opacity == 0 then
  47. return false
  48. end
  49. if not actor:IsPlayer() then
  50. return false
  51. end
  52. local camera = global.gameMapController:GetViewCamera()
  53. if not camera then
  54. return
  55. end
  56. self._originWinSize = global.Director:getWinSize()
  57. local rootNode = global.sceneGraphCtl:GetSceneNode( global.MMO.NODE_ACTOR_SPRITE )
  58. local size = global.Director:getWinSize()
  59. local coverNode = cc.RenderTexture:create(size.width, size.height, cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A4444)
  60. coverNode:setCameraMask(cc.CameraFlag.USER2, true)
  61. coverNode:setKeepMatrix(true)
  62. rootNode:addChild(coverNode)
  63. self._coverNode = coverNode
  64. local coverSprite = coverNode:getSprite()
  65. coverSprite:setAnchorPoint(cc.p(0.5, 0.5))
  66. coverSprite:setOpacity(opacity)
  67. local animCoverNode = cc.RenderTexture:create(size.width, size.height, cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A4444)
  68. animCoverNode:setCameraMask(cc.CameraFlag.USER2, true)
  69. animCoverNode:setKeepMatrix(true)
  70. rootNode:addChild(animCoverNode)
  71. self._animCoverNode = animCoverNode
  72. local animCoverSprite = animCoverNode:getSprite()
  73. animCoverSprite:setAnchorPoint(cc.p(0.5, 0.5))
  74. animCoverSprite:setOpacity(opacity)
  75. animCoverSprite:setBlendFunc(global.MMO.screen_blend_func)
  76. self:visitRenderTextureActor()
  77. end
  78. function BuffEntityPoisonTransparent:visitRenderTextureActor()
  79. if not self._coverNode then
  80. return
  81. end
  82. local actor = global.actorManager:GetActor(self._actorID)
  83. if not actor then
  84. return
  85. end
  86. local PlayerInputProxy = global.Facade:retrieveProxy( global.ProxyTable.PlayerInputProxy )
  87. if actor:IsMainPlayer() or PlayerInputProxy:GetTargetID() == self._actorID then
  88. if not self._visitCoverNode then
  89. local rootNode = global.sceneGraphCtl:GetSceneNode( global.MMO.NODE_MAP_OBJ )
  90. local size = global.Director:getWinSize()
  91. self._visitCoverNode = cc.RenderTexture:create(size.width, size.height, cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A4444)
  92. self._visitCoverNode:setCameraMask(cc.CameraFlag.USER1, true)
  93. self._visitCoverNode:setKeepMatrix(true)
  94. rootNode:addChild(self._visitCoverNode)
  95. local coverSprite = self._visitCoverNode:getSprite()
  96. coverSprite:setAnchorPoint(cc.p(0.5, 0.5))
  97. coverSprite:setOpacity(128)
  98. end
  99. else
  100. if self._visitCoverNode then
  101. self._visitCoverNode:removeFromParent()
  102. self._visitCoverNode = nil
  103. if self._visitCoverNodeHandler then
  104. global.RenderTextureManager:RmvDrawFunc(self._visitCoverNodeHandler)
  105. self._visitCoverNodeHandler = nil
  106. end
  107. end
  108. end
  109. self._coverNodeHandler = global.RenderTextureManager:AddDrawFuncOnce({func = function ()
  110. self._coverNodeHandler = nil
  111. self:visitRenderTexture( self._coverNode, self._animCoverNode )
  112. end})
  113. self._visitCoverNodeHandler = global.RenderTextureManager:AddDrawFuncOnce({func = function ()
  114. self._visitCoverNodeHandler = nil
  115. self:visitRenderTexture( self._visitCoverNode )
  116. end})
  117. end
  118. function BuffEntityPoisonTransparent:visitRenderTexture( coverNode, animCoverNode )
  119. if not coverNode then
  120. return
  121. end
  122. local actor = global.actorManager:GetActor(self._actorID)
  123. if not actor then
  124. coverNode:setVisible(false)
  125. if animCoverNode then
  126. animCoverNode:setVisible(false)
  127. end
  128. return
  129. end
  130. local camera = global.gameMapController:GetViewCamera()
  131. if not camera then
  132. return
  133. end
  134. local filteredTable = {}
  135. local txFilterdTable = {}
  136. filterSpecialBlendChild(actor:GetNode(), filteredTable)
  137. coverNode:setVisible(true)
  138. local viewIndex = 0
  139. global.Director:pushProjectionMatrix( viewIndex )
  140. global.Director:loadProjectionMatrix( camera:getViewProjectionMatrix(), viewIndex )
  141. camera:apply()
  142. local destPosX = 0
  143. local destPosY = 30
  144. local scaleSize = 1.5
  145. local currSize = global.Director:getWinSize()
  146. local cameraPos = cc.p( camera:getPosition() )
  147. local destPos = cc.pMul( cc.pSub(actor:getPosition(),cameraPos), scaleSize-1 )
  148. coverNode:setPosition( cameraPos.x - destPos.x + destPosX , cameraPos.y - destPos.y + destPosY )
  149. coverNode:beginWithClear(0,0,0,0)
  150. actor:GetNode():visit()
  151. rebackSpecialBlendChild(filteredTable)
  152. coverNode:endToLua()
  153. local screenScaleX = 1
  154. local screenScaleY = 1
  155. if not global.isWinPlayMode then
  156. screenScaleX = currSize.width / self._originWinSize.width
  157. screenScaleY = currSize.height / self._originWinSize.height
  158. end
  159. local viewScaleX, viewScaleY = CalcCameraZoom( camera )
  160. coverNode:setScaleX( viewScaleX * screenScaleX * scaleSize )
  161. coverNode:setScaleY( viewScaleY * screenScaleY * scaleSize )
  162. coverNode:setLocalZOrder( actor:GetNode():getLocalZOrder()-1 )
  163. if animCoverNode then
  164. filteredTable = {}
  165. filterSpecialBlendChild(actor:GetNode(), filteredTable, true)
  166. animCoverNode:setVisible(true)
  167. animCoverNode:setPosition( cameraPos.x - destPos.x + destPosX , cameraPos.y - destPos.y + destPosY )
  168. animCoverNode:beginWithClear(0,0,0,0)
  169. actor:GetNode():visit()
  170. rebackSpecialBlendChild(filteredTable)
  171. animCoverNode:endToLua()
  172. animCoverNode:setScaleX( viewScaleX * screenScaleX * scaleSize )
  173. animCoverNode:setScaleY( viewScaleY * screenScaleY * scaleSize )
  174. animCoverNode:setLocalZOrder( actor:GetNode():getLocalZOrder()-1 )
  175. end
  176. camera:restore()
  177. global.Director:popProjectionMatrix( viewIndex )
  178. end
  179. function BuffEntityPoisonTransparent:UnCoverSeparateActor()
  180. if self._coverNode then
  181. self._coverNode:removeFromParent()
  182. self._coverNode = nil
  183. end
  184. if self._coverNodeHandler then
  185. global.RenderTextureManager:RmvDrawFunc(self._coverNodeHandler)
  186. self._coverNodeHandler = nil
  187. end
  188. if self._visitCoverNodeHandler then
  189. global.RenderTextureManager:RmvDrawFunc(self._visitCoverNodeHandler)
  190. self._visitCoverNodeHandler = nil
  191. end
  192. if self._animCoverNode then
  193. self._animCoverNode:removeFromParent()
  194. self._animCoverNode = nil
  195. end
  196. if self._visitCoverNode then
  197. self._visitCoverNode:removeFromParent()
  198. self._visitCoverNode = nil
  199. end
  200. end
  201. function BuffEntityPoisonTransparent:OnExit()
  202. BuffEntityPoisonTransparent.super.OnExit(self)
  203. self:UnCoverSeparateActor()
  204. end
  205. return BuffEntityPoisonTransparent