00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "cullBin.h"
00016 #include "config_pgraph.h"
00017 #include "pandaNode.h"
00018 #include "geomNode.h"
00019 #include "cullableObject.h"
00020 #include "decalEffect.h"
00021 #include "string_utils.h"
00022
00023 PStatCollector CullBin::_cull_bin_pcollector("Cull:Sort");
00024
00025 TypeHandle CullBin::_type_handle;
00026
00027
00028
00029
00030
00031
00032 CullBin::
00033 ~CullBin() {
00034 }
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 PT(CullBin) CullBin::
00050 make_next() const {
00051 return (CullBin *)NULL;
00052 }
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 void CullBin::
00064 finish_cull(SceneSetup *, Thread *) {
00065 }
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 PT(PandaNode) CullBin::
00083 make_result_graph() {
00084 PT(PandaNode) root_node = new PandaNode(get_name());
00085 ResultGraphBuilder builder(root_node);
00086 fill_result_graph(builder);
00087 return root_node;
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097 void CullBin::
00098 check_flash_color() {
00099 #ifdef NDEBUG
00100 _has_flash_color = false;
00101 #else
00102 ConfigVariableDouble flash_bin
00103 ("flash-bin-" + _name, "", "", ConfigVariable::F_dynamic);
00104 if (flash_bin.get_num_words() == 0) {
00105 _has_flash_color = false;
00106
00107 } else if (flash_bin.get_num_words() == 3) {
00108 _has_flash_color = true;
00109 _flash_color.set(flash_bin[0], flash_bin[1], flash_bin[2], 1.0f);
00110
00111 } else if (flash_bin.get_num_words() == 4) {
00112 _has_flash_color = true;
00113 _flash_color.set(flash_bin[0], flash_bin[1], flash_bin[2], flash_bin[3]);
00114
00115 } else {
00116 _has_flash_color = false;
00117 pgraph_cat.warning()
00118 << "Invalid value for flash-bin-" << _name << ": "
00119 << flash_bin.get_string_value() << "\n";
00120 }
00121 #endif // NDEBUG
00122 }
00123
00124
00125
00126
00127
00128
00129 CullBin::ResultGraphBuilder::
00130 ResultGraphBuilder(PandaNode *root_node) :
00131 _object_index(0),
00132 _root_node(root_node)
00133 {
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143 void CullBin::ResultGraphBuilder::
00144 add_object(CullableObject *object) {
00145 if (_current_transform != object->_modelview_transform ||
00146 _current_state != object->_state ||
00147 object->is_fancy()) {
00148
00149
00150
00151 _current_transform = object->_modelview_transform;
00152 _current_state = object->_state;
00153 _current_node = new GeomNode("object_" + format_string(_object_index));
00154 _root_node->add_child(_current_node);
00155 _current_node->set_transform(_current_transform);
00156 _current_node->set_state(_current_state);
00157 }
00158
00159 record_one_object(_current_node, object);
00160
00161 if (object->get_next() != (CullableObject *)NULL) {
00162
00163 CullableObject *base = object->get_next();
00164 while (base != (CullableObject *)NULL && base->_geom != (Geom *)NULL) {
00165 record_one_object(_current_node, base);
00166 base = base->get_next();
00167 }
00168
00169 if (base != (CullableObject *)NULL) {
00170
00171 _current_node->set_effect(DecalEffect::make());
00172 int decal_index = 0;
00173
00174 CPT(TransformState) transform;
00175 CPT(RenderState) state;
00176 PT(GeomNode) decal_node;
00177 CullableObject *decal = base->get_next();
00178 while (decal != (CullableObject *)NULL) {
00179 if (transform != decal->_modelview_transform ||
00180 state != decal->_state ||
00181 decal->get_next() != (CullableObject *)NULL) {
00182
00183 transform = decal->_modelview_transform;
00184 state = decal->_state;
00185 decal_node = new GeomNode("decal_" + format_string(decal_index));
00186 _current_node->add_child(decal_node);
00187 decal_node->set_transform(transform);
00188 decal_node->set_state(state);
00189 }
00190
00191 record_one_object(decal_node, decal);
00192 decal = decal->get_next();
00193 ++decal_index;
00194 }
00195 }
00196
00197
00198
00199 _current_node.clear();
00200 _current_transform.clear();
00201 _current_state.clear();
00202 }
00203
00204 ++_object_index;
00205 }
00206
00207
00208
00209
00210
00211
00212 void CullBin::ResultGraphBuilder::
00213 record_one_object(GeomNode *node, CullableObject *object) {
00214 PT(Geom) new_geom = object->_geom->make_copy();
00215 new_geom->set_vertex_data(object->_munged_data);
00216 node->add_geom(new_geom);
00217 }