00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "cullBinBackToFront.h"
00016 #include "graphicsStateGuardianBase.h"
00017 #include "geometricBoundingVolume.h"
00018 #include "cullableObject.h"
00019 #include "cullHandler.h"
00020 #include "pStatTimer.h"
00021
00022 #include <algorithm>
00023
00024
00025 TypeHandle CullBinBackToFront::_type_handle;
00026
00027
00028
00029
00030
00031
00032 CullBinBackToFront::
00033 ~CullBinBackToFront() {
00034 Objects::iterator oi;
00035 for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
00036 CullableObject *object = (*oi)._object;
00037 delete object;
00038 }
00039 }
00040
00041
00042
00043
00044
00045
00046 CullBin *CullBinBackToFront::
00047 make_bin(const string &name, GraphicsStateGuardianBase *gsg,
00048 const PStatCollector &draw_region_pcollector) {
00049 return new CullBinBackToFront(name, gsg, draw_region_pcollector);
00050 }
00051
00052
00053
00054
00055
00056
00057
00058 void CullBinBackToFront::
00059 add_object(CullableObject *object, Thread *current_thread) {
00060
00061 CPT(BoundingVolume) volume = object->_geom->get_bounds(current_thread);
00062 if (volume->is_empty()) {
00063 delete object;
00064 return;
00065 }
00066
00067 const GeometricBoundingVolume *gbv;
00068 DCAST_INTO_V(gbv, volume);
00069
00070 LPoint3 center = gbv->get_approx_center();
00071 nassertv(object->_modelview_transform != (const TransformState *)NULL);
00072 center = center * object->_modelview_transform->get_mat();
00073
00074 PN_stdfloat distance = _gsg->compute_distance_to(center);
00075 _objects.push_back(ObjectData(object, distance));
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 void CullBinBackToFront::
00088 finish_cull(SceneSetup *, Thread *current_thread) {
00089 PStatTimer timer(_cull_this_pcollector, current_thread);
00090 sort(_objects.begin(), _objects.end());
00091 }
00092
00093
00094
00095
00096
00097
00098
00099 void CullBinBackToFront::
00100 draw(bool force, Thread *current_thread) {
00101 PStatTimer timer(_draw_this_pcollector, current_thread);
00102 Objects::const_iterator oi;
00103 for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
00104 CullableObject *object = (*oi)._object;
00105 CullHandler::draw(object, _gsg, force, current_thread);
00106 }
00107 }
00108
00109
00110
00111
00112
00113
00114
00115 void CullBinBackToFront::
00116 fill_result_graph(CullBin::ResultGraphBuilder &builder) {
00117 Objects::const_iterator oi;
00118 for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
00119 CullableObject *object = (*oi)._object;
00120 builder.add_object(object);
00121 }
00122 }