Ejemplo n.º 1
0
static int
draw_child(struct sprite *s, struct srt *srt, struct sprite_trans * ts) {
	struct sprite_trans temp;
	struct matrix temp_matrix;
	struct sprite_trans *t = trans_mul(&s->t, ts, &temp, &temp_matrix);
	switch (s->type) {
	case TYPE_PICTURE:
		switch_program(t, PROGRAM_PICTURE);
		sprite_drawquad(s->s.pic, srt, t);
		return 0;
	case TYPE_POLYGON:
		switch_program(t, PROGRAM_PICTURE);
		sprite_drawpolygon(s->s.poly, srt, t);
		return 0;
	case TYPE_LABEL:
		if (s->data.text) {
			switch_program(t, s->s.label->edge ? PROGRAM_TEXT_EDGE : PROGRAM_TEXT);
			label_draw(s->data.text, s->s.label,srt,t);
		}
		return 0;
	case TYPE_ANCHOR:
		anchor_update(s, srt, t);
		return 0;
	case TYPE_ANIMATION:
		break;
	case TYPE_PANNEL:
		if (s->data.scissor) {
			// enable scissor
			set_scissor(s->s.pannel, srt, t);
			return 1;
		} else {
			return 0;
		}
	default:
		// todo : invalid type
		return 0;
	}
	// draw animation
	struct pack_animation *ani = s->s.ani;
	int frame = real_frame(s) + s->start_frame;
	struct pack_frame * pf = &ani->frame[frame];
	int i;
	int scissor = 0;
	for (i=0;i<pf->n;i++) {
		struct pack_part *pp = &pf->part[i];
		int index = pp->component_id;
		struct sprite * child = s->data.children[index];
		if (child == NULL || child->visible == false) {
			continue;
		}
		struct sprite_trans temp2;
		struct matrix temp_matrix2;
		struct sprite_trans *ct = trans_mul(&pp->t, t, &temp2, &temp_matrix2);
		scissor += draw_child(child, srt, ct);
	}
	for (i=0;i<scissor;i++) {
		scissor_pop();
	}
	return 0;
}
Ejemplo n.º 2
0
static int
child_pos(struct sprite *s, struct srt *srt, struct sprite_trans *ts, struct sprite *t, int pos[2]) {
	struct sprite_trans temp;
	struct matrix temp_matrix;
	struct sprite_trans *st = trans_mul(&s->t, ts, &temp, &temp_matrix);
	if (s == t) {
		struct matrix tmp;
		if (st->mat == NULL) {
			matrix_identity(&tmp);
		} else {
			tmp = *st->mat;
		}
		matrix_srt(&tmp, srt);
		switch (s->type) {
		case TYPE_PICTURE:
			picture_pos(tmp.m, s->s.pic, srt, st, pos);
			return 0;
		case TYPE_LABEL:
			label_pos(tmp.m, s->s.label, srt, st, pos);
			return 0;
		case TYPE_ANIMATION:
		case TYPE_PANNEL:
			pos[0] = tmp.m[4] / SCREEN_SCALE;
			pos[1] = tmp.m[5] / SCREEN_SCALE;
			return 0;
		default:
			return 1;
		}
	} 
	
	if (s->type != TYPE_ANIMATION){
		return 1;
	}

	struct pack_animation *ani = s->s.ani;
	int frame = real_frame(s) + s->start_frame;
	struct pack_frame * pf = &ani->frame[frame];
	int i;
	for (i=0;i<pf->n;i++) {
		struct pack_part *pp = &pf->part[i];
		int index = pp->component_id;
		struct sprite * child = s->data.children[index];
		if (child == NULL) {
			continue;
		}
		struct sprite_trans temp2;
		struct matrix temp_matrix2;
		struct sprite_trans *ct = trans_mul(&pp->t, st, &temp2, &temp_matrix2);
		if (child_pos(child, srt, ct, t, pos) == 0) {
			return 0;
		}
	}
	return 1;
}