eggPolysetMaker.cxx

00001 // Filename: eggPolysetMaker.cxx
00002 // Created by:  drose (20Jun01)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 #include "eggPolysetMaker.h"
00016 #include "eggPolygon.h"
00017 
00018 TypeHandle EggPolysetMaker::_type_handle;
00019 
00020 ////////////////////////////////////////////////////////////////////
00021 //     Function: EggPolysetMaker::Constructor
00022 //       Access: Public
00023 //  Description: 
00024 ////////////////////////////////////////////////////////////////////
00025 EggPolysetMaker::
00026 EggPolysetMaker() {
00027   _properties = 0;
00028 }
00029 
00030 ////////////////////////////////////////////////////////////////////
00031 //     Function: EggPolysetMaker::set_properties
00032 //       Access: Public
00033 //  Description: Sets the set of properties that determines which
00034 //               polygons are allowed to be grouped together into a
00035 //               single polyset.  This is the bitwise 'or' of all the
00036 //               properties that matter.  If this is 0, all polygons
00037 //               (within a given group) will be lumped into a common
00038 //               polyset regardless of their properties.
00039 ////////////////////////////////////////////////////////////////////
00040 void EggPolysetMaker::
00041 set_properties(int properties) {
00042   _properties = properties;
00043 }
00044 
00045 ////////////////////////////////////////////////////////////////////
00046 //     Function: EggPolysetMaker::get_bin_number
00047 //       Access: Public, Virtual
00048 //  Description:
00049 ////////////////////////////////////////////////////////////////////
00050 int EggPolysetMaker::
00051 get_bin_number(const EggNode *node) {
00052   if (node->is_of_type(EggPolygon::get_class_type())) {
00053     return (int)BN_polyset;
00054   }
00055 
00056   return (int)BN_none;
00057 }
00058 
00059 
00060 ////////////////////////////////////////////////////////////////////
00061 //     Function: EggPolysetMaker::sorts_less
00062 //       Access: Public, Virtual
00063 //  Description:
00064 ////////////////////////////////////////////////////////////////////
00065 bool EggPolysetMaker::
00066 sorts_less(int bin_number, const EggNode *a, const EggNode *b) {
00067   nassertr((BinNumber)bin_number == BN_polyset, false);
00068 
00069   const EggPolygon *pa = DCAST(EggPolygon, a);
00070   const EggPolygon *pb = DCAST(EggPolygon, b);
00071 
00072   if ((_properties & (P_has_texture | P_texture)) != 0) {
00073     bool a_has_texture = (pa->get_num_textures() > 0);
00074     bool b_has_texture = (pb->get_num_textures() > 0);
00075     if (a_has_texture != b_has_texture) {
00076       return ((int)a_has_texture < (int)b_has_texture);
00077     }
00078   }
00079   if ((_properties & (P_texture)) != 0) {
00080     int num_textures = min(pa->get_num_textures(), pb->get_num_textures());
00081     for (int i = 0; i < num_textures; i++) {
00082       EggTexture *a_texture = pa->get_texture(i);
00083       EggTexture *b_texture = pb->get_texture(i);
00084       if (a_texture != b_texture) {
00085         return (a_texture->sorts_less_than(*b_texture, ~EggTexture::E_tref_name));
00086       }
00087     }
00088     if (pa->get_num_textures() != pb->get_num_textures()) {
00089       return (pa->get_num_textures() < pb->get_num_textures());
00090     }
00091   }
00092   if ((_properties & (P_has_material | P_material)) != 0) {
00093     if (pa->has_material() != pb->has_material()) {
00094       return ((int)pa->has_material() < (int)pb->has_material());
00095     }
00096   }
00097   if ((_properties & (P_material)) != 0) {
00098     if (pa->has_material()) {
00099       return (pa->get_material()->sorts_less_than(*pb->get_material(), ~EggMaterial::E_mref_name));
00100     }
00101   }
00102   if ((_properties & (P_has_poly_color)) != 0) {
00103     if (pa->has_color() != pb->has_color()) {
00104       return ((int)pa->has_color() < (int)pb->has_color());
00105     }
00106   }
00107   if ((_properties & (P_poly_color)) != 0) {
00108     if (pa->get_color() != pb->get_color()) {
00109       return (pa->get_color() < pb->get_color());
00110     }
00111   }
00112   if ((_properties & (P_has_poly_normal)) != 0) {
00113     if (pa->has_normal() != pb->has_normal()) {
00114       return ((int)pa->has_normal() < (int)pb->has_normal());
00115     }
00116   }
00117   if ((_properties & (P_has_vertex_normal)) != 0) {
00118     bool pa_has_normal = pa->has_vertex_normal();
00119     bool pb_has_normal = pb->has_vertex_normal();
00120     if (pa_has_normal != pb_has_normal) {
00121       return ((int)pa_has_normal < (int)pb_has_normal);
00122     }
00123   }
00124   if ((_properties & (P_has_vertex_color)) != 0) {
00125     bool pa_has_color = pa->has_vertex_color();
00126     bool pb_has_color = pb->has_vertex_color();
00127     if (pa_has_color != pb_has_color) {
00128       return ((int)pa_has_color < (int)pb_has_color);
00129     }
00130   }
00131   if ((_properties & (P_bface)) != 0) {
00132     if (pa->get_bface_flag() != pb->get_bface_flag()) {
00133       return ((int)pa->get_bface_flag() < (int)pb->get_bface_flag());
00134     }
00135   }
00136 
00137   return false;
00138 }