src/ldtypes.cpp

changeset 539
72ad83a67165
parent 538
2f85d4d286e5
child 540
0334789cb4d7
equal deleted inserted replaced
538:2f85d4d286e5 539:72ad83a67165
34 34
35 // ============================================================================= 35 // =============================================================================
36 // LDObject constructors 36 // LDObject constructors
37 // ----------------------------------------------------------------------------- 37 // -----------------------------------------------------------------------------
38 LDObject::LDObject() : 38 LDObject::LDObject() :
39 m_hidden (false), 39 m_Hidden (false),
40 m_selected (false), 40 m_Selected (false),
41 m_parent (null), 41 m_Parent (null),
42 m_file (null), 42 m_File (null),
43 qObjListEntry (null), 43 qObjListEntry (null),
44 m_glinit (false) 44 m_glinit (false)
45 { 45 {
46 memset (m_coords, 0, sizeof m_coords); 46 memset (m_coords, 0, sizeof m_coords);
47 47
48 // Determine ID 48 // Determine ID
49 int32 id = 1; // 0 is invalid 49 int32 id = 1; // 0 is invalid
50 50
51 for (LDObject* obj : g_LDObjects) 51 for (LDObject* obj : g_LDObjects)
52 if (obj->id() >= id) 52 if (obj->getID() >= id)
53 id = obj->id() + 1; 53 id = obj->getID() + 1;
54 54
55 setID (id); 55 setID (id);
56 g_LDObjects << this; 56 g_LDObjects << this;
57 } 57 }
58 58
102 } 102 }
103 103
104 // ============================================================================= 104 // =============================================================================
105 // ----------------------------------------------------------------------------- 105 // -----------------------------------------------------------------------------
106 str LDSubfile::raw() 106 str LDSubfile::raw()
107 { str val = fmt ("1 %1 %2 ", color(), position()); 107 { str val = fmt ("1 %1 %2 ", getColor(), position());
108 val += transform().stringRep(); 108 val += getTransform().stringRep();
109 val += ' '; 109 val += ' ';
110 val += fileInfo()->name(); 110 val += getFileInfo()->getName();
111 return val; 111 return val;
112 } 112 }
113 113
114 // ============================================================================= 114 // =============================================================================
115 // ----------------------------------------------------------------------------- 115 // -----------------------------------------------------------------------------
116 str LDLine::raw() 116 str LDLine::raw()
117 { str val = fmt ("2 %1", color()); 117 { str val = fmt ("2 %1", getColor());
118 118
119 for (int i = 0; i < 2; ++i) 119 for (int i = 0; i < 2; ++i)
120 val += fmt (" %1", getVertex (i)); 120 val += fmt (" %1", getVertex (i));
121 121
122 return val; 122 return val;
123 } 123 }
124 124
125 // ============================================================================= 125 // =============================================================================
126 // ----------------------------------------------------------------------------- 126 // -----------------------------------------------------------------------------
127 str LDTriangle::raw() 127 str LDTriangle::raw()
128 { str val = fmt ("3 %1", color()); 128 { str val = fmt ("3 %1", getColor());
129 129
130 for (int i = 0; i < 3; ++i) 130 for (int i = 0; i < 3; ++i)
131 val += fmt (" %1", getVertex (i)); 131 val += fmt (" %1", getVertex (i));
132 132
133 return val; 133 return val;
134 } 134 }
135 135
136 // ============================================================================= 136 // =============================================================================
137 // ----------------------------------------------------------------------------- 137 // -----------------------------------------------------------------------------
138 str LDQuad::raw() 138 str LDQuad::raw()
139 { str val = fmt ("4 %1", color()); 139 { str val = fmt ("4 %1", getColor());
140 140
141 for (int i = 0; i < 4; ++i) 141 for (int i = 0; i < 4; ++i)
142 val += fmt (" %1", getVertex (i)); 142 val += fmt (" %1", getVertex (i));
143 143
144 return val; 144 return val;
145 } 145 }
146 146
147 // ============================================================================= 147 // =============================================================================
148 // ----------------------------------------------------------------------------- 148 // -----------------------------------------------------------------------------
149 str LDCndLine::raw() 149 str LDCndLine::raw()
150 { str val = fmt ("5 %1", color()); 150 { str val = fmt ("5 %1", getColor());
151 151
152 // Add the coordinates 152 // Add the coordinates
153 for (int i = 0; i < 4; ++i) 153 for (int i = 0; i < 4; ++i)
154 val += fmt (" %1", getVertex (i)); 154 val += fmt (" %1", getVertex (i));
155 155
163 } 163 }
164 164
165 // ============================================================================= 165 // =============================================================================
166 // ----------------------------------------------------------------------------- 166 // -----------------------------------------------------------------------------
167 str LDVertex::raw() 167 str LDVertex::raw()
168 { return fmt ("0 !LDFORGE VERTEX %1 %2", color(), pos); 168 { return fmt ("0 !LDFORGE VERTEX %1 %2", getColor(), pos);
169 } 169 }
170 170
171 // ============================================================================= 171 // =============================================================================
172 // ----------------------------------------------------------------------------- 172 // -----------------------------------------------------------------------------
173 str LDEmpty::raw() 173 str LDEmpty::raw()
204 // 1---2 1 1---2 204 // 1---2 1 1---2
205 LDTriangle* tri1 = new LDTriangle (getVertex (0), getVertex (1), getVertex (3)); 205 LDTriangle* tri1 = new LDTriangle (getVertex (0), getVertex (1), getVertex (3));
206 LDTriangle* tri2 = new LDTriangle (getVertex (1), getVertex (2), getVertex (3)); 206 LDTriangle* tri2 = new LDTriangle (getVertex (1), getVertex (2), getVertex (3));
207 207
208 // The triangles also inherit the quad's color 208 // The triangles also inherit the quad's color
209 tri1->setColor (color()); 209 tri1->setColor (getColor());
210 tri2->setColor (color()); 210 tri2->setColor (getColor());
211 211
212 QList<LDTriangle*> triangles; 212 QList<LDTriangle*> triangles;
213 triangles << tri1; 213 triangles << tri1;
214 triangles << tri2; 214 triangles << tri2;
215 return triangles; 215 return triangles;
220 void LDObject::replace (LDObject* other) 220 void LDObject::replace (LDObject* other)
221 { long idx = getIndex(); 221 { long idx = getIndex();
222 assert (idx != -1); 222 assert (idx != -1);
223 223
224 // Replace the instance of the old object with the new object 224 // Replace the instance of the old object with the new object
225 file()->setObject (idx, other); 225 getFile()->setObject (idx, other);
226 226
227 // Remove the old object 227 // Remove the old object
228 delete this; 228 delete this;
229 } 229 }
230 230
231 // ============================================================================= 231 // =============================================================================
232 // ----------------------------------------------------------------------------- 232 // -----------------------------------------------------------------------------
233 void LDObject::swap (LDObject* other) 233 void LDObject::swap (LDObject* other)
234 { int i = 0; 234 { int i = 0;
235 235
236 for (LDObject* obj : file()->objects()) 236 for (LDObject* obj : getFile()->getObjects())
237 { if (obj == this) 237 { if (obj == this)
238 file()->setObject (i, other); 238 getFile()->setObject (i, other);
239 elif (obj == other) 239 elif (obj == other)
240 file()->setObject (i, this); 240 getFile()->setObject (i, this);
241 241
242 ++i; 242 ++i;
243 } 243 }
244 244
245 file()->addToHistory (new SwapHistory (id(), other->id())); 245 getFile()->addToHistory (new SwapHistory (getID(), other->getID()));
246 } 246 }
247 247
248 // ============================================================================= 248 // =============================================================================
249 // ----------------------------------------------------------------------------- 249 // -----------------------------------------------------------------------------
250 LDLine::LDLine (vertex v1, vertex v2) 250 LDLine::LDLine (vertex v1, vertex v2)
263 263
264 // ============================================================================= 264 // =============================================================================
265 // ----------------------------------------------------------------------------- 265 // -----------------------------------------------------------------------------
266 LDObject::~LDObject() 266 LDObject::~LDObject()
267 { // If this object was selected, unselect it now 267 { // If this object was selected, unselect it now
268 if (selected()) 268 if (isSelected())
269 unselect(); 269 unselect();
270 270
271 // If this object was associated to a file, remove it off it now 271 // If this object was associated to a file, remove it off it now
272 if (file()) 272 if (getFile())
273 file()->forgetObject (this); 273 getFile()->forgetObject (this);
274 274
275 // Delete the GL lists 275 // Delete the GL lists
276 GL::deleteLists (this); 276 GL::deleteLists (this);
277 277
278 // Remove this object from the list of LDObjects 278 // Remove this object from the list of LDObjects
296 296
297 break; 297 break;
298 298
299 case LDObject::Subfile: 299 case LDObject::Subfile:
300 { LDSubfile* ref = static_cast<LDSubfile*> (obj); 300 { LDSubfile* ref = static_cast<LDSubfile*> (obj);
301 matrix newMatrix = transform * ref->transform(); 301 matrix newMatrix = transform * ref->getTransform();
302 vertex newpos = ref->position(); 302 vertex newpos = ref->position();
303 303
304 newpos.transform (transform, pos); 304 newpos.transform (transform, pos);
305 ref->setPosition (newpos); 305 ref->setPosition (newpos);
306 ref->setTransform (newMatrix); 306 ref->setTransform (newMatrix);
309 309
310 default: 310 default:
311 break; 311 break;
312 } 312 }
313 313
314 if (obj->color() == maincolor) 314 if (obj->getColor() == maincolor)
315 obj->setColor (parentcolor); 315 obj->setColor (parentcolor);
316 } 316 }
317 317
318 // ============================================================================= 318 // =============================================================================
319 // ----------------------------------------------------------------------------- 319 // -----------------------------------------------------------------------------
320 QList<LDObject*> LDSubfile::inlineContents (InlineFlags flags) 320 QList<LDObject*> LDSubfile::inlineContents (InlineFlags flags)
321 { QList<LDObject*> objs = fileInfo()->inlineContents (flags); 321 { QList<LDObject*> objs = getFileInfo()->inlineContents (flags);
322 322
323 // Transform the objects 323 // Transform the objects
324 for (LDObject * obj : objs) 324 for (LDObject * obj : objs)
325 { // Set the parent now so we know what inlined this. 325 { // Set the parent now so we know what inlined this.
326 obj->setParent (this); 326 obj->setParent (this);
327 transformObject (obj, transform(), position(), color()); 327 transformObject (obj, getTransform(), position(), getColor());
328 } 328 }
329 329
330 return objs; 330 return objs;
331 } 331 }
332 332
333 // ============================================================================= 333 // =============================================================================
334 // ----------------------------------------------------------------------------- 334 // -----------------------------------------------------------------------------
335 long LDObject::getIndex() const 335 long LDObject::getIndex() const
336 { 336 {
337 #ifndef RELEASE 337 #ifndef RELEASE
338 assert (file() != null); 338 assert (getFile() != null);
339 #endif 339 #endif
340 340
341 for (int i = 0; i < file()->getObjectCount(); ++i) 341 for (int i = 0; i < getFile()->getObjectCount(); ++i)
342 if (file()->getObject (i) == this) 342 if (getFile()->getObject (i) == this)
343 return i; 343 return i;
344 344
345 return -1; 345 return -1;
346 } 346 }
347 347
354 // If we move down, we need to iterate the array in reverse order. 354 // If we move down, we need to iterate the array in reverse order.
355 const long start = up ? 0 : (objs.size() - 1); 355 const long start = up ? 0 : (objs.size() - 1);
356 const long end = up ? objs.size() : -1; 356 const long end = up ? objs.size() : -1;
357 const long incr = up ? 1 : -1; 357 const long incr = up ? 1 : -1;
358 QList<LDObject*> objsToCompile; 358 QList<LDObject*> objsToCompile;
359 LDFile* file = objs[0]->file(); 359 LDFile* file = objs[0]->getFile();
360 360
361 for (long i = start; i != end; i += incr) 361 for (long i = start; i != end; i += incr)
362 { LDObject* obj = objs[i]; 362 { LDObject* obj = objs[i];
363 363
364 const long idx = obj->getIndex(), 364 const long idx = obj->getIndex(),
365 target = idx + (up ? -1 : 1); 365 target = idx + (up ? -1 : 1);
366 366
367 if ( (up && idx == 0) || (!up && idx == (long) (file->objects().size() - 1))) 367 if ( (up && idx == 0) || (!up && idx == (long) (file->getObjects().size() - 1)))
368 { // One of the objects hit the extrema. If this happens, this should be the first 368 { // One of the objects hit the extrema. If this happens, this should be the first
369 // object to be iterated on. Thus, nothing has changed yet and it's safe to just 369 // object to be iterated on. Thus, nothing has changed yet and it's safe to just
370 // abort the entire operation. 370 // abort the entire operation.
371 assert (i == start); 371 assert (i == start);
372 return; 372 return;
433 } 433 }
434 434
435 // ============================================================================= 435 // =============================================================================
436 // ----------------------------------------------------------------------------- 436 // -----------------------------------------------------------------------------
437 LDObject* LDObject::topLevelParent() 437 LDObject* LDObject::topLevelParent()
438 { if (!parent()) 438 { if (!getParent())
439 return this; 439 return this;
440 440
441 LDObject* it = this; 441 LDObject* it = this;
442 442
443 while (it->parent()) 443 while (it->getParent())
444 it = it->parent(); 444 it = it->getParent();
445 445
446 return it; 446 return it;
447 } 447 }
448 448
449 // ============================================================================= 449 // =============================================================================
450 // ----------------------------------------------------------------------------- 450 // -----------------------------------------------------------------------------
451 LDObject* LDObject::next() const 451 LDObject* LDObject::next() const
452 { long idx = getIndex(); 452 { long idx = getIndex();
453 assert (idx != -1); 453 assert (idx != -1);
454 454
455 if (idx == (long) file()->getObjectCount() - 1) 455 if (idx == (long) getFile()->getObjectCount() - 1)
456 return null; 456 return null;
457 457
458 return file()->getObject (idx + 1); 458 return getFile()->getObject (idx + 1);
459 } 459 }
460 460
461 // ============================================================================= 461 // =============================================================================
462 // ----------------------------------------------------------------------------- 462 // -----------------------------------------------------------------------------
463 LDObject* LDObject::prev() const 463 LDObject* LDObject::prev() const
465 assert (idx != -1); 465 assert (idx != -1);
466 466
467 if (idx == 0) 467 if (idx == 0)
468 return null; 468 return null;
469 469
470 return file()->getObject (idx - 1); 470 return getFile()->getObject (idx - 1);
471 } 471 }
472 472
473 // ============================================================================= 473 // =============================================================================
474 // ----------------------------------------------------------------------------- 474 // -----------------------------------------------------------------------------
475 void LDObject::move (vertex vect) 475 void LDObject::move (vertex vect)
595 if (idx > 0) 595 if (idx > 0)
596 { LDBFC* bfc = dynamic_cast<LDBFC*> (prev()); 596 { LDBFC* bfc = dynamic_cast<LDBFC*> (prev());
597 597
598 if (bfc && bfc->type == LDBFC::InvertNext) 598 if (bfc && bfc->type == LDBFC::InvertNext)
599 { // This is prefixed with an invertnext, thus remove it. 599 { // This is prefixed with an invertnext, thus remove it.
600 file()->forgetObject (bfc); 600 getFile()->forgetObject (bfc);
601 delete bfc; 601 delete bfc;
602 return; 602 return;
603 } 603 }
604 } 604 }
605 605
606 // Not inverted, thus prefix it with a new invertnext. 606 // Not inverted, thus prefix it with a new invertnext.
607 LDBFC* bfc = new LDBFC (LDBFC::InvertNext); 607 LDBFC* bfc = new LDBFC (LDBFC::InvertNext);
608 file()->insertObj (idx, bfc); 608 getFile()->insertObj (idx, bfc);
609 } 609 }
610 610
611 // ============================================================================= 611 // =============================================================================
612 // ----------------------------------------------------------------------------- 612 // -----------------------------------------------------------------------------
613 static void invertLine (LDObject* line) 613 static void invertLine (LDObject* line)
634 { LDLine* repl = new LDLine; 634 { LDLine* repl = new LDLine;
635 635
636 for (int i = 0; i < repl->vertices(); ++i) 636 for (int i = 0; i < repl->vertices(); ++i)
637 repl->setVertex (i, getVertex (i)); 637 repl->setVertex (i, getVertex (i));
638 638
639 repl->setColor (color()); 639 repl->setColor (getColor());
640 640
641 replace (repl); 641 replace (repl);
642 return repl; 642 return repl;
643 } 643 }
644 644
645 // ============================================================================= 645 // =============================================================================
646 // ----------------------------------------------------------------------------- 646 // -----------------------------------------------------------------------------
647 LDObject* LDObject::fromID (int id) 647 LDObject* LDObject::fromID (int id)
648 { for (LDObject * obj : g_LDObjects) 648 { for (LDObject * obj : g_LDObjects)
649 if (obj->id() == id) 649 if (obj->getID() == id)
650 return obj; 650 return obj;
651 651
652 return null; 652 return null;
653 } 653 }
654 654
655 // ============================================================================= 655 // =============================================================================
656 // ----------------------------------------------------------------------------- 656 // -----------------------------------------------------------------------------
657 str LDOverlay::raw() 657 str LDOverlay::raw()
658 { return fmt ("0 !LDFORGE OVERLAY %1 %2 %3 %4 %5 %6", 658 { return fmt ("0 !LDFORGE OVERLAY %1 %2 %3 %4 %5 %6",
659 filename(), camera(), x(), y(), width(), height()); 659 getFileName(), getCamera(), getX(), getY(), getWidth(), getHeight());
660 } 660 }
661 661
662 void LDOverlay::move (vertex vect) 662 void LDOverlay::move (vertex vect)
663 { Q_UNUSED (vect) 663 { Q_UNUSED (vect)
664 } 664 }
667 667
668 // ============================================================================= 668 // =============================================================================
669 // Hook the set accessors of certain properties to this changeProperty function. 669 // Hook the set accessors of certain properties to this changeProperty function.
670 // It takes care of history management so we can capture low-level changes, this 670 // It takes care of history management so we can capture low-level changes, this
671 // makes history stuff work out of the box. 671 // makes history stuff work out of the box.
672 //
673 // TODO: use new PROPERTY-callbacks
672 // ----------------------------------------------------------------------------- 674 // -----------------------------------------------------------------------------
673 template<class T> static void changeProperty (LDObject* obj, T* ptr, const T& val) 675 template<class T> static void changeProperty (LDObject* obj, T* ptr, const T& val)
674 { long idx; 676 { long idx;
675 677
676 if (*ptr == val) 678 if (*ptr == val)
677 return; 679 return;
678 680
679 if (obj->file() && (idx = obj->getIndex()) != -1) 681 if (obj->getFile() && (idx = obj->getIndex()) != -1)
680 { str before = obj->raw(); 682 { str before = obj->raw();
681 *ptr = val; 683 *ptr = val;
682 str after = obj->raw(); 684 str after = obj->raw();
683 685
684 obj->file()->addToHistory (new EditHistory (idx, before, after)); 686 obj->getFile()->addToHistory (new EditHistory (idx, before, after));
685 } 687 }
686 else 688 else
687 *ptr = val; 689 *ptr = val;
688 } 690 }
689 691
690 // ============================================================================= 692 // =============================================================================
691 // ----------------------------------------------------------------------------- 693 // -----------------------------------------------------------------------------
692 READ_ACCESSOR (int, LDObject::color) 694 const int& LDObject::getColor() const
693 { return m_color; 695 { return m_Color;
694 } 696 }
695 697
696 SET_ACCESSOR (int, LDObject::setColor) 698 void LDObject::setColor (int val)
697 { changeProperty (this, &m_color, val); 699 { changeProperty (this, &m_Color, val);
698 } 700 }
699 701
700 // ============================================================================= 702 // =============================================================================
701 // ----------------------------------------------------------------------------- 703 // -----------------------------------------------------------------------------
702 const vertex& LDObject::getVertex (int i) const 704 const vertex& LDObject::getVertex (int i) const
708 } 710 }
709 711
710 // ============================================================================= 712 // =============================================================================
711 // ----------------------------------------------------------------------------- 713 // -----------------------------------------------------------------------------
712 void LDMatrixObject::setPosition (const vertex& a) 714 void LDMatrixObject::setPosition (const vertex& a)
713 { changeProperty (linkPointer(), &m_position, LDSharedVertex::getSharedVertex (a)); 715 { changeProperty (getLinkPointer(), &m_position, LDSharedVertex::getSharedVertex (a));
714 } 716 }
715 717
716 // ============================================================================= 718 // =============================================================================
717 // ----------------------------------------------------------------------------- 719 // -----------------------------------------------------------------------------
718 READ_ACCESSOR (matrix, LDMatrixObject::transform) 720 void LDMatrixObject::setTransform (const matrix& val)
719 { return m_transform; 721 { changeProperty (getLinkPointer(), &m_Transform, val);
720 }
721
722 SET_ACCESSOR (matrix, LDMatrixObject::setTransform)
723 { changeProperty (linkPointer(), &m_transform, val);
724 } 722 }
725 723
726 // ============================================================================= 724 // =============================================================================
727 // ----------------------------------------------------------------------------- 725 // -----------------------------------------------------------------------------
728 static QMap<vertex, LDSharedVertex*> g_sharedVerts; 726 static QMap<vertex, LDSharedVertex*> g_sharedVerts;
757 } 755 }
758 756
759 // ============================================================================= 757 // =============================================================================
760 // ----------------------------------------------------------------------------- 758 // -----------------------------------------------------------------------------
761 void LDObject::select() 759 void LDObject::select()
762 { if (!file()) 760 { if (!getFile())
763 { log ("Warning: Object #%1 cannot be selected as it is not assigned a file!\n", id()); 761 { log ("Warning: Object #%1 cannot be selected as it is not assigned a file!\n", getID());
764 return; 762 return;
765 } 763 }
766 764
767 file()->addToSelection (this); 765 getFile()->addToSelection (this);
768 } 766 }
769 767
770 void LDObject::unselect() 768 void LDObject::unselect()
771 { if (!file()) 769 { if (!getFile())
772 { log ("Warning: Object #%1 cannot be unselected as it is not assigned a file!\n", id()); 770 { log ("Warning: Object #%1 cannot be unselected as it is not assigned a file!\n", getID());
773 return; 771 return;
774 } 772 }
775 773
776 file()->removeFromSelection (this); 774 getFile()->removeFromSelection (this);
777 } 775 }

mercurial