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