@@ -495,4 +495,144 @@ namespace Forth
495495 break ;
496496 }
497497 }
498+
499+ void Buffer4::AddBySequence (SequenceMode mode, const std::vector<int > &v)
500+ {
501+ // Copy of the original sequence
502+ int va = v.size ();
503+ switch (mode)
504+ {
505+ case SQM_Points:
506+ for (int i = 0 ; i < va;)
507+ AddPoint (v[i++]);
508+ break ;
509+
510+ case SQM_Lines:
511+ for (int i = 0 ; i < va;)
512+ AddSegment (v[i++], v[i++]);
513+ break ;
514+
515+ case SQM_LineStrip:
516+ for (int i = 1 ; i < va;)
517+ AddSegment (v[i - 1 ], v[i++]);
518+ break ;
519+
520+ case SQM_LineFan:
521+ for (int i = 1 ; i < va;)
522+ AddSegment (v[0 ], v[i++]);
523+ break ;
524+
525+ case SQM_LineLoop:
526+ for (int i = 0 ; i < va;)
527+ AddSegment (v[i], (v[++i % va]));
528+ break ;
529+
530+ case SQM_Triangles:
531+ for (int i = 0 ; i < va;)
532+ AddTriangle (v[i++], v[i++], v[i++]);
533+ break ;
534+
535+ case SQM_TriangleStrip:
536+ for (int i = 2 ; i < va;)
537+ AddTriangle (v[i - 2 ], v[i - 1 ], v[i++]);
538+ break ;
539+
540+ case SQM_TriangleFan:
541+ for (int i = 1 ; i < va;)
542+ AddTriangle (v[0 ], v[i - 1 ], v[i++]);
543+ break ;
544+
545+ case SQM_Quads:
546+ for (int i = 0 ; i < va;)
547+ AddQuad (v[i++], v[i++], v[i++], v[i++]);
548+ break ;
549+
550+ case SQM_QuadStrip:
551+ for (int i = 2 ; i < va; i += 2 )
552+ AddQuad (v[i - 2 ], v[i - 1 ], v[i + 1 ], v[i]);
553+ break ;
554+
555+ case SQM_Polygon:
556+ for (int i = 1 ; i < va;)
557+ AddTriangle (v[0 ], v[i], (v[++i % va]));
558+ break ;
559+
560+ case SQM_Trimids:
561+ for (int i = 0 ; i < va;)
562+ AddTrimid (v[i++], v[i++], v[i++], v[i++]);
563+ break ;
564+
565+ case SQM_TrimidStrip:
566+ for (int i = 3 ; i < va;)
567+ AddTrimid (v[i - 3 ], v[i - 2 ], v[i - 1 ], v[i++]);
568+ break ;
569+
570+ case SQM_TrimidFan:
571+ for (int i = 1 ; i < va;)
572+ AddTrimid (v[0 ], v[i++], v[i++], v[i++]);
573+ break ;
574+
575+ case SQM_PyramidFan:
576+ for (int i = 1 ; i < va;)
577+ AddPyramid (v[0 ], v[i++], v[i++], v[i++], v[i++]);
578+ break ;
579+
580+ case SQM_PrismFan:
581+ for (int i = 2 ; i < va; i += 2 )
582+ AddPrism (v[i++], v[i++], v[0 ], v[i + 1 ], v[i], v[1 ]);
583+ break ;
584+
585+ case SQM_Cubes:
586+ for (int i = 0 ; i < va;)
587+ AddCube (v[i++], v[i++], v[i++], v[i++], v[i++], v[i++], v[i++], v[i++]);
588+ break ;
589+
590+ case SQM_CubeStrip:
591+ for (int i = 4 ; i < va;)
592+ AddCube (v[i - 4 ], v[i - 3 ], v[i - 2 ], v[i - 1 ], v[i++], v[i++], v[i++], v[i++]);
593+ break ;
594+ }
595+ }
596+
597+ void Buffer4::AddPoint (const std::vector<int > &v)
598+ {
599+ AddBySequence (SQM_Points, v);
600+ }
601+
602+ void Buffer4::AddSegment (const std::vector<int > &v)
603+ {
604+ AddBySequence (SQM_Lines, v);
605+ }
606+
607+ void Buffer4::AddTriangle (const std::vector<int > &v)
608+ {
609+ AddBySequence (SQM_Triangles, v);
610+ }
611+
612+ void Buffer4::AddQuad (const std::vector<int > &v)
613+ {
614+ AddBySequence (SQM_Quads, v);
615+ }
616+
617+ void Buffer4::AddTrimid (const std::vector<int > &v)
618+ {
619+ AddBySequence (SQM_Trimids, v);
620+ }
621+
622+ void Buffer4::AddPolygon (const std::vector<int > &v)
623+ {
624+ switch (simplex)
625+ {
626+ case SM_Point:
627+ AddBySequence (SQM_Points, v);
628+ break ;
629+ case SM_Line:
630+ AddBySequence (SQM_LineLoop, v);
631+ break ;
632+ case SM_Triangle:
633+ AddBySequence (SQM_Polygon, v);
634+ break ;
635+ }
636+ }
637+
498638} // namespace Forth
0 commit comments