Beispiel #1
0
void TranBucketMan::Flush( Bool doDraw)  // = TRUE
{ 
  if (!doDraw)
	{
		BucketMan::Flush(FALSE);
		return;
	}

  Vid::SetZWriteState( FALSE);
  Bool alpha = Vid::SetAlphaState( TRUE);

	// figure out how many buckets actually have vertices in them
	// so that we don't have to look at any empty buckets

	NList<Bucket>::Iterator li(&bucketList); 
  Bucket * list[444];
  S32 count = 0;
  while (Bucket * bucket = li++)
  {
    if (bucket->vCount)
    {
      list[count] = bucket;
      count++;

      ASSERT( count <= 444);
    }
#ifdef DOLASTBUCKET
    if (bucket == lastUsedBucket)
    {
      break;
    }
#endif
  }

	// for each bucket that is not empty...
	for (count--; count >= 0; count--)
	{
		Bucket *max = list[count];
  
		// find the bucket with the maximum z value
    S32 i, current = count;
		for (i = count - 1; i >= 0; i--)
		{
			if (list[i]->tag > max->tag)
			{
				max = list[i];
        current = i;
			}
/*
			else if (list[i]->tag == max->tag)
      {
        if (list[i]->tag1 > max->tag1)
        {
	  			max = list[i];
          current = i;
        }
      }
*/
		}

    if (!Vid::caps.noTransort && !(max->flags & RS_NOSORT) && primitive.primitive_type != PT_LINELIST)
    {
      max->Sort();
    }
		// flush the bucket with the maximum z value
    if ((max->flags & RS_DST_MASK) == RS_DST_ONE)
    {
      Vid::SetFogColorD3D( 0);

  		FlushBucket( *max);

      Vid::SetFogColorD3D( Vid::renderState.fogColor);
    }
    else
    {
  		FlushBucket( *max);
    }

    max->Reset();

    // move end of list to current position 
    //
    list[current] = list[count];
	}


  Vid::SetAlphaState( alpha);
  Vid::SetZWriteState( TRUE);

  curMem  = memBlock;
  curSize = memSize;

  currentBucket = NULL;
  lastUsedBucket = NULL;
}
Beispiel #2
0
void TranBucketMan::FlushTex( const Bitmap * texture, Bool doDraw)  // = TRUE
{ 
  if (!doDraw)
	{
		BucketMan::Flush(FALSE);
		return;
	}

  Vid::SetZWriteState( FALSE);
  Bool alpha = Vid::SetAlphaState( TRUE);

#if 1

  NList<Bucket>::Iterator li(&bucketList); 
  for (!li; *li; li++)
	{
    Bucket *bucket = *li;

    if (bucket->texture_count && bucket->textureStages[0].texture == texture && bucket->vCount)
    {

		  // flush the bucket with the maximum z value
      if ((bucket->flags & RS_DST_MASK) == RS_DST_ONE)
      {
        Vid::SetFogColorD3D( 0);

  		  FlushBucket( *bucket);

        Vid::SetFogColorD3D( Vid::renderState.fogColor);
      }
      else
      {
  		  FlushBucket( *bucket);
      }
    }
    bucket->Reset();
	}

  currentBucket = NULL;

#else

	// figure out how many buckets actually have vertices in them
	// so that we don't have to look at any empty buckets
	NList<Bucket>::Iterator li(&bucketList); 
  Bucket *list[222];
  S32 count = 0;
#if 0
  S32 ic = 0;
	NList<Bucket>::Node *lnode = NULL;
  NList<Bucket>::Node *llnode = NULL;
#endif
  for (!li; *li; li++)
  {

		if ((*li)->vCount)
		{
      list[count] = *li;
      count++;
		}
	}

	// for each bucket that is not empty...
	for (count--; count >= 0; count--)
	{
		Bucket *max = list[count];
  
		// find the bucket with the maximum z value
    S32 i, current = count;
		for (i = count - 1; i >= 0; i--)
		{
			if (list[i]->tag > max->tag)
			{
				max = list[i];
        current = i;
			}
		}

    if (!Vid::caps.notransort && !(max->flags & RS_NOSORT))
    {
      max->Sort();
    }


		// flush the bucket with the maximum z value
    if ((max->flags & RS_DST_MASK) == RS_DST_ONE)
    {
      Vid::SetFogColorD3D( 0);

  		FlushBucket( *max);

      Vid::SetFogColorD3D( Vid::renderState.fogColor);
    }
    else
    {
  		FlushBucket( *max);
    }
    max->Reset();

    // move end of list to current position 
    //
    list[current] = list[count];
	}
#endif

  Vid::SetAlphaState( alpha);
  Vid::SetZWriteState( TRUE);

  curMem  = memBlock;
  curSize = memSize;
  currentBucket = NULL;
}