1 /****************************************************************************
  2  Copyright (c) 2010-2012 cocos2d-x.org
  3  Copyright (c) 2008-2010 Ricardo Quesada
  4  Copyright (c) 2011      Zynga Inc.
  5 
  6  http://www.cocos2d-x.org
  7 
  8  Permission is hereby granted, free of charge, to any person obtaining a copy
  9  of this software and associated documentation files (the "Software"), to deal
 10  in the Software without restriction, including without limitation the rights
 11  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 12  copies of the Software, and to permit persons to whom the Software is
 13  furnished to do so, subject to the following conditions:
 14 
 15  The above copyright notice and this permission notice shall be included in
 16  all copies or substantial portions of the Software.
 17 
 18  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 19  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 20  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 21  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 22  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 23  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 24  THE SOFTWARE.
 25  ****************************************************************************/
 26 
 27 /**
 28  * @constant
 29  * @type Number
 30  */
 31 cc.INVALID_INDEX = -1;
 32 
 33 /**
 34  * PI is the ratio of a circle's circumference to its diameter.
 35  * @constant
 36  * @type Number
 37  */
 38 cc.PI = Math.PI;
 39 
 40 /**
 41  * @constant
 42  * @type Number
 43  */
 44 cc.FLT_MAX = parseFloat('3.402823466e+38F');
 45 
 46 /**
 47  * @constant
 48  * @type Number
 49  */
 50 cc.RAD = cc.PI / 180;
 51 
 52 /**
 53  * @constant
 54  * @type Number
 55  */
 56 cc.DEG = 180 / cc.PI;
 57 
 58 /**
 59  * maximum unsigned int value
 60  * @constant
 61  * @type Number
 62  */
 63 cc.UINT_MAX = 0xffffffff;
 64 
 65 /**
 66  * <p>
 67  * simple macro that swaps 2 variables<br/>
 68  *  modified from c++ macro, you need to pass in the x and y variables names in string, <br/>
 69  *  and then a reference to the whole object as third variable
 70  * </p>
 71  * @param x
 72  * @param y
 73  * @param ref
 74  * @function
 75  * @deprecated
 76  */
 77 cc.SWAP = function (x, y, ref) {
 78     if ((typeof ref) == 'object' && (typeof ref.x) != 'undefined' && (typeof ref.y) != 'undefined') {
 79         var tmp = ref[x];
 80         ref[x] = ref[y];
 81         ref[y] = tmp;
 82     } else
 83         cc.log("cc.SWAP is being modified from original macro, please check usage");
 84 };
 85 
 86 /**
 87  * <p>
 88  *     Linear interpolation between 2 numbers, the ratio sets how much it is biased to each end
 89  * </p>
 90  * @param {Number} a number A
 91  * @param {Number} b number B
 92  * @param {Number} r ratio between 0 and 1
 93  * @function
 94  * @example
 95  * cc.lerp(2,10,0.5)//returns 6<br/>
 96  * cc.lerp(2,10,0.2)//returns 3.6
 97  */
 98 cc.lerp = function (a, b, r) {
 99     return a + (b - a) * r;
100 };
101 
102 /**
103  * returns a random float between -1 and 1
104  * @return {Number}
105  * @function
106  */
107 cc.RANDOM_MINUS1_1 = function () {
108     return (Math.random() - 0.5) * 2;
109 };
110 
111 /**
112  * returns a random float between 0 and 1
113  * @return {Number}
114  * @function
115  */
116 cc.RANDOM_0_1 = function () {
117     return Math.random();
118 };
119 
120 /**
121  * converts degrees to radians
122  * @param {Number} angle
123  * @return {Number}
124  * @function
125  */
126 cc.DEGREES_TO_RADIANS = function (angle) {
127     return angle * cc.RAD;
128 };
129 
130 /**
131  * converts radians to degrees
132  * @param {Number} angle
133  * @return {Number}
134  * @function
135  */
136 cc.RADIANS_TO_DEGREES = function (angle) {
137     return angle * cc.DEG;
138 };
139 
140 /**
141  * @constant
142  * @type Number
143  */
144 cc.REPEAT_FOREVER = Number.MAX_VALUE - 1;
145 
146 /**
147  * default gl blend src function. Compatible with premultiplied alpha images.
148  * @constant
149  * @type Number
150  */
151 cc.BLEND_SRC = cc.OPTIMIZE_BLEND_FUNC_FOR_PREMULTIPLIED_ALPHA ? 1 : 0x0302;
152 
153 /**
154  * default gl blend dst function. Compatible with premultiplied alpha images.
155  * @constant
156  * @type Number
157  */
158 cc.BLEND_DST = 0x0303;
159 
160 /**
161  * Helpful macro that setups the GL server state, the correct GL program and sets the Model View Projection matrix
162  * @param {cc.Node} node setup node
163  * @function
164  */
165 cc.NODE_DRAW_SETUP = function (node) {
166     //cc.glEnable(node._glServerState);
167     if (node._shaderProgram) {
168         //cc._renderContext.useProgram(node._shaderProgram._programObj);
169         node._shaderProgram.use();
170         node._shaderProgram.setUniformForModelViewAndProjectionMatrixWithMat4();
171     }
172 };
173 
174 /**
175  * <p>
176  *     GL states that are enabled:<br/>
177  *       - GL_TEXTURE_2D<br/>
178  *       - GL_VERTEX_ARRAY<br/>
179  *       - GL_TEXTURE_COORD_ARRAY<br/>
180  *       - GL_COLOR_ARRAY<br/>
181  * </p>
182  * @function
183  */
184 cc.ENABLE_DEFAULT_GL_STATES = function () {
185     //TODO OPENGL STUFF
186     /*
187      glEnableClientState(GL_VERTEX_ARRAY);
188      glEnableClientState(GL_COLOR_ARRAY);
189      glEnableClientState(GL_TEXTURE_COORD_ARRAY);
190      glEnable(GL_TEXTURE_2D);*/
191 };
192 
193 /**
194  * <p>
195  *   Disable default GL states:<br/>
196  *     - GL_TEXTURE_2D<br/>
197  *     - GL_TEXTURE_COORD_ARRAY<br/>
198  *     - GL_COLOR_ARRAY<br/>
199  * </p>
200  * @function
201  */
202 cc.DISABLE_DEFAULT_GL_STATES = function () {
203     //TODO OPENGL
204     /*
205      glDisable(GL_TEXTURE_2D);
206      glDisableClientState(GL_COLOR_ARRAY);
207      glDisableClientState(GL_TEXTURE_COORD_ARRAY);
208      glDisableClientState(GL_VERTEX_ARRAY);
209      */
210 };
211 
212 /**
213  * <p>
214  *  Increments the GL Draws counts by one.<br/>
215  *  The number of calls per frame are displayed on the screen when the CCDirector's stats are enabled.<br/>
216  * </p>
217  * @param {Number} addNumber
218  * @function
219  */
220 cc.INCREMENT_GL_DRAWS = function (addNumber) {
221     cc.g_NumberOfDraws += addNumber;
222 };
223 
224 /**
225  * @constant
226  * @type Number
227  */
228 cc.FLT_EPSILON = 0.0000001192092896;
229 
230 /**
231  * <p>
232  *     On Mac it returns 1;<br/>
233  *     On iPhone it returns 2 if RetinaDisplay is On. Otherwise it returns 1
234  * </p>
235  * @function
236  */
237 cc.CONTENT_SCALE_FACTOR = cc.IS_RETINA_DISPLAY_SUPPORTED ? function () {
238     return cc.director.getContentScaleFactor();
239 } : function () {
240     return 1;
241 };
242 
243 /**
244  * Converts a Point in points to pixels
245  * @param {cc.Point} points
246  * @return {cc.Point}
247  * @function
248  */
249 cc.POINT_POINTS_TO_PIXELS = function (points) {
250     var scale = cc.CONTENT_SCALE_FACTOR();
251     return cc.p(points.x * scale, points.y * scale);
252 };
253 
254 /**
255  * Converts a Size in points to pixels
256  * @param {cc.Size} sizeInPoints
257  * @return {cc.Size}
258  * @function
259  */
260 cc.SIZE_POINTS_TO_PIXELS = function (sizeInPoints) {
261     var scale = cc.CONTENT_SCALE_FACTOR();
262     return cc.size(sizeInPoints.width * scale, sizeInPoints.height * scale);
263 };
264 
265 /**
266  * Converts a size in pixels to points
267  * @param {cc.Size} sizeInPixels
268  * @return {cc.Size}
269  * @function
270  */
271 cc.SIZE_PIXELS_TO_POINTS = function (sizeInPixels) {
272     var scale = cc.CONTENT_SCALE_FACTOR();
273     return cc.size(sizeInPixels.width / scale, sizeInPixels.height / scale);
274 };
275 
276 cc._SIZE_PIXELS_TO_POINTS_OUT = function (sizeInPixels, outSize) {
277     var scale = cc.CONTENT_SCALE_FACTOR();
278     outSize.width = sizeInPixels.width / scale;
279     outSize.height = sizeInPixels.height / scale;
280 };
281 
282 /**
283  * Converts a Point in pixels to points
284  * @param {Point} pixels
285  * @function
286  */
287 cc.POINT_PIXELS_TO_POINTS = function (pixels) {
288     var scale = cc.CONTENT_SCALE_FACTOR();
289     return cc.p(pixels.x / scale, pixels.y / scale);
290 };
291 
292 cc._POINT_PIXELS_TO_POINTS_OUT = function(pixels, outPoint){
293     var scale = cc.CONTENT_SCALE_FACTOR();
294     outPoint.x = pixels.x / scale;
295     outPoint.y = pixels.y / scale;
296 };
297 
298 /**
299  * Converts a rect in pixels to points
300  * @param {cc.Rect} pixel
301  * @function
302  */
303 cc.RECT_PIXELS_TO_POINTS = cc.IS_RETINA_DISPLAY_SUPPORTED ? function (pixel) {
304     var scale = cc.CONTENT_SCALE_FACTOR();
305     return cc.rect(pixel.x / scale, pixel.y / scale,
306         pixel.width / scale, pixel.height / scale);
307 } : function (p) {
308     return p;
309 };
310 
311 /**
312  * Converts a rect in points to pixels
313  * @param {cc.Rect} point
314  * @function
315  */
316 cc.RECT_POINTS_TO_PIXELS = cc.IS_RETINA_DISPLAY_SUPPORTED ? function (point) {
317    var scale = cc.CONTENT_SCALE_FACTOR();
318     return cc.rect(point.x * scale, point.y * scale,
319         point.width * scale, point.height * scale);
320 } : function (p) {
321     return p;
322 };
323 
324 /**
325  * @constant
326  * @type Number
327  */
328 cc.ONE = 1;
329 
330 /**
331  * @constant
332  * @type Number
333  */
334 cc.ZERO = 0;
335 
336 /**
337  * @constant
338  * @type Number
339  */
340 cc.SRC_ALPHA = 0x0302;
341 
342 /**
343  * @constant
344  * @type Number
345  */
346 cc.ONE_MINUS_SRC_ALPHA = 0x0303;
347 
348 /**
349  * @constant
350  * @type Number
351  */
352 cc.ONE_MINUS_DST_COLOR = 0x0307;
353 
354 
355 cc.CHECK_GL_ERROR_DEBUG = function () {
356     if (cc.renderMode == cc._RENDER_TYPE_WEBGL) {
357         var _error = cc._renderContext.getError();
358         if (_error) {
359             cc.log("WebGL error " + _error);
360         }
361     }
362 };
363