@@ -495,4 +495,144 @@ namespace Forth
495
495
break ;
496
496
}
497
497
}
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
+
498
638
} // namespace Forth
0 commit comments