From 515de57e76a015fe142457d800fd39189ca7c996 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 6 Feb 2009 00:29:00 +0000 Subject: [PATCH] - screensaver: flesh out new SS a bit svn path=/trunk/boinc/; revision=17162 --- checkin_notes | 5 + client/sim.h | 2 + clientscr/screensaver_opengl.h | 29 ---- clientscr/ss_app.cpp | 273 +++++++++++++++++++-------------- doc/logo/boinc_logo_black.jpg | Bin 0 -> 36235 bytes win_build/ss_app.vcproj | 12 +- 6 files changed, 176 insertions(+), 145 deletions(-) delete mode 100644 clientscr/screensaver_opengl.h create mode 100644 doc/logo/boinc_logo_black.jpg diff --git a/checkin_notes b/checkin_notes index d5fa982d38..1edcbad1c1 100644 --- a/checkin_notes +++ b/checkin_notes @@ -1277,3 +1277,8 @@ David 5 Feb 2009 cs_scheduler.cpp cs_statefile.cpp +David 5 Feb 2009 + - screensaver: flesh out new SS a bit + + clientscr/ + ss_app.cpp diff --git a/client/sim.h b/client/sim.h index fa7a1e589a..117ae7fa80 100644 --- a/client/sim.h +++ b/client/sim.h @@ -307,3 +307,5 @@ extern bool work_fetch_old; #define CPU_PESSIMISM_FACTOR 0.9 // assume actual CPU utilization will be this multiple // of what we've actually measured recently + +#define WORK_FETCH_PERIOD 60 \ No newline at end of file diff --git a/clientscr/screensaver_opengl.h b/clientscr/screensaver_opengl.h deleted file mode 100644 index 8b3927c861..0000000000 --- a/clientscr/screensaver_opengl.h +++ /dev/null @@ -1,29 +0,0 @@ -// This file is part of BOINC. -// http://boinc.berkeley.edu -// Copyright (C) 2008 University of California -// -// BOINC is free software; you can redistribute it and/or modify it -// under the terms of the GNU Lesser General Public License -// as published by the Free Software Foundation, -// either version 3 of the License, or (at your option) any later version. -// -// BOINC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with BOINC. If not, see . - -#include "boinc_api.h" - -struct UC_SHMEM { - double update_time; - double fraction_done; - double cpu_time; - BOINC_STATUS status; - int countdown; - // graphics app sets this to 5 repeatedly, - // main program decrements it once/sec. - // If it's zero, don't bother updating shmem -}; diff --git a/clientscr/ss_app.cpp b/clientscr/ss_app.cpp index 489a25b146..3140d64005 100644 --- a/clientscr/ss_app.cpp +++ b/clientscr/ss_app.cpp @@ -28,33 +28,53 @@ #else #include #endif +#include +#include #include "diagnostics.h" -#include "parse.h" -#include "util.h" #include "gutil.h" #include "boinc_gl.h" -#include "app_ipc.h" -#include "boinc_api.h" #include "graphics2.h" #include "txf_util.h" -#include "screensaver_opengl.h" +#include "network.h" +#include "gui_rpc_client.h" +#include "app_ipc.h" #ifdef __APPLE__ #include "mac_app_icon.h" #endif +using std::string; +using std::vector; + float white[4] = {1., 1., 1., 1.}; TEXTURE_DESC logo; int width, height; // window dimensions -APP_INIT_DATA uc_aid; bool mouse_down = false; int mouse_x, mouse_y; double pitch_angle, roll_angle, viewpoint_distance=10; float color[4] = {.7, .2, .5, 1}; // the color of the 3D object. // Can be changed using preferences -UC_SHMEM* shmem = NULL; + +RPC_CLIENT rpc; +CC_STATE cc_state; + +struct APP_SLIDES { + string name; + int index; + double switch_time; + vector slides; + APP_SLIDES(string n): name(n), index(0), switch_time(0) {} +}; + +struct PROJECT_IMAGES { + string url; + TEXTURE_DESC icon; + vector app_slides; +}; + +vector project_images; // set up lighting model // @@ -75,56 +95,120 @@ static void draw_logo() { } } -static void draw_text() { - static float x=0, y=0; - static float dx=0.0003, dy=0.0007; - char buf[256]; - x += dx; - y += dy; - if (x < 0 || x > .5) dx *= -1; - if (y < 0 || y > .5) dy *= -1; - double fd = 0, cpu=0, dt; - if (shmem) { - fd = shmem->fraction_done; - cpu = shmem->cpu_time; - } - sprintf(buf, "User: %s", uc_aid.user_name); - txf_render_string(.1, x, y, 0, 500, white, 0, buf); - sprintf(buf, "Team: %s", uc_aid.team_name); - txf_render_string(.1, x, y+.1, 0, 500, white, 0, buf); - sprintf(buf, "%% Done: %f", 100*fd); - txf_render_string(.1, x, y+.2, 0, 500, white, 0, buf); - sprintf(buf, "CPU time: %f", cpu); - txf_render_string(.1, x, y+.3, 0, 500, white, 0, buf); - if (shmem) { - dt = dtime() - shmem->update_time; - if (dt > 10) { - boinc_close_window_and_quit("shmem not updated"); - } else if (dt > 5) { - txf_render_string(.1, 0, 0, 0, 500, white, 0, "App not running - exiting in 5 seconds"); - } else if (shmem->status.suspended) { - txf_render_string(.1, 0, 0, 0, 500, white, 0, "App suspended"); - } - } else { - txf_render_string(.1, 0, 0, 0, 500, white, 0, "No shared mem"); +void icon_path(PROJECT* p, char* buf) { + char dir[256]; + url_to_project_dir((char*)p->master_url.c_str(), dir); + sprintf(buf, "%s/stat_icon", dir); +} + +void slideshow(PROJECT* p) { + char dir[256], buf[256]; + int i; + + url_to_project_dir((char*)p->master_url.c_str(), dir); + for (i=0; i<99; i++) { + sprintf(buf, "%s/slideshow_%02d", dir, i); } } -static void draw_3d_stuff() { - static float x=0, y=0, z=10; - static float dx=0.3, dy=0.2, dz=0.5; - x += dx; - y += dy; - z += dz; - if (x < -15 || x > 15) dx *= -1; - if (y < -15 || y > 15) dy *= -1; - if (z < 0 || z > 40) dz *= -1; - float pos[3]; - pos[0] = x; - pos[1] = y; - pos[2] = z; - drawSphere(pos, 4); - drawCylinder(false, pos, 6, 6); +PROJECT_IMAGES* get_project_images(PROJECT* p) { + unsigned int i; + char dir[256], path[256], filename[256]; + + for (i=0; imaster_url) return π + } + PROJECT_IMAGES pim; + pim.url = p->master_url; + url_to_project_dir((char*)p->master_url.c_str(), dir); + sprintf(path, "%s/stat_icon", dir); + boinc_resolve_filename(path, filename, 256); + pim.icon.load_image_file(filename); + for (i=0; iapp->user_friendly_name.c_str()); + y -= 3; + progress.init(prog_pos, 10., 1., 0.8, prog_c, prog_ci); + progress.draw(r->fraction_done); + mode_unshaded(); + sprintf(buf, "%.2f%%", r->fraction_done*100); + txf_render_string(.1, x+15, y, 0, 8., white, 0, buf); + y -= 3; +} + +void show_coords() { + int i; + char buf[256]; + for (i=-100; i< 101; i+=5) { + sprintf(buf, "%d", i); + float x = (float)i; + txf_render_string(.1, x, 0, 0, 10., white, 0, buf); + } + for (i=-100; i< 101; i+=5) { + sprintf(buf, "%d", i); + float y = (float)i; + txf_render_string(.1, 0, y, 0, 10., white, 0, buf); + } +} +void show_project(PROJECT* p, float x, float& y) { + unsigned int i; + PROJECT_IMAGES* pim = get_project_images(p); + txf_render_string(.1, x, y, 0, 5., white, 0, (char*)p->project_name.c_str()); + if (pim->icon.present) { + float pos[3] = {x, y, 1}; + float size[2] = {3., 3.}; + pim->icon.draw(pos, size, 0, 0); + } + y -= 3; + for (i=0; iproject != p) continue; + if (!r->active_task) continue; + if (r->active_task_state != PROCESS_EXECUTING) continue; + show_result(r, x, y); + } +} + +void show_projects() { + char buf[256]; + float x=-45, y=30; + unsigned int i; + for (i=0; icountdown = 5; +void app_graphics_render(int xs, int ys, double t) { + int retval = update_data(t); + if (retval) { + boinc_close_window_and_quit("RPC failed"); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -181,15 +258,15 @@ void app_graphics_render(int xs, int ys, double time_of_day) { // init_camera(viewpoint_distance); scale_screen(width, height); - mode_shaded(color); - draw_3d_stuff(); + //mode_shaded(color); // draw text on top // - mode_unshaded(); - mode_ortho(); - draw_text(); - ortho_done(); + //mode_unshaded(); + //mode_ortho(); + show_projects(); + show_coords(); + //ortho_done(); } void app_graphics_resize(int w, int h){ @@ -232,59 +309,27 @@ void boinc_app_key_press(int, int){} void boinc_app_key_release(int, int){} void app_graphics_init() { - char path[256]; - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - txf_load_fonts("."); - - boinc_resolve_filename("logo.jpg", path, sizeof(path)); - logo.load_image_file(path); - + logo.load_image_file("boinc_logo_black.jpg"); init_lights(); } -static void parse_project_prefs(char* buf) { - char cs[256]; - COLOR c; - double hue; - double max_frames_sec, max_gfx_cpu_pct; - if (!buf) return; - if (parse_str(buf, "", cs, 256)) { - if (!strcmp(cs, "Tahiti Sunset")) { - hue = .9; - } else if (!strcmp(cs, "Desert Sands")) { - hue = .1; - } else { - hue = .5; - } - HLStoRGB(hue, .5, .5, c); - color[0] = c.r; - color[1] = c.g; - color[2] = c.b; - color[3] = 1; - } - if (parse_double(buf, "", max_frames_sec)) { - boinc_max_fps = max_frames_sec; - } - if (parse_double(buf, "", max_gfx_cpu_pct)) { - boinc_max_gfx_cpu_frac = max_gfx_cpu_pct/100; - } -} - int main(int argc, char** argv) { - boinc_init_graphics_diagnostics(BOINC_DIAG_DEFAULTS); + int retval; + +#ifdef _WIN32 + WinsockInitialize(); +#endif + retval = rpc.init("localhost"); + if (retval) exit(retval); #ifdef __APPLE__ setMacIcon(argv[0], MacAppIconData, sizeof(MacAppIconData)); #endif - - boinc_parse_init_data_file(); - boinc_get_init_data(uc_aid); - if (uc_aid.project_preferences) { - parse_project_prefs(uc_aid.project_preferences); - } boinc_graphics_loop(argc, argv); - boinc_finish_diag(); +#ifdef _WIN32 + WinsockCleanup(); +#endif } diff --git a/doc/logo/boinc_logo_black.jpg b/doc/logo/boinc_logo_black.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64fb6b4539a5fac7ed13746639c0ee2f9e361294 GIT binary patch literal 36235 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 + + + +