void score_screen_react(score_screen_t* s, SDL_Event* e){ //if key or joybutton is hit, we go to the game or something like it if(e->type == SDL_KEYDOWN || e->type == SDL_JOYBUTTONDOWN) game_system_communicate(s->system, 0); else if(e->type == SDL_VIDEORESIZE){ renderer_resize(&s->system->renderer,e->resize.w, e->resize.h); renderer_reload(&s->system->renderer); } }
/*----------------------------------------------------------------- * Initialization *-----------------------------------------------------------------*/ void renderer_init(struct renderer_state* rs) { /* Populate renderer state according to init params */ memset(rs, 0, sizeof(*rs)); rs->internal = calloc(1, sizeof(*rs->internal)); struct renderer_internal_state* is = rs->internal; /* Initialize resource manager */ resmgr_init(&rs->rmgr); /* Initial dimensions */ int width = 1280, height = 720; is->viewport.x = width; is->viewport.y = height; /* Initialize gbuffer */ gbuffer_init(&is->main_gbuf, width, height); is->gbuf = &is->main_gbuf; /* Initialize internal postfx renderer */ postfx_init(&is->postfx, width, height); /* Initial resize */ renderer_resize(rs, width, height); /* Initialize gl utilities state */ glutils_init(); /* Initialize internal panic screen state */ panicscr_init(&is->ps_rndr); register_gl_error_handler(pnkscr_err_cb, &is->ps_rndr); /* Initialize embedded resources */ resint_init(); /* Initialize SSAO state */ ssao_init(&is->ssao, width, height); /* Initialize internal eye adaptation state */ eyeadapt_init(&is->eyeadpt); /* Initialize internal texture sky state */ sky_texture_init(&is->sky_rndr.tex); /* Initialize internal preetham sky state */ sky_preetham_init(&is->sky_rndr.preeth); /* Initialize internal Global Illumination renderer state */ gi_rndr_init(&is->gi_rndr); /* Initialize internal bbox renderer state */ bbox_rndr_init(&is->bbox_rs); /* Initialize internal occlusion state */ occull_init(&is->occl_st); /* Initialize internal shadowmap state */ const GLuint shmap_res = 2048; shadowmap_init(&is->shdwmap, shmap_res, shmap_res); /* Fetch shaders */ renderer_shdr_fetch(rs); /* Initialize frame profiler */ is->fprof = frame_prof_init(); /* Initialize debug text rendering */ dbgtxt_init(); /* Initialize multiple render targets debugger */ mrtdbg_init(); /* Load internal textures */ image im; void* fdata; size_t fsize; embedded_file(&fdata, &fsize, "textures/smaa_area_tex.dds"); im = image_from_buffer(fdata, fsize, ".dds"); glGenTextures(1, &is->textures.smaa.area); glBindTexture(GL_TEXTURE_2D, is->textures.smaa.area); glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, im.w, im.h, 0, GL_BGR, GL_UNSIGNED_BYTE, im.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); free(im.data); embedded_file(&fdata, &fsize, "textures/smaa_search_tex.dds"); im = image_from_buffer(fdata, fsize, ".dds"); glGenTextures(1, &is->textures.smaa.search); glBindTexture(GL_TEXTURE_2D, is->textures.smaa.search); glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, im.w, im.h, 0, GL_RED, GL_UNSIGNED_BYTE, im.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); free(im.data); glBindTexture(GL_TEXTURE_2D, 0); /* Setup IBL */ is->textures.brdf_lut = brdf_lut_generate(is->shdrs.ibl.brdf_lut); /* Default options */ rs->options.use_occlusion_culling = 0; rs->options.use_rough_met_maps = 1; rs->options.use_detail_maps = 1; rs->options.use_shadows = 0; rs->options.use_envlight = 1; rs->options.use_bloom = 0; rs->options.use_tonemapping = 1; rs->options.use_gamma_correction = 1; rs->options.use_ssao = 0; rs->options.show_bboxes = 0; rs->options.show_normals = 0; rs->options.show_fprof = 1; rs->options.show_gbuf_textures = 0; rs->options.show_gidata = 0; }
JNIEXPORT void JNICALL Java_com_fiftyply_mosaic_GameRenderer_nativeResize(JNIEnv* env, jobject obj, int w, int h) { LOGI("nativeResize"); renderer_resize(w, h); }
/** renderer for setups */ static NftResult _render_setup(cairo_surface_t ** surface, gpointer element) { if(!surface || !element) NFT_LOG_NULL(NFT_FAILURE); /* setup to render */ LedSetup *s = (LedSetup *) element; /* get dimensions of setup */ LedFrameCord w, h; led_setup_get_dim(s, &w, &h); /* calculate rendered dimensions of this tile */ double width = (double) w * ui_renderer_scale_factor(); double height = (double) h * ui_renderer_scale_factor(); /* if dimensions changed, we need to allocate a new surface */ if(!renderer_resize(setup_get_renderer(), width, height)) { g_error("Failed to resize renderer to %dx%d", w, h); return NFT_FAILURE; } /* create context for drawing */ cairo_t *cr = cairo_create(*surface); /* clear surface */ #ifdef DEBUG cairo_set_source_rgba(cr, 0.1, 0.1, 0.1, 1); #else cairo_set_source_rgba(cr, 0, 0, 0, 1); #endif cairo_rectangle(cr, 0, 0, (double) cairo_image_surface_get_width(*surface), (double) cairo_image_surface_get_height(*surface)); cairo_fill(cr); /* walk through all hardware LED adapters */ LedHardware *hw; for(hw = led_setup_get_hardware(s); hw; hw = led_hardware_list_get_next(hw)) { /* calculate offset of complete setup */ LedTile *t; double xOff = 0, yOff = 0; for(t = led_hardware_get_tile(hw); t; t = led_tile_list_get_next(t)) { double xOffT, yOffT; tile_calc_render_offset(led_tile_get_privdata(t), (double) w, (double) h, &xOffT, &yOffT); xOff = MIN(xOff, xOffT); yOff = MIN(yOff, yOffT); } renderer_set_offset(setup_get_renderer(), xOff * ui_renderer_scale_factor(), yOff * ui_renderer_scale_factor()); /* Walk all tiles of this hardware & draw their surface */ for(t = led_hardware_get_tile(hw); t; t = led_tile_list_get_next(t)) { /** @todo check for visibility? */ /* get surface from tile */ NiftyconfTile *tile = (NiftyconfTile *) led_tile_get_privdata(t); /* get surface */ cairo_surface_t *tsurface = renderer_get_surface (tile_get_renderer(tile)); /* compensate child tiles' offset */ double xOffT, yOffT; renderer_get_offset(tile_get_renderer(tile), &xOffT, &yOffT); cairo_translate(cr, xOffT, yOffT); /* compensate setup offset */ cairo_translate(cr, -xOff * ui_renderer_scale_factor(), -yOff * ui_renderer_scale_factor()); /* move to x/y */ LedFrameCord x, y; led_tile_get_pos(t, &x, &y); cairo_translate(cr, ((double) x) * ui_renderer_scale_factor(), ((double) y) * ui_renderer_scale_factor()); /* rotate around pivot */ double pX, pY; led_tile_get_pivot(t, &pX, &pY); cairo_translate(cr, pX * ui_renderer_scale_factor(), pY * ui_renderer_scale_factor()); cairo_rotate(cr, led_tile_get_rotation(t)); cairo_translate(cr, -pX * ui_renderer_scale_factor(), -pY * ui_renderer_scale_factor()); /* draw surface */ cairo_set_source_surface(cr, tsurface, 0, 0); /* disable filtering */ cairo_pattern_set_filter(cairo_get_source(cr), ui_renderer_filter()); /* disable antialiasing */ cairo_set_antialias(cr, ui_renderer_antialias()); /* render surface */ cairo_paint(cr); /* reset transformation matrix */ cairo_identity_matrix(cr); } /* Draw chain of this hardware */ /* s = * chain_get_surface(led_chain_get_privdata(led_hardware_get_chain(h))); * cairo_set_source_surface(cr, s, 0, 0); cairo_paint(cr); */ } cairo_destroy(cr); return NFT_SUCCESS; }
/** renderer for chains */ static NftResult _render_chain( cairo_surface_t ** s, gpointer element) { if(!s || !*s || !element) NFT_LOG_NULL(NFT_FAILURE); /* get this chain */ NiftyconfChain *chain = (NiftyconfChain *) element; LedChain *c = chain_niftyled(chain); /* if dimensions changed, we need to allocate a new surface */ int width = (led_chain_get_max_x(c) + 1) * renderer_scale_factor(); int height = (led_chain_get_max_y(c) + 1) * renderer_scale_factor(); NiftyconfRenderer *r = chain_get_renderer(chain); if(!renderer_resize(r, width, height)) { g_error("Failed to resize renderer to %dx%d", width, height); return NFT_FAILURE; } /* create context for drawing */ cairo_t *cr = cairo_create(*s); /* disable antialiasing */ cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); /* clear surface */ cairo_set_source_rgba(cr, 0, 0, 0, 1); cairo_rectangle(cr, 0, 0, (double) cairo_image_surface_get_width(*s), (double) cairo_image_surface_get_height(*s)); cairo_fill(cr); /* set line-width */ cairo_set_line_width(cr, 1); /* walk all LEDs */ LedCount i; for(i = 0; i < led_chain_get_ledcount(c); i++) { Led *l = led_chain_get_nth(c, i); NiftyconfLed *led = led_get_privdata(l); NiftyconfRenderer *lr = led_get_renderer(led); cairo_set_source_surface(cr, renderer_get_surface(lr), (double) led_get_x(l) * renderer_scale_factor(), (double) led_get_y(l) * renderer_scale_factor()); cairo_paint(cr); } cairo_destroy(cr); return NFT_SUCCESS; }