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; }
void OpenGL3RenderState::enable(OpenGL3ContextState& state) const { depth_state_.enable(state); stencil_state_.enable(state); blend_state_.enable(state); rasterizer_state_.enable(state); if (viewport_.is_empty()) set_viewport(state, rect<int>(0, 0, state.window_size.x(), state.window_size.y())); else set_viewport(state, viewport_); set_scissor(state, scissor_state_); }
static void render_widget(AlWidget *widget, Vec2 translate, Box2 scissor) { widget->valid = true; if (!widget->visible) return; Vec2 location = vec2_add(widget->location, translate); Box2 bounds = box2_add_vec2(widget->bounds, location); scissor = box2_round(box2_intersect(scissor, bounds)); if (!box2_is_valid(scissor)) return; if (!widget->passThrough) { set_scissor(scissor); render_widget_main(widget, bounds); if (widget->border.width > 0) { scissor = box2_expand(scissor, -widget->border.width); set_scissor(scissor); } if (widget->model.model) { render_model(widget->model.model, vec2_add(widget->model.location, location), widget->model.scale); } if (widget->text.value) { render_text(widget->text.value, widget->text.colour, vec2_add(widget->text.location, location), widget->text.size); } } FOR_EACH_WIDGET(child, widget) { render_widget(child, location, scissor); }
void D3DGraphicContextProvider::reset_scissor() { set_scissor(Rect(0,0,0x7FFFFFFF,0x7FFFFFFF)); // The below does not work, why? //window->get_device_context()->RSSetScissorRects(0, 0); }