Cc3dVector4 normalize(const Cc3dVector4&v){ //assert(v.w()==0); float r2=v.x()*v.x()+v.y()*v.y()+v.z()*v.z(); if(r2==0){ return Cc3dVector4(0,0,0,0); } float r=sqrtf(r2); Cc3dVector4 rs(v.x()/r,v.y()/r,v.z()/r,0); return rs; }
Cc3dVector4 Cc3dMatrix4::operator*(const Cc3dVector4&v)const{ const float *m=this->getArray(); const float *vin=v.getArray(); float vout[4]; vout[0]=vin[0]*m[0]+vin[1]*m[4]+vin[2]*m[8]+vin[3]*m[12]; vout[1]=vin[0]*m[1]+vin[1]*m[5]+vin[2]*m[9]+vin[3]*m[13]; vout[2]=vin[0]*m[2]+vin[1]*m[6]+vin[2]*m[10]+vin[3]*m[14]; vout[3]=vin[0]*m[3]+vin[1]*m[7]+vin[2]*m[11]+vin[3]*m[15]; return Cc3dVector4(vout); }
void CbossCellSet::loadConfig(const string&fileNameWithExt){ //------------------获得绝对路径--abc string pathName=Cc3dFileUtils::sharedFileUtils()->getFullPath(fileNameWithExt); //打开文件--abc FILE *fp=NULL; fp=fopen(pathName.c_str(),"r"); if(fp==NULL) { cout<<"Open "<<pathName<<" failed!"<<endl; assert(false); } //------------------提取文件信息,并建立模型列表--abc { char buffer[1024]={0}; //提取项目数--abc int n; fscanf(fp, "%d",&n); //提取项目--abc for(int i=0;i<n;i++){ //----cellTemplateID int templateID; fscanf(fp,"%s",buffer); if(buffer[0]=='#'){ cout<<"error:met # too early!"<<endl; assert(false); } fscanf(fp,"%d",&templateID); CbossCell*pbossCell=makeCellTemplate(templateID); //----pos float posx,posy,posz; fscanf(fp, "%f",&posx); fscanf(fp, "%f",&posy); fscanf(fp, "%f",&posz); pbossCell->getTransformPointer()->setPos(posx,posy,posz); if(pbossCell->isFly){ ((Cship*)pbossCell->get_ship())->setTransform(((Cship*)pbossCell)->getTransform()); //根据initPos和flyRange_relativeToInitPos计算flyRange pbossCell->flyRange=pbossCell->flyRange_relativeToInitPos; pbossCell->flyRange.mov(Cc3dVector4(posx,posy,posz,0)); } this->addActor(pbossCell); } fscanf(fp, "%s",buffer); assert(buffer[0]=='#');//缺少#或实际条目数比n值大--abc } //关闭文件--abc fclose(fp); }
void CtestLayer::clearCallBack(CCObject *senderz, cocos2d::extension::CCControlEvent controlEvent) { for(int i=0; i<m_nRow; i++) { for(int j=0; j<m_nCol; j++) { for(int k=0; k<m_nDeep; k++) { Cc3dActor*actor=m_actor3dMat3d[i][j][k]; int meshCount=actor->getModel()->getMeshCount(); for(int u=0; u<meshCount; u++) { Cc3dMesh*mesh=actor->getModel()->getMeshByIndex(u); int subMeshCount=mesh->getSubMeshCount(); for(int v=0; v<subMeshCount; v++) { Cc3dSubMesh*subMesh=mesh->getSubMeshByIndex(v); Cc3dSubMeshData*subMeshData=subMesh->getSubMeshData(); vector<Cc3dVector4>&colorList=subMeshData->m_colorList; for(int k=0; k<(int)colorList.size(); k++) { colorList[k]=Cc3dVector4(1,1,1,1); } subMesh->submitColor(GL_STREAM_DRAW); } } } } } }
Cc3dVector4 toV4(const Cc3dVector2&v2,float z,float w){ return Cc3dVector4(v2.x(), v2.y(), z, w); }
void loadInfo_subMesh(Cc3dSubMesh*submesh,const string&meshFilePathShort,const string&texClipPathShort,float scale,Cc3dVector4 offsetVec) //加载网格--abc //scale为放缩系数,可以在导入时对顶点坐标进行等比方缩--abc //offsetVec为偏移量(缩放以后的偏移量),可在导入时对顶点坐标进行偏移--abc //由于是等比放缩,所以法线和纹理坐标不受影响--abc { if(meshFilePathShort.empty()==false)assert(meshFilePathShort[(int)meshFilePathShort.size()-1]!='/'); if(texClipPathShort.empty()==false)assert(texClipPathShort[(int)texClipPathShort.size()-1]!='/'); assert(submesh->getSubMeshData()->isEmpty()); //------------------获得纹理文件夹相对路径--abc string meshFileName_part1;//相对路径名,不包含文件名--abc string meshFileName_part2;//文件名--abc vector<string> rs=splitStrInTwoByLastBar(meshFilePathShort); meshFileName_part1=rs[0]; meshFileName_part2=rs[1]; //------------------获得绝对路径--abc string pathName=Cc3dFileUtils::sharedFileUtils()->getFullPath(meshFilePathShort); //打开文件--abc FILE *fp=NULL; fp=fopen(pathName.c_str(),"r"); if(fp==NULL) { cout<<"Open "<<pathName<<" failed!"<<endl; assert(false); } //------------------提取文件信息到submesh { //提取顶点数--abc int nv; fscanf(fp, "%d",&nv); //提取各顶点--abc for(int i=0;i<nv;i++){ //提取pos float pos[4]={0,0,0,1}; fscanf(fp, "%f",&pos[0]); fscanf(fp, "%f",&pos[1]); fscanf(fp, "%f",&pos[2]); //提取texCoord float texCoord[2]; fscanf(fp, "%f",&texCoord[0]); fscanf(fp, "%f",&texCoord[1]); //提取norm float norm[4]={0,0,0,0}; fscanf(fp, "%f",&norm[0]); fscanf(fp, "%f",&norm[1]); fscanf(fp, "%f",&norm[2]); //将texCoord原点由左下角变为左上角--abc texCoord[1]=1-texCoord[1]; //对顶点进行放缩--abc Cc3dVector4 posWithScale=Cc3dVector4(pos)*scale; posWithScale.setw(1); //对缩放后的顶点进行偏移(注意,一定要放在缩放后面) posWithScale=posWithScale+offsetVec; //组成顶点--abc Cc3dVertex vertex(posWithScale,Cc3dVector2(texCoord),Cc3dVector4(norm)); //将此顶点加入vlist submesh->getSubMeshData()->addVertex(vertex); } //提取IDtri数--abc int nIDtri; fscanf(fp, "%d",&nIDtri); //提取各IDtri for(int i=0;i<nIDtri;i++){ Cc3dIDTriangle IDtri; //提取ID0,ID1,ID2 fscanf(fp, "%d",&IDtri.vID[0]); fscanf(fp, "%d",&IDtri.vID[1]); fscanf(fp, "%d",&IDtri.vID[2]); submesh->getSubMeshData()->addIDtri(IDtri); } //提取纹理图片名并加载纹理--abc { char t_imageName[1024]; fscanf(fp, "%s",t_imageName); //将texFileName的后缀名改成.png string part1,part2; vector<string> rs=splitStrInTwoByLastDotBehindLastBar(t_imageName); part1=rs[0]; part2=rs[1]; string imageName=part1+".png"; //生成相对路径--abc string texPathName=texClipPathShort+"/"+imageName; //根据纹理图片路径加载纹理,并将纹理句柄存入submesh submesh->setTexture(Cc3dTextureCache::sharedTextureCache()->addImage(texPathName.c_str())); } //提取backVisible char buffer[1024]={0}; int backVisible; fscanf(fp, "%s",buffer); fscanf(fp, "%d",&backVisible); if(backVisible){ submesh->setCullFace(ec3dNotCull); }else{ submesh->setCullFace(ec3dCullBack); } } //关闭文件--abc fclose(fp); }
bool Cboard::init(float width,float height,string imagePath){ m_width=width; m_height=height; //--texture Cc3dTexture*texture=Cc3dTextureCache::sharedTextureCache()->addImage(imagePath,GL_CLAMP_TO_EDGE,GL_CLAMP_TO_EDGE); //meshes { //----subMesh Cc3dSubMesh* subMesh=new Cc3dSubMesh(); subMesh->autorelease(); //--color Cc3dVector4 color[4]={Cc3dVector4(1,1,1,1),Cc3dVector4(1,1,1,1),Cc3dVector4(1,1,1,1),Cc3dVector4(1,1,1,1)}; //--vertex //front face subMesh->addVertex(Cc3dVertex(Cc3dVector4(-width/2,+height/2,0,1),Cc3dVector2(0,0),Cc3dVector4(0,0,1,0),color[0]));//0 subMesh->addVertex(Cc3dVertex(Cc3dVector4(-width/2,-height/2,0,1),Cc3dVector2(0,1),Cc3dVector4(0,0,1,0),color[1]));//1 subMesh->addVertex(Cc3dVertex(Cc3dVector4(+width/2,-height/2,0,1),Cc3dVector2(1,1),Cc3dVector4(0,0,1,0),color[2]));//2 subMesh->addVertex(Cc3dVertex(Cc3dVector4(+width/2,+height/2,0,1),Cc3dVector2(1,0),Cc3dVector4(0,0,1,0),color[3]));//3 //--IDTriangles //front face subMesh->addIDtri(Cc3dIDTriangle(0,1,2)); subMesh->addIDtri(Cc3dIDTriangle(0,2,3)); //----mesh Cc3dMesh*mesh=new Cc3dMesh(); mesh->autorelease(); mesh->addSubMesh(subMesh); //----model this->addMesh(mesh); } //----texture this->getMeshByIndex(0)->getSubMeshByIndex(0)->setTexture(texture); this->setIsDoDepthTest(false); return true; }
void initGame(){ //----light { light0=new Cc3dLight(); light0->autorelease(); light0->retain(); light0->setPos(200,200,50); //light0->setSpecular(0.4,0.4,0.4); } //----camera2D { float left=0; float right=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth(); float top=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight(); float bottom = 0; float _near = -1;//note: near and far is key word in vs2010, so here we use _near and _far float _far = 1; Cc3dRange range(left,right,bottom,top,_near,_far); camera2D=new Cc3dCamera(); camera2D->autorelease(); camera2D->retain();//must retain camera2D->setRange(range); camera2D->setProjectionMode(ec3dOrthographicMode); } //----camera { camera=new Cc3dCamera(); camera->autorelease(); camera->retain();//must retain camera->setFovy(70); camera->setAspect((float)Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth()/Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight()); camera->setzNear(0.5); camera->setzFar(10000); float eyePos[3]={0,30*1.2,50*1.2}; float eyeTg[3]={0,0,0}; float up[3]={0,1,0}; camera->setEyePos(Cc3dVector3(eyePos).toV4(1)); camera->setCenter(Cc3dVector3(eyeTg).toV4(1)); camera->setUp(Cc3dVector3(up).toV4(0)); camera->updateFrustum(); } //----fbx model Cc3dSkinActor*actor=Cc3dFbxLoader::sharedFbxLoader()->load("fbxLoader_resource/shapeDeformTest/shapeDeformTest_progressive.fbx",1.0f/10);//shapeDeformTest.fbx actor->setPos(Cc3dVector4(0,0,0,1)); actor->setLight(light0); actor->setCamera(camera); actor->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("classicLighting")); actor->setPassUnifoCallback(buildinProgramPassUnifoCallback_classicLighting); actor->genVBOBuffers(); actor->submit(GL_STATIC_DRAW); //----add to scene Cc3dSceneManager::sharedSceneManager()->getRoot()->addChild(actor); }
void Cc3dTransform::rotate(float nx,float ny,float nz,float cosa,float sina) //n must be normalized vector { Cc3dMatrix4 rotmat=calculateRotationMatrix(Cc3dVector4(nx,ny,nz,0),cosa,sina); //calculateRotationMatrix(nx, ny, nz, cosa, sina); m_RTmat=m_RTmat*rotmat; }
bool CtestLayer::init(){ CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); CCSize winSize=CCDirector::sharedDirector()->getWinSize(); float ZEye=CCDirector::sharedDirector()->getZEye(); //enable touch setTouchEnabled( true ); //enable update scheduleUpdate(); //update eye pos updateEyePos(); //----------------------------- //root3d m_root3d=new Cc3dRoot(); m_root3d->autorelease(); m_root3d->init(); m_root3d->setNodeName("root3d"); this->addChild(m_root3d); //camera Cc3dCamera*camera=m_root3d->getCamera3D(); m_r=(winSize.height/2)/tanf(camera->getFovy()/2*M_PI/180); camera->setEyePos(cc3dv4(0, 0, m_r, 1)); camera->setCenter(cc3dv4(0, 0, 0, 1)); camera->setUp(cc3dv4(0, 1, 0, 0)); camera->setProjectionMode(ec3dPerspectiveMode); //lightSource Cc3dLightSource*lightSource=new Cc3dLightSource(); lightSource->autorelease(); lightSource->init(); m_root3d->addChild(lightSource); lightSource->setAmbient(cc3dv4(0.8, 0.8, 0.8, 1)); lightSource->setPosition3D(cc3dv4(600, 900, 1200, 1)); //program Cc3dProgram*program=c3dGetProgram_c3dClassicLighting(); //actor3D m_actor3D=c3dSimpleLoadActor("toolKitRes/model/apple_cfc"); m_actor3D->setLightSource(lightSource); m_actor3D->setCamera3D(camera); m_actor3D->setPassUnifoCallback(passUnifoCallback_classicLighting); m_actor3D->setProgram(program); m_actor3D->setNodeName("actor3D"); m_root3d->addChild(m_actor3D,0); m_actor3D->scale3D(4, 4, 4); m_actor3D->setPosition3D(Cc3dVector4(0,-130,0,1)); //submit m_actor3D->submit(GL_STATIC_DRAW); //controlButton_swithProjMode { CCScale9Sprite* btnUp=CCScale9Sprite::create("button.png"); CCScale9Sprite* btnDn=CCScale9Sprite::create("button_dn.png"); CCLabelTTF*title=CCLabelTTF::create("proj mode", "Helvetica", 30); CCControlButton* controlButton=CCControlButton::create(title, btnUp); controlButton->setBackgroundSpriteForState(btnDn,CCControlStateHighlighted); controlButton->setPreferredSize(CCSize(180,80)); controlButton->setPosition(ccp(400,100)); controlButton->addTargetWithActionForControlEvents(this, (SEL_CCControlHandler)(&CtestLayer::switchProjModeCallBack), CCControlEventTouchDown); this->addChild(controlButton); m_controlButton_swithProjMode=controlButton; } //controlButton_transform { CCScale9Sprite* btnUp=CCScale9Sprite::create("button.png"); CCScale9Sprite* btnDn=CCScale9Sprite::create("button_dn.png"); CCLabelTTF*title=CCLabelTTF::create("transform", "Helvetica", 30); CCControlButton* controlButton=CCControlButton::create(title, btnUp); controlButton->setBackgroundSpriteForState(btnDn,CCControlStateHighlighted); controlButton->setPreferredSize(CCSize(180,80)); controlButton->setPosition(ccp(700,100)); controlButton->addTargetWithActionForControlEvents(this, (SEL_CCControlHandler)(&CtestLayer::transformCallBack), CCControlEventTouchDown); this->addChild(controlButton); m_controlButton_transform=controlButton; } //projection mode label m_pLabel=CCLabelTTF::create("proj mode: Perspective", "Arial", 35); m_pLabel->setPosition(ccp(origin.x + visibleSize.width*(3.0/4), origin.y + visibleSize.height - m_pLabel->getContentSize().height-100)); this->addChild(m_pLabel, 1); return true; }
void CtestLayer::ccTouchesBegan(CCSet* touches, CCEvent* event) { CCSetIterator it; CCTouch* touch; for( it = touches->begin(); it != touches->end(); it++) { touch = (CCTouch*)(*it); if(!touch) break; CCPoint pointInWinSpace = touch->getLocationInView(); //note: for 3d mode, CCDirector::convertToGL() not works as we expected // CCPoint pointInWinSpace = CCDirector::sharedDirector()->convertToGL(pointInWinSpace); //----update mos m_mosPosf=m_mosPos; m_mosPos=pointInWinSpace; //------- CCRect viewportRect=cocos2d::CCEGLView::sharedOpenGLView()->getViewPortRect(); float viewport[4]= {viewportRect.getMinX(),viewportRect.getMinY(),viewportRect.size.width,viewportRect.size.height}; Cc3dCamera*camera=m_root3d->getCamera3D(); Cc3dVector4 eyePos=camera->getEyePos(); Cc3dVector4 winPos=Cc3dVector4(m_mosPos.x,viewport[3]-m_mosPos.y,0,1); Cc3dMatrix4 projMat=camera->calculateProjectionMat(); Cc3dMatrix4 viewMat=camera->calculateViewMat(); Cc3dMatrix4 projViewInverse=inverse(projMat*viewMat); Cc3dVector4 worldPos= convertFromViewportSpaceToWorldSpace(winPos, projMat, viewMat, viewport); int i_firstIntersectActor=-1; int j_firstIntersectActor=-1; int k_firstIntersectActor=-1; float minDisIntersectPointToEyePos=INFINITY; for(int i=0; i<m_nRow; i++) { for(int j=0; j<m_nCol; j++) { for(int k=0; k<m_nDeep; k++) { Cc3dActor*actor=m_actor3dMat3d[i][j][k]; int meshCount=actor->getModel()->getMeshCount(); for(int u=0; u<meshCount; u++) { Cc3dMesh*mesh=actor->getModel()->getMeshByIndex(u); int subMeshCount=mesh->getSubMeshCount(); for(int v=0; v<subMeshCount; v++) { Cc3dSubMesh*subMesh=mesh->getSubMeshByIndex(v); Cc3dSubMeshData*subMeshData=subMesh->getSubMeshData(); const vector<Cc3dVector4>&positionList=subMeshData->m_positionList; const vector<Cc3dIDTriangle>&IDtriList=subMeshData->m_IDtriList; int nIDtri=(int)IDtriList.size(); for(int w=0; w<nIDtri; w++) { const Cc3dIDTriangle&IDtri=IDtriList[w]; int ID0=IDtri.vID(0); int ID1=IDtri.vID(1); int ID2=IDtri.vID(2); Cc3dVector4 p0=subMesh->convertToWorldSpace3D(positionList[ID0]); Cc3dVector4 p1=subMesh->convertToWorldSpace3D(positionList[ID1]); Cc3dVector4 p2=subMesh->convertToWorldSpace3D(positionList[ID2]); if(isLine3dIntersectWithTriangle3d(eyePos, worldPos-eyePos, p0, p1, p2)) { //intersect Cc3dVector4 intersectPos=getIntersectPointOfLine3dIntersectWithPlane3d(eyePos, worldPos-eyePos, p0, cross(p1-p0, p2-p1)); float disIntersectPointToEyePos=getLength(intersectPos-eyePos); if(disIntersectPointToEyePos<minDisIntersectPointToEyePos) { minDisIntersectPointToEyePos=disIntersectPointToEyePos; i_firstIntersectActor=i; j_firstIntersectActor=j; k_firstIntersectActor=k; } } } } } } } }//got i_firstIntersectActor, j_firstIntersectActor, k_firstIntersectActor, minDisIntersectPointToEyePos if(i_firstIntersectActor!=-1) { //have intersect Cc3dActor*firstIntersectActor=m_actor3dMat3d[i_firstIntersectActor][j_firstIntersectActor][k_firstIntersectActor]; int meshCount=firstIntersectActor->getModel()->getMeshCount(); for(int i=0; i<meshCount; i++) { Cc3dMesh*mesh=firstIntersectActor->getModel()->getMeshByIndex(i); int subMeshCount=mesh->getSubMeshCount(); for(int j=0; j<subMeshCount; j++) { Cc3dSubMesh*subMesh=mesh->getSubMeshByIndex(j); Cc3dSubMeshData*subMeshData=subMesh->getSubMeshData(); vector<Cc3dVector4>&colorList=subMeshData->m_colorList; for(int k=0; k<(int)colorList.size(); k++) { colorList[k]=Cc3dVector4(0,0,1,1); } subMesh->submitColor(GL_STREAM_DRAW); } } } break;//only consider the first touch } }
Cc3dVector4 Cc3dVector2::toV4(float z,float w)const{ return Cc3dVector4(x(),y(),z,w); }
Cc3dVector4 Cc3dVector3::toV4(float w)const{ return Cc3dVector4(x(),y(),z(),w); }
void initGame(){ Cc3dRect screenRect=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect(); //----light { light0=new Cc3dLight(); light0->autorelease(); light0->retain(); light0->setPos(1000,5000,1000);//(50,200,500); light0->setSpecular(0.4,0.4,0.4); } //----camera2D { float left=0; float right=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth(); float top=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight(); float bottom = 0; float _near = -1;//note: near and far is key word in vs2010, so here we use _near and _far float _far = 1; Cc3dRange range(left,right,bottom,top,_near,_far); camera2D=new Cc3dCamera(); camera2D->autorelease(); camera2D->retain();//must retain camera2D->setRange(range); camera2D->setProjectionMode(ec3dOrthographicMode); } //----camera { camera=new Cc3dCamera(); camera->autorelease(); camera->retain();//must retain camera->setFovy(70); camera->setAspect((float)Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth()/Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight()); camera->setzNear(0.5); camera->setzFar(10000); float eyePos[3]={0,30,50}; float eyeTg[3]={0,30,0}; float up[3]={0,1,0}; camera->setEyePos(Cc3dVector3(eyePos).toV4(1)); camera->setCenter(Cc3dVector3(eyeTg).toV4(1)); camera->setUp(Cc3dVector3(up).toV4(0)); camera->updateFrustum(); } //load fbx string fbxFilePath="fbxLoader_resource/girl/girl.fbx"; float aniFrameInterval=1.0f/10;//1.0f/25;//frame interval value we want (second) Cc3dSkinActor*actor=Cc3dFbxLoader::sharedFbxLoader()->load(fbxFilePath.c_str(),aniFrameInterval); //actor is just for export, no need to fully set up and add to scene // actor->setPos(Cc3dVector4(0,0,0,1)); // actor->setLight(light0); // actor->setCamera(camera); // actor->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("classicLighting")); // actor->setPassUnifoCallback(buildinProgramPassUnifoCallback_classicLighting); // actor->genVBOBuffers(); // actor->submit(GL_STATIC_DRAW); // Cc3dSceneManager::sharedSceneManager()->getRoot()->addChild(actor); //export to my own format //do not use girl.cfc (do not use dot in folderName), because it can cause getFullPath fail on iOS(on iOS, the getFullPath function is not implemented very well) //export values only { #if (C3D_TARGET_PLATFORM == C3D_PLATFORM_WIN32) string exportPath="export/girl_cfc"; #elif (C3D_TARGET_PLATFORM == C3D_PLATFORM_IOS) string exportPath=Cc3dDocuments::sharedDocuments()->getDocumentsPath()+"/export/girl_cfc"; #else assert(false); #endif bool valueOnly=true;//export values only. small, but not very readable. cout<<"export values only..."<<endl; actor->doExport(exportPath,valueOnly); cout<<"export done! model has exported to:"<<exportPath<<endl; } //export values and keys { #if (C3D_TARGET_PLATFORM == C3D_PLATFORM_WIN32) string exportPath="export/girl_readable_cfc"; #elif (C3D_TARGET_PLATFORM == C3D_PLATFORM_IOS) string exportPath=Cc3dDocuments::sharedDocuments()->getDocumentsPath()+"/export/girl_readable_cfc"; #else assert(false); #endif bool valueOnly=false;//export values and keys. big, but more readable. cout<<"export values and keys..."<<endl; actor->doExport(exportPath,valueOnly); cout<<"export done! model has exported to:"<<exportPath<<endl; } //text Cboard*text=new Cboard(); text->init(240,30,"exportFbxToMyOwnFormat_resource/text.png"); text->setPos(Cc3dVector4((screenRect.getMinX()+screenRect.getMaxX())/2,(screenRect.getMinY()+screenRect.getMaxY())/2,0,1)); text->setLight(light0); text->setCamera(camera2D); text->genVBOBuffers(); text->submit(GL_STATIC_DRAW); //text add to scene Cc3dSceneManager::sharedSceneManager()->getRoot()->addChild(text); }