/* frees the bucket, only used when freeing scenes */ void RAS_BucketManager::RemoveMaterial(RAS_IPolyMaterial * mat) { BucketList::iterator bit, bitp; list<RAS_MeshSlot>::iterator mit; int i; for(i=0; i<m_SolidBuckets.size(); i++) { RAS_MaterialBucket *bucket = m_SolidBuckets[i]; if (mat == bucket->GetPolyMaterial()) { m_SolidBuckets.erase(m_SolidBuckets.begin()+i); delete bucket; i--; } } for(int i=0; i<m_AlphaBuckets.size(); i++) { RAS_MaterialBucket *bucket = m_AlphaBuckets[i]; if (mat == bucket->GetPolyMaterial()) { m_AlphaBuckets.erase(m_AlphaBuckets.begin()+i); delete bucket; i--; } } }
void RAS_BucketManager::ReleaseMaterials(RAS_IPolyMaterial *mat) { BucketList& buckets = m_buckets[ALL_BUCKET]; for (BucketList::iterator it = buckets.begin(), end = buckets.end(); it != end; ++it) { RAS_MaterialBucket *bucket = *it; if (mat == NULL || (mat == bucket->GetPolyMaterial())) { bucket->GetPolyMaterial()->ReleaseMaterial(); } } }
void RAS_BucketManager::ReleaseDisplayLists(RAS_IPolyMaterial *mat) { BucketList& buckets = m_buckets[ALL_BUCKET]; for (BucketList::iterator it = buckets.begin(), end = buckets.end(); it != end; ++it) { RAS_MaterialBucket *bucket = *it; if (bucket->GetPolyMaterial() != mat && mat) { continue; } RAS_DisplayArrayBucketList& displayArrayBucketList = bucket->GetDisplayArrayBucketList(); for (RAS_DisplayArrayBucketList::iterator dit = displayArrayBucketList.begin(), dend = displayArrayBucketList.end(); dit != dend; ++dit) { (*dit)->DestructStorageInfo(); } } }
RAS_MaterialBucket *RAS_BucketManager::FindBucket(RAS_IPolyMaterial *material, bool &bucketCreated) { bucketCreated = false; BucketList& buckets = m_buckets[ALL_BUCKET]; for (BucketList::iterator it = buckets.begin(), end = buckets.end(); it != end; ++it) { RAS_MaterialBucket *bucket = *it; if (bucket->GetPolyMaterial() == material) { return bucket; } } RAS_MaterialBucket *bucket = new RAS_MaterialBucket(material); bucketCreated = true; const bool useinstancing = material->UseInstancing(); if (!material->OnlyShadow()) { if (material->IsAlpha()) { if (material->IsAlphaDepth()) { m_buckets[useinstancing ? ALPHA_DEPTH_INSTANCING_BUCKET : ALPHA_DEPTH_BUCKET].push_back(bucket); } else { m_buckets[useinstancing ? ALPHA_INSTANCING_BUCKET : ALPHA_BUCKET].push_back(bucket); } } else { m_buckets[useinstancing ? SOLID_INSTANCING_BUCKET : SOLID_BUCKET].push_back(bucket); } } if (material->CastsShadows()) { if (material->IsAlphaShadow()) { m_buckets[useinstancing ? ALPHA_SHADOW_INSTANCING_BUCKET : ALPHA_SHADOW_BUCKET].push_back(bucket); } else { m_buckets[useinstancing ? SOLID_SHADOW_INSTANCING_BUCKET : SOLID_SHADOW_BUCKET].push_back(bucket); } } if (material->IsText()) { m_buckets[TEXT_BUCKET].push_back(bucket); } // Used to free the bucket. m_buckets[ALL_BUCKET].push_back(bucket); return bucket; }
/* frees the bucket, only used when freeing scenes */ void RAS_BucketManager::RemoveMaterial(RAS_IPolyMaterial *mat) { for (unsigned short i = 0; i < NUM_BUCKET_TYPE; ++i) { BucketList& buckets = m_buckets[i]; for (BucketList::iterator it = buckets.begin(); it != buckets.end();) { RAS_MaterialBucket *bucket = *it; if (mat == bucket->GetPolyMaterial()) { it = buckets.erase(it); if (i == ALL_BUCKET) { delete bucket; } } else { ++it; } } } }