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; }
Cc3dVector2 toV2(const Cc3dVector4&v4){ return Cc3dVector2(v4.x(), v4.y()); }
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); }
Cc3dMeshData*genSampleCubeWithCode(float cx,float cy,float cz,float dx,float dy,float dz, float k_s, float k_t, int cubUVMode) //用代码生成示例立方体 //cx,cy,cz为中心 //dx,dy,dz分别为x,y,z方向上的边心距 { Cc3dMeshData*meshData=new Cc3dMeshData(); meshData->init(); meshData->autorelease(); meshData->vlist.reserve(8); meshData->IDtriList.reserve(12); //----生成顶点数据 Cc3dVertex tv; //前面 tv.setPos(Cc3dVector3(cx-dx, cy-dy,cz+dz));tv.setTexCoord(Cc3dVector2(0, 0));tv.setNorm(Cc3dVector3(0, 0, 1));//0 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx+dx, cy-dy,cz+dz));tv.setTexCoord(Cc3dVector2(1, 0));tv.setNorm(Cc3dVector3(0, 0, 1));//1 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx+dx, cy+dy, cz+dz));tv.setTexCoord(Cc3dVector2(1, 1));tv.setNorm(Cc3dVector3(0, 0, 1));//2 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx-dx, cy+dy, cz+dz));tv.setTexCoord(Cc3dVector2(0, 1));tv.setNorm(Cc3dVector3(0, 0, 1));//3 meshData->vlist.push_back(tv); //后面 tv.setPos(Cc3dVector3(cx-dx, cy-dy,cz -dz));tv.setTexCoord(Cc3dVector2(0, 0));tv.setNorm(Cc3dVector3(0, 0, -1));//4 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx+dx, cy-dy, cz-dz));tv.setTexCoord(Cc3dVector2(1, 0));tv.setNorm(Cc3dVector3(0, 0, -1));//5 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx+dx, cy+dy, cz-dz));tv.setTexCoord(Cc3dVector2(1, 1));tv.setNorm(Cc3dVector3(0, 0, -1));//6 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(0, 0, -1);//7 meshData->vlist.push_back(tv); //上面 tv.setPos(cx-dx, cy+dy, cz+dz);tv.setTexCoord(0, 0);tv.setNorm(0, 1, 0);//8 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy+dy, cz+dz);tv.setTexCoord(1, 0);tv.setNorm(0, 1, 0);//9 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy+dy, cz-dz);tv.setTexCoord(1, 1);tv.setNorm(0, 1, 0);//10 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(0, 1, 0);//11 meshData->vlist.push_back(tv); //下面 tv.setPos(cx-dx, cy-dy, cz+dz);tv.setTexCoord(0, 0);tv.setNorm(0, -1, 0);//12 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy-dy, cz+dz);tv.setTexCoord(1, 0);tv.setNorm(0, -1, 0);//13 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy-dy, cz-dz);tv.setTexCoord(1, 1);tv.setNorm(0, -1, 0);//14 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy-dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(0, -1, 0);//15 meshData->vlist.push_back(tv); //左面 tv.setPos(cx-dx, cy-dy,cz -dz);tv.setTexCoord(0, 0);tv.setNorm(-1, 0, 0);//16 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy-dy, cz+dz);tv.setTexCoord(1, 0);tv.setNorm(-1, 0, 0);//17 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy+dy, cz+dz);tv.setTexCoord(1, 1);tv.setNorm(-1, 0, 0);//18 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(-1, 0, 0);//19 meshData->vlist.push_back(tv); //右面 tv.setPos(cx+dx, cy-dy, cz-dz);tv.setTexCoord(0, 0);tv.setNorm(1, 0, 0);//20 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy-dy,cz+ dz);tv.setTexCoord(1, 0);tv.setNorm(1, 0, 0);//21 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy+dy, cz+dz);tv.setTexCoord(1, 1);tv.setNorm(1, 0, 0);//22 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(1, 0, 0);//23 meshData->vlist.push_back(tv); //----生成索引三角形 Cc3dIDTriangle tIDtri; //前面 tIDtri.setvID(0, 1, 2); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(0, 2, 3); meshData->IDtriList.push_back(tIDtri); //后面 tIDtri.setvID(4, 6, 5); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(4, 7, 6); meshData->IDtriList.push_back(tIDtri); //上面 tIDtri.setvID(8, 9, 10); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(8, 10, 11); meshData->IDtriList.push_back(tIDtri); //下面 tIDtri.setvID(12, 14, 13); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(12, 15, 14); meshData->IDtriList.push_back(tIDtri); //左面 tIDtri.setvID(16, 17, 18); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(16, 18, 19); meshData->IDtriList.push_back(tIDtri); //右面 tIDtri.setvID(20, 22, 21); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(20, 23, 22); meshData->IDtriList.push_back(tIDtri); //----重新计算各三角形各顶点的uv int nv=(int)meshData->vlist.size(); vector<bool> markList(nv);//标记各顶点是否已经重计算过uv,避免多次计算(多次计算可能导致出错),初始全0 int nIDtri=(int)meshData->IDtriList.size(); for(int i=0;i<nIDtri;i++){ Cc3dIDTriangle&IDtri=meshData->IDtriList[i]; //重新计算IDtri各顶点的uv switch(cubUVMode) { case cubUVMode_FITFACE: { //将IDtri中未mark的顶点的uv分别乘以k_s,k_t for(int j=0;j<3;j++){ int vID=IDtri.vID[j];//顶点号 if(markList[vID]==false){//未计算过 //重新计算 Cc3dVertex&v=meshData->vlist[vID]; Cc3dVector2 texCoord=v.getTexCoord(); texCoord.setx(texCoord.x()*k_s); texCoord.sety(texCoord.y()*k_t); v.setTexCoord(texCoord); markList[vID]=true;//标记为已计算 } } }break; case cubUVMode_UNIFORM: { //将IDtri各顶点的uv,重新按顶点坐标来计算,并以k_s,k_t放缩 //判断IDtri的类型 const int type_LR=0;//左或右 const int type_UD=1;//上或下 const int type_FB=2;//前或后 int type=0; Cc3dVector3 norm=meshData->vlist[IDtri.vID[0]].getNorm(); if(fabsf(fabsf(norm.x())-1)<0.01){//左面或右面 type=type_LR; }else if(fabsf(fabsf(norm.y())-1)<0.01){//上面或下面 type=type_UD; }else{//前面或后面 type=type_FB; }//得到type for(int j=0;j<3;j++){ int vID=IDtri.vID[j];//顶点号 if(markList[vID]==false){//未计算过 //重新计算 Cc3dVertex&v=meshData->vlist[vID]; switch (type) { case type_LR:{ //用yz Cc3dVector2 texCoord(v.getPos().y()*k_s,v.getPos().z()*k_t); v.setTexCoord(texCoord); }break; case type_UD:{ //用xz Cc3dVector2 texCoord(v.getPos().x()*k_s,v.getPos().z()*k_t); v.setTexCoord(texCoord); }break; case type_FB:{ //用xy Cc3dVector2 texCoord(v.getPos().x()*k_s,v.getPos().y()*k_t); v.setTexCoord(texCoord); }break; } //标记为已计算 markList[vID]=true; } } }break; default: cout<<"error:未知的cubUV映射类型!"<<endl; assert(false); break; } } return meshData; }
Cc3dVector2 Cc3dVector3::toV2()const{ return Cc3dVector2(x(),y()); }
Cc3dVector2 getResolutionSize_plat(){ //由于iOS上凡640x1136分辨率者只有高清,所以这里只能假装是高清以便能够使用资源--abc return Cc3dVector2(640,1136); }
Cc3dVector2 getScreenSize_plat(){ return Cc3dVector2(640*0.5,1136*0.5); }