Esempio n. 1
0
IoCairoFontFace *IoCairoFontFace_rawClone(IoCairoFontFace *proto)
{
	IoObject *self = IoObject_rawClonePrimitive(proto);
	if (FACE(proto))
		IoObject_setDataPointer_(self, cairo_font_face_reference(FACE(proto)));
	return self;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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);
}
Esempio n. 5
0
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;
	}
}
Esempio n. 6
0
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);
}
Esempio n. 8
0
/*
 * 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;
}
Esempio n. 9
0
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);
}
Esempio n. 10
0
cairo_font_face_t *IoCairoFontFace_rawFontFace(IoCairoFontFace *self)
{
	return FACE(self);
}
Esempio n. 11
0
void IoCairoFontFace_free(IoCairoFontFace *self)
{
	if (FACE(self))
		cairo_font_face_destroy(FACE(self));
}