Browse Source

add indexed flag to egg files

David Rose 21 years ago
parent
commit
831e0a84e7

+ 1 - 0
panda/src/configfiles/panda.prc.pp

@@ -58,5 +58,6 @@ egg-object-type-portal          <Scalar> portal { 1 }
 egg-object-type-polylight       <Scalar> polylight { 1 }
 egg-object-type-seq24           <Switch> { 1 } <Scalar> fps { 24 }
 egg-object-type-seq12           <Switch> { 1 } <Scalar> fps { 12 }
+egg-object-type-indexed         <Scalar> indexed { 1 }
 
 #end 20_panda.prc

+ 47 - 0
panda/src/egg/eggGroup.I

@@ -514,6 +514,53 @@ get_polylight_flag() const {
   return ((_flags2 & F2_polylight_flag) != 0);
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: EggGroup::set_indexed_flag
+//       Access: Public
+//  Description: If this flag is true, geometry at this node and below
+//               will be generated as indexed geometry.
+////////////////////////////////////////////////////////////////////
+INLINE void EggGroup::
+set_indexed_flag(bool flag) {
+  if (flag) {
+    _flags2 |= F2_indexed_flag;
+  } else {
+    _flags2 &= ~F2_indexed_flag;
+  }
+  _flags2 |= F2_has_indexed_flag;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: EggGroup::clear_indexed_flag
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+INLINE void EggGroup::
+clear_indexed_flag() {
+  _flags2 &= ~(F2_indexed_flag | F2_has_indexed_flag);
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: EggGroup::has_indexed_flag
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+INLINE bool EggGroup::
+has_indexed_flag() const {
+  return (_flags2 & F2_has_indexed_flag) != 0;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: EggGroup::get_indexed_flag
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+INLINE bool EggGroup::
+get_indexed_flag() const {
+  nassertr(has_indexed_flag(), false);
+  return ((_flags2 & F2_indexed_flag) != 0);
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: EggGroup::set_collide_mask
 //       Access: Public

+ 26 - 2
panda/src/egg/eggGroup.cxx

@@ -210,11 +210,16 @@ write(ostream &out, int indent_level) const {
   write_render_mode(out, indent_level + 2);
 
   if (get_portal_flag()) {
-    indent(out, indent_level) << "<Portal> { 1 }\n";
+    indent(out, indent_level) << "<Scalar> portal { 1 }\n";
   }
 
   if (get_polylight_flag()) {
-    indent(out, indent_level) << "<Polylight> { 1 }\n";
+    indent(out, indent_level) << "<Scalar> polylight { 1 }\n";
+  }
+
+  if (has_indexed_flag()) {
+    indent(out, indent_level) 
+      << "<Scalar> indexed { " << get_indexed_flag() << " }\n";
   }
 
   // We have to write the children nodes before we write the vertex
@@ -514,6 +519,25 @@ determine_bin() {
   return EggGroupNode::determine_bin();
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: EggGroup::determine_indexed
+//       Access: Public, Virtual
+//  Description: Walks back up the hierarchy, looking for an EggGroup
+//               at this level or above that has the "indexed" scalar
+//               set.  Returns the value of the indexed scalar if it
+//               is found, or false if it is not.
+//
+//               In other words, returns true if the "indexed" flag is
+//               in effect for the indicated node, false otherwise.
+////////////////////////////////////////////////////////////////////
+bool EggGroup::
+determine_indexed() {
+  if (has_indexed_flag()) {
+    return get_indexed_flag();
+  }
+  return EggGroupNode::determine_indexed();
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: EggGroup::ref_vertex
 //       Access: Public

+ 8 - 0
panda/src/egg/eggGroup.h

@@ -116,6 +116,7 @@ PUBLISHED:
   virtual EggRenderMode *determine_visibility_mode();
   virtual EggRenderMode *determine_draw_order();
   virtual EggRenderMode *determine_bin();
+  virtual bool determine_indexed();
 
   void set_group_type(GroupType type);
   INLINE GroupType get_group_type() const;
@@ -180,6 +181,11 @@ PUBLISHED:
   INLINE void set_polylight_flag(bool flag);
   INLINE bool get_polylight_flag() const;
 
+  INLINE void set_indexed_flag(bool flag);
+  INLINE void clear_indexed_flag();
+  INLINE bool has_indexed_flag() const;
+  INLINE bool get_indexed_flag() const;
+
   INLINE void set_collide_mask(CollideMask mask);
   INLINE void clear_collide_mask();
   INLINE bool has_collide_mask() const;
@@ -272,6 +278,8 @@ private:
     F2_dcs_type              = 0x00000030,
     F2_portal_flag           = 0x00000040,
     F2_polylight_flag        = 0x00000080,
+    F2_indexed_flag          = 0x00000100,
+    F2_has_indexed_flag      = 0x00000200,
   };
 
   int _flags;

+ 20 - 0
panda/src/egg/eggNode.cxx

@@ -177,6 +177,26 @@ determine_bin() {
   return _parent->determine_bin();
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: EggNode::determine_indexed
+//       Access: Public, Virtual
+//  Description: Walks back up the hierarchy, looking for an EggGroup
+//               at this level or above that has the "indexed" scalar
+//               set.  Returns the value of the indexed scalar if it
+//               is found, or false if it is not.
+//
+//               In other words, returns true if the "indexed" flag is
+//               in effect for the indicated node, false otherwise.
+////////////////////////////////////////////////////////////////////
+bool EggNode::
+determine_indexed() {
+  if (_parent == (EggGroupNode *)NULL) {
+    // Too bad; we're done.
+    return false;
+  }
+  return _parent->determine_indexed();
+}
+
 
 ////////////////////////////////////////////////////////////////////
 //     Function: EggNode::parse_egg

+ 1 - 0
panda/src/egg/eggNode.h

@@ -79,6 +79,7 @@ PUBLISHED:
   virtual EggRenderMode *determine_visibility_mode();
   virtual EggRenderMode *determine_draw_order();
   virtual EggRenderMode *determine_bin();
+  virtual bool determine_indexed();
 
   virtual void write(ostream &out, int indent_level) const=0;
   bool parse_egg(const string &egg_syntax);

+ 132 - 130
panda/src/egg/parser.cxx.prebuilt

@@ -433,24 +433,24 @@ static const short yyrline[] =
      805,   817,   817,   862,   867,   871,   875,   879,   879,   894,
      895,   896,   904,   922,   927,   935,   952,   957,   965,   982,
      987,   995,  1012,  1012,  1032,  1032,  1053,  1053,  1074,  1076,
-    1144,  1156,  1161,  1168,  1174,  1187,  1194,  1207,  1213,  1219,
-    1225,  1230,  1236,  1237,  1238,  1239,  1252,  1282,  1284,  1305,
-    1305,  1321,  1323,  1324,  1325,  1326,  1327,  1328,  1329,  1332,
-    1338,  1344,  1350,  1356,  1362,  1366,  1372,  1376,  1378,  1399,
-    1399,  1418,  1420,  1421,  1422,  1423,  1426,  1432,  1438,  1444,
-    1447,  1449,  1467,  1500,  1505,  1529,  1541,  1547,  1563,  1563,
-    1582,  1582,  1601,  1601,  1620,  1620,  1639,  1639,  1659,  1661,
-    1662,  1663,  1664,  1665,  1666,  1667,  1668,  1726,  1728,  1729,
-    1730,  1731,  1732,  1733,  1734,  1735,  1736,  1737,  1738,  1744,
-    1745,  1808,  1810,  1811,  1812,  1813,  1814,  1815,  1816,  1817,
-    1818,  1819,  1887,  1904,  1944,  1961,  1966,  1974,  1991,  1996,
-    2004,  2021,  2037,  2068,  2086,  2106,  2126,  2132,  2142,  2149,
-    2167,  2183,  2204,  2204,  2226,  2226,  2248,  2250,  2254,  2258,
-    2262,  2266,  2280,  2280,  2301,  2303,  2315,  2328,  2328,  2349,
-    2351,  2368,  2381,  2381,  2402,  2404,  2419,  2433,  2438,  2451,
-    2456,  2469,  2490,  2511,  2535,  2541,  2552,  2564,  2570,  2580,
-    2585,  2598,  2603,  2607,  2619,  2624,  2639,  2644,  2657,  2659,
-    2673,  2680,  2686,  2702,  2711,  2717
+    1146,  1158,  1163,  1170,  1176,  1189,  1196,  1209,  1215,  1221,
+    1227,  1232,  1238,  1239,  1240,  1241,  1254,  1284,  1286,  1307,
+    1307,  1323,  1325,  1326,  1327,  1328,  1329,  1330,  1331,  1334,
+    1340,  1346,  1352,  1358,  1364,  1368,  1374,  1378,  1380,  1401,
+    1401,  1420,  1422,  1423,  1424,  1425,  1428,  1434,  1440,  1446,
+    1449,  1451,  1469,  1502,  1507,  1531,  1543,  1549,  1565,  1565,
+    1584,  1584,  1603,  1603,  1622,  1622,  1641,  1641,  1661,  1663,
+    1664,  1665,  1666,  1667,  1668,  1669,  1670,  1728,  1730,  1731,
+    1732,  1733,  1734,  1735,  1736,  1737,  1738,  1739,  1740,  1746,
+    1747,  1810,  1812,  1813,  1814,  1815,  1816,  1817,  1818,  1819,
+    1820,  1821,  1889,  1906,  1946,  1963,  1968,  1976,  1993,  1998,
+    2006,  2023,  2039,  2070,  2088,  2108,  2128,  2134,  2144,  2151,
+    2169,  2185,  2206,  2206,  2228,  2228,  2250,  2252,  2256,  2260,
+    2264,  2268,  2282,  2282,  2303,  2305,  2317,  2330,  2330,  2351,
+    2353,  2370,  2383,  2383,  2404,  2406,  2421,  2435,  2440,  2453,
+    2458,  2471,  2492,  2513,  2537,  2543,  2554,  2566,  2572,  2582,
+    2587,  2600,  2605,  2609,  2621,  2626,  2641,  2646,  2659,  2661,
+    2675,  2682,  2688,  2704,  2713,  2719
 };
 #endif
 
@@ -2496,13 +2496,15 @@ case 69:
     group->set_portal_flag(value != 0);
   } else if (cmp_nocase_uh(name, "polylight") == 0) {
     group->set_polylight_flag(value != 0);
+  } else if (cmp_nocase_uh(name, "indexed") == 0) {
+    group->set_indexed_flag(value != 0);
   } else {
     eggyywarning("Unknown group scalar " + name);
   }
 }
     break;
 case 70:
-#line 1145 "parser.yxx"
+#line 1147 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   string strval = yyvsp[-1]._string;
@@ -2516,14 +2518,14 @@ case 70:
 }
     break;
 case 71:
-#line 1157 "parser.yxx"
+#line 1159 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   group->set_billboard_center(LPoint3d(yyvsp[-3]._number, yyvsp[-2]._number, yyvsp[-1]._number));
 }
     break;
 case 72:
-#line 1162 "parser.yxx"
+#line 1164 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   string name = yyvsp[-4]._string;
@@ -2532,7 +2534,7 @@ case 72:
 }
     break;
 case 73:
-#line 1169 "parser.yxx"
+#line 1171 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   int value = (int)yyvsp[-1]._number;
@@ -2540,7 +2542,7 @@ case 73:
 }
     break;
 case 74:
-#line 1175 "parser.yxx"
+#line 1177 "parser.yxx"
 {
   // The special flavor of DCS, with { sync } or { nosync }.
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
@@ -2555,7 +2557,7 @@ case 74:
 }
     break;
 case 75:
-#line 1188 "parser.yxx"
+#line 1190 "parser.yxx"
 {
   // The traditional flavor of DART, with { 0 } or { 1 }.
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
@@ -2564,7 +2566,7 @@ case 75:
 }
     break;
 case 76:
-#line 1195 "parser.yxx"
+#line 1197 "parser.yxx"
 {
   // The special flavor of DART, with { sync } or { nosync }.
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
@@ -2579,7 +2581,7 @@ case 76:
 }
     break;
 case 77:
-#line 1208 "parser.yxx"
+#line 1210 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   int value = (int)yyvsp[-1]._number;
@@ -2587,7 +2589,7 @@ case 77:
 }
     break;
 case 78:
