Beispiel #1
0
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());
}
Beispiel #3
0
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);
}