cocos2d-x 2.0 版本的 GLES-Render

原文链接:http://blog.csdn.net/yang3wei/article/details/8442725

GLES-Render 是用来做 Box2D 的 debug draw 功能的,比较重要。

在 cocos2d-x 2.0 模板工程里面没有看到这个东西的影子,

而且我又有需要,便拿 cocos2d-iphone 2.0 的改了一个来用。

注意的一个地方是 shader 成员可以从  cocos2d shader 缓存里面拿,不用自己创建一个。

因为这里我是探索,所以就自己创建了一个玩玩儿。


代码如下:

GLES-Render.h

[cpp]  view plain copy
  1. /* 
  2. * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com 
  3. * 
  4. * iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com 
  5. * 
  6. * This software is provided 'as-is', without any express or implied 
  7. * warranty.  In no event will the authors be held liable for any damages 
  8. * arising from the use of this software. 
  9. * Permission is granted to anyone to use this software for any purpose, 
  10. * including commercial applications, and to alter it and redistribute it 
  11. * freely, subject to the following restrictions: 
  12. * 1. The origin of this software must not be misrepresented; you must not 
  13. * claim that you wrote the original software. If you use this software 
  14. * in a product, an acknowledgment in the product documentation would be 
  15. * appreciated but is not required. 
  16. * 2. Altered source versions must be plainly marked as such, and must not be 
  17. * misrepresented as being the original software. 
  18. * 3. This notice may not be removed or altered from any source distribution. 
  19. */  
  20.   
  21. //  
  22. // File modified for cocos2d integration  
  23. // http://www.cocos2d-iphone.org  
  24. //  
  25.   
  26. #ifndef GLES_RENDER_H  
  27. #define GLES_RENDER_H  
  28.   
  29. #import "cocos2d.h"  
  30.   
  31. #ifdef __CC_PLATFORM_IOS  
  32. #import <OpenGLES/EAGL.h>  
  33. #elif defined(__CC_PLATFORM_MAC)  
  34. #import <OpenGL/OpenGL.h>  
  35. #endif  
  36.   
  37. #include "Box2D.h"  
  38. #include "ccShaders.h"  
  39.   
  40. USING_NS_CC;  
  41.   
  42. struct b2AABB;  
  43.   
  44. // This class implements debug drawing callbacks that are invoked  
  45. // inside b2World::Step.  
  46. class GLESDebugDraw : public b2Draw {  
  47.     float32 mRatio;  
  48.     CCGLProgram* mShaderProgram;  
  49.     GLint mColorLocation;  
  50.   
  51.     void initShader( void );  
  52. public:  
  53.     GLESDebugDraw();  
  54.   
  55.     GLESDebugDraw( float32 ratio );  
  56.   
  57.     void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);  
  58.   
  59.     void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);  
  60.   
  61.     void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color);  
  62.   
  63.     void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color);  
  64.   
  65.     void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color);  
  66.   
  67.     void DrawTransform(const b2Transform& xf);  
  68.   
  69.     void DrawPoint(const b2Vec2& p, float32 size, const b2Color& color);  
  70.   
  71.     void DrawString(int x, int y, const char* string, ...);  
  72.   
  73.     void DrawAABB(b2AABB* aabb, const b2Color& color);  
  74. };  
  75.   
  76.   
  77. #endif // GLES_RENDER_H  

GLES-Render.cpp

[cpp]  view plain copy
  1. /* 
  2.  * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com 
  3.  * 
  4.  * iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com 
  5.  * 
  6.  * This software is provided 'as-is', without any express or implied 
  7.  * warranty.  In no event will the authors be held liable for any damages 
  8.  * arising from the use of this software. 
  9.  * Permission is granted to anyone to use this software for any purpose, 
  10.  * including commercial applications, and to alter it and redistribute it 
  11.  * freely, subject to the following restrictions: 
  12.  * 1. The origin of this software must not be misrepresented; you must not 
  13.  * claim that you wrote the original software. If you use this software 
  14.  * in a product, an acknowledgment in the product documentation would be 
  15.  * appreciated but is not required. 
  16.  * 2. Altered source versions must be plainly marked as such, and must not be 
  17.  * misrepresented as being the original software. 
  18.  * 3. This notice may not be removed or altered from any source distribution. 
  19.  */  
  20.   
  21. //  
  22. // File modified for cocos2d integration  
  23. // http://www.cocos2d-iphone.org  
  24. //  
  25.   
  26. #import "cocos2d.h"  
  27. #include "GLES-Render.h"  
  28.   
  29.   
  30. #include <cstdio>  
  31. #include <cstdarg>  
  32.   
  33. #include <string>  
  34.   
  35. using namespace std;  
  36.   
  37. GLESDebugDraw::GLESDebugDraw() : mRatio( 1.0f ) {  
  38.     this->initShader();  
  39. }  
  40.   
  41. GLESDebugDraw::GLESDebugDraw( float32 ratio ) : mRatio( ratio ) {  
  42.     this->initShader();  
  43. }  
  44.   
  45. void GLESDebugDraw::initShader( void ) {  
  46.     mShaderProgram = new CCGLProgram();  
  47.       
  48.     /** 
  49.      * 0.CCString 方法存在问题~ 
  50.      */  
  51. //    mShaderProgram->initWithVertexShaderFilename("Position_uColor.vsh", "Position_uColor.fsh");  
  52.       
  53.     /** 
  54.      * 1.报 shader 文件编译错误~ 
  55.      */  
  56. //    string t_oStr0("#ifdef GL_ES\nprecision lowp float;\n#endif\nvarying vec4 v_fragmentColor;\nvoid main() {\ngl_FragColor = v_fragmentColor;\n}");  
  57. //    string t_oStr1("attribute vec4 a_position;\nuniform   mat4 u_MVPMatrix;\nuniform  vec4 u_color;\nuniform float u_pointSize;\n#ifdef GL_ES\nvarying lowp vec4 v_fragmentColor;\n#else\nvarying vec4 v_fragmentColor;\n#endif\nvoid main()\n{\ngl_Position = u_MVPMatrix * a_position;\ngl_PointSize = u_pointSize;\nv_fragmentColor = u_color;\n}");  
  58. //    mShaderProgram->initWithVertexShaderByteArray(t_oStr0.c_str(), t_oStr1.c_str());  
  59.       
  60.     /** 
  61.      * 2.终于成功了~ 
  62.      */  
  63.     mShaderProgram->initWithVertexShaderByteArray(ccPosition_uColor_vert, ccPosition_uColor_frag);  
  64.       
  65.     mShaderProgram->addAttribute("aVertex", kCCVertexAttrib_Position);  
  66.     mShaderProgram->link();  
  67.     mShaderProgram->updateUniforms();  
  68.   
  69.     mColorLocation = glGetUniformLocation( mShaderProgram->getProgram(), "u_color");  
  70. }  
  71.   
  72. void GLESDebugDraw::DrawPolygon(const b2Vec2* old_vertices, int32 vertexCount, const b2Color& color) {  
  73.     ccGLUseProgram(mShaderProgram->getProgram());  
  74.     mShaderProgram->setUniformForModelViewProjectionMatrix();  
  75.   
  76.     ccVertex2F vertices[vertexCount];  
  77.   
  78.     forint i=0;i<vertexCount;i++) {  
  79.         b2Vec2 tmp = old_vertices[i];  
  80.         tmp *= mRatio;  
  81.         vertices[i].x = tmp.x;  
  82.         vertices[i].y = tmp.y;  
  83.     }  
  84.   
  85.     glUniform4f( mColorLocation, color.r, color.g, color.b, 1);  
  86.   
  87.     glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);  
  88.     glDrawArrays(GL_LINE_LOOP, 0, vertexCount);  
  89.   
  90.     CHECK_GL_ERROR_DEBUG();  
  91. }  
  92.   
  93. void GLESDebugDraw::DrawSolidPolygon(const b2Vec2* old_vertices, int32 vertexCount, const b2Color& color)  
  94. {  
  95.     ccGLUseProgram(mShaderProgram->getProgram());  
  96.     mShaderProgram->setUniformForModelViewProjectionMatrix();  
  97.   
  98.     ccVertex2F vertices[vertexCount];  
  99.   
  100.     forint i=0;i<vertexCount;i++) {  
  101.         b2Vec2 tmp = old_vertices[i];  
  102.         tmp = old_vertices[i];  
  103.         tmp *= mRatio;  
  104.         vertices[i].x = tmp.x;  
  105.         vertices[i].y = tmp.y;  
  106.     }  
  107.   
  108.     glUniform4f( mColorLocation, color.r*0.5f, color.g*0.5f, color.b*0.5f,0.5f);  
  109.     glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);  
  110.   
  111.     glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount);  
  112.   
  113.     glUniform4f( mColorLocation, color.r, color.g, color.b,1);  
  114.     glDrawArrays(GL_LINE_LOOP, 0, vertexCount);  
  115.   
  116.     CHECK_GL_ERROR_DEBUG();  
  117. }  
  118.   
  119. void GLESDebugDraw::DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color)  
  120. {  
  121.     ccGLUseProgram(mShaderProgram->getProgram());  
  122.     mShaderProgram->setUniformForModelViewProjectionMatrix();  
  123.   
  124.   
  125.     const float32 k_segments = 16.0f;  
  126.     int vertexCount=16;  
  127.     const float32 k_increment = 2.0f * b2_pi / k_segments;  
  128.     float32 theta = 0.0f;  
  129.   
  130.     GLfloat             glVertices[vertexCount*2];  
  131.     for (int32 i = 0; i < k_segments; ++i)  
  132.     {  
  133.         b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta));  
  134.         glVertices[i*2]=v.x * mRatio;  
  135.         glVertices[i*2+1]=v.y * mRatio;  
  136.         theta += k_increment;  
  137.     }  
  138.   
  139.     glUniform4f( mColorLocation, color.r, color.g, color.b,1);  
  140.     glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, glVertices);  
  141.   
  142.     glDrawArrays(GL_LINE_LOOP, 0, vertexCount);  
  143.   
  144.     CHECK_GL_ERROR_DEBUG();  
  145. }  
  146.   
  147. void GLESDebugDraw::DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color)  
  148. {  
  149.     ccGLUseProgram(mShaderProgram->getProgram());  
  150.     mShaderProgram->setUniformForModelViewProjectionMatrix();  
  151.   
  152.     const float32 k_segments = 16.0f;  
  153.     int vertexCount=16;  
  154.     const float32 k_increment = 2.0f * b2_pi / k_segments;  
  155.     float32 theta = 0.0f;  
  156.   
  157.     GLfloat             glVertices[vertexCount*2];  
  158.     for (int32 i = 0; i < k_segments; ++i)  
  159.     {  
  160.         b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta));  
  161.         glVertices[i*2]=v.x * mRatio;  
  162.         glVertices[i*2+1]=v.y * mRatio;  
  163.         theta += k_increment;  
  164.     }  
  165.   
  166.   
  167.     glUniform4f( mColorLocation, color.r *0.5f, color.g*0.5f, color.b*0.5f,0.5f );  
  168.     glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, glVertices);  
  169.     glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount);  
  170.   
  171.   
  172.     glUniform4f( mColorLocation, color.r, color.g, color.b,1);  
  173.     glDrawArrays(GL_LINE_LOOP, 0, vertexCount);  
  174.   
  175.     // Draw the axis line  
  176.     DrawSegment(center,center+radius*axis,color);  
  177.   
  178.     CHECK_GL_ERROR_DEBUG();  
  179. }  
  180.   
  181. void GLESDebugDraw::DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color)  
  182. {  
  183.     ccGLUseProgram(mShaderProgram->getProgram());  
  184.     mShaderProgram->setUniformForModelViewProjectionMatrix();  
  185.   
  186.     glUniform4f( mColorLocation, color.r, color.g, color.b,1);  
  187.   
  188.     GLfloat             glVertices[] = {  
  189.         p1.x * mRatio, p1.y * mRatio,  
  190.         p2.x * mRatio, p2.y * mRatio  
  191.     };  
  192.   
  193.     glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, glVertices);  
  194.   
  195.     glDrawArrays(GL_LINES, 0, 2);  
  196.   
  197.     CHECK_GL_ERROR_DEBUG();  
  198. }  
  199.   
  200. void GLESDebugDraw::DrawTransform(const b2Transform& xf)  
  201. {  
  202.     b2Vec2 p1 = xf.p, p2;  
  203.     const float32 k_axisScale = 0.4f;  
  204.     p2 = p1 + k_axisScale * xf.q.GetXAxis();  
  205.     DrawSegment(p1, p2, b2Color(1,0,0));  
  206.   
  207.     p2 = p1 + k_axisScale * xf.q.GetYAxis();  
  208.     DrawSegment(p1,p2,b2Color(0,1,0));  
  209. }  
  210.   
  211. void GLESDebugDraw::DrawPoint(const b2Vec2& p, float32 size, const b2Color& color)  
  212. {  
  213.     ccGLUseProgram(mShaderProgram->getProgram());  
  214.     mShaderProgram->setUniformForModelViewProjectionMatrix();  
  215.   
  216.     glUniform4f( mColorLocation, color.r, color.g, color.b,1);  
  217.   
  218. //  glPointSize(size);  
  219.   
  220.     GLfloat             glVertices[] = {  
  221.         p.x * mRatio, p.y * mRatio  
  222.     };  
  223.   
  224.     glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, glVertices);  
  225.   
  226.     glDrawArrays(GL_POINTS, 0, 1);  
  227. //  glPointSize(1.0f);  
  228.   
  229.     CHECK_GL_ERROR_DEBUG();  
  230. }  
  231.   
  232. void GLESDebugDraw::DrawString(int x, int y, const char *string, ...)  
  233. {  
  234.     //  NSLog(@"DrawString: unsupported: %s", string);  
  235.     //printf(string);  
  236.     /* Unsupported as yet. Could replace with bitmap font renderer at a later date */  
  237. }  
  238.   
  239. void GLESDebugDraw::DrawAABB(b2AABB* aabb, const b2Color& c)  
  240. {  
  241.     ccGLUseProgram(mShaderProgram->getProgram());  
  242.     mShaderProgram->setUniformForModelViewProjectionMatrix();  
  243.   
  244.     glUniform4f( mColorLocation, c.r, c.g, c.b,1);  
  245.   
  246.     GLfloat             glVertices[] = {  
  247.         aabb->lowerBound.x * mRatio, aabb->lowerBound.y * mRatio,  
  248.         aabb->upperBound.x * mRatio, aabb->lowerBound.y * mRatio,  
  249.         aabb->upperBound.x * mRatio, aabb->upperBound.y * mRatio,  
  250.         aabb->lowerBound.x * mRatio, aabb->upperBound.y * mRatio  
  251.     };  
  252.   
  253.     glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, glVertices);  
  254.     glDrawArrays(GL_LINE_LOOP, 0, 8);  
  255.   
  256.     CHECK_GL_ERROR_DEBUG();  
  257. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值