Tuesday, 15 June 2010

The Cocos2D/Cocos2d-x internal implementation of drawDot in CCDrawNode/DrawNode -



The Cocos2D/Cocos2d-x internal implementation of drawDot in CCDrawNode/DrawNode -

for opengl es issue, tracing cocos2d 3.1.0 source code. focus on drawdot in ccdrawnode, here internal implementation:

-(void)drawdot:(cgpoint)pos radius:(cgfloat)radius color:(cccolor *)color; { glkvector4 color4 = premultiply(color.glkvector4); glkvector2 zero2 = glkvector2make(0, 0); ccrenderbuffer buffer = [self buffervertexes:4 andtrianglecount:2]; ccrenderbuffersetvertex(buffer, 0, (ccvertex){glkvector4make(pos.x - radius, pos.y - radius, 0, 1), glkvector2make(-1, -1), zero2, color4}); ccrenderbuffersetvertex(buffer, 1, (ccvertex){glkvector4make(pos.x - radius, pos.y + radius, 0, 1), glkvector2make(-1, 1), zero2, color4}); ccrenderbuffersetvertex(buffer, 2, (ccvertex){glkvector4make(pos.x + radius, pos.y + radius, 0, 1), glkvector2make( 1, 1), zero2, color4}); ccrenderbuffersetvertex(buffer, 3, (ccvertex){glkvector4make(pos.x + radius, pos.y - radius, 0, 1), glkvector2make( 1, -1), zero2, color4}); ccrenderbuffersettriangle(buffer, 0, 0, 1, 2); ccrenderbuffersettriangle(buffer, 1, 0, 2, 3); }

i remember drawdot allows draw circle radius. in knowledge of drawing circle opengl, utilize many triangles form circle, algorithm http://slabode.exofire.net/circle_draw.shtml. please kindly explain why cocos2d uses 2 triangles? or not 2 triangles, miss something?

for reference, cocos2d-x code is:

void drawnode::drawdot(const vec2 &pos, float radius, const color4f &color) { unsigned int vertex_count = 2*3; ensurecapacity(vertex_count); v2f_c4b_t2f = {vec2(pos.x - radius, pos.y - radius), color4b(color), tex2f(-1.0, -1.0) }; v2f_c4b_t2f b = {vec2(pos.x - radius, pos.y + radius), color4b(color), tex2f(-1.0, 1.0) }; v2f_c4b_t2f c = {vec2(pos.x + radius, pos.y + radius), color4b(color), tex2f( 1.0, 1.0) }; v2f_c4b_t2f d = {vec2(pos.x + radius, pos.y - radius), color4b(color), tex2f( 1.0, -1.0) }; v2f_c4b_t2f_triangle *triangles = (v2f_c4b_t2f_triangle *)(_buffer + _buffercount); v2f_c4b_t2f_triangle triangle0 = {a, b, c}; v2f_c4b_t2f_triangle triangle1 = {a, c, d}; triangles[0] = triangle0; triangles[1] = triangle1; _buffercount += vertex_count; _dirty = true; }

thanks

drawdot uses 2 triangles drawing dot(circle). uses specific fragment shader drawing circle.

https://github.com/cocos2d/cocos2d-iphone/blob/v3.1/cocos2d/ccdrawnode.m#l43

gl_fragcolor = cc_fragcolor*smoothstep(0.0, length(fwidth(cc_fragtexcoord1)), 1.0 - length(cc_fragtexcoord1));

for farther reference: http://people.freedesktop.org/~idr/opengl_tutorials/03-fragment-intro.html

cocos2d-x cocos2d-x-3.0

No comments:

Post a Comment