CCShaderCache.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. /****************************************************************************
  2. Copyright (c) 2010-2012 cocos2d-x.org
  3. Copyright (c) 2008-2010 Ricardo Quesada
  4. Copyright (c) 2011 Zynga Inc.
  5. http://www.cocos2d-x.org
  6. Permission is hereby granted, free of charge, to any person obtaining a copy
  7. of this software and associated documentation files (the "Software"), to deal
  8. in the Software without restriction, including without limitation the rights
  9. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. copies of the Software, and to permit persons to whom the Software is
  11. furnished to do so, subject to the following conditions:
  12. The above copyright notice and this permission notice shall be included in
  13. all copies or substantial portions of the Software.
  14. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20. THE SOFTWARE.
  21. ****************************************************************************/
  22. /**
  23. * @constant
  24. * @type {Number}
  25. */
  26. cc.SHADERTYPE_POSITION_TEXTURECOLOR = 0;
  27. /**
  28. * @constant
  29. * @type {Number}
  30. */
  31. cc.SHADERTYPE_POSITION_TEXTURECOLOR_ALPHATEST = 1;
  32. /**
  33. * @constant
  34. * @type {Number}
  35. */
  36. cc.SHADERTYPE_POSITION_COLOR = 2;
  37. /**
  38. * @constant
  39. * @type {Number}
  40. */
  41. cc.SHADERTYPE_POSITION_TEXTURE = 3;
  42. /**
  43. * @constant
  44. * @type {Number}
  45. */
  46. cc.SHADERTYPE_POSITION_TEXTURE_UCOLOR = 4;
  47. /**
  48. * @constant
  49. * @type {Number}
  50. */
  51. cc.SHADERTYPE_POSITION_TEXTURE_A8COLOR = 5;
  52. /**
  53. * @constant
  54. * @type {Number}
  55. */
  56. cc.SHADERTYPE_POSITION_UCOLOR = 6;
  57. /**
  58. * @constant
  59. * @type {Number}
  60. */
  61. cc.SHADERTYPE_POSITION_LENGTH_TEXTURECOLOR = 7;
  62. /**
  63. * @constant
  64. * @type {Number}
  65. */
  66. cc.SHADERTYPE_MAX = 8;
  67. cc._sharedShaderCache = null;
  68. /**
  69. * Singleton that stores manages GL shaders
  70. * @class
  71. * @extends cc.Class
  72. */
  73. cc.ShaderCache = cc.Class.extend({
  74. _programs: null,
  75. _init: function () {
  76. this.loadDefaultShaders();
  77. return true;
  78. },
  79. _loadDefaultShader: function (program, type) {
  80. switch (type) {
  81. case cc.SHADERTYPE_POSITION_TEXTURECOLOR:
  82. program.initWithVertexShaderByteArray(cc.SHADER_POSITION_TEXTURE_COLOR_VERT, cc.SHADER_POSITION_TEXTURE_COLOR_FRAG);
  83. program.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
  84. program.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
  85. program.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
  86. break;
  87. case cc.SHADERTYPE_POSITION_TEXTURECOLOR_ALPHATEST:
  88. program.initWithVertexShaderByteArray(cc.SHADER_POSITION_TEXTURE_COLOR_VERT, cc.SHADER_POSITION_TEXTURE_COLOR_ALPHATEST_FRAG);
  89. program.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
  90. program.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
  91. program.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
  92. break;
  93. case cc.SHADERTYPE_POSITION_COLOR:
  94. program.initWithVertexShaderByteArray(cc.SHADER_POSITION_COLOR_VERT, cc.SHADER_POSITION_COLOR_FRAG);
  95. program.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
  96. program.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
  97. break;
  98. case cc.SHADERTYPE_POSITION_TEXTURE:
  99. program.initWithVertexShaderByteArray(cc.SHADER_POSITION_TEXTURE_VERT, cc.SHADER_POSITION_TEXTURE_FRAG);
  100. program.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
  101. program.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
  102. break;
  103. case cc.SHADERTYPE_POSITION_TEXTURE_UCOLOR:
  104. program.initWithVertexShaderByteArray(cc.SHADER_POSITION_TEXTURE_UCOLOR_VERT, cc.SHADER_POSITION_TEXTURE_UCOLOR_FRAG);
  105. program.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
  106. program.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
  107. break;
  108. case cc.SHADERTYPE_POSITION_TEXTURE_A8COLOR:
  109. program.initWithVertexShaderByteArray(cc.SHADER_POSITION_TEXTURE_A8COLOR_VERT, cc.SHADER_POSITION_TEXTURE_A8COLOR_FRAG);
  110. program.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
  111. program.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
  112. program.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
  113. break;
  114. case cc.SHADERTYPE_POSITION_UCOLOR:
  115. program.initWithVertexShaderByteArray(cc.SHADER_POSITION_UCOLOR_VERT, cc.SHADER_POSITION_UCOLOR_FRAG);
  116. program.addAttribute("aVertex", cc.VERTEX_ATTRIB_POSITION);
  117. break;
  118. case cc.SHADERTYPE_POSITION_LENGTH_TEXTURECOLOR:
  119. program.initWithVertexShaderByteArray(cc.SHADER_POSITION_COLOR_LENGTH_TEXTURE_VERT, cc.SHADER_POSITION_COLOR_LENGTH_TEXTURE_FRAG);
  120. program.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
  121. program.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
  122. program.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
  123. break;
  124. default:
  125. cc.log("cocos2d: cc.ShaderCache._loadDefaultShader, error shader type");
  126. return;
  127. }
  128. program.link();
  129. program.updateUniforms();
  130. //cc.CHECK_GL_ERROR_DEBUG();
  131. },
  132. /**
  133. * Constructor
  134. * @override
  135. */
  136. ctor: function () {
  137. this._programs = {};
  138. },
  139. /**
  140. * loads the default shaders
  141. */
  142. loadDefaultShaders: function () {
  143. // Position Texture Color shader
  144. var program = new cc.GLProgram();
  145. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURECOLOR);
  146. this._programs[cc.SHADER_POSITION_TEXTURECOLOR] = program;
  147. this._programs["ShaderPositionTextureColor"] = program;
  148. // Position Texture Color alpha test
  149. program = new cc.GLProgram();
  150. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURECOLOR_ALPHATEST);
  151. this._programs[cc.SHADER_POSITION_TEXTURECOLORALPHATEST] = program;
  152. this._programs["ShaderPositionTextureColorAlphaTest"] = program;
  153. //
  154. // Position, Color shader
  155. //
  156. program = new cc.GLProgram();
  157. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_COLOR);
  158. this._programs[cc.SHADER_POSITION_COLOR] = program;
  159. this._programs["ShaderPositionColor"] = program;
  160. //
  161. // Position Texture shader
  162. //
  163. program = new cc.GLProgram();
  164. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURE);
  165. this._programs[cc.SHADER_POSITION_TEXTURE] = program;
  166. this._programs["ShaderPositionTexture"] = program;
  167. //
  168. // Position, Texture attribs, 1 Color as uniform shader
  169. //
  170. program = new cc.GLProgram();
  171. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURE_UCOLOR);
  172. this._programs[cc.SHADER_POSITION_TEXTURE_UCOLOR] = program;
  173. this._programs["ShaderPositionTextureUColor"] = program;
  174. //
  175. // Position Texture A8 Color shader
  176. //
  177. program = new cc.GLProgram();
  178. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURE_A8COLOR);
  179. this._programs[cc.SHADER_POSITION_TEXTUREA8COLOR] = program;
  180. this._programs["ShaderPositionTextureA8Color"] = program;
  181. //
  182. // Position and 1 color passed as a uniform (to similate glColor4ub )
  183. //
  184. program = new cc.GLProgram();
  185. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_UCOLOR);
  186. this._programs[cc.SHADER_POSITION_UCOLOR] = program;
  187. this._programs["ShaderPositionUColor"] = program;
  188. //
  189. // Position, Legth(TexCoords, Color (used by Draw Node basically )
  190. //
  191. program = new cc.GLProgram();
  192. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_LENGTH_TEXTURECOLOR);
  193. this._programs[cc.SHADER_POSITION_LENGTHTEXTURECOLOR] = program;
  194. this._programs["ShaderPositionLengthTextureColor"] = program;
  195. },
  196. /**
  197. * reload the default shaders
  198. */
  199. reloadDefaultShaders: function () {
  200. // reset all programs and reload them
  201. // Position Texture Color shader
  202. var program = this.programForKey(cc.SHADER_POSITION_TEXTURECOLOR);
  203. program.reset();
  204. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURECOLOR);
  205. // Position Texture Color alpha test
  206. program = this.programForKey(cc.SHADER_POSITION_TEXTURECOLORALPHATEST);
  207. program.reset();
  208. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURECOLOR_ALPHATEST);
  209. //
  210. // Position, Color shader
  211. //
  212. program = this.programForKey(cc.SHADER_POSITION_COLOR);
  213. program.reset();
  214. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_COLOR);
  215. //
  216. // Position Texture shader
  217. //
  218. program = this.programForKey(cc.SHADER_POSITION_TEXTURE);
  219. program.reset();
  220. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURE);
  221. //
  222. // Position, Texture attribs, 1 Color as uniform shader
  223. //
  224. program = this.programForKey(cc.SHADER_POSITION_TEXTURE_UCOLOR);
  225. program.reset();
  226. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURE_UCOLOR);
  227. //
  228. // Position Texture A8 Color shader
  229. //
  230. program = this.programForKey(cc.SHADER_POSITION_TEXTUREA8COLOR);
  231. program.reset();
  232. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_TEXTURE_A8COLOR);
  233. //
  234. // Position and 1 color passed as a uniform (to similate glColor4ub )
  235. //
  236. program = this.programForKey(cc.SHADER_POSITION_UCOLOR);
  237. program.reset();
  238. this._loadDefaultShader(program, cc.SHADERTYPE_POSITION_UCOLOR);
  239. },
  240. /** returns a GL program for a given key */
  241. programForKey: function (key) {
  242. return this._programs[key];
  243. },
  244. /**
  245. * returns a GL program for a shader name
  246. * @param {String} shaderName
  247. * @return cc.GLProgram
  248. */
  249. getProgram: function (shaderName) {
  250. return this._programs[shaderName];
  251. },
  252. /** adds a CCGLProgram to the cache for a given name */
  253. addProgram: function (program, key) {
  254. this._programs[key] = program;
  255. }
  256. });
  257. /** */
  258. /**
  259. * returns the cc.ShaderCache instance
  260. * @return {cc.ShaderCache}
  261. */
  262. cc.ShaderCache.getInstance = function () {
  263. if (!cc._sharedShaderCache) {
  264. cc._sharedShaderCache = new cc.ShaderCache();
  265. cc._sharedShaderCache._init();
  266. }
  267. return cc._sharedShaderCache;
  268. };
  269. /**
  270. * purges the cache. It releases the retained instance.
  271. */
  272. cc.ShaderCache.purgeSharedShaderCache = function () {
  273. cc._sharedShaderCache = null;
  274. };