From 831e0a84e7f56cee013a93a23b776242b8bd55ce Mon Sep 17 00:00:00 2001 From: David Rose Date: Mon, 27 Sep 2004 22:38:54 +0000 Subject: [PATCH] add indexed flag to egg files --- panda/src/configfiles/panda.prc.pp | 1 + panda/src/egg/eggGroup.I | 47 +++++ panda/src/egg/eggGroup.cxx | 28 ++- panda/src/egg/eggGroup.h | 8 + panda/src/egg/eggNode.cxx | 20 +++ panda/src/egg/eggNode.h | 1 + panda/src/egg/parser.cxx.prebuilt | 262 ++++++++++++++-------------- panda/src/egg/parser.yxx | 2 + panda/src/egg2pg/characterMaker.cxx | 3 +- panda/src/egg2pg/eggLoader.cxx | 53 +++--- panda/src/egg2pg/eggLoader.h | 9 +- 11 files changed, 276 insertions(+), 158 deletions(-) diff --git a/panda/src/configfiles/panda.prc.pp b/panda/src/configfiles/panda.prc.pp index cd2f5da3ea..2e83ac8c0f 100644 --- a/panda/src/configfiles/panda.prc.pp +++ b/panda/src/configfiles/panda.prc.pp @@ -58,5 +58,6 @@ egg-object-type-portal portal { 1 } egg-object-type-polylight polylight { 1 } egg-object-type-seq24 { 1 } fps { 24 } egg-object-type-seq12 { 1 } fps { 12 } +egg-object-type-indexed indexed { 1 } #end 20_panda.prc diff --git a/panda/src/egg/eggGroup.I b/panda/src/egg/eggGroup.I index 194bb3fb86..23e2f7ccbf 100644 --- a/panda/src/egg/eggGroup.I +++ b/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 diff --git a/panda/src/egg/eggGroup.cxx b/panda/src/egg/eggGroup.cxx index 3ff008e478..174f5c9ca3 100644 --- a/panda/src/egg/eggGroup.cxx +++ b/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) << " { 1 }\n"; + indent(out, indent_level) << " portal { 1 }\n"; } if (get_polylight_flag()) { - indent(out, indent_level) << " { 1 }\n"; + indent(out, indent_level) << " polylight { 1 }\n"; + } + + if (has_indexed_flag()) { + indent(out, indent_level) + << " 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 diff --git a/panda/src/egg/eggGroup.h b/panda/src/egg/eggGroup.h index a353fa8dd5..ec349165b3 100644 --- a/panda/src/egg/eggGroup.h +++ b/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; diff --git a/panda/src/egg/eggNode.cxx b/panda/src/egg/eggNode.cxx index 84aeb2c775..ffe722e12b 100644 --- a/panda/src/egg/eggNode.cxx +++ b/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 diff --git a/panda/src/egg/eggNode.h b/panda/src/egg/eggNode.h index bae53e363d..dfc170e071 100644 --- a/panda/src/egg/eggNode.h +++ b/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); diff --git a/panda/src/egg/parser.cxx.prebuilt b/panda/src/egg/parser.cxx.prebuilt index 5e770997b3..d46b08b5a5 100644 --- a/panda/src/egg/parser.cxx.prebuilt +++ b/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" diff --git a/panda/src/egg/parser.yxx b/panda/src/egg/parser.yxx index cf2f0a6c46..bb8f15e512 100644 --- a/panda/src/egg/parser.yxx +++ b/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); } diff --git a/panda/src/egg2pg/characterMaker.cxx b/panda/src/egg2pg/characterMaker.cxx index aa1815b9bb..1dff0eb527 100644 --- a/panda/src/egg2pg/characterMaker.cxx +++ b/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); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx index e1fa16af50..d6a02a6693 100644 --- a/panda/src/egg2pg/eggLoader.cxx +++ b/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; } diff --git a/panda/src/egg2pg/eggLoader.h b/panda/src/egg2pg/eggLoader.h index 75edaa5f0d..a0857a6bc9 100644 --- a/panda/src/egg2pg/eggLoader.h +++ b/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;