2010-07-06 11:54:00 +08:00
|
|
|
#include "CCDrawingPrimitives.h"
|
2010-07-06 10:19:51 +08:00
|
|
|
|
2010-07-06 17:54:36 +08:00
|
|
|
#define _USE_MATH_DEFINES
|
2010-07-06 10:19:51 +08:00
|
|
|
#include <math.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <GLES/gl.h>
|
|
|
|
|
|
|
|
void ccDrawPoint(CGPoint point)
|
|
|
|
{
|
|
|
|
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Needed states: GL_VERTEX_ARRAY,
|
|
|
|
// Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
|
|
|
glVertexPointer(2, GL_FLOAT, 0, &point);
|
|
|
|
glDrawArrays(GL_POINTS, 0, 1);
|
|
|
|
|
|
|
|
// restore default state
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ccDrawPoints(CGPoint *points, unsigned int numberOfPoints)
|
|
|
|
{
|
|
|
|
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Needed states: GL_VERTEX_ARRAY,
|
|
|
|
// Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
|
|
|
glVertexPointer(2, GL_FLOAT, 0, points);
|
|
|
|
glDrawArrays(GL_POINTS, 0, numberOfPoints);
|
|
|
|
|
|
|
|
// restore default state
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ccDrawLine(CGPoint origin, CGPoint destination)
|
|
|
|
{
|
|
|
|
CGPoint vertices[2];
|
|
|
|
|
|
|
|
vertices[0] = origin;
|
|
|
|
vertices[1] = destination;
|
|
|
|
|
|
|
|
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Needed states: GL_VERTEX_ARRAY,
|
|
|
|
// Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
|
|
|
glVertexPointer(2, GL_FLOAT, 0, vertices);
|
|
|
|
glDrawArrays(GL_LINES, 0, 2);
|
|
|
|
|
|
|
|
// restore default state
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ccDrawPoly(CGPoint *poli, int points, BOOL closePolygon)
|
|
|
|
{
|
|
|
|
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Needed states: GL_VERTEX_ARRAY,
|
|
|
|
// Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
|
|
|
glVertexPointer(2, GL_FLOAT, 0, poli);
|
|
|
|
if (closePolygon)
|
|
|
|
{
|
|
|
|
glDrawArrays(GL_LINE_LOOP, 0, points);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
glDrawArrays(GL_LINE_STRIP, 0, points);
|
|
|
|
}
|
|
|
|
|
|
|
|
// restore default state
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ccDrawCircle(CGPoint center, float r, float a, int segs, BOOL drawLineToCenter)
|
|
|
|
{
|
|
|
|
int additionalSegment = 1;
|
|
|
|
if (drawLineToCenter)
|
|
|
|
{
|
|
|
|
++additionalSegment;
|
|
|
|
}
|
|
|
|
|
|
|
|
const float coef = 2.0f * (float)M_PI/segs;
|
|
|
|
|
2010-07-06 17:54:36 +08:00
|
|
|
float *vertices = (float *)malloc( sizeof(float)*2*(segs+2));
|
2010-07-06 10:19:51 +08:00
|
|
|
if( ! vertices )
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
memset( vertices,0, sizeof(float)*2*(segs+2));
|
|
|
|
|
|
|
|
for(int i=0;i<=segs;i++)
|
|
|
|
{
|
|
|
|
float rads = i*coef;
|
|
|
|
float j = r * cosf(rads + a) + center.x;
|
|
|
|
float k = r * sinf(rads + a) + center.y;
|
|
|
|
|
|
|
|
vertices[i*2] = j;
|
|
|
|
vertices[i*2+1] =k;
|
|
|
|
}
|
|
|
|
vertices[(segs+1)*2] = center.x;
|
|
|
|
vertices[(segs+1)*2+1] = center.y;
|
|
|
|
|
|
|
|
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Needed states: GL_VERTEX_ARRAY,
|
|
|
|
// Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
|
|
|
glVertexPointer(2, GL_FLOAT, 0, vertices);
|
|
|
|
glDrawArrays(GL_LINE_STRIP, 0, segs+additionalSegment);
|
|
|
|
|
|
|
|
// restore default state
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
|
|
|
|
free(vertices);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ccDrawQuadBezier(CGPoint origin, CGPoint control, CGPoint destination, int segments)
|
|
|
|
{
|
2010-07-06 17:54:36 +08:00
|
|
|
CGPoint *vertices = new CGPoint[segments + 1];
|
2010-07-06 10:19:51 +08:00
|
|
|
|
|
|
|
float t = 0.0f;
|
|
|
|
for(int i = 0; i < segments; i++)
|
|
|
|
{
|
|
|
|
float x = powf(1 - t, 2) * origin.x + 2.0f * (1 - t) * t * control.x + t * t * destination.x;
|
|
|
|
float y = powf(1 - t, 2) * origin.y + 2.0f * (1 - t) * t * control.y + t * t * destination.y;
|
|
|
|
vertices[i] = CGPointMake(x, y);
|
|
|
|
t += 1.0f / segments;
|
|
|
|
}
|
|
|
|
vertices[segments] = destination;
|
|
|
|
|
|
|
|
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Needed states: GL_VERTEX_ARRAY,
|
|
|
|
// Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
|
|
|
glVertexPointer(2, GL_FLOAT, 0, vertices);
|
|
|
|
glDrawArrays(GL_LINE_STRIP, 0, segments + 1);
|
2010-07-06 17:54:36 +08:00
|
|
|
delete[] vertices;
|
2010-07-06 10:19:51 +08:00
|
|
|
|
|
|
|
// restore default state
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ccDrawCubicBezier(CGPoint origin, CGPoint control1, CGPoint control2, CGPoint destination, int segments)
|
|
|
|
{
|
2010-07-06 17:54:36 +08:00
|
|
|
CGPoint *vertices = new CGPoint[segments + 1];
|
2010-07-06 10:19:51 +08:00
|
|
|
|
|
|
|
float t = 0;
|
|
|
|
for(int i = 0; i < segments; ++i)
|
|
|
|
{
|
|
|
|
float x = powf(1 - t, 3) * origin.x + 3.0f * powf(1 - t, 2) * t * control1.x + 3.0f * (1 - t) * t * t * control2.x + t * t * t * destination.x;
|
|
|
|
float y = powf(1 - t, 3) * origin.y + 3.0f * powf(1 - t, 2) * t * control1.y + 3.0f * (1 - t) * t * t * control2.y + t * t * t * destination.y;
|
|
|
|
vertices[i] = CGPointMake(x, y);
|
|
|
|
t += 1.0f / segments;
|
|
|
|
}
|
|
|
|
vertices[segments] = destination;
|
|
|
|
|
|
|
|
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Needed states: GL_VERTEX_ARRAY,
|
|
|
|
// Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
|
|
|
glVertexPointer(2, GL_FLOAT, 0, vertices);
|
|
|
|
glDrawArrays(GL_LINE_STRIP, 0, segments + 1);
|
2010-07-06 17:54:36 +08:00
|
|
|
delete[] vertices;
|
2010-07-06 10:19:51 +08:00
|
|
|
|
|
|
|
// restore default state
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
}
|