286 lines
8.8 KiB
Text
286 lines
8.8 KiB
Text
/**
|
|
* PANDA 3D SOFTWARE
|
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
*
|
|
* All use of this software is subject to the terms of the revised BSD
|
|
* license. You should have received a copy of this license along
|
|
* with this source code in a file named "LICENSE."
|
|
*
|
|
* @file cullBinManager.I
|
|
* @author drose
|
|
* @date 2002-02-28
|
|
*/
|
|
|
|
/**
|
|
* This is a function object whose sole purpose is to put the _sorted_bins
|
|
* vector in the proper order for rendering the bins.
|
|
*/
|
|
INLINE CullBinManager::SortBins::
|
|
SortBins(CullBinManager *manager) :
|
|
_manager(manager)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* The function call method of the function object. Returns true if the two
|
|
* bin indices are already in sorted order with a < b, or false otherwise.
|
|
*/
|
|
INLINE bool CullBinManager::SortBins::
|
|
operator () (int a, int b) const {
|
|
return _manager->_bin_definitions[a]._sort < _manager->_bin_definitions[b]._sort;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Returns the number of bins in the world.
|
|
*/
|
|
INLINE int CullBinManager::
|
|
get_num_bins() const {
|
|
// We quietly sort the bins in order if they are not already sorted. This
|
|
// is a non-const operation, but we pretend it's const because it's intended
|
|
// to be a transparent update.
|
|
if (!_bins_are_sorted) {
|
|
((CullBinManager *)this)->do_sort_bins();
|
|
}
|
|
return _sorted_bins.size();
|
|
}
|
|
|
|
/**
|
|
* Returns the bin_index of the nth bin in the set, where n is a number
|
|
* between 0 and get_num_bins(). This returns the list of bin_index numbers,
|
|
* in sorted order (that is, in the order in which the bins should be
|
|
* rendered).
|
|
*/
|
|
INLINE int CullBinManager::
|
|
get_bin(int n) const {
|
|
nassertr(n >= 0 && n < (int)_sorted_bins.size(), -1);
|
|
return _sorted_bins[n];
|
|
}
|
|
|
|
/**
|
|
* Returns the name of the bin with the indicated bin_index (where bin_index
|
|
* was retrieved by get_bin() or find_bin()). The bin's name may not be
|
|
* changed during the life of the bin.
|
|
*/
|
|
INLINE std::string CullBinManager::
|
|
get_bin_name(int bin_index) const {
|
|
nassertr(bin_index >= 0 && bin_index < (int)_bin_definitions.size(), std::string());
|
|
nassertr(_bin_definitions[bin_index]._in_use, std::string());
|
|
return _bin_definitions[bin_index]._name;
|
|
}
|
|
|
|
/**
|
|
* Returns the type of the bin with the indicated bin_index (where bin_index
|
|
* was retrieved by get_bin() or find_bin()).
|
|
*/
|
|
INLINE CullBinManager::BinType CullBinManager::
|
|
get_bin_type(int bin_index) const {
|
|
nassertr(bin_index >= 0 && bin_index < (int)_bin_definitions.size(), BT_invalid);
|
|
nassertr(_bin_definitions[bin_index]._in_use, BT_invalid);
|
|
return _bin_definitions[bin_index]._type;
|
|
}
|
|
|
|
/**
|
|
* Returns the type of the bin with the indicated name.
|
|
*/
|
|
INLINE CullBinManager::BinType CullBinManager::
|
|
get_bin_type(const std::string &name) const {
|
|
int bin_index = find_bin(name);
|
|
nassertr(bin_index != -1, BT_invalid);
|
|
return get_bin_type(bin_index);
|
|
}
|
|
|
|
/**
|
|
* Changes the type of the bin with the indicated bin_index (where bin_index
|
|
* was retrieved by get_bin() or find_bin()).
|
|
*
|
|
* The change might be effective immediately, or it might take place next
|
|
* frame, depending on the bin type.
|
|
*/
|
|
INLINE void CullBinManager::
|
|
set_bin_type(int bin_index, CullBinManager::BinType type) {
|
|
nassertv(bin_index >= 0 && bin_index < (int)_bin_definitions.size());
|
|
nassertv(_bin_definitions[bin_index]._in_use);
|
|
_bin_definitions[bin_index]._type = type;
|
|
}
|
|
|
|
/**
|
|
* Changes the type of the bin with the indicated name.
|
|
*
|
|
* The change might be effective immediately, or it might take place next
|
|
* frame, depending on the bin type.
|
|
*/
|
|
INLINE void CullBinManager::
|
|
set_bin_type(const std::string &name, CullBinManager::BinType type) {
|
|
int bin_index = find_bin(name);
|
|
nassertv(bin_index != -1);
|
|
set_bin_type(bin_index, type);
|
|
}
|
|
|
|
/**
|
|
* Returns the sort order of the bin with the indicated bin_index (where
|
|
* bin_index was retrieved by get_bin() or find_bin()).
|
|
*
|
|
* The bins are rendered in increasing order by their sort order; this number
|
|
* may be changed from time to time to reorder the bins.
|
|
*/
|
|
INLINE int CullBinManager::
|
|
get_bin_sort(int bin_index) const {
|
|
nassertr(bin_index >= 0 && bin_index < (int)_bin_definitions.size(), 0);
|
|
nassertr(_bin_definitions[bin_index]._in_use, 0);
|
|
return _bin_definitions[bin_index]._sort;
|
|
}
|
|
|
|
/**
|
|
* Returns the sort order of the bin with the indicated name.
|
|
*
|
|
* The bins are rendered in increasing order by their sort order; this number
|
|
* may be changed from time to time to reorder the bins.
|
|
*/
|
|
INLINE int CullBinManager::
|
|
get_bin_sort(const std::string &name) const {
|
|
int bin_index = find_bin(name);
|
|
nassertr(bin_index != -1, 0);
|
|
return get_bin_sort(bin_index);
|
|
}
|
|
|
|
/**
|
|
* Changes the sort order of the bin with the indicated bin_index (where
|
|
* bin_index was retrieved by get_bin() or find_bin()).
|
|
*
|
|
* The bins are rendered in increasing order by their sort order; this number
|
|
* may be changed from time to time to reorder the bins.
|
|
*/
|
|
INLINE void CullBinManager::
|
|
set_bin_sort(int bin_index, int sort) {
|
|
nassertv(bin_index >= 0 && bin_index < (int)_bin_definitions.size());
|
|
nassertv(_bin_definitions[bin_index]._in_use);
|
|
_bin_definitions[bin_index]._sort = sort;
|
|
_bins_are_sorted = false;
|
|
}
|
|
|
|
/**
|
|
* Changes the sort order of the bin with the indicated name.
|
|
*
|
|
* The bins are rendered in increasing order by their sort order; this number
|
|
* may be changed from time to time to reorder the bins.
|
|
*/
|
|
INLINE void CullBinManager::
|
|
set_bin_sort(const std::string &name, int sort) {
|
|
int bin_index = find_bin(name);
|
|
nassertv(bin_index != -1);
|
|
set_bin_sort(bin_index, sort);
|
|
}
|
|
|
|
/**
|
|
* Returns the active flag of the bin with the indicated bin_index (where
|
|
* bin_index was retrieved by get_bin() or find_bin()).
|
|
*
|
|
* When a bin is marked inactive, all geometry assigned to it is not rendered.
|
|
*/
|
|
INLINE bool CullBinManager::
|
|
get_bin_active(int bin_index) const {
|
|
nassertr(bin_index >= 0 && bin_index < (int)_bin_definitions.size(), false);
|
|
nassertr(_bin_definitions[bin_index]._in_use, false);
|
|
return _bin_definitions[bin_index]._active;
|
|
}
|
|
|
|
/**
|
|
* Returns the active flag of the bin with the indicated name.
|
|
*
|
|
* When a bin is marked inactive, all geometry assigned to it is not rendered.
|
|
*/
|
|
INLINE bool CullBinManager::
|
|
get_bin_active(const std::string &name) const {
|
|
int bin_index = find_bin(name);
|
|
nassertr(bin_index != -1, false);
|
|
return get_bin_active(bin_index);
|
|
}
|
|
|
|
/**
|
|
* Changes the active flag of the bin with the indicated bin_index (where
|
|
* bin_index was retrieved by get_bin() or find_bin()).
|
|
*
|
|
* When a bin is marked inactive, all geometry assigned to it is not rendered.
|
|
*/
|
|
INLINE void CullBinManager::
|
|
set_bin_active(int bin_index, bool active) {
|
|
nassertv(bin_index >= 0 && bin_index < (int)_bin_definitions.size());
|
|
nassertv(_bin_definitions[bin_index]._in_use);
|
|
_bin_definitions[bin_index]._active = active;
|
|
}
|
|
|
|
/**
|
|
* Changes the active flag of the bin with the indicated name.
|
|
*
|
|
* When a bin is marked inactive, all geometry assigned to it is not rendered.
|
|
*/
|
|
INLINE void CullBinManager::
|
|
set_bin_active(const std::string &name, bool active) {
|
|
int bin_index = find_bin(name);
|
|
nassertv(bin_index != -1);
|
|
set_bin_active(bin_index, active);
|
|
}
|
|
|
|
#ifndef NDEBUG
|
|
/**
|
|
* Returns true if the bin with the given bin_index is configured to flash at
|
|
* a predetermined color (where bin_index was retrieved by get_bin() or
|
|
* find_bin()).
|
|
*
|
|
* This method is not available in release builds.
|
|
*/
|
|
INLINE bool CullBinManager::
|
|
get_bin_flash_active(int bin_index) const {
|
|
nassertr(bin_index >= 0 && bin_index < (int)_bin_definitions.size(), false);
|
|
return _bin_definitions[bin_index]._flash_active;
|
|
}
|
|
|
|
/**
|
|
* Returns the color that this bin has been configured to flash to, if
|
|
* configured.
|
|
*
|
|
* This method is not available in release builds.
|
|
*/
|
|
INLINE const LColor &CullBinManager::
|
|
get_bin_flash_color(int bin_index) const {
|
|
nassertr(bin_index >= 0 && bin_index < (int)_bin_definitions.size(), LColor::zero());
|
|
return _bin_definitions[bin_index]._flash_color;
|
|
}
|
|
|
|
/**
|
|
* When set to true, the given bin_index is configured to flash at a
|
|
* predetermined color (where bin_index was retrieved by get_bin() or
|
|
* find_bin()).
|
|
*
|
|
* This method is not available in release builds.
|
|
*/
|
|
INLINE void CullBinManager::
|
|
set_bin_flash_active(int bin_index, bool active) {
|
|
nassertv(bin_index >= 0 && bin_index < (int)_bin_definitions.size());
|
|
_bin_definitions[bin_index]._flash_active = active;
|
|
}
|
|
|
|
/**
|
|
* Changes the flash color for the given bin index.
|
|
*
|
|
* This method is not available in release builds.
|
|
*/
|
|
INLINE void CullBinManager::
|
|
set_bin_flash_color(int bin_index, const LColor &color) {
|
|
nassertv(bin_index >= 0 && bin_index < (int)_bin_definitions.size());
|
|
_bin_definitions[bin_index]._flash_color = color;
|
|
}
|
|
#endif // NDEBUG
|
|
|
|
/**
|
|
* Returns the pointer to the global CullBinManager object.
|
|
*/
|
|
INLINE CullBinManager *CullBinManager::
|
|
get_global_ptr() {
|
|
if (_global_ptr == nullptr) {
|
|
_global_ptr = new CullBinManager;
|
|
}
|
|
return _global_ptr;
|
|
}
|