68GeomPrimitive::PrimitiveType GeomTristrips::
69get_primitive_type()
const {
78get_geom_rendering()
const {
80 return GR_triangle_strip | GR_indexed_other;
82 return GR_triangle_strip;
91make_adjacency()
const {
99 int num_vertices = from.get_num_vertices();
100 const int num_unused = 2;
103 map<std::pair<int, int>,
int> edge_map;
105 int vi = -num_unused;
107 while (li < (
int)ends.size()) {
111 nassertr(vi + 2 <= end,
nullptr);
113 int v0 = from.get_vertex(vi++);
114 int v1 = from.get_vertex(vi++);
115 int v2 = from.get_vertex(vi);
116 edge_map[make_pair(v0, v1)] = v2;
119 v2 = from.get_vertex(vi++);
120 edge_map[make_pair(v2, v0)] = v1;
124 edge_map[make_pair(v1, v2)] = v0;
130 v2 = from.get_vertex(vi++);
131 edge_map[make_pair(v0, v2)] = v1;
135 edge_map[make_pair(v2, v1)] = v0;
144 nassertr(vi == num_vertices,
nullptr);
150 while (li < (
int)ends.size()) {
154 nassertr(vi + 2 <= end,
nullptr);
156 int v0 = from.get_vertex(vi++);
157 int v1 = from.get_vertex(vi++);
162 auto it = edge_map.find(make_pair(v1, v0));
163 if (it != edge_map.end()) {
164 adj->add_vertex(it->second);
172 v2 = from.get_vertex(vi++);
173 it = edge_map.find(make_pair(v0, v2));
174 if (it != edge_map.end()) {
175 adj->add_vertex(it->second);
183 it = edge_map.find(make_pair(v2, v1));
184 if (it != edge_map.end()) {
185 adj->add_vertex(it->second);
194 v2 = from.get_vertex(vi++);
195 it = edge_map.find(make_pair(v2, v0));
196 if (it != edge_map.end()) {
197 adj->add_vertex(it->second);
205 it = edge_map.find(make_pair(v1, v2));
206 if (it != edge_map.end()) {
207 adj->add_vertex(it->second);
217 adj->close_primitive();
220 nassertr(vi == num_vertices,
nullptr);
230get_min_num_vertices_per_primitive()
const {
241get_num_unused_vertices_per_primitive()
const {
251 return gsg->draw_tristrips(reader, force);
265decompose_impl()
const {
271 int num_unused = get_num_unused_vertices_per_primitive();
279 int vi = -num_unused;
281 while (li < (
int)ends.size()) {
285 nassertr(vi + 2 <= end,
nullptr);
290 bool reversed =
false;
295 if (v0 != v1 && v0 != v2 && v1 != v2) {
296 triangles->add_vertex(v0);
297 triangles->add_vertex(v2);
298 triangles->add_vertex(v1);
299 triangles->close_primitive();
303 if (v0 != v1 && v0 != v2 && v1 != v2) {
304 triangles->add_vertex(v0);
305 triangles->add_vertex(v1);
306 triangles->add_vertex(v2);
307 triangles->close_primitive();
316 nassertr(vi == num_vertices,
nullptr);
321 int vi = -num_unused;
323 while (li < (
int)ends.size()) {
327 nassertr(vi + 2 <= end,
nullptr);
332 bool reversed =
false;
336 if (v0 != v1 && v0 != v2 && v1 != v2) {
337 triangles->add_vertex(v1);
338 triangles->add_vertex(v0);
339 triangles->add_vertex(v2);
340 triangles->close_primitive();
344 if (v0 != v1 && v0 != v2 && v1 != v2) {
345 triangles->add_vertex(v0);
346 triangles->add_vertex(v1);
347 triangles->add_vertex(v2);
348 triangles->close_primitive();
358 nassertr(vi == num_vertices,
nullptr);
368doubleside_impl()
const {
371 return decompose_impl()->doubleside();
378reverse_impl()
const {
381 return decompose_impl()->reverse();
406 CPTA_int::const_iterator ei;
407 for (ei = ends.begin(); ei != ends.end(); ++ei) {
409 int num_vertices = end - begin;
413 to.set_data1i(last_added);
414 from.set_row_unsafe(end - 1);
415 to.set_data1i(from.get_data1i());
421 nassertr((num_vertices & 1) == 0,
nullptr);
422 for (
int vi = end - 1; vi >= begin; --vi) {
423 from.set_row_unsafe(vi);
424 last_added = from.get_data1i();
425 to.set_data1i(last_added);
431 nassertr(to.is_at_end(),
nullptr);
440 CPTA_int::const_iterator ei;
441 for (ei = ends.begin(); ei != ends.end(); ++ei) {
443 int num_vertices = end - begin;
447 to.set_data1i(last_added);
448 to.set_data1i(end - 1 + first_vertex);
454 nassertr((num_vertices & 1) == 0,
nullptr);
455 for (
int vi = end - 1; vi >= begin; --vi) {
456 last_added = vi + first_vertex;
457 to.set_data1i(last_added);
463 nassertr(to.is_at_end(),
nullptr);
473requires_unused_vertices()
const {
487 int prev = from.get_data1i();
493 to.add_data1i(vertex);