Exemple #1
0
// 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;
   }
Exemple #2
0
// 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;
   }