/* Draw current frame number in a little green box beside the current frame indicator */ static void draw_cfra_number(Scene *scene, View2D *v2d, const float cfra, const bool time) { float xscale, yscale, x, y; char numstr[32] = " t"; /* t is the character to start replacing from */ short slen; /* because the frame number text is subject to the same scaling as the contents of the view */ UI_view2d_scale_get(v2d, &xscale, &yscale); glScalef(1.0f / xscale, 1.0f, 1.0f); /* get timecode string * - padding on str-buf passed so that it doesn't sit on the frame indicator * - power = 0, gives 'standard' behavior for time * but power = 1 is required for frames (to get integer frames) */ if (time) { BLI_timecode_string_from_time(&numstr[4], sizeof(numstr) - 4, 0, FRA2TIME(cfra), FPS, U.timecode_style); } else { BLI_timecode_string_from_time_simple(&numstr[4], sizeof(numstr) - 4, 1, cfra); } slen = (short)UI_GetStringWidth(numstr) - 1; /* get starting coordinates for drawing */ x = cfra * xscale; y = 0.9f * U.widget_unit; /* draw green box around/behind text */ UI_ThemeColorShade(TH_CFRAME, 0); glRectf(x, y, x + slen, y + 0.75f * U.widget_unit); /* draw current frame number - black text */ UI_ThemeColor(TH_TEXT); UI_DrawString(x - 0.25f * U.widget_unit, y + 0.15f * U.widget_unit, numstr); /* restore view transform */ glScalef(xscale, 1.0, 1.0); }
/* str is IMA_MAX_RENDER_TEXT in size */ static void make_renderinfo_string(const RenderStats *rs, const Scene *scene, const bool v3d_override, const char *error, char *str) { char info_time_str[32]; // used to be extern to header_info.c uintptr_t mem_in_use, mmap_in_use, peak_memory; float megs_used_memory, mmap_used_memory, megs_peak_memory; char *spos = str; mem_in_use = MEM_get_memory_in_use(); mmap_in_use = MEM_get_mapped_memory_in_use(); peak_memory = MEM_get_peak_memory(); megs_used_memory = (mem_in_use - mmap_in_use) / (1024.0 * 1024.0); mmap_used_memory = (mmap_in_use) / (1024.0 * 1024.0); megs_peak_memory = (peak_memory) / (1024.0 * 1024.0); /* local view */ if (rs->localview) spos += sprintf(spos, "%s | ", IFACE_("3D Local View")); else if (v3d_override) spos += sprintf(spos, "%s | ", IFACE_("3D View")); /* frame number */ spos += sprintf(spos, IFACE_("Frame:%d "), (scene->r.cfra)); /* previous and elapsed time */ BLI_timecode_string_from_time_simple(info_time_str, sizeof(info_time_str), rs->lastframetime); if (rs->infostr && rs->infostr[0]) { if (rs->lastframetime != 0.0) spos += sprintf(spos, IFACE_("| Last:%s "), info_time_str); else spos += sprintf(spos, "| "); BLI_timecode_string_from_time_simple(info_time_str, sizeof(info_time_str), PIL_check_seconds_timer() - rs->starttime); } else spos += sprintf(spos, "| "); spos += sprintf(spos, IFACE_("Time:%s "), info_time_str); /* statistics */ if (rs->statstr) { if (rs->statstr[0]) { spos += sprintf(spos, "| %s ", rs->statstr); } } else { if (rs->totvert || rs->totface || rs->tothalo || rs->totstrand || rs->totlamp) spos += sprintf(spos, "| "); if (rs->totvert) spos += sprintf(spos, IFACE_("Ve:%d "), rs->totvert); if (rs->totface) spos += sprintf(spos, IFACE_("Fa:%d "), rs->totface); if (rs->tothalo) spos += sprintf(spos, IFACE_("Ha:%d "), rs->tothalo); if (rs->totstrand) spos += sprintf(spos, IFACE_("St:%d "), rs->totstrand); if (rs->totlamp) spos += sprintf(spos, IFACE_("La:%d "), rs->totlamp); if (rs->mem_peak == 0.0f) spos += sprintf(spos, IFACE_("| Mem:%.2fM (%.2fM, Peak %.2fM) "), megs_used_memory, mmap_used_memory, megs_peak_memory); else spos += sprintf(spos, IFACE_("| Mem:%.2fM, Peak: %.2fM "), rs->mem_used, rs->mem_peak); if (rs->curfield) spos += sprintf(spos, IFACE_("Field %d "), rs->curfield); if (rs->curblur) spos += sprintf(spos, IFACE_("Blur %d "), rs->curblur); } /* full sample */ if (rs->curfsa) spos += sprintf(spos, IFACE_("| Full Sample %d "), rs->curfsa); /* extra info */ if (rs->infostr && rs->infostr[0]) { spos += sprintf(spos, "| %s ", rs->infostr); } else if (error && error[0]) { spos += sprintf(spos, "| %s ", error); } /* very weak... but 512 characters is quite safe */ if (spos >= str + IMA_MAX_RENDER_TEXT) if (G.debug & G_DEBUG) printf("WARNING! renderwin text beyond limit\n"); }
void BlenderSession::update_status_progress() { string timestatus, status, substatus; string scene = ""; float progress; double total_time, remaining_time = 0, render_time; char time_str[128]; float mem_used = (float)session->stats.mem_used / 1024.0f / 1024.0f; float mem_peak = (float)session->stats.mem_peak / 1024.0f / 1024.0f; get_status(status, substatus); get_progress(progress, total_time, render_time); if(progress > 0) remaining_time = (1.0 - (double)progress) * (render_time / (double)progress); if(background) { scene += " | " + b_scene.name(); if(b_rlay_name != "") scene += ", " + b_rlay_name; if(b_rview_name != "") scene += ", " + b_rview_name; } else { BLI_timecode_string_from_time_simple(time_str, sizeof(time_str), total_time); timestatus = "Time:" + string(time_str) + " | "; } if(remaining_time > 0) { BLI_timecode_string_from_time_simple(time_str, sizeof(time_str), remaining_time); timestatus += "Remaining:" + string(time_str) + " | "; } timestatus += string_printf("Mem:%.2fM, Peak:%.2fM", (double)mem_used, (double)mem_peak); if(status.size() > 0) status = " | " + status; if(substatus.size() > 0) status += " | " + substatus; if(status != last_status) { b_engine.update_stats("", (timestatus + scene + status).c_str()); b_engine.update_memory_stats(mem_used, mem_peak); last_status = status; } if(progress != last_progress) { b_engine.update_progress(progress); last_progress = progress; } if(session->progress.get_error()) { string error = session->progress.get_error_message(); if(error != last_error) { /* TODO(sergey): Currently C++ RNA API doesn't let us to * use mnemonic name for the variable. Would be nice to * have this figured out. * * For until then, 1 << 5 means RPT_ERROR. */ b_engine.report(1 << 5, error.c_str()); b_engine.error_set(error.c_str()); last_error = error; } } }