void render() { #ifdef OPENGL glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glPushMatrix(); glScalef(zoomFactor, zoomFactor, 0.0); glTranslatef(-transX, -transY, 0.0); if (layer[currentLayer].glList) { glCallList(layer[currentLayer].glList); } else { layer[currentLayer].glList = glGenLists(1); glNewList(layer[currentLayer].glList, GL_COMPILE_AND_EXECUTE); glBegin(GL_QUADS); #else uint32_t yellow; yellow = SDL_MapRGB(Surf_Display->format, 224, 224, 128); SDL_LockSurface(Surf_Display); SDL_FillRect(Surf_Display, NULL, yellow); int lines = 0; #endif for (int i = shadow_layers; i >= 1; i--) { if (currentLayer - i > 0) render_layer(currentLayer - i, shadow_alpha - (i - 1) * (shadow_alpha / ((float) shadow_layers))); } render_layer(currentLayer, 1.0); #ifdef OPENGL glEnd(); glEndList(); } glPopMatrix(); glPushMatrix(); glTranslatef(0.0, 200.0 - (20.0 * 0.3), 0.0); glScalef(0.3, 0.3, 1.0); ftglSetFontFaceSize(font, 20, 20); ftglRenderFont(font, msgbuf, FTGL_RENDER_ALL); glPopMatrix(); glFlush(); glFinish(); SDL_GL_SwapBuffers(); glFinish(); #else SDL_UnlockSurface(Surf_Display); SDL_Flip(Surf_Display); #endif }
int main(int argc, char* argv[]) { msgbuf = malloc(256); msgbuf[0] = 0; currentLayer = 0; cache = true; int longIndex; int opt; do { opt = getopt_long(argc, argv, optString, longOpts, &longIndex); if (opt != -1) { switch( opt ) { case 'l': currentLayer = strtol(optarg, NULL, 10); break; case 'w': extrusionWidth = strtof(optarg, NULL); break; case 'n': printf("DISABLING CACHE\n"); cache = false; break; case 'h': /* fall-through is intentional */ case '?': display_usage(); break; case 0: /* long option without a short arg */ //if( strcmp( "randomize", longOpts[longIndex].name ) == 0 ) { // globalArgs.randomized = 1; //} break; default: /* You won't actually get here. */ break; } } } while (opt != -1); if (optind >= argc) display_usage(); int fd = open(argv[optind], 0); if (fd == -1) die("Open ", argv[optind]); struct stat filestats; if (fstat(fd, &filestats) == -1) die("fstat ", argv[optind]); filesz = filestats.st_size; printf("File is %d long\n", filesz); #ifdef __linux__ gcodefile = mmap(NULL, filesz, PROT_READ, MAP_PRIVATE | MAP_POPULATE, fd, 0); #elif defined __APPLE__ gcodefile = mmap(NULL, filesz, PROT_READ, MAP_PRIVATE, fd, 0); #else #error "don't know how to mmap on this system!" #endif if (gcodefile == MAP_FAILED) die("mmap ", argv[optind]); gcodefile_end = &gcodefile[filesz]; busy = BUSY_SCANFILE; scanLines(); if (currentLayer >= layerCount) currentLayer = layerCount - 1; //for (int i = 0; i < layerCount; i++) // printf("Layer %3d starts at %7d and is %7d bytes long\n", i, layer[i].index - gcodefile, layer[i].size); Running = true; Surf_Display = NULL; if (SDL_Init(SDL_INIT_EVERYTHING) < 0) die("SDL_init", ""); if (FcInitLoadConfigAndFonts() == ((void *) FcTrue)) die("FontConfig Init",""); // from http://www.spinics.net/lists/font-config/msg03050.html FcPattern *pat, *match; FcResult result; char *file; int index; pat = FcPatternCreate(); FcPatternAddString(pat, FC_FAMILY, (FcChar8 *) "Mono"); FcConfigSubstitute(NULL, pat, FcMatchPattern); FcDefaultSubstitute(pat); match = FcFontMatch(NULL, pat, &result); FcPatternGetString(match, FC_FILE, 0, (FcChar8 **) &file); FcPatternGetInteger(match, FC_INDEX, 0, &index); font = ftglCreateExtrudeFont(file); if (!font) die("FTGL createFont", ""); FcPatternDestroy (match); FcPatternDestroy (pat); #ifdef OPENGL transX = transY = 0.0; zoomFactor = 1.0; resize(600, 600); #else viewPortL = viewPortT = 0.0; viewPortR = viewPortB = 200.0; zoomFactor = 3.0; resize(viewPortR * zoomFactor, viewPortB * zoomFactor); #endif SDL_WM_SetCaption("gcodeview", 0); drawLayer(currentLayer); layerVelocity = 0; timerIdle = SDL_AddTimer(20, &timerCallback, (void *) TIMER_IDLE); SDL_Event Event; while(Running != false) { if (busy) { Event.type = SDL_NOEVENT; SDL_PollEvent(&Event); } else { if (SDL_WaitEvent(&Event) == 0) die("SDL_WaitEvent", ""); } //SDL_RemoveTimer(timerIdle); switch (Event.type) { case SDL_NOEVENT: if (busy & BUSY_SCANFILE) { // TODO: scan next layer scanLine(); if ((busy & BUSY_SCANFILE) == 0) { if (cache) { printf("File scanned, rendering...\n"); busy = BUSY_RENDER; } else { printf("File scanned.\n"); busy = 0; } } } else if ((busy & BUSY_RENDER) && cache) { bool allRendered = true; int i; // TODO: render next layer in background for (i = 0; i < layerCount; i++) { if (layer[i].glList == 0) { layer[i].glList = glGenLists(1); glNewList(layer[i].glList, GL_COMPILE); glBegin(GL_QUADS); for (int j = SHADOW_LAYERS; j >= 1; j--) { if (i - j > 0) render_layer(i - j, SHADOW_ALPHA - (j - 1) * (SHADOW_ALPHA / SHADOW_LAYERS)); } render_layer(i, 1.0); glEnd(); glEndList(); layer[i].flags |= LD_LISTGENERATED; allRendered = false; break; } } if (allRendered) { printf("All %d layers rendered\n", i); busy &= ~BUSY_RENDER; } } break; case SDL_QUIT: Running = false; break; case SDL_VIDEORESIZE: resize(Event.resize.w, Event.resize.h); break; case SDL_VIDEOEXPOSE: render(); break; case SDL_MOUSEBUTTONDOWN: handle_mousedown(Event.button); break; case SDL_MOUSEBUTTONUP: handle_mouseup(Event.button); break; case SDL_MOUSEMOTION: handle_mousemove(Event.motion); break; case SDL_ACTIVEEVENT: // lose or gain focus break; case SDL_KEYDOWN: handle_keydown(Event.key); break; case SDL_KEYUP: handle_keyup(Event.key); break; case SDL_USEREVENT: handle_userevent(Event.user); break; default: printf("SDL Event %d\n", Event.type); break; } //idle code //if (busy) // timerIdle = SDL_AddTimer(20, &timerCallback, (void *) TIMER_IDLE); } if (timerKeyRepeat) SDL_RemoveTimer(timerKeyRepeat); if (timerDragRender) SDL_RemoveTimer(timerDragRender); free(layer); SDL_FreeSurface(Surf_Display); SDL_Quit(); return 0; }
int main(int argc, char **argv) { char spath[PATH_MAX] = RENDER_SOCKET; char *config_file = RENDERD_CONFIG; char *map = NULL; int c; int numThreads = 1; int dd, mm, yy; struct tm tm; while (1) { int option_index = 0; static struct option long_options[] = { {"config",1,0,'c'}, {"min-zoom", 1, 0, 'z'}, {"max-zoom", 1, 0, 'Z'}, {"max-load", 1, 0, 'l'}, {"socket", 1, 0, 's'}, {"num-threads", 1, 0, 'n'}, {"tile-dir", 1, 0, 't'}, {"timestamp", 1, 0, 'T'}, {"map", 1, 0, 'm'}, {"verbose", 0, 0, 'v'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long(argc, argv, "hvz:Z:s:t:n:c:l:T:m:", long_options, &option_index); if (c == -1) break; switch (c) { case 's': /* -s, --socket */ strncpy(spath, optarg, PATH_MAX-1); spath[PATH_MAX-1] = 0; break; case 't': /* -t, --tile-dir */ tile_dir=strdup(optarg); break; case 'c': /* -c, --config */ config_file=strdup(optarg); break; case 'm': /* -m, --map */ map=strdup(optarg); break; case 'n': /* -n, --num-threads */ numThreads=atoi(optarg); if (numThreads <= 0) { fprintf(stderr, "Invalid number of threads, must be at least 1\n"); return 1; } break; case 'z': /* -z, --min-zoom */ minZoom=atoi(optarg); if (minZoom < 0 || minZoom > MAX_ZOOM) { fprintf(stderr, "Invalid minimum zoom selected, must be between 0 and %d\n", MAX_ZOOM); return 1; } break; case 'Z': /* -Z, --max-zoom */ maxZoom=atoi(optarg); if (maxZoom < 0 || maxZoom > MAX_ZOOM) { fprintf(stderr, "Invalid maximum zoom selected, must be between 0 and %d\n", MAX_ZOOM); return 1; } break; case 'l': max_load = atoi(optarg); if (max_load < 0) { fprintf(stderr, "Invalid maximum load specified, must be greater than 0\n"); return 1; } break; case 'T': if (sscanf(optarg,"%d/%d/%d", &dd, &mm, &yy) < 3) { fprintf(stderr, "Invalid planet time stamp, must be in the format dd/mm/yyyy\n"); return 1; } if (yy > 100) yy -= 1900; if (yy < 70) yy += 100; tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0; tm.tm_mday = dd; tm.tm_mon = mm - 1; tm.tm_year = yy; planetTime = mktime(&tm); case 'v': /* -v, --verbose */ verbose=1; break; case 'h': /* -h, --help */ fprintf(stderr, "Usage: render_old [OPTION] ...\n"); fprintf(stderr, "Search the rendered tiles and re-render tiles which are older then the last planet import\n"); fprintf(stderr, " -c, --config=CONFIG specify the renderd config file\n"); fprintf(stderr, " -n, --num-threads=N the number of parallel request threads (default 1)\n"); fprintf(stderr, " -t, --tile-dir tile cache directory (defaults to '" HASH_PATH "')\n"); fprintf(stderr, " -z, --min-zoom=ZOOM filter input to only render tiles greater or equal to this zoom level (default 0)\n"); fprintf(stderr, " -Z, --max-zoom=ZOOM filter input to only render tiles less than or equal to this zoom level (default %d)\n", MAX_ZOOM); fprintf(stderr, " -s, --socket=SOCKET unix domain socket name for contacting renderd\n"); fprintf(stderr, " -l, --max-load=LOAD maximum system load with which requests are submitted\n"); fprintf(stderr, " -T, --timestamp=DD/MM/YY Overwrite the assumed data of the planet import\n"); fprintf(stderr, " -m, --map=STYLE Instead of going through all styls of CONFIG, only use a specific map-style\n"); return -1; default: fprintf(stderr, "unhandled char '%c'\n", c); break; } } if (maxZoom < minZoom) { fprintf(stderr, "Invalid zoom range, max zoom must be greater or equal to minimum zoom\n"); return 1; } fprintf(stderr, "Rendering old tiles\n"); if (planetTime != 0) { printf("Overwriting planet file update to %s", ctime(&planetTime)); } gettimeofday(&start, NULL); FILE * hini ; char line[INILINE_MAX]; char value[INILINE_MAX]; // Load the config if ((hini=fopen(config_file, "r"))==NULL) { fprintf(stderr, "Config: cannot open %s\n", config_file); exit(7); } spawn_workers(numThreads, spath); if (map) { render_layer(map); } else { while (fgets(line, INILINE_MAX, hini)!=NULL) { if (line[0] == '[') { if (strlen(line) >= XMLCONFIG_MAX){ fprintf(stderr, "XML name too long: %s\n", line); exit(7); } sscanf(line, "[%[^]]", value); // Skip mapnik & renderd sections which are config, not tile layers if (strcmp(value,"mapnik") && strncmp(value, "renderd", 7)) render_layer(value); } } } fclose(hini); finish_workers(numThreads); gettimeofday(&end, NULL); printf("\nTotal for all tiles rendered\n"); printf("Meta tiles rendered: "); display_rate(start, end, num_render); printf("Total tiles rendered: "); display_rate(start, end, num_render * METATILE * METATILE); printf("Total tiles handled: "); display_rate(start, end, num_all); return 0; }
glm::vec4 Indigo::ImageLayer::colour(const glm::vec4& colour) { glm::vec4 prev_colour = m_colour; if (colour != prev_colour) { OOBase::SharedPtr< ::ImageLayer> layer = OOBase::static_pointer_cast< ::ImageLayer>(render_layer()); if (layer) render_pipe()->post(OOBase::make_delegate<OOBase::ThreadLocalAllocator>(layer.get(),&::ImageLayer::colour),colour); } return prev_colour; }