-#line 1214 "parser.yxx"
+#line 1216 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   string type = yyvsp[-1]._string;
@@ -2595,7 +2597,7 @@ case 78:
 }
     break;
 case 79:
-#line 1220 "parser.yxx"
+#line 1222 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   int value = (int)yyvsp[-1]._number;
@@ -2603,14 +2605,14 @@ case 79:
 }
     break;
 case 80:
-#line 1226 "parser.yxx"
+#line 1228 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   group->set_tag(yyvsp[-3]._string, yyvsp[-1]._string);
 }
     break;
 case 81:
-#line 1231 "parser.yxx"
+#line 1233 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   int value = (int)yyvsp[-1]._number;
@@ -2618,13 +2620,13 @@ case 81:
 }
     break;
 case 85:
-#line 1240 "parser.yxx"
+#line 1242 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->add_child(DCAST(EggNode, yyvsp[0]._egg));
 }
     break;
 case 86:
-#line 1254 "parser.yxx"
+#line 1256 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   string strval = yyvsp[0]._string;
@@ -2646,7 +2648,7 @@ case 86:
 }
     break;
 case 88:
-#line 1285 "parser.yxx"
+#line 1287 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   string strval = yyvsp[0]._string;
@@ -2660,55 +2662,55 @@ case 88:
 }
     break;
 case 89:
-#line 1307 "parser.yxx"
+#line 1309 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->clear_transform();
 }
     break;
 case 99:
-#line 1333 "parser.yxx"
+#line 1335 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->add_translate(LVector3d(yyvsp[-3]._number, yyvsp[-2]._number, yyvsp[-1]._number));
 }
     break;
 case 100:
-#line 1339 "parser.yxx"
+#line 1341 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->add_rotx(yyvsp[-1]._number);
 }
     break;
 case 101:
-#line 1345 "parser.yxx"
+#line 1347 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->add_roty(yyvsp[-1]._number);
 }
     break;
 case 102:
-#line 1351 "parser.yxx"
+#line 1353 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->add_rotz(yyvsp[-1]._number);
 }
     break;
 case 103:
-#line 1357 "parser.yxx"
+#line 1359 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->add_rotate(yyvsp[-4]._number, LVector3d(yyvsp[-3]._number, yyvsp[-2]._number, yyvsp[-1]._number));
 }
     break;
 case 104:
-#line 1363 "parser.yxx"
+#line 1365 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->add_scale(LVecBase3d(yyvsp[-3]._number, yyvsp[-2]._number, yyvsp[-1]._number));
 }
     break;
 case 105:
-#line 1367 "parser.yxx"
+#line 1369 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->add_uniform_scale(yyvsp[-1]._number);
 }
     break;
 case 108:
-#line 1382 "parser.yxx"
+#line 1384 "parser.yxx"
 {
   DCAST(EggGroup, egg_stack.back())->add_matrix
     (LMatrix4d(yyvsp[-15]._number, yyvsp[-14]._number, yyvsp[-13]._number, yyvsp[-12]._number,
@@ -2718,37 +2720,37 @@ case 108:
 }
     break;
 case 109:
-#line 1401 "parser.yxx"
+#line 1403 "parser.yxx"
 {
   matrix_2d = LMatrix3d::ident_mat();
 }
     break;
 case 110:
-#line 1405 "parser.yxx"
+#line 1407 "parser.yxx"
 {
   DCAST(EggTexture, egg_stack.back())->set_transform(matrix_2d);
 }
     break;
 case 116:
-#line 1427 "parser.yxx"
+#line 1429 "parser.yxx"
 {
   matrix_2d *= LMatrix3d::translate_mat(yyvsp[-2]._number, yyvsp[-1]._number);
 }
     break;
 case 117:
-#line 1433 "parser.yxx"
+#line 1435 "parser.yxx"
 {
   matrix_2d *= LMatrix3d::rotate_mat(yyvsp[-1]._number);
 }
     break;
 case 118:
-#line 1439 "parser.yxx"
+#line 1441 "parser.yxx"
 {
   matrix_2d *= LMatrix3d::scale_mat(yyvsp[-2]._number, yyvsp[-1]._number);
 }
     break;
 case 121:
-#line 1452 "parser.yxx"
+#line 1454 "parser.yxx"
 {
   matrix_2d *= LMatrix3d(yyvsp[-8]._number, yyvsp[-7]._number, yyvsp[-6]._number,
                          yyvsp[-5]._number, yyvsp[-4]._number, yyvsp[-3]._number,
@@ -2756,7 +2758,7 @@ case 121:
 }
     break;
 case 122:
-#line 1469 "parser.yxx"
+#line 1471 "parser.yxx"
 {
   if (yyvsp[-2]._egg != (EggVertexPool *)NULL) {
     EggVertexPool *pool = DCAST(EggVertexPool, yyvsp[-2]._egg);
@@ -2780,13 +2782,13 @@ case 122:
 }
     break;
 case 123:
-#line 1502 "parser.yxx"
+#line 1504 "parser.yxx"
 {
   yyval._number = 1.0;
 }
     break;
 case 124:
-#line 1506 "parser.yxx"
+#line 1508 "parser.yxx"
 {
   string name = yyvsp[-3]._string;
   double value = yyvsp[-1]._number;
@@ -2802,86 +2804,86 @@ case 124:
 }
     break;
 case 126:
-#line 1543 "parser.yxx"
+#line 1545 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   group->set_lod(EggSwitchConditionDistance(yyvsp[-8]._number, yyvsp[-7]._number, LPoint3d(yyvsp[-4]._number, yyvsp[-3]._number, yyvsp[-2]._number)));
 }
     break;
 case 127:
-#line 1548 "parser.yxx"
+#line 1550 "parser.yxx"
 {
   EggGroup *group = DCAST(EggGroup, egg_stack.back());
   group->set_lod(EggSwitchConditionDistance(yyvsp[-9]._number, yyvsp[-8]._number, LPoint3d(yyvsp[-4]._number, yyvsp[-3]._number, yyvsp[-2]._number), yyvsp[-7]._number));
 }
     break;
 case 128:
-#line 1565 "parser.yxx"
+#line 1567 "parser.yxx"
 {
   egg_stack.push_back(new EggPolygon(yyvsp[0]._string));
 }
     break;
 case 129:
-#line 1569 "parser.yxx"
+#line 1571 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 130:
-#line 1584 "parser.yxx"
+#line 1586 "parser.yxx"
 {
   egg_stack.push_back(new EggPoint(yyvsp[0]._string));
 }
     break;
 case 131:
-#line 1588 "parser.yxx"
+#line 1590 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 132:
-#line 1603 "parser.yxx"
+#line 1605 "parser.yxx"
 {
   egg_stack.push_back(new EggLine(yyvsp[0]._string));
 }
     break;
 case 133:
-#line 1607 "parser.yxx"
+#line 1609 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 134:
-#line 1622 "parser.yxx"
+#line 1624 "parser.yxx"
 {
   egg_stack.push_back(new EggNurbsSurface(yyvsp[0]._string));
 }
     break;
 case 135:
-#line 1626 "parser.yxx"
+#line 1628 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 136:
-#line 1641 "parser.yxx"
+#line 1643 "parser.yxx"
 {
   egg_stack.push_back(new EggNurbsCurve(yyvsp[0]._string));
 }
     break;
 case 137:
-#line 1645 "parser.yxx"
+#line 1647 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 146:
-#line 1669 "parser.yxx"
+#line 1671 "parser.yxx"
 {
   EggPrimitive *primitive = DCAST(EggPrimitive, egg_stack.back());
   string name = yyvsp[-3]._string;
@@ -2932,7 +2934,7 @@ case 146:
 }
     break;
 case 158:
-#line 1739 "parser.yxx"
+#line 1741 "parser.yxx"
 {
   EggNurbsCurve *curve = DCAST(EggNurbsCurve, yyvsp[0]._egg);
   EggNurbsSurface *nurbs = DCAST(EggNurbsSurface, egg_stack.back());
@@ -2940,7 +2942,7 @@ case 158:
 }
     break;
 case 160:
-#line 1746 "parser.yxx"
+#line 1748 "parser.yxx"
 {
   EggNurbsSurface *primitive = DCAST(EggNurbsSurface, egg_stack.back());
   string name = yyvsp[-3]._string;
@@ -2995,7 +2997,7 @@ case 160:
 }
     break;
 case 171:
-#line 1820 "parser.yxx"
+#line 1822 "parser.yxx"
 {
   EggNurbsCurve *primitive = DCAST(EggNurbsCurve, egg_stack.back());
   string name = yyvsp[-3]._string;
@@ -3056,7 +3058,7 @@ case 171:
 }
     break;
 case 172:
-#line 1889 "parser.yxx"
+#line 1891 "parser.yxx"
 {
   if (yyvsp[0]._egg != (EggTexture *)NULL) {
     EggTexture *texture = DCAST(EggTexture, yyvsp[0]._egg);
@@ -3065,7 +3067,7 @@ case 172:
 }
     break;
 case 173:
-#line 1906 "parser.yxx"
+#line 1908 "parser.yxx"
 {
   EggTexture *texture = NULL;
 
@@ -3097,7 +3099,7 @@ case 173:
 }
     break;
 case 174:
-#line 1946 "parser.yxx"
+#line 1948 "parser.yxx"
 {
   if (yyvsp[0]._egg != (EggMaterial *)NULL) {
     EggMaterial *material = DCAST(EggMaterial, yyvsp[0]._egg);
@@ -3106,13 +3108,13 @@ case 174:
 }
     break;
 case 175:
-#line 1963 "parser.yxx"
+#line 1965 "parser.yxx"
 {
   DCAST(EggPrimitive, egg_stack.back())->set_normal(Normald(yyvsp[-2]._number, yyvsp[-1]._number, yyvsp[0]._number));
 }
     break;
 case 176:
-#line 1967 "parser.yxx"
+#line 1969 "parser.yxx"
 {
   bool inserted = DCAST(EggPrimitive, egg_stack.back())->_dnormals.
     insert(EggMorphNormal(yyvsp[-5]._string, LVector3d(yyvsp[-3]._number, yyvsp[-2]._number, yyvsp[-1]._number))).second;
@@ -3122,7 +3124,7 @@ case 176:
 }
     break;
 case 177:
-#line 1975 "parser.yxx"
+#line 1977 "parser.yxx"
 {
   bool inserted = DCAST(EggPrimitive, egg_stack.back())->_dnormals.
     insert(EggMorphNormal(yyvsp[-4]._string, LVector3d(yyvsp[-3]._number, yyvsp[-2]._number, yyvsp[-1]._number))).second;
@@ -3132,13 +3134,13 @@ case 177:
 }
     break;
 case 178:
-#line 1993 "parser.yxx"
+#line 1995 "parser.yxx"
 {
   DCAST(EggPrimitive, egg_stack.back())->set_color(Colorf(yyvsp[-3]._number, yyvsp[-2]._number, yyvsp[-1]._number, yyvsp[0]._number));
 }
     break;
 case 179:
-#line 1997 "parser.yxx"
+#line 1999 "parser.yxx"
 {
   bool inserted = DCAST(EggPrimitive, egg_stack.back())->_drgbas.
     insert(EggMorphColor(yyvsp[-6]._string, LVector4f(yyvsp[-4]._number, yyvsp[-3]._number, yyvsp[-2]._number, yyvsp[-1]._number))).second;
@@ -3148,7 +3150,7 @@ case 179:
 }
     break;
 case 180:
-#line 2005 "parser.yxx"
+#line 2007 "parser.yxx"
 {
   bool inserted = DCAST(EggPrimitive, egg_stack.back())->_drgbas.
     insert(EggMorphColor(yyvsp[-5]._string, LVector4f(yyvsp[-4]._number, yyvsp[-3]._number, yyvsp[-2]._number, yyvsp[-1]._number))).second;
@@ -3158,7 +3160,7 @@ case 180:
 }
     break;
 case 181:
-#line 2023 "parser.yxx"
+#line 2025 "parser.yxx"
 {
   EggPrimitive *primitive = DCAST(EggPrimitive, egg_stack.back());
   int value = (int)yyvsp[0]._number;
@@ -3166,7 +3168,7 @@ case 181:
 }
     break;
 case 182:
-#line 2039 "parser.yxx"
+#line 2041 "parser.yxx"
 {
   if (yyvsp[-2]._egg != (EggVertexPool *)NULL) {
     EggVertexPool *pool = DCAST(EggVertexPool, yyvsp[-2]._egg);
@@ -3189,7 +3191,7 @@ case 182:
 }
     break;
 case 183:
-#line 2070 "parser.yxx"
+#line 2072 "parser.yxx"
 {
   EggNurbsSurface *nurbs = DCAST(EggNurbsSurface, egg_stack.back());
   int u_order = (int)yyvsp[-1]._number;
@@ -3199,7 +3201,7 @@ case 183:
 }
     break;
 case 184:
-#line 2088 "parser.yxx"
+#line 2090 "parser.yxx"
 {
   EggNurbsSurface *nurbs = DCAST(EggNurbsSurface, egg_stack.back());
   PTA_double nums = yyvsp[0]._number_list;
@@ -3211,7 +3213,7 @@ case 184:
 }
     break;
 case 185:
-#line 2108 "parser.yxx"
+#line 2110 "parser.yxx"
 {
   EggNurbsSurface *nurbs = DCAST(EggNurbsSurface, egg_stack.back());
   PTA_double nums = yyvsp[0]._number_list;
@@ -3223,14 +3225,14 @@ case 185:
 }
     break;
 case 186:
-#line 2128 "parser.yxx"
+#line 2130 "parser.yxx"
 {
   EggNurbsSurface *nurbs = DCAST(EggNurbsSurface, egg_stack.back());
   nurbs->_trims.push_back(EggNurbsSurface::Trim());
 }
     break;
 case 188:
-#line 2144 "parser.yxx"
+#line 2146 "parser.yxx"
 {
   EggNurbsSurface *nurbs = DCAST(EggNurbsSurface, egg_stack.back());
   nassertr(!nurbs->_trims.empty(), 0);
@@ -3238,7 +3240,7 @@ case 188:
 }
     break;
 case 189:
-#line 2150 "parser.yxx"
+#line 2152 "parser.yxx"
 {
   EggNurbsSurface *nurbs = DCAST(EggNurbsSurface, egg_stack.back());
   nassertr(!nurbs->_trims.empty(), 0);
@@ -3248,7 +3250,7 @@ case 189:
 }
     break;
 case 190:
-#line 2169 "parser.yxx"
+#line 2171 "parser.yxx"
 {
   EggNurbsCurve *nurbs = DCAST(EggNurbsCurve, egg_stack.back());
   int order = (int)yyvsp[0]._number;
@@ -3256,7 +3258,7 @@ case 190:
 }
     break;
 case 191:
-#line 2185 "parser.yxx"
+#line 2187 "parser.yxx"
 {
   EggNurbsCurve *nurbs = DCAST(EggNurbsCurve, egg_stack.back());
   PTA_double nums = yyvsp[0]._number_list;
@@ -3268,7 +3270,7 @@ case 191:
 }
     break;
 case 192:
-#line 2206 "parser.yxx"
+#line 2208 "parser.yxx"
 {
   EggTable *table = new EggTable(yyvsp[0]._string);
   table->set_table_type(EggTable::TT_table);
@@ -3276,14 +3278,14 @@ case 192:
 }
     break;
 case 193:
-#line 2212 "parser.yxx"
+#line 2214 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 194:
-#line 2228 "parser.yxx"
+#line 2230 "parser.yxx"
 {
   EggTable *table = new EggTable(yyvsp[0]._string);
   table->set_table_type(EggTable::TT_bundle);
@@ -3291,58 +3293,58 @@ case 194:
 }
     break;
 case 195:
-#line 2234 "parser.yxx"
+#line 2236 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 197:
-#line 2251 "parser.yxx"
+#line 2253 "parser.yxx"
 {
   DCAST(EggTable, egg_stack.back())->add_child(DCAST(EggNode, yyvsp[0]._egg));
 }
     break;
 case 198:
-#line 2255 "parser.yxx"
+#line 2257 "parser.yxx"
 {
   DCAST(EggTable, egg_stack.back())->add_child(DCAST(EggNode, yyvsp[0]._egg));
 }
     break;
 case 199:
-#line 2259 "parser.yxx"
+#line 2261 "parser.yxx"
 {
   DCAST(EggTable, egg_stack.back())->add_child(DCAST(EggNode, yyvsp[0]._egg));
 }
     break;
 case 200:
-#line 2263 "parser.yxx"
+#line 2265 "parser.yxx"
 {
   DCAST(EggTable, egg_stack.back())->add_child(DCAST(EggNode, yyvsp[0]._egg));
 }
     break;
 case 201:
-#line 2267 "parser.yxx"
+#line 2269 "parser.yxx"
 {
   DCAST(EggTable, egg_stack.back())->add_child(DCAST(EggNode, yyvsp[0]._egg));
 }
     break;
 case 202:
-#line 2282 "parser.yxx"
+#line 2284 "parser.yxx"
 {
   EggSAnimData *anim_data = new EggSAnimData(yyvsp[0]._string);
   egg_stack.push_back(anim_data);
 }
     break;
 case 203:
-#line 2287 "parser.yxx"
+#line 2289 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 205:
-#line 2304 "parser.yxx"
+#line 2306 "parser.yxx"
 {
   EggSAnimData *anim_data = DCAST(EggSAnimData, egg_stack.back());
   string name = yyvsp[-3]._string;
@@ -3356,27 +3358,27 @@ case 205:
 }
     break;
 case 206:
-#line 2316 "parser.yxx"
+#line 2318 "parser.yxx"
 {
   DCAST(EggSAnimData, egg_stack.back())->set_data(yyvsp[-1]._number_list);
 }
     break;
 case 207:
-#line 2330 "parser.yxx"
+#line 2332 "parser.yxx"
 {
   EggXfmAnimData *anim_data = new EggXfmAnimData(yyvsp[0]._string);
   egg_stack.push_back(anim_data);
 }
     break;
 case 208:
-#line 2335 "parser.yxx"
+#line 2337 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 210:
-#line 2352 "parser.yxx"
+#line 2354 "parser.yxx"
 {
   EggXfmAnimData *anim_data = DCAST(EggXfmAnimData, egg_stack.back());
   string name = yyvsp[-3]._string;
@@ -3395,27 +3397,27 @@ case 210:
 }
     break;
 case 211:
-#line 2369 "parser.yxx"
+#line 2371 "parser.yxx"
 {
   DCAST(EggXfmAnimData, egg_stack.back())->set_data(yyvsp[-1]._number_list);
 }
     break;
 case 212:
-#line 2383 "parser.yxx"
+#line 2385 "parser.yxx"
 {
   EggXfmSAnim *anim_group = new EggXfmSAnim(yyvsp[0]._string);
   egg_stack.push_back(anim_group);
 }
     break;
 case 213:
-#line 2388 "parser.yxx"
+#line 2390 "parser.yxx"
 {
   yyval._egg = egg_stack.back();
   egg_stack.pop_back();
 }
     break;
 case 215:
-#line 2405 "parser.yxx"
+#line 2407 "parser.yxx"
 {
   EggXfmSAnim *anim_group = DCAST(EggXfmSAnim, egg_stack.back());
   string name = yyvsp[-3]._string;
@@ -3432,37 +3434,37 @@ case 215:
 }
     break;
 case 216:
-#line 2420 "parser.yxx"
+#line 2422 "parser.yxx"
 {
   DCAST(EggXfmSAnim, egg_stack.back())->add_child(DCAST(EggNode, yyvsp[0]._egg));
 }
     break;
 case 217:
-#line 2435 "parser.yxx"
+#line 2437 "parser.yxx"
 {
   yyval._number_list = PTA_double::empty_array(0);
 }
     break;
 case 218:
-#line 2439 "parser.yxx"
+#line 2441 "parser.yxx"
 {
   yyval._number_list.push_back((double)yyvsp[0]._number);
 }
     break;
 case 219:
-#line 2453 "parser.yxx"
+#line 2455 "parser.yxx"
 {
   yyval._number_list = PTA_double::empty_array(0);
 }
     break;
 case 220:
-#line 2457 "parser.yxx"
+#line 2459 "parser.yxx"
 {
   yyval._number_list.push_back(yyvsp[0]._number);
 }
     break;
 case 221:
-#line 2471 "parser.yxx"
+#line 2473 "parser.yxx"
 {
   string name = yyvsp[0]._string;
   Textures::iterator vpi = textures.find(name);
@@ -3475,7 +3477,7 @@ case 221:
 }
     break;
 case 222:
-#line 2492 "parser.yxx"
+#line 2494 "parser.yxx"
 {
   string name = yyvsp[0]._string;
   Materials::iterator vpi = materials.find(name);
@@ -3488,7 +3490,7 @@ case 222:
 }
     break;
 case 223:
-#line 2513 "parser.yxx"
+#line 2515 "parser.yxx"
 {
   string name = yyvsp[0]._string;
   VertexPools::iterator vpi = vertex_pools.find(name);
@@ -3503,69 +3505,69 @@ case 223:
 }
     break;
 case 224:
-#line 2537 "parser.yxx"
+#line 2539 "parser.yxx"
 {
   eggyyerror("Name required.");
   yyval._string = "";
 }
     break;
 case 227:
-#line 2566 "parser.yxx"
+#line 2568 "parser.yxx"
 {
   eggyyerror("String required.");
   yyval._string = "";
 }
     break;
 case 229:
-#line 2582 "parser.yxx"
+#line 2584 "parser.yxx"
 {
   yyval._string = "";
 }
     break;
 case 231:
-#line 2600 "parser.yxx"
+#line 2602 "parser.yxx"
 {
   yyval._string = yyvsp[0]._string;
 }
     break;
 case 232:
-#line 2604 "parser.yxx"
+#line 2606 "parser.yxx"
 {
   yyval._string = yyvsp[0]._string;
 }
     break;
 case 234:
-#line 2621 "parser.yxx"
+#line 2623 "parser.yxx"
 {
   yyval._string = "";
 }
     break;
 case 235:
-#line 2625 "parser.yxx"
+#line 2627 "parser.yxx"
 {
   yyval._string = yyvsp[0]._string;
 }
     break;
 case 236:
-#line 2641 "parser.yxx"
+#line 2643 "parser.yxx"
 {
   yyval._string = yyvsp[0]._string;
 }
     break;
 case 237:
-#line 2645 "parser.yxx"
+#line 2647 "parser.yxx"
 {
   yyval._string = yyvsp[-1]._string + "\n" + yyvsp[0]._string;
 }
     break;
 case 239:
-#line 2660 "parser.yxx"
+#line 2662 "parser.yxx"
 {
   yyval._number = yyvsp[0]._ulong;
 }
     break;
 case 240:
-#line 2675 "parser.yxx"
+#line 2677 "parser.yxx"
 {
   yyval._number = yyvsp[0]._number;
   yyval._ulong = (unsigned long)yyvsp[0]._number;
@@ -3573,7 +3575,7 @@ case 240:
 }
     break;
 case 241:
-#line 2681 "parser.yxx"
+#line 2683 "parser.yxx"
 {
   yyval._number = yyvsp[0]._ulong;
   yyval._ulong = yyvsp[0]._ulong;
@@ -3581,7 +3583,7 @@ case 241:
 }
     break;
 case 242:
-#line 2687 "parser.yxx"
+#line 2689 "parser.yxx"
 {
   yyval._number = 0.0;
   yyval._ulong = 0;
@@ -3589,7 +3591,7 @@ case 242:
 }
     break;
 case 243:
-#line 2704 "parser.yxx"
+#line 2706 "parser.yxx"
 {
   int i = (int)yyvsp[0]._number;
   if ((double)i != yyvsp[0]._number) {
@@ -3599,7 +3601,7 @@ case 243:
 }
     break;
 case 244:
-#line 2712 "parser.yxx"
+#line 2714 "parser.yxx"
 {
   yyval._number = yyvsp[0]._ulong;
 }
@@ -3837,4 +3839,4 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 2719 "parser.yxx"
+#line 2721 "parser.yxx"

+ 2 - 0
panda/src/egg/parser.yxx

@@ -1137,6 +1137,8 @@ group_body:
     group->set_portal_flag(value != 0);
   } else if (cmp_nocase_uh(name, "polylight") == 0) {
     group->set_polylight_flag(value != 0);
+  } else if (cmp_nocase_uh(name, "indexed") == 0) {
+    group->set_indexed_flag(value != 0);
   } else {
     eggyywarning("Unknown group scalar " + name);
   }

+ 2 - 1
panda/src/egg2pg/characterMaker.cxx

@@ -291,7 +291,8 @@ make_static_primitive(EggPrimitive *egg_primitive, EggGroupNode *prim_home) {
     egg_primitive->get_vertex_frame() *
     prim_home->get_node_frame_inv();
 
-  _loader.make_nonindexed_primitive(egg_primitive, node, &transform);
+  _loader.make_nonindexed_primitive(egg_primitive, node, &transform,
+                                    _comp_verts_maker);
 }
 
 ////////////////////////////////////////////////////////////////////

+ 31 - 22
panda/src/egg2pg/eggLoader.cxx

@@ -238,7 +238,16 @@ reparent_decals() {
 ////////////////////////////////////////////////////////////////////
 void EggLoader::
 make_nonindexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
-                          const LMatrix4d *transform) {
+                          const LMatrix4d *transform,
+                          ComputedVerticesMaker &comp_verts_maker) {
+  if (egg_prim->determine_indexed()) {
+    // Whoops, the primitive inherits the "indexed" flag.  This means
+    // it should be an indexed primitive, even though the caller asked
+    // for a nonindexed primitive.
+    make_indexed_primitive(egg_prim, parent, transform, comp_verts_maker);
+    return;
+  }
+
   BuilderBucket bucket;
   BakeInUVs bake_in_uvs;
   setup_bucket(bucket, bake_in_uvs, parent, egg_prim);
@@ -347,7 +356,7 @@ make_nonindexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
 void EggLoader::
 make_indexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
                        const LMatrix4d *transform,
-                       ComputedVerticesMaker &_comp_verts_maker) {
+                       ComputedVerticesMaker &comp_verts_maker) {
   BuilderBucket bucket;
   BakeInUVs bake_in_uvs;
   setup_bucket(bucket, bake_in_uvs, parent, egg_prim);
@@ -375,16 +384,16 @@ make_indexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
   if (egg_prim->has_normal()) {
     // Define the transform space of the polygon normal.  This will be
     // the average of all the vertex transform spaces.
-    _comp_verts_maker.begin_new_space();
+    comp_verts_maker.begin_new_space();
     EggPrimitive::const_iterator vi;
     for (vi = egg_prim->begin(); vi != egg_prim->end(); ++vi) {
       EggVertex *egg_vert = *vi;
-      _comp_verts_maker.add_vertex_joints(egg_vert, egg_prim);
+      comp_verts_maker.add_vertex_joints(egg_vert, egg_prim);
     }
-    _comp_verts_maker.mark_space();
+    comp_verts_maker.mark_space();
 
     int nindex =
-      _comp_verts_maker.add_normal(egg_prim->get_normal(),
+      comp_verts_maker.add_normal(egg_prim->get_normal(),
                                    egg_prim->_dnormals, mat);
 
     bprim.set_normal(nindex);
@@ -392,7 +401,7 @@ make_indexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
 
   if (egg_prim->has_color() && !egg_false_color) {
     int cindex =
-      _comp_verts_maker.add_color(egg_prim->get_color(),
+      comp_verts_maker.add_color(egg_prim->get_color(),
                                   egg_prim->_drgbas);
     bprim.set_color(cindex);
   }
@@ -410,18 +419,18 @@ make_indexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
     } else {
       // Set up the ComputedVerticesMaker for the coordinate space of
       // the vertex.
-      _comp_verts_maker.begin_new_space();
-      _comp_verts_maker.add_vertex_joints(egg_vert, egg_prim);
-      _comp_verts_maker.mark_space();
+      comp_verts_maker.begin_new_space();
+      comp_verts_maker.add_vertex_joints(egg_vert, egg_prim);
+      comp_verts_maker.mark_space();
       
       int vindex =
-        _comp_verts_maker.add_vertex(egg_vert->get_pos3(),
+        comp_verts_maker.add_vertex(egg_vert->get_pos3(),
                                      egg_vert->_dxyzs, mat);
       BuilderVertexI bvert(vindex);
       
       if (egg_vert->has_normal()) {
         int nindex =
-          _comp_verts_maker.add_normal(egg_vert->get_normal(),
+          comp_verts_maker.add_normal(egg_vert->get_normal(),
                                        egg_vert->_dnormals,
                                        mat);
         bvert.set_normal(nindex);
@@ -429,7 +438,7 @@ make_indexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
       
       if (egg_vert->has_color() && !egg_false_color) {
         int cindex =
-          _comp_verts_maker.add_color(egg_vert->get_color(),
+          comp_verts_maker.add_color(egg_vert->get_color(),
                                       egg_vert->_drgbas);
         bvert.set_color(cindex);
       } else {
@@ -458,7 +467,7 @@ make_indexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
         }
         
         int tindex =
-          _comp_verts_maker.add_texcoord(uv_name, uv, uv_obj->_duvs, mat);
+          comp_verts_maker.add_texcoord(uv_name, uv, uv_obj->_duvs, mat);
         bvert.set_texcoord(uv_name, tindex);
       }
       
@@ -470,7 +479,7 @@ make_indexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
   // vertex color, make it white.
   if (!egg_prim->has_color() && !has_vert_color && !egg_false_color) {
     int cindex =
-      _comp_verts_maker.add_color(Colorf(1.0, 1.0, 1.0, 1.0),
+      comp_verts_maker.add_color(Colorf(1.0, 1.0, 1.0, 1.0),
                                   EggMorphColorList());
     bprim.set_color(cindex);
   }
@@ -479,13 +488,13 @@ make_indexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
   // vertices, because iterating through the vertices might discover
   // additional texture coordinate sets that we didn't know about
   // before.
-  bucket.set_coords(_comp_verts_maker._coords);
-  bucket.set_normals(_comp_verts_maker._norms);
-  bucket.set_colors(_comp_verts_maker._colors);
+  bucket.set_coords(comp_verts_maker._coords);
+  bucket.set_normals(comp_verts_maker._norms);
+  bucket.set_colors(comp_verts_maker._colors);
 
   ComputedVerticesMaker::TexCoords::const_iterator tci;
-  for (tci = _comp_verts_maker._texcoords.begin();
-       tci != _comp_verts_maker._texcoords.end();
+  for (tci = comp_verts_maker._texcoords.begin();
+       tci != comp_verts_maker._texcoords.end();
        ++tci) {
     const TexCoordName *name = (*tci).first;
     bucket.set_texcoords(name, (*tci).second);
@@ -1708,7 +1717,7 @@ make_node(EggPrimitive *egg_prim, PandaNode *parent) {
       // so we need to create a placeholder now.
       PandaNode *group = new PandaNode(egg_prim->get_name());
       parent->add_child(group);
-      make_nonindexed_primitive(egg_prim, group);
+      make_nonindexed_primitive(egg_prim, group, NULL, _comp_verts_maker);
       return group;
     }
 
@@ -1716,7 +1725,7 @@ make_node(EggPrimitive *egg_prim, PandaNode *parent) {
     // primitive is within its parent's list of children, and in fact
     // we want to allow it to be combined with other polygons added to
     // the same parent.
-    make_nonindexed_primitive(egg_prim, parent);
+    make_nonindexed_primitive(egg_prim, parent, NULL, _comp_verts_maker);
   }
   return (PandaNode *)NULL;
 }

+ 6 - 3
panda/src/egg2pg/eggLoader.h

@@ -38,6 +38,7 @@
 #include "textureStage.h"
 #include "texGenAttrib.h"
 #include "eggTransform3d.h"
+#include "computedVerticesMaker.h"
 
 class EggNode;
 class EggBin;
@@ -47,7 +48,6 @@ class EggNurbsSurface;
 class EggPrimitive;
 class EggPolygon;
 class EggMaterial;
-class ComputedVerticesMaker;
 class RenderRelation;
 class CollisionSolid;
 class CollisionNode;
@@ -73,11 +73,12 @@ public:
   void reparent_decals();
 
   void make_nonindexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
-                                 const LMatrix4d *transform = NULL);
+                                 const LMatrix4d *transform,
+                                 ComputedVerticesMaker &comp_verts_maker);
 
   void make_indexed_primitive(EggPrimitive *egg_prim, PandaNode *parent,
                               const LMatrix4d *transform,
-                              ComputedVerticesMaker &_comp_verts_maker);
+                              ComputedVerticesMaker &comp_verts_maker);
 
 private:
   class TextureDef {
@@ -188,6 +189,8 @@ private:
 
   DeferredNodes _deferred_nodes;
 
+  ComputedVerticesMaker _comp_verts_maker;
+
 public:
   PT(PandaNode) _root;
   EggData _data;