IoCairoFontFace *IoCairoFontFace_rawClone(IoCairoFontFace *proto) { IoObject *self = IoObject_rawClonePrimitive(proto); if (FACE(proto)) IoObject_setDataPointer_(self, cairo_font_face_reference(FACE(proto))); return self; }
static inline int compareCards (int c0, int c1) { int t0 = SUIT(c0), t1 = SUIT(c1); int r = t1-t0; if (!r) { t0 = FACE(c0), t1 = FACE(c1); r = t0-t1; } return r; }
static void TessellateSphere(std::vector<float>& vertexes, std::vector<u16>& indexes, int level) { /* Start with a tetrahedron, then tessellate */ float s = sqrtf(0.5f); #define VERT(a,b,c) vertexes.push_back(a); vertexes.push_back(b); vertexes.push_back(c); VERT(-s, 0, -s); VERT( s, 0, -s); VERT( s, 0, s); VERT(-s, 0, s); VERT( 0, -1, 0); VERT( 0, 1, 0); #define FACE(a,b,c) \ TessellateSphereFace( \ CVector3D(vertexes[a*3], vertexes[a*3+1], vertexes[a*3+2]), a, \ CVector3D(vertexes[b*3], vertexes[b*3+1], vertexes[b*3+2]), b, \ CVector3D(vertexes[c*3], vertexes[c*3+1], vertexes[c*3+2]), c, \ vertexes, indexes, level); FACE(0,4,1); FACE(1,4,2); FACE(2,4,3); FACE(3,4,0); FACE(1,5,0); FACE(2,5,1); FACE(3,5,2); FACE(0,5,3); #undef FACE #undef VERT }
static void draw_cube(int x, int y, int level, int cube_layer) { glTexParameteri(target, GL_TEXTURE_MIN_LOD, level); glTexParameteri(target, GL_TEXTURE_MAX_LOD, level); draw_face(FACE(POSITIVE_X), cube_layer, x, y+DRAW_SIZE); draw_face(FACE(POSITIVE_Y), cube_layer, x+DRAW_SIZE, y+DRAW_SIZE); draw_face(FACE(NEGATIVE_X), cube_layer, x+DRAW_SIZE*2, y+DRAW_SIZE); draw_face(FACE(NEGATIVE_Y), cube_layer, x+DRAW_SIZE*3, y+DRAW_SIZE); draw_face(FACE(POSITIVE_Z), cube_layer, x+DRAW_SIZE, y+DRAW_SIZE*2); draw_face(FACE(NEGATIVE_Z), cube_layer, x+DRAW_SIZE, y); }
void UniversalLoader<MapType, AttrTypeLoader>:: UnpackOnFace(MapType& map, const Dart* facesId, const AHEMHeader* hdr, const char* attrName, const void* buffer) const { FaceAttribute<typename AttrTypeLoader::ATTR_TYPE> attr = map.template getAttribute<typename AttrTypeLoader::ATTR_TYPE>, FACE(attrName); if (!attr.isValid()) attr = map.template addAttribute<typename AttrTypeLoader::ATTR_TYPE>(FACE, attrName); char* p = (char*)buffer; for(unsigned int i = 0 ; i < hdr->meshHdr.faceCount ; i++) { AttrTypeLoader::Extract(&attr[facesId[i]], p); p += AttrTypeLoader::TYPE_SIZE_IN_BUFFER; } }
void __smapValidateSphereMapMesh(SphereMapMesh *mesh) { /* setup some local variables for variable array size indexing */ INITFACE(mesh); INITBACK(mesh); float st[2]; /* (s,t) coordinate */ /* range=[0..1,0..1] */ float v[3]; /* (x,y,z) location on cube map */ /* range=[-1..1,-1..1,-1..1] */ float rv[3]; /* reflection vector, ie. cube map location */ /* normalized onto unit sphere */ float len; /* distance from v[3] to origin */ /* for converting to rv[3] */ int side; /* which of 5 faces (all but back face) */ int i, j; int xl, yl, zl; /* renamed X, Y, Z index */ int swap; int flip; int edge; /* which edge of back face */ float sc, tc; /* singularity (s,t) on back face circle */ if (mesh->face) { assert(mesh->back == &(mesh->face[5*sqsteps])); return; } assert(mesh->back == NULL); mesh->face = (STXY*) malloc((5*sqsteps+4*ringedspokes) * sizeof(STXY)); mesh->back = &(mesh->face[5*sqsteps]); /* for the front and four side faces */ for (side=0; side<5; side++) { /* use faceInfo to parameterize face construction */ xl = faceInfo[side].xl; yl = faceInfo[side].yl; zl = faceInfo[side].zl; swap = faceInfo[side].swap; flip = faceInfo[side].flip; /* cube map "Z" coordinate */ v[zl] = faceInfo[side].dir; for (i=0; i<mesh->steps; i++) { /* cube map "Y" coordinate */ v[yl] = 2.0/(mesh->steps-1) * i - 1.0; for (j=0; j<mesh->steps; j++) { /* cube map "X" coordinate */ v[xl] = 2.0/(mesh->steps-1) * j - 1.0; /* normalize cube map location to construct */ /* reflection vector */ len = sqrt(1.0 + v[xl]*v[xl] + v[yl]*v[yl]); rv[0] = v[0]/len; rv[1] = v[1]/len; rv[2] = v[2]/len; /* map reflection vector to sphere map (s,t) */ /* NOTE: face[side][i][j] (x,y) gets updated */ smapRvecToSt(rv, FACExy(side,i,j)); /* update texture coordinate, */ /* normalize [-1..1,-1..1] to [0..1,0..1] */ if (!swap) { FACE(side,i,j).s = (-v[xl] + 1.0)/2.0; FACE(side,i,j).t = (flip*v[yl] + 1.0)/2.0; } else { FACE(side,i,j).s = (flip*-v[yl] + 1.0)/2.0; FACE(side,i,j).t = (v[xl] + 1.0)/2.0; } } } } /* The back face must be specially handled. The center point in the back face of a cube map becomes a a singularity around the circular edge of a sphere map. */ /* Carefully work from each edge of the back face to center of back face mapped to the outside of the sphere map. */ /* cube map "Z" coordinate, always -1 since backface */ v[2] = -1; /* for each edge */ /* [x=-1, y=-1..1, z=-1] */ /* [x= 1, y=-1..1, z=-1] */ /* [x=-1..1, y=-1, z=-1] */ /* [x=-1..1, y= 1, z=-1] */ for (edge=0; edge<4; edge++) { /* cube map "X" coordinate */ v[edgeInfo[edge].xl] = edgeInfo[edge].dir; for (j=0; j<mesh->steps; j++) { /* cube map "Y" coordinate */ v[edgeInfo[edge].yl] = 2.0/(mesh->steps-1) * j - 1.0; /* normalize cube map location to construct */ /* reflection vector */ len = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); rv[0] = v[0]/len; rv[1] = v[1]/len; rv[2] = v[2]/len; /* Map reflection vector to sphere map (s,t). */ smapRvecToSt(rv, st); /* Determine distinance from the center of sphere */ /* map (0.5,0.5) to (s,t) */ len = sqrt((st[0]-0.5)*(st[0]-0.5) + (st[1]-0.5)*(st[1]-0.5)); /* Calculate (s,t) location extended to the singularity */ /* at the center of the back face (ie, extend to */ /* circle edge of the sphere map). */ sc = (st[0]-0.5)/len * 0.5 + 0.5; tc = (st[1]-0.5)/len * 0.5 + 0.5; /* (s,t) at back face edge. */ BACK(edge,0,j).s = (-v[0] + 1.0)/2.0; BACK(edge,0,j).t = (-v[1] + 1.0)/2.0; BACK(edge,0,j).x = st[0]; BACK(edge,0,j).y = st[1]; /* If just two rings, we just generate a back face edge vertex and a center vertex (2 rings), but if there are more rings, we carefully interpolate between the edge and center vertices. Notice how smapStToRvec is used to map the interpolated (s,t) into a reflection vector that must then be extended to the back cube face (it is not correct to just interpolate the texture coordinates!). */ if (mesh->rings > 2) { float ist[2]; /* interpolated (s,t) */ float ds, dt; /* delta s and delta t */ /* Start interpolating from the edge. */ ist[0] = st[0]; ist[1] = st[1]; /* Calculate delta s and delta t for interpolation. */ ds = (sc - ist[0]) / (mesh->rings-1); dt = (tc - ist[1]) / (mesh->rings-1); for (i=1; i<mesh->rings-1; i++) { /* Incremental interpolation of (s,t). */ ist[0] = ist[0] + ds; ist[1] = ist[1] + dt; /* Calculate reflection vector from interpolated (s,t). */ smapStToRvec(ist, rv); /* Assert that z must be on the back cube face. */ assert(rv[2] <= -sqrt(1.0/3.0)); /* Extend reflection vector out of back cube face. */ /* Note: z is negative value so negate z to avoid */ /* inverting x and y! */ rv[0] = rv[0] / -rv[2]; rv[1] = rv[1] / -rv[2]; BACK(edge,i,j).s = (-rv[0] + 1.0)/2.0; BACK(edge,i,j).t = (-rv[1] + 1.0)/2.0; BACK(edge,i,j).x = ist[0]; BACK(edge,i,j).y = ist[1]; } } /* (s,t) at circle edge of the sphere map is ALWAYS */ /* at center of back cube map face */ BACK(edge,mesh->rings-1,j).s = 0.5; BACK(edge,mesh->rings-1,j).t = 0.5; /* Location of singularity at the edge of the sphere map. */ BACK(edge,mesh->rings-1,j).x = sc; BACK(edge,mesh->rings-1,j).y = tc; if (mesh->edgeExtend) { /* Add an extra ring to avoid seeing the */ /* tessellation boundary of the sphere map's sphere. */ BACK(edge,mesh->rings,j).s = 0.5; BACK(edge,mesh->rings,j).t = 0.5; /* 0.33 below is a fudge factor. */ BACK(edge,mesh->rings,j).x = sc + 0.33*(sc - st[0]); BACK(edge,mesh->rings,j).y = tc + 0.33*(tc - st[1]); } } } for (edge=0; edge<4; edge++) { for (j=0; j<mesh->steps; j++) { for (i=1; i<mesh->rings-1; i++) { } } } }
static void piglit_draw_rect_face(float x, float y, float w, float h, int face, int cube_layer) { float verts[4][4]; float tex[4][4]; float sign = face % 2 ? -1 : 1; verts[0][0] = x; verts[0][1] = y; verts[0][2] = 0.0; verts[0][3] = 1.0; verts[1][0] = x + w; verts[1][1] = y; verts[1][2] = 0.0; verts[1][3] = 1.0; verts[2][0] = x + w; verts[2][1] = y + h; verts[2][2] = 0.0; verts[2][3] = 1.0; verts[3][0] = x; verts[3][1] = y + h; verts[3][2] = 0.0; verts[3][3] = 1.0; switch (face) { case FACE(POSITIVE_X): case FACE(NEGATIVE_X): tex[0][0] = sign; tex[1][0] = sign; tex[2][0] = sign; tex[3][0] = sign; tex[3][1] = -1 * sign; tex[3][2] = 1; tex[0][1] = -1 * sign; tex[0][2] = -1; tex[1][1] = 1 * sign; tex[1][2] = -1; tex[2][1] = 1 * sign; tex[2][2] = 1; break; case FACE(POSITIVE_Y): case FACE(NEGATIVE_Y): tex[0][1] = sign; tex[1][1] = sign; tex[2][1] = sign; tex[3][1] = sign; tex[0][0] = 1 * sign; tex[0][2] = -1; tex[1][0] = -1 * sign; tex[1][2] = -1; tex[2][0] = -1 * sign; tex[2][2] = 1; tex[3][0] = 1 * sign; tex[3][2] = 1; break; case FACE(POSITIVE_Z): case FACE(NEGATIVE_Z): tex[0][2] = sign; tex[1][2] = sign; tex[2][2] = sign; tex[3][2] = sign; tex[0][0] = 1; tex[0][1] = 1 * sign; tex[1][0] = -1; tex[1][1] = 1 * sign; tex[2][0] = -1; tex[2][1] = -1 * sign; tex[3][0] = 1; tex[3][1] = -1 * sign; break; default: assert(0); } tex[0][3] = cube_layer; tex[1][3] = cube_layer; tex[2][3] = cube_layer; tex[3][3] = cube_layer; glVertexPointer(4, GL_FLOAT, 0, verts); glTexCoordPointer(4, GL_FLOAT, 0, tex); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glDrawArrays(GL_QUADS, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); }
/* * aLeftPlayer: next in turn * aRightPlayer: prev in turn * 0, 1th * 1th, 2nd */ Card *AlphaBetaPlayer::makeMove (Card *lMove, Card *rMove, Player *aLeftPlayer, Player *aRightPlayer, bool isPassOut) { qDebug() << type() << "("<< mPlayerNo << ") moves"; card_t hands[3][10]; card_t desk[3]; int crdLeft = 0; int trumpSuit = 0; Player *plst[3]; //again: plst[0] = plst[1] = plst[2] = 0; plst[mPlayerNo-1] = this; plst[aLeftPlayer->number()-1] = aLeftPlayer; plst[aRightPlayer->number()-1] = aRightPlayer; // build hands for (int c = 0; c < 3; c++) { Q_ASSERT(plst[c]); CardList *clst = &(plst[c]->mCards); //for (int f = 0; f < 10; f++) hds[c][f] = hands[c][f] = 0; int pos = 0; for (int f = 0; f < clst->size(); f++) { Card *ct = clst->at(f); if (!ct) continue; hands[c][pos++] = CARD(ct->face(), ct->suit()-1); if (pos > crdLeft) crdLeft = pos; } for (int f = pos; f < 10; f++) hands[c][f] = 0; xsortCards(hands[c], pos); } if (!lMove && !rMove && crdLeft == 10) { return AiPlayer::makeMove(lMove, rMove, aLeftPlayer, aRightPlayer, isPassOut); } // find game const eGameBid bid = m_model->currentGame(); gPassOutOrMisere = (bid == g86 || bid == g86catch || bid == raspass); trumpSuit = bid%10-1;//(bid-(bid/10)*10)-1; /* if (bid == g86catch || bid == g86 || bid == raspass) { return Player::moveSelectCard(lMove, rMove, aLeftPlayer, aRightPlayer); } */ if (bid == g86catch || bid == g86 || bid == raspass) { trumpSuit = 4; } if (trumpSuit < 0) trumpSuit = 4; fprintf(stderr, "po:%s; lm:%s, rm:%s\n", isPassOut?"y":"n", lMove?"y":"n", rMove?"y":"n"); if (isPassOut && rMove && !lMove) { // это распасы, первый или второй круг, первый ход gPassOutSuit = rMove->suit()-1; fprintf(stderr, "pass-out: %i\n", gPassOutSuit); rMove = 0; } else gPassOutSuit = -1; // build desk int turn = 0; if (lMove) { desk[turn++] = CARD(lMove->face(), lMove->suit()-1); if (rMove) desk[turn++] = CARD(rMove->face(), rMove->suit()-1); } else if (rMove) { desk[turn++] = CARD(rMove->face(), rMove->suit()-1); } // build hands for (int f = 0; f < 3; f++) { xHands[f].suitCount[0] = xHands[f].suitCount[1] = xHands[f].suitCount[2] = xHands[f].suitCount[3] = 0; xHands[f].suitStart[0] = xHands[f].suitStart[1] = xHands[f].suitStart[2] = xHands[f].suitStart[3] = 11; xHands[f].tricks = plst[f]->tricksTaken(); int st; for (int z = 0; z < 10; z++) { if (hands[f][z]) { xHands[f].faces[z] = FACE(hands[f][z]); st = xHands[f].suits[z] = SUIT(hands[f][z]); if (xHands[f].suitCount[st]++ == 0) xHands[f].suitStart[st] = z; } else xHands[f].faces[z] = 0; } } // build desk for (int f = 0; f < turn; f++) { xDeskFaces[f] = FACE(desk[f]); xDeskSuits[f] = SUIT(desk[f]); } int a, b, c, move; int me = this->number()-1; xCardsLeft = crdLeft; gTrumpSuit = trumpSuit; gIterations = 0; printf("%shand 0:", this->number()==0?"*":" "); printHand(&(xHands[0])); printf("%shand 1:", this->number()==1?"*":" "); printHand(&(xHands[1])); printf("%shand 2:", this->number()==2?"*":" "); printHand(&(xHands[2])); printDesk(turn); // оптимизации /* if (turn > 0) { // можем вообще взять? if (hands[me].suitCount( } */ stTime = QTime::currentTime(); stTime.start(); abcPrune(turn, me, -666, 666, 666, &a, &b, &c, &move); qDebug() << "face:" << FACE(hands[me][move]) << "suit:" << SUIT(hands[me][move])+1 << "move:" << move << "turn:" << turn << "moves:" << crdLeft << "trump:" << trumpSuit << "iters:" << gIterations << ""; /* for (int h = 0; h < 3; h++) { fprintf(stderr, (h == me)?"*":" "); fprintf(stderr, "hand %i:", h); for (int f = 0; f < 10; f++) { if (hands[h][f]) { fprintf(stderr, " %2i.%i(%3i)", FACE(hands[h][f]), SUIT(hands[h][f]), hands[h][f]); } else { fprintf(stderr, " %2i.%i(%3i)", 0, 0, hands[h][f]); } } fprintf(stderr, "\n"); } fprintf(stderr, "desk:"); for (int f = 0; f < turn; f++) { fprintf(stderr, " %2i.%i(%3i)", FACE(desk[f]), SUIT(desk[f]), desk[f]); } fprintf(stderr, "\n"); */ Q_ASSERT(move >= 0); Card *moveCard = getCard(FACE(hands[me][move]), SUIT(hands[me][move])+1); qDebug() << "move:" << moveCard->toString(); mCards.remove(moveCard); mCardsOut.insert(moveCard); return moveCard; }
void mesh::LoadMesh(string obj_file) { char token[100], buf[100], v[5][100]; // v[5] 表示一個 polygon 可以有 5個 vertex float vec[3]; int n_vertex, n_texture, n_normal; int cur_tex = 0; // state variable: 目前所使用的 material scene = fopen(obj_file.c_str(),"r"); s_file = obj_file; if (!scene) { cout<< string("Can not open object File \"") << obj_file << "\" !" << endl; return; } cout<<endl<<obj_file<<endl; while(!feof(scene)) { token[0] = NULL; fscanf(scene,"%s", token); // 讀 token if (!strcmp(token,"g")) { fscanf(scene,"%s",buf); } else if (!strcmp(token,"mtllib")) { fscanf(scene,"%s", mat_file); LoadTex(string(obj_database) + string(mat_file)); } else if (!strcmp(token,"usemtl")) { fscanf(scene,"%s",buf); cur_tex = matMap[s_file+string("_")+string(buf)]; } else if (!strcmp(token,"v")) { fscanf(scene,"%f %f %f",&vec[0],&vec[1],&vec[2]); vList.push_back(Vec3(vec)); } else if (!strcmp(token,"vn")) { fscanf(scene,"%f %f %f",&vec[0],&vec[1],&vec[2]); nList.push_back(Vec3(vec)); } else if (!strcmp(token,"vt")) { fscanf(scene,"%f %f",&vec[0],&vec[1]); tList.push_back(Vec3(vec)); } else if (!strcmp(token,"f")) { for (int i=0;i<3;i++) // face 預設為 3,假設一個 polygon 都只有 3 個 vertex { fscanf(scene,"%s",v[i]); //printf("[%s]",v[i]); } //printf("\n"); Vertex tmp_vertex[3]; // for faceList structure for (int i=0;i<3;i++) // for each vertex of this face { char str[20], ch; int base,offset; base = offset = 0; // calculate vertex-list index while( (ch=v[i][base+offset]) != '/' && (ch=v[i][base+offset]) != '\0') { str[offset] = ch; offset++; } str[offset] = '\0'; n_vertex = atoi(str); base += (ch == '\0')? offset : offset+1; offset = 0; // calculate texture-list index while( (ch=v[i][base+offset]) != '/' && (ch=v[i][base+offset]) != '\0') { str[offset] = ch; offset++; } str[offset] = '\0'; n_texture = atoi(str); // case: xxx//zzz,texture 設為 0 (tList 從 1 開始) base += (ch == '\0')? offset : offset+1; offset = 0; // calculate normal-list index while( (ch=v[i][base+offset]) != '\0') { str[offset] = ch; offset++; } str[offset] = '\0'; n_normal = atoi(str); // case: xxx/yyy,normal 設為 0 (nList 從 1 開始) tmp_vertex[i].v = n_vertex; tmp_vertex[i].t = n_texture; tmp_vertex[i].n = n_normal; tmp_vertex[i].m = cur_tex; } faceList.push_back(FACE(tmp_vertex[0],tmp_vertex[1],tmp_vertex[2])); } else if (!strcmp(token,"#")) // 註解 fgets(buf,100,scene); // printf("[%s]\n",token); } if (scene) fclose(scene); vTotal = vList.size(); nTotal = nList.size(); tTotal = tList.size(); fTotal = faceList.size(); printf("vetex: %d, normal: %d, texture: %d, triangles: %d\n",vTotal, nTotal, tTotal, fTotal); }
cairo_font_face_t *IoCairoFontFace_rawFontFace(IoCairoFontFace *self) { return FACE(self); }
void IoCairoFontFace_free(IoCairoFontFace *self) { if (FACE(self)) cairo_font_face_destroy(FACE(self)); }