Box2d draw Line Help class in cocos2d-x

Source: Internet
Author: User

/* * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com * * This software is provided 'as-is', without any express or implied * warranty.  In no event will the authors be held liable for any damages * arising from the use of this software. * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. *///// File modified for cocos2d integration// http://www.cocos2d-iphone.org//#ifndef GLES_RENDER_H#define GLES_RENDER_H#include "Box2D/Box2D.h"#include "cocos2d.h"struct b2AABB;// This class implements debug drawing callbacks that are invoked// inside b2World::Step.class GLESDebugDraw : public b2Draw{float32 mRatio;cocos2d::GLProgram *mShaderProgram;GLintmColorLocation;    void initShader( void );public:GLESDebugDraw();    GLESDebugDraw( float32 ratio );    void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);    void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color);    void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color);    void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color);    void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color);    void DrawTransform(const b2Transform& xf);        void DrawPoint(const b2Vec2& p, float32 size, const b2Color& color);        void DrawString(int x, int y, const char* string, ...);        void DrawAABB(b2AABB* aabb, const b2Color& color);};#endif // GLES_RENDER_H

#include "cocos2d.h"#include 
 
  #include 
  
   #include 
   
    USING_NS_CC;GLESDebugDraw::GLESDebugDraw(): mRatio( 1.0f ){this->initShader();}GLESDebugDraw::GLESDebugDraw( float32 ratio ): mRatio( ratio ){this->initShader();}void GLESDebugDraw::initShader( void ){mShaderProgram = ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_U_COLOR);mColorLocation = glGetUniformLocation( mShaderProgram->getProgram(), "u_color");}void GLESDebugDraw::DrawPolygon(const b2Vec2* old_vertices, int32 vertexCount, const b2Color& color){mShaderProgram->use();mShaderProgram->setUniformsForBuiltins();b2Vec2* vertices = new b2Vec2[vertexCount];for( int i=0;i
    
     setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1);glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);glDrawArrays(GL_LINE_LOOP, 0, vertexCount);CC_INCREMENT_GL_DRAWS(1);CHECK_GL_ERROR_DEBUG();delete[] vertices;}void GLESDebugDraw::DrawSolidPolygon(const b2Vec2* old_vertices, int32 vertexCount, const b2Color& color){mShaderProgram->use();mShaderProgram->setUniformsForBuiltins();b2Vec2* vertices = new b2Vec2[vertexCount];for( int i=0;i
     
      setUniformLocationWith4f(mColorLocation, color.r*0.5f, color.g*0.5f, color.b*0.5f, 0.5f);glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount);mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1);glDrawArrays(GL_LINE_LOOP, 0, vertexCount);CC_INCREMENT_GL_DRAWS(2);CHECK_GL_ERROR_DEBUG();delete[] vertices;}void GLESDebugDraw::DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color){mShaderProgram->use();mShaderProgram->setUniformsForBuiltins();const float32 k_segments = 16.0f;int vertexCount=16;const float32 k_increment = 2.0f * b2_pi / k_segments;float32 theta = 0.0f;GLfloat*    glVertices = new GLfloat[vertexCount*2];for (int i = 0; i < k_segments; ++i){b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta));glVertices[i*2]=v.x * mRatio;glVertices[i*2+1]=v.y * mRatio;theta += k_increment;}mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1);glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices);glDrawArrays(GL_LINE_LOOP, 0, vertexCount);CC_INCREMENT_GL_DRAWS(1);CHECK_GL_ERROR_DEBUG();delete[] glVertices;}void GLESDebugDraw::DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color){mShaderProgram->use();mShaderProgram->setUniformsForBuiltins();const float32 k_segments = 16.0f;int vertexCount=16;const float32 k_increment = 2.0f * b2_pi / k_segments;float32 theta = 0.0f;GLfloat*    glVertices = new GLfloat[vertexCount*2];for (int i = 0; i < k_segments; ++i){b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta));glVertices[i*2]=v.x * mRatio;glVertices[i*2+1]=v.y * mRatio;theta += k_increment;}mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r*0.5f, color.g*0.5f, color.b*0.5f, 0.5f);glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices);glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount);mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1);glDrawArrays(GL_LINE_LOOP, 0, vertexCount);// Draw the axis lineDrawSegment(center,center+radius*axis,color);CC_INCREMENT_GL_DRAWS(2);CHECK_GL_ERROR_DEBUG();delete[] glVertices;}void GLESDebugDraw::DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color){mShaderProgram->use();mShaderProgram->setUniformsForBuiltins();mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1);GLfloat    glVertices[] = {p1.x * mRatio, p1.y * mRatio,p2.x * mRatio, p2.y * mRatio};glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices);glDrawArrays(GL_LINES, 0, 2);CC_INCREMENT_GL_DRAWS(1);CHECK_GL_ERROR_DEBUG();}void GLESDebugDraw::DrawTransform(const b2Transform& xf){b2Vec2 p1 = xf.p, p2;const float32 k_axisScale = 0.4f;p2 = p1 + k_axisScale * xf.q.GetXAxis();DrawSegment(p1, p2, b2Color(1,0,0));    p2 = p1 + k_axisScale * xf.q.GetYAxis();DrawSegment(p1,p2,b2Color(0,1,0));}void GLESDebugDraw::DrawPoint(const b2Vec2& p, float32 size, const b2Color& color){mShaderProgram->use();mShaderProgram->setUniformsForBuiltins();mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1);//    glPointSize(size);GLfloat                glVertices[] = {p.x * mRatio, p.y * mRatio};glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices);glDrawArrays(GL_POINTS, 0, 1);//    glPointSize(1.0f);CC_INCREMENT_GL_DRAWS(1);CHECK_GL_ERROR_DEBUG();}void GLESDebugDraw::DrawString(int x, int y, const char *string, ...){//NSLog(@"DrawString: unsupported: %s", string);//printf(string);/* Unsupported as yet. Could replace with bitmap font renderer at a later date */}void GLESDebugDraw::DrawAABB(b2AABB* aabb, const b2Color& color){mShaderProgram->use();mShaderProgram->setUniformsForBuiltins();mShaderProgram->setUniformLocationWith4f(mColorLocation, color.r, color.g, color.b, 1);GLfloat                glVertices[] = {aabb->lowerBound.x * mRatio, aabb->lowerBound.y * mRatio,aabb->upperBound.x * mRatio, aabb->lowerBound.y * mRatio,aabb->upperBound.x * mRatio, aabb->upperBound.y * mRatio,aabb->lowerBound.x * mRatio, aabb->upperBound.y * mRatio};glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, glVertices);glDrawArrays(GL_LINE_LOOP, 0, 8);CC_INCREMENT_GL_DRAWS(1);CHECK_GL_ERROR_DEBUG();}
     
    
   
  
 


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.