| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- local BaseLayer = requireLayerUI("BaseLayer")
- local darklayer = class("darklayer", BaseLayer)
- local darkShader = "darkShader"
- function darklayer:ctor()
- darklayer.super.ctor(self)
- end
- function darklayer.create(...)
- local ui = darklayer.new()
- if ui and ui:Init(...) then
- return ui
- end
- return nil
- end
- function darklayer:Init(data)
- if SL:GetMetaValue("GAME_DATA", "dark") ~= 1 then
- return true
- end
- self._glProgram = global.GLProgramCache:getGLProgram( darkShader )
- if not self._glProgram then
- self._glProgram = cc.GLProgram:createWithFilenames( "shader/dark.vert", "shader/dark.frag" )
- global.GLProgramCache:addGLProgram( self._glProgram, darkShader )
- end
-
- self.glNode = gl.glNodeCreate()
- local rootNode = global.sceneGraphCtl:GetGameWorldRoot()
- rootNode:addChild(self.glNode)
- self.glNode:setCameraMask(cc.CameraFlag.USER1, true)
- self.glNode:registerScriptDrawHandler(handler(self,self.onDraw))
- return true
- end
- function darklayer:onDraw(transform, transformUpdated)
- local DarkLayerProxy = global.Facade:retrieveProxy(global.ProxyTable.DarkLayerProxy)
- local curState = DarkLayerProxy:getCurState()
- if curState == DarkLayerProxy.STATE.daytime then
- return
- end
- local camera = global.gameMapController:GetViewCamera()
- if not camera then
- return
- end
- -- self.glNode:setPosition(camera:getPosition())
- local gameWorldPos = cc.p(camera:getPosition())
- -- dump(gameWorldPos,"gameWorldPos___")
- self._glProgram:use()
- self._glProgram:setUniformsForBuiltins()
- local size = cc.Director:getInstance():getWinSize()
- local viewScaleX, viewScaleY = CalcCameraZoom( camera )
- local vertices = {
- gameWorldPos.x + size.width*viewScaleX/2, gameWorldPos.y - size.height*viewScaleY/2,
- gameWorldPos.x + size.width*viewScaleX/2, gameWorldPos.y + size.height*viewScaleY/2,
- gameWorldPos.x - size.width*viewScaleX/2, gameWorldPos.y - size.height*viewScaleY/2,
- gameWorldPos.x - size.width*viewScaleX/2, gameWorldPos.y + size.height*viewScaleY/2,
- }
- local vao = gl.createBuffer()
- gl.bindBuffer(gl.ARRAY_BUFFER, vao)
- gl.bufferData(gl.ARRAY_BUFFER, table.getn(vertices), vertices, gl.STATIC_DRAW)
- gl.bindBuffer(gl.ARRAY_BUFFER, 0)
- ------------render-------------
-
- local nodeData = global.darkNodeManager:getAllNodes()
- local nodeInfo = {}
- for i, v in pairs(nodeData) do
- table.insert(nodeInfo,v.x or 0)
- table.insert(nodeInfo,v.y or 0)
- table.insert(nodeInfo,v.r or 0)
- table.insert(nodeInfo,v.w or 0)
- end
- -- dump(nodeInfo,"nodeInfo___")
- local opacity = DarkLayerProxy:getOpacity()
- local nodenum = global.darkNodeManager:getNodeNums()
- local opacityLocation = gl.getUniformLocation(self._glProgram:getProgram(), "opacity")
- self._glProgram:setUniformLocationF32(opacityLocation,opacity)
- local nodenumLocation = gl.getUniformLocation(self._glProgram:getProgram(), "nodenum")
- self._glProgram:setUniformLocationI32(nodenumLocation, nodenum)
- local nodeinfoLocation = gl.getUniformLocation(self._glProgram:getProgram(), "nodeinfo")
- self._glProgram:setUniformLocationWithMatrix2fv(nodeinfoLocation,nodeInfo ,nodenum)
- gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA )
- gl.glEnableVertexAttribs(cc.VERTEX_ATTRIB_FLAG_POSITION)
- gl.bindBuffer(gl.ARRAY_BUFFER, vao)
- gl.vertexAttribPointer(cc.VERTEX_ATTRIB_POSITION, 2, gl.FLOAT, false, 0, 0);
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
- gl.bindBuffer(gl.ARRAY_BUFFER, 0)
- gl.deleteBuffer(vao)
- end
- return darklayer
|