Hi, I took the code from http://jameshui.tumblr.com/post/29459200037/rendering-simple-3d-objects-and-md2-models-with and adapted it for the latest version of cocos2d-x.
The code of “LoadingLayer” is below:
#include "LoadingLayer.h"
bool LoadingLayer::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init());
mTexture = CCTextureCache::sharedTextureCache()->addImage("test.png");
CCGLProgram* program = CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTexture);
setShaderProgram(program);
mSpeed = 80;
mYaw = 0;
mPitch = 90.0f;
mRoll = 0;
bRet = true;
scheduleUpdate();
} while (0);
return bRet;
}
void LoadingLayer::update(float dt)
{
if (dt > 0.0167f)
dt = 0.0167f;
mYaw += dt*mSpeed;
mPitch += dt*mSpeed;
mRoll += dt*mSpeed;
}
void LoadingLayer::draw()
{
CCDirector::sharedDirector()->setDepthTest(true);
ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords );
getShaderProgram()->use();
CCSize size = CCDirector::sharedDirector()->getWinSize();
float scale = size.width/480.0f;
kmMat4 matrixP;
kmMat4 matrixMV;
kmMat4 matrixMVP;
kmGLGetMatrix(KM_GL_PROJECTION, &matrixP );
kmGLGetMatrix(KM_GL_MODELVIEW, &matrixMV );
kmQuaternion quat;
kmQuaternionRotationYawPitchRoll(&quat, mYaw, mPitch, mRoll);
kmMat3 rotation;
kmMat3RotationQuaternion(&rotation, &quat);
kmVec3 translation;
kmVec3Fill(&translation, size.width/2, size.height/2.2f, 0);
kmMat4 rotationAndMove;
kmMat4RotationTranslation(&rotationAndMove, &rotation, &translation);
kmMat4Multiply(&matrixMVP, &matrixP, &matrixMV);
kmMat4Multiply(&matrixMVP, &matrixMVP, &rotationAndMove); // apply rotation and translation to the matrix
GLuint matrixId = glGetUniformLocation(getShaderProgram()->getProgram(), "u_MVPMatrix");
getShaderProgram()->setUniformLocationWithMatrix4fv(matrixId, matrixMVP.mat, 1);
// texture for the box
ccGLBindTexture2D( mTexture->getName() );
ccVertex3F vertices[4];
ccVertex2F uv[4];
glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, 0, vertices);
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, uv);
float x = 0;
float y = 0;
float len = 40*scale;
/////////// front
vertices[0] = vertex3(x-len,y-len,len);
vertices[1] = vertex3(x-len,y+len,len);
vertices[2] = vertex3(x+len,y-len,len);
vertices[3] = vertex3(x+len,y+len,len);
uv[0] = vertex2(0, 1);
uv[1] = vertex2(0, 0);
uv[2] = vertex2(1, 1);
uv[3] = vertex2(1, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
////////// right
vertices[0] = vertex3(x+len,y-len,len);
vertices[1] = vertex3(x+len,y+len,len);
vertices[2] = vertex3(x+len,y-len,-len);
vertices[3] = vertex3(x+len,y+len,-len);
uv[0] = vertex2(0, 1);
uv[1] = vertex2(0, 0);
uv[2] = vertex2(1, 1);
uv[3] = vertex2(1, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
///////// back
vertices[0] = vertex3(x+len,y-len,-len);
vertices[1] = vertex3(x+len,y+len,-len);
vertices[2] = vertex3(x-len,y-len,-len);
vertices[3] = vertex3(x-len,y+len,-len);
uv[0] = vertex2(0, 1);
uv[1] = vertex2(0, 0);
uv[2] = vertex2(1, 1);
uv[3] = vertex2(1, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
////////// left
vertices[0] = vertex3(x-len,y-len,len);
vertices[1] = vertex3(x-len,y+len,len);
vertices[2] = vertex3(x-len,y-len,-len);
vertices[3] = vertex3(x-len,y+len,-len);
uv[0] = vertex2(0, 1);
uv[1] = vertex2(0, 0);
uv[2] = vertex2(1, 1);
uv[3] = vertex2(1, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
///////// top
vertices[0] = vertex3(x+len,y+len,len);
vertices[1] = vertex3(x-len,y+len,len);
vertices[2] = vertex3(x+len,y+len,-len);
vertices[3] = vertex3(x-len,y+len,-len);
uv[0] = vertex2(0, 0);
uv[1] = vertex2(1, 0);
uv[2] = vertex2(0, 1);
uv[3] = vertex2(1, 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
///////// bottom
vertices[0] = vertex3(x+len,y-len,len);
vertices[1] = vertex3(x-len,y-len,len);
vertices[2] = vertex3(x+len,y-len,-len);
vertices[3] = vertex3(x-len,y-len,-len);
uv[0] = vertex2(0, 0);
uv[1] = vertex2(1, 0);
uv[2] = vertex2(0, 1);
uv[3] = vertex2(1, 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
CC_INCREMENT_GL_DRAWS(1);
}
All I get is this:
As you can see, it shows one GL call, so the draw() method is being called. Any ideas?