add indexed flag to egg files

This commit is contained in:
David Rose 2004-09-27 22:38:54 +00:00
parent 4ebc6b2750
commit 831e0a84e7
11 changed files with 276 additions and 158 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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"

View File

@ -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);
}

View File

@ -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);
}
////////////////////////////////////////////////////////////////////

View File

@ -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;
}

View File

@ -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;