src/types.cpp

changeset 380
e442d9b7c251
parent 358
7885fa5b09c5
child 381
241f65769a57
equal deleted inserted replaced
379:f5f3faac60cd 380:e442d9b7c251
23 #include <assert.h> 23 #include <assert.h>
24 #include "common.h" 24 #include "common.h"
25 #include "types.h" 25 #include "types.h"
26 #include "misc.h" 26 #include "misc.h"
27 27
28 const File nullfile;
29
30 str DoFormat( vector<StringFormatArg> args ) 28 str DoFormat( vector<StringFormatArg> args )
31 { 29 {
32 assert( args.size() >= 1 ); 30 assert( args.size() >= 1 );
33 str text = args[0].value(); 31 str text = args[0].value();
34 32
482 480
483 bool File::iterator::operator!= ( File::iterator& other ) 481 bool File::iterator::operator!= ( File::iterator& other )
484 { 482 {
485 return !operator== ( other ); 483 return !operator== ( other );
486 } 484 }
485
486 // =============================================================================
487 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
488 // =============================================================================
489 bbox::bbox() {
490 reset();
491 }
492
493 // =============================================================================
494 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
495 // =============================================================================
496 void bbox::calculate() {
497 reset();
498
499 if (!currentFile())
500 return;
501
502 for (LDObject* obj : currentFile()->objs())
503 calcObject (obj);
504 }
505
506 // =============================================================================
507 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
508 // =============================================================================
509 void bbox::calcObject (LDObject* obj) {
510 switch (obj->getType()) {
511 case LDObject::Line:
512 case LDObject::Triangle:
513 case LDObject::Quad:
514 case LDObject::CondLine:
515 for (short i = 0; i < obj->vertices(); ++i)
516 calcVertex (obj->getVertex (i));
517
518 break;
519
520 case LDObject::Subfile: {
521 LDSubfileObject* ref = static_cast<LDSubfileObject*> (obj);
522 vector<LDObject*> objs = ref->inlineContents (true, true);
523
524 for (LDObject* obj : objs) {
525 calcObject (obj);
526 delete obj;
527 }
528 }
529 break;
530
531 default:
532 break;
533 }
534 }
535
536 // =============================================================================
537 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
538 // =============================================================================
539 void bbox::calcVertex (const vertex& v) {
540 for (const Axis ax : g_Axes) {
541 if (v[ax] < m_v0[ax])
542 m_v0[ax] = v[ax];
543
544 if (v[ax] > m_v1[ax])
545 m_v1[ax] = v[ax];
546 }
547
548 m_empty = false;
549 }
550
551 // =============================================================================
552 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
553 // =============================================================================
554 void bbox::reset() {
555 m_v0[X] = m_v0[Y] = m_v0[Z] = 0x7FFFFFFF;
556 m_v1[X] = m_v1[Y] = m_v1[Z] = 0xFFFFFFFF;
557
558 m_empty = true;
559 }
560
561 // =============================================================================
562 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
563 // =============================================================================
564 double bbox::size() const {
565 double xscale = (m_v0[X] - m_v1[X]);
566 double yscale = (m_v0[Y] - m_v1[Y]);
567 double zscale = (m_v0[Z] - m_v1[Z]);
568 double size = zscale;
569
570 if (xscale > yscale) {
571 if (xscale > zscale)
572 size = xscale;
573 } elif (yscale > zscale)
574 size = yscale;
575
576 if (abs (size) >= 2.0f)
577 return abs (size / 2);
578
579 return 1.0f;
580 }
581
582 // =============================================================================
583 vertex bbox::center() const {
584 return vertex (
585 (m_v0[X] + m_v1[X]) / 2,
586 (m_v0[Y] + m_v1[Y]) / 2,
587 (m_v0[Z] + m_v1[Z]) / 2);
588 }

mercurial