static void glw_mirror_render(glw_t *w, const glw_rctx_t *rc) { glw_t *c; glw_rctx_t rc0; int b; if((c = TAILQ_FIRST(&w->glw_childs)) == NULL) return; b = glw_clip_enable(w->glw_root, rc, GLW_CLIP_BOTTOM, 0); glw_render0(c, rc); glw_clip_disable(w->glw_root, b); rc0 = *rc; glw_Translatef(&rc0, 0, -1, 0); glw_Scalef(&rc0, 1.0, -1.0, 1.0); glw_Translatef(&rc0, 0, 1, 0); glw_frontface(w->glw_root, GLW_CW); rc0.rc_alpha *= w->glw_alpha; rc0.rc_inhibit_matrix_store = 1; b = glw_clip_enable(w->glw_root, &rc0, GLW_CLIP_BOTTOM, 0); glw_render0(c, &rc0); glw_clip_disable(w->glw_root, b); glw_frontface(w->glw_root, GLW_CCW); }
static void glw_scale_to_pixels(glw_rctx_t *rc, int w, int h) { float xs = (float)w / rc->rc_width; float ys = (float)h / rc->rc_height; glw_Scalef(rc, xs, ys, 1.0f); rc->rc_width = w; rc->rc_height = h; }
static void glw_bloom_render(glw_t *w, const glw_rctx_t *rc) { glw_bloom_t *b = (void *)w; float a = rc->rc_alpha * w->glw_alpha; glw_rctx_t rc0; glw_t *c; rc0 = *rc; rc0.rc_alpha = a; TAILQ_FOREACH(c, &w->glw_childs, glw_parent_link) glw_render0(c, &rc0); if(b->b_glow < 0.01) return; b->b_need_render = a > 0.01; if(!b->b_need_render) return; if(glw_is_focusable(w)) glw_store_matrix(w, rc); rc0 = *rc; glw_Scalef(&rc0, 1.0 + EDGE_SIZE / rc->rc_width, 1.0 + EDGE_SIZE / rc->rc_height, 1.0); #if 0 glw_render(&b->b_render, w->glw_root, &rc0, GLW_RENDER_MODE_QUADS, GLW_RENDER_ATTRIBS_TEX, &glw_rtt_texture(&b->b_rtt[0]), 1, 1, 1, a); #endif a *= b->b_glow; glw_blendmode(w->glw_root, GLW_BLEND_ADDITIVE); glw_renderer_draw(&b->b_render, w->glw_root, &rc0, &glw_rtt_texture(&b->b_rtt[0]), NULL, NULL, a * 0.50, 0, NULL); glw_renderer_draw(&b->b_render, w->glw_root, &rc0, &glw_rtt_texture(&b->b_rtt[1]), NULL, NULL, a * 0.44, 0, NULL); glw_renderer_draw(&b->b_render, w->glw_root, &rc0, &glw_rtt_texture(&b->b_rtt[2]), NULL, NULL, a * 0.33, 0, NULL); glw_blendmode(w->glw_root, GLW_BLEND_NORMAL); }
static void glw_rotator_render(glw_t *w, glw_rctx_t *rc) { glw_rotator_t *gr = (glw_rotator_t *)w; glw_t *c; glw_rctx_t rc0; if((c = TAILQ_FIRST(&w->glw_childs)) == NULL) return; rc0 = *rc; glw_Scalef(&rc0, 0.8, 0.8, 0.8); glw_scale_to_aspect(&rc0, 1.0f); glw_Rotatef(&rc0, gr->theta, 0.0, 0.0f, 1.0f); glw_render0(c, &rc0); }
static void glw_displacement_render(glw_t *w, const glw_rctx_t *rc) { glw_displacement_t *gd = (glw_displacement_t *)w; glw_t *c; glw_rctx_t rc0 = *rc; rc0.rc_alpha = rc->rc_alpha * w->glw_alpha; if(rc0.rc_alpha < 0.01) return; if((c = TAILQ_FIRST(&w->glw_childs)) == NULL) return; glw_Translatef(&rc0, gd->gd_translate_x, gd->gd_translate_y, gd->gd_translate_z); glw_Scalef(&rc0, gd->gd_scale_x, gd->gd_scale_y, gd->gd_scale_z); if(gd->gd_rotate_a) glw_Rotatef(&rc0, gd->gd_rotate_a, gd->gd_rotate_x, gd->gd_rotate_y, gd->gd_rotate_z); glw_repositionf(&rc0, gd->gd_padding_left, rc->rc_height - gd->gd_padding_top, rc->rc_width - gd->gd_padding_right, gd->gd_padding_bottom); if(glw_is_focusable(w)) glw_store_matrix(w, &rc0); glw_render0(c, &rc0); }
static void glw_fx_texrot_render_internal(glw_root_t *gr, glw_rctx_t *rc, glw_fx_texrot_t *fx, glw_loadable_texture_t *glt) { int i; glw_rctx_t rc0; glw_blendmode(gr, GLW_BLEND_ADDITIVE); glw_Scalef(rc, 2.0, 2.0, 1.0); for(i = 0; i < FX_NPLATES; i++) { rc0 = *rc; fx->fx_plates[i].angle += fx->fx_plates[i].inc; glw_Translatef(&rc0, fx->fx_plates[i].x, fx->fx_plates[i].y, 0.0); glw_Rotatef(&rc0, fx->fx_plates[i].angle, 0.0, 0.0, 1.0); glw_renderer_draw(&fx->fx_source_render, gr, &rc0, &glt->glt_texture, NULL, NULL, 0.15); } glw_blendmode(gr, GLW_BLEND_NORMAL); }
static void glw_bloom_layout(glw_t *w, glw_rctx_t *rc) { glw_bloom_t *b = (void *)w; glw_root_t *gr = w->glw_root; glw_rctx_t rc0; glw_t *c; int x, y, i, sizx, sizy; TAILQ_FOREACH(c, &w->glw_childs, glw_parent_link) glw_layout0(c, rc); if(b->b_glow < 0.01) { if(b->b_width || b->b_height) bloom_destroy_rtt(gr, b); return; } sizx = rc->rc_width + EDGE_SIZE; sizy = rc->rc_height + EDGE_SIZE; if(b->b_width != sizx || b->b_height != sizy) { if(b->b_width || b->b_height) bloom_destroy_rtt(gr, b); b->b_width = sizx; b->b_height = sizy; if(b->b_width || b->b_height) { for(i = 0; i < BLOOM_COUNT; i++) { x = b->b_width / (2 << i); y = b->b_height / (2 << i); glw_rtt_init(gr, &b->b_rtt[i], x, y, 1); } } } // Initialize output texture if(!b->b_render_initialized) { float xs = gr->gr_normalized_texture_coords ? 1.0 : b->b_width; float ys = gr->gr_normalized_texture_coords ? 1.0 : b->b_height; glw_renderer_init_quad(&b->b_render); glw_renderer_vtx_pos(&b->b_render, 0, -1.0, -1.0, 0.0); glw_renderer_vtx_st (&b->b_render, 0, 0.0, 0); glw_renderer_vtx_pos(&b->b_render, 1, 1.0, -1.0, 0.0); glw_renderer_vtx_st (&b->b_render, 1, xs, 0); glw_renderer_vtx_pos(&b->b_render, 2, 1.0, 1.0, 0.0); glw_renderer_vtx_st (&b->b_render, 2, xs, ys); glw_renderer_vtx_pos(&b->b_render, 3, -1.0, 1.0, 0.0); glw_renderer_vtx_st (&b->b_render, 3, 0.0, ys); } memset(&rc0, 0, sizeof(glw_rctx_t)); rc0.rc_alpha = 1; rc0.rc_width = b->b_width - EDGE_SIZE; rc0.rc_height = b->b_height - EDGE_SIZE; rc0.rc_inhibit_shadows = 1; if(!b->b_need_render) return; for(i = 0; i < BLOOM_COUNT; i++) { glw_rtt_enter(gr, &b->b_rtt[i], &rc0); rc0.rc_width = b->b_width - EDGE_SIZE; rc0.rc_height = b->b_height - EDGE_SIZE; glw_Scalef(&rc0, 1.0 - EDGE_SIZE / b->b_width, 1.0 - EDGE_SIZE / b->b_height, 1.0); TAILQ_FOREACH(c, &w->glw_childs, glw_parent_link) glw_render0(c, &rc0); glw_rtt_restore(gr, &b->b_rtt[i]); } }