// deliver data that is already available void datacloud::deliverdata(databuf *hfield,databuf *texture,databuf *fogmap,BOOLINT immediate,int *col,int *row,int *hlod,int *tlod) { float prio,p; jobqueueelem *job,*scan; BOOLINT isavailable; // start periodical tasks if (!immediate) { if (!DELIVERED) { // delete delayed jobs deletedelayedjobs(); // delete delayed tiles deletedelayedtiles(); // delete expired tiles deleteexpiredtiles(); // shrink cache to maximum allowed size shrinkcache(MAXSIZE*1024*1024); } // load pending tiles in the background startthread(); } // check deferred data delivery if (!immediate) if (DELIVERED) // stop deferred data delivery if time is up if (gettime()-DELIVERYSTART>TIMESLOT) { DELIVERED=FALSE; return; } // scan jobs if (!immediate) { prio=0.0f; job=NULL; scan=JOBQUEUETAIL; while (scan!=NULL) { p=0.0f; isavailable=TRUE; // check the availability of all required maps: if (scan->hfield!=NULL) if (!scan->hfield->isavailable) isavailable=FALSE; else p=getpriority(scan->hfield); if (scan->texture!=NULL) if (!scan->texture->isavailable) isavailable=FALSE; if (scan->fogmap!=NULL) if (!scan->fogmap->isavailable) isavailable=FALSE; // check the priority of the job if (isavailable && p>=prio) { prio=p; job=scan; } scan=scan->prev; } } else job=JOBQUEUE; // deferred data delivery if (job!=NULL) { // return maps if (job->hfield!=NULL) *hfield=*(job->hfield->tile); if (job->texture!=NULL) *texture=*(job->texture->tile); if (job->fogmap!=NULL) *fogmap=*(job->fogmap->tile); // return tile position if (col!=NULL) *col=job->col; if (row!=NULL) *row=job->row; // return level of detail if (hlod!=NULL) *hlod=job->hlod; if (tlod!=NULL) *tlod=job->tlod; // check for immediate delivery if (immediate) DELIVERED=FALSE; // remember starting time of deferred delivery else if (!DELIVERED) { DELIVERED=TRUE; DELIVERYSTART=gettime(); } // remove finished job from queue deletejob(job); } else DELIVERED=FALSE; }
// deliver data that is already available void datacloud::deliverdata(databuf *hfield,databuf *texture,databuf *fogmap,BOOLINT immediate,int *col,int *row,int *hlod,int *tlod) { // start periodical tasks if (!immediate) { if (!DELIVERED) { // delete expired tiles deleteexpiredtiles(); // shrink cache to maximum allowed size shrinkcache(MAXSIZE*1024*1024); } // load pending tiles in the background startthread(); } // check deferred data delivery if (!immediate) if (DELIVERED) { double upload=minitime()-DELIVERYSTART; // stop deferred data delivery because time is up if (upload>TIMESLOT) { DELIVERED=FALSE; return; } } jobqueueelem *job=JOBQUEUE; // scan jobs if (!immediate) while (job!=NULL) { BOOLINT isavailable=TRUE; // check availability of maps: if (job->hfield!=NULL) if (!job->hfield->isavailable) isavailable=FALSE; if (job->texture!=NULL) if (!job->texture->isavailable) isavailable=FALSE; if (job->fogmap!=NULL) if (!job->fogmap->isavailable) isavailable=FALSE; // start deferred data delivery if (isavailable) break; job=job->next; } // data delivery if (job!=NULL) { // return maps if (job->hfield!=NULL) *hfield=*(job->hfield->tile); if (job->texture!=NULL) *texture=*(job->texture->tile); if (job->fogmap!=NULL) *fogmap=*(job->fogmap->tile); // return tile position if (col!=NULL) *col=job->col; if (row!=NULL) *row=job->row; // return level of detail if (hlod!=NULL) *hlod=job->hlod; if (tlod!=NULL) *tlod=job->tlod; // check for immediate delivery if (immediate) DELIVERED=FALSE; // remember starting time of deferred delivery else if (!DELIVERED) { DELIVERED=TRUE; DELIVERYSTART=minitime(); } // remove finished job from queue deletejob(job); } else DELIVERED=FALSE; }