darklayer.lua 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. local BaseLayer = requireLayerUI("BaseLayer")
  2. local darklayer = class("darklayer", BaseLayer)
  3. local darkShader = "darkShader"
  4. function darklayer:ctor()
  5. darklayer.super.ctor(self)
  6. end
  7. function darklayer.create(...)
  8. local ui = darklayer.new()
  9. if ui and ui:Init(...) then
  10. return ui
  11. end
  12. return nil
  13. end
  14. function darklayer:Init(data)
  15. if SL:GetMetaValue("GAME_DATA", "dark") ~= 1 then
  16. return true
  17. end
  18. self._glProgram = global.GLProgramCache:getGLProgram( darkShader )
  19. if not self._glProgram then
  20. self._glProgram = cc.GLProgram:createWithFilenames( "shader/dark.vert", "shader/dark.frag" )
  21. global.GLProgramCache:addGLProgram( self._glProgram, darkShader )
  22. end
  23. self.glNode = gl.glNodeCreate()
  24. local rootNode = global.sceneGraphCtl:GetGameWorldRoot()
  25. rootNode:addChild(self.glNode)
  26. self.glNode:setCameraMask(cc.CameraFlag.USER1, true)
  27. self.glNode:registerScriptDrawHandler(handler(self,self.onDraw))
  28. return true
  29. end
  30. function darklayer:onDraw(transform, transformUpdated)
  31. local DarkLayerProxy = global.Facade:retrieveProxy(global.ProxyTable.DarkLayerProxy)
  32. local curState = DarkLayerProxy:getCurState()
  33. if curState == DarkLayerProxy.STATE.daytime then
  34. return
  35. end
  36. local camera = global.gameMapController:GetViewCamera()
  37. if not camera then
  38. return
  39. end
  40. -- self.glNode:setPosition(camera:getPosition())
  41. local gameWorldPos = cc.p(camera:getPosition())
  42. -- dump(gameWorldPos,"gameWorldPos___")
  43. self._glProgram:use()
  44. self._glProgram:setUniformsForBuiltins()
  45. local size = cc.Director:getInstance():getWinSize()
  46. local viewScaleX, viewScaleY = CalcCameraZoom( camera )
  47. local vertices = {
  48. gameWorldPos.x + size.width*viewScaleX/2, gameWorldPos.y - size.height*viewScaleY/2,
  49. gameWorldPos.x + size.width*viewScaleX/2, gameWorldPos.y + size.height*viewScaleY/2,
  50. gameWorldPos.x - size.width*viewScaleX/2, gameWorldPos.y - size.height*viewScaleY/2,
  51. gameWorldPos.x - size.width*viewScaleX/2, gameWorldPos.y + size.height*viewScaleY/2,
  52. }
  53. local vao = gl.createBuffer()
  54. gl.bindBuffer(gl.ARRAY_BUFFER, vao)
  55. gl.bufferData(gl.ARRAY_BUFFER, table.getn(vertices), vertices, gl.STATIC_DRAW)
  56. gl.bindBuffer(gl.ARRAY_BUFFER, 0)
  57. ------------render-------------
  58. local nodeData = global.darkNodeManager:getAllNodes()
  59. local nodeInfo = {}
  60. for i, v in pairs(nodeData) do
  61. table.insert(nodeInfo,v.x or 0)
  62. table.insert(nodeInfo,v.y or 0)
  63. table.insert(nodeInfo,v.r or 0)
  64. table.insert(nodeInfo,v.w or 0)
  65. end
  66. -- dump(nodeInfo,"nodeInfo___")
  67. local opacity = DarkLayerProxy:getOpacity()
  68. local nodenum = global.darkNodeManager:getNodeNums()
  69. local opacityLocation = gl.getUniformLocation(self._glProgram:getProgram(), "opacity")
  70. self._glProgram:setUniformLocationF32(opacityLocation,opacity)
  71. local nodenumLocation = gl.getUniformLocation(self._glProgram:getProgram(), "nodenum")
  72. self._glProgram:setUniformLocationI32(nodenumLocation, nodenum)
  73. local nodeinfoLocation = gl.getUniformLocation(self._glProgram:getProgram(), "nodeinfo")
  74. self._glProgram:setUniformLocationWithMatrix2fv(nodeinfoLocation,nodeInfo ,nodenum)
  75. gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA )
  76. gl.glEnableVertexAttribs(cc.VERTEX_ATTRIB_FLAG_POSITION)
  77. gl.bindBuffer(gl.ARRAY_BUFFER, vao)
  78. gl.vertexAttribPointer(cc.VERTEX_ATTRIB_POSITION, 2, gl.FLOAT, false, 0, 0);
  79. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
  80. gl.bindBuffer(gl.ARRAY_BUFFER, 0)
  81. gl.deleteBuffer(vao)
  82. end
  83. return darklayer