Example #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;
}
Example #2
0
static void
drawparticle(struct sprite *s, struct particle_system *ps, struct pack_picture *pic, const struct srt *srt) {
	int n = ps->particleCount;
	int i;
	struct matrix *old_m = s->t.mat;
	uint32_t old_c = s->t.color;

	shader_blend(ps->config->srcBlend, ps->config->dstBlend);
	for (i=0;i<n;i++) {
		struct particle *p = &ps->particles[i];
		struct matrix *mat = &ps->matrix[i];
		uint32_t color = p->color_val;

		s->t.mat = mat;
		s->t.color = color;
		sprite_drawquad(pic, NULL, &s->t);
	}
	shader_defaultblend();

	s->t.mat = old_m;
	s->t.color = old_c;
}