static VIDEO_UPDATE( alg ) { /* composite the video */ if (!video_skip_this_frame()) { mame_bitmap *vidbitmap; rectangle fixedvis = Machine->screen[screen].visarea; fixedvis.max_x++; fixedvis.max_y++; /* first lay down the video data */ laserdisc_get_video(discinfo, &vidbitmap); if (video_texture == NULL) video_texture = render_texture_alloc(vidbitmap, NULL, 0, TEXFORMAT_YUY16, NULL, NULL); else render_texture_set_bitmap(video_texture, vidbitmap, NULL, 0, TEXFORMAT_YUY16); /* then overlay the Amiga video */ if (overlay_texture == NULL) overlay_texture = render_texture_alloc(tmpbitmap, &fixedvis, 0, TEXFORMAT_PALETTEA16, NULL, NULL); else render_texture_set_bitmap(overlay_texture, tmpbitmap, &fixedvis, 0, TEXFORMAT_PALETTEA16); /* add both quads to the screen */ render_screen_add_quad(0, 0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0xff,0xff,0xff), video_texture, PRIMFLAG_BLENDMODE(BLENDMODE_NONE) | PRIMFLAG_SCREENTEX(1)); render_screen_add_quad(0, 0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0xff,0xff,0xff), overlay_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_SCREENTEX(1)); } /* display disc information */ if (discinfo != NULL) popmessage("%s", laserdisc_describe_state(discinfo)); return 0; }
static VIDEO_UPDATE( cliff ) { /* update the TMS9928A video */ video_update_tms9928a( machine, screen, bitmap, cliprect ); if (discinfo != NULL) { mame_bitmap *vidbitmap; rectangle fixedvis = *TMS9928A_get_visarea(); fixedvis.max_x++; fixedvis.max_y++; laserdisc_get_video(discinfo, &vidbitmap); /* first lay down the video data */ if (video_texture == NULL) video_texture = render_texture_alloc(NULL, NULL); if (vidbitmap != last_video_bitmap) render_texture_set_bitmap(video_texture, vidbitmap, NULL, 0, TEXFORMAT_YUY16); last_video_bitmap = vidbitmap; /* then overlay the TMS9928A video */ if (overlay_texture == NULL) overlay_texture = render_texture_alloc(NULL, NULL); render_texture_set_bitmap(overlay_texture, bitmap, &fixedvis, 0, TEXFORMAT_PALETTEA16); /* add both quads to the screen */ render_container_empty(render_container_get_screen(screen)); render_screen_add_quad(screen, 0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0xff,0xff,0xff), video_texture, PRIMFLAG_BLENDMODE(BLENDMODE_NONE) | PRIMFLAG_SCREENTEX(1)); render_screen_add_quad(screen, 0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0xff,0xff,0xff), overlay_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_SCREENTEX(1)); } /* display disc information */ if (discinfo != NULL) popmessage("%s", laserdisc_describe_state(discinfo)); return 0; }
void crosshair_render(screen_device &screen) { int player; for (player = 0; player < MAX_PLAYERS; player++) /* draw if visible and the right screen */ if (global.visible[player] && ((global.screen[player] == &screen) || (global.screen[player] == CROSSHAIR_SCREEN_ALL))) { /* add a quad assuming a 4:3 screen (this is not perfect) */ render_screen_add_quad(&screen, global.x[player] - 0.03f, global.y[player] - 0.04f, global.x[player] + 0.03f, global.y[player] + 0.04f, MAKE_ARGB(0xc0, global.fade, global.fade, global.fade), global.texture[player], PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } }
void video_frame_update(void) { int skipped_it = video_skip_this_frame(); int paused = mame_is_paused(Machine); int phase = mame_get_phase(Machine); int livemask; int scrnum; /* only render sound and video if we're in the running phase */ if (phase == MAME_PHASE_RUNNING) { /* update sound */ sound_frame_update(); /* finish updating the screens */ for (scrnum = 0; scrnum < MAX_SCREENS; scrnum++) if (Machine->drv->screen[scrnum].tag != NULL) video_screen_update_partial(scrnum, Machine->screen[scrnum].visarea.max_y); /* now add the quads for all the screens */ livemask = render_get_live_screens_mask(); for (scrnum = 0; scrnum < MAX_SCREENS; scrnum++) { if (livemask & (1 << scrnum)) { internal_screen_info *screen = &scrinfo[scrnum]; /* only update if empty and not a vector game; otherwise assume the driver did it directly */ if (render_container_is_empty(render_container_get_screen(scrnum)) && !(Machine->drv->video_attributes & VIDEO_TYPE_VECTOR)) { mame_bitmap *bitmap = screen->bitmap[screen->curbitmap]; if (!skipping_this_frame && screen->changed) { rectangle fixedvis = Machine->screen[scrnum].visarea; fixedvis.max_x++; fixedvis.max_y++; render_texture_set_bitmap(screen->texture, bitmap, &fixedvis, Machine->drv->screen[scrnum].palette_base, screen->format); screen->curbitmap = 1 - screen->curbitmap; } render_screen_add_quad(scrnum, 0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0xff,0xff,0xff), screen->texture, PRIMFLAG_BLENDMODE(BLENDMODE_NONE) | PRIMFLAG_SCREENTEX(1)); } } } /* update our movie recording state */ if (!paused) movie_record_frame(0); /* reset the screen changed flags */ for (scrnum = 0; scrnum < MAX_SCREENS; scrnum++) scrinfo[scrnum].changed = 0; } /* draw any crosshairs */ crosshair_render(); /* draw the user interface */ ui_update_and_render(); /* call the OSD to update */ skipping_this_frame = osd_update(mame_timer_get_time()); /* empty the containers */ for (scrnum = 0; scrnum < MAX_SCREENS; scrnum++) if (Machine->drv->screen[scrnum].tag != NULL) render_container_empty(render_container_get_screen(scrnum)); /* update FPS */ recompute_fps(skipped_it); /* call the end-of-frame callback */ if (phase == MAME_PHASE_RUNNING) { /* reset partial updates if we're paused or if the debugger is active */ if (paused || mame_debug_is_active()) video_reset_partial_updates(); /* otherwise, call the video EOF callback */ else if (Machine->drv->video_eof != NULL) { profiler_mark(PROFILER_VIDEO); (*Machine->drv->video_eof)(Machine); profiler_mark(PROFILER_END); } } }
static void crosshair_render(void) { float x[MAX_PLAYERS], y[MAX_PLAYERS]; input_port_entry *ipt; int portnum = -1; int player; UINT8 tscale; /* skip if not needed */ if (crosshair_visible == 0) return; /* animate via crosshair_animate */ crosshair_animate += 0x04; /* compute a color scaling factor from the current animation value */ if (crosshair_animate < 0x80) tscale = 0xa0 + (0x60 * (crosshair_animate & 0x7f) / 0x80); else tscale = 0xa0 + (0x60 * (~crosshair_animate & 0x7f) / 0x80); /* read all the lightgun values */ for (ipt = Machine->input_ports; ipt->type != IPT_END; ipt++) { /* keep track of the port number */ if (ipt->type == IPT_PORT) portnum++; /* compute the values */ if (ipt->analog.crossaxis != CROSSHAIR_AXIS_NONE) { float value = (float)((readinputport(portnum) & ipt->mask) - ipt->analog.min) / (float)(ipt->analog.max - ipt->analog.min); value = (value - 0.5f) * ipt->analog.crossscale + 0.5f; value += ipt->analog.crossoffset; /* switch off the axis */ switch (ipt->analog.crossaxis) { case CROSSHAIR_AXIS_X: x[ipt->player] = value; if (ipt->analog.crossaltaxis != 0) y[ipt->player] = ipt->analog.crossaltaxis; break; case CROSSHAIR_AXIS_Y: y[ipt->player] = value; if (ipt->analog.crossaltaxis != 0) x[ipt->player] = ipt->analog.crossaltaxis; break; } } } /* draw all crosshairs */ for (player = 0; player < MAX_PLAYERS; player++) if (crosshair_visible & (1 << player)) { /* add a quad assuming a 4:3 screen (this is not perfect) */ render_screen_add_quad(0, x[player] - 0.03f, y[player] - 0.04f, x[player] + 0.03f, y[player] + 0.04f, MAKE_ARGB(0xc0, tscale, tscale, tscale), crosshair_texture[player], PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } }