home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / developm / source / macraysh.sit / Code / Source / mactrans.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-08  |  3.8 KB  |  151 lines

  1. /*
  2.  * Mactrans.c
  3.  */
  4.  
  5. #include <MacHeaders>
  6. #include <Windows.h>
  7. #include <QuickDraw.h>
  8. #include <Controls.h>
  9. #include <Dialogs.h>
  10. #include <Types.h>
  11.  
  12. #include "geom.h"
  13.  
  14. #include "rotate.h"
  15. #include "scale.h"
  16. #include "translate.h"
  17.  
  18. #include "macmodify.h"
  19. #include "maceditor.h"
  20. #include "macdialog.h"
  21.  
  22. extern DialogPtr editorDialog ;
  23. extern Geom *Objects ;            /* Named objects */
  24. extern Geom *World;
  25.  
  26. void PostTransform(Geom *obj, Trans *trans)
  27. {
  28.     Trans *TransHead, *TransTail;
  29.  
  30.     TransHead = obj->trans;
  31.     TransTail = obj->transtail;
  32.  
  33.     TransPropagate(trans);
  34.     if (TransHead == (Trans *)NULL) {
  35.         /* we're the list, head and tail */
  36.         TransHead = TransTail = trans;
  37.     } else {
  38.         if (trans->animated || TransTail->animated) {
  39.             /* new tail */
  40.             trans->prev = TransTail;
  41.             TransTail->next = trans;
  42.             TransTail = trans;
  43.         } else {
  44.             /* collapse with tail */
  45.             TransCompose(TransTail, trans, TransTail);
  46.             TransFree(trans);
  47.         }
  48.     }
  49.     obj->trans = TransHead;
  50.     obj->transtail = TransTail;
  51. }
  52.  
  53. Trans *EditTransforms(Geom *obj)
  54. {
  55.     GrafPtr currPort;
  56.     Geom dummyobject ;
  57.     ControlHandle itemHandle ;
  58.     Rect itemRect, bounds ;
  59.     DialogPtr transDialog ;
  60.     short hitItem, itemType, loop ;
  61.     char exit = 0 ;
  62.     Trans *trans;
  63.     Rotate rot;
  64.     Scale sca;
  65.     Translate tra;
  66.  
  67.     int type ;
  68.  
  69.     transDialog = GetNewDialog(transdialogR, 0L, (WindowPtr)-1) ;
  70.     /* Turn our user item into a transform list */
  71.     DrawDialog(transDialog) ;
  72.     DrawHilite(transDialog,transdoneBU) ;
  73.     GetPort(&currPort);
  74.     SetPort(transDialog);
  75.     
  76.     /* Some Default values */
  77.     SetFloatEditText(transDialog,transxaxisET,0.);
  78.     SetFloatEditText(transDialog,transyaxisET,0.);
  79.     SetFloatEditText(transDialog,transzaxisET,1.);
  80.     SetFloatEditText(transDialog,transthetaET,0.);
  81.  
  82.     SetFloatEditText(transDialog,transscalexET,1.);
  83.     SetFloatEditText(transDialog,transscaleyET,1.);
  84.     SetFloatEditText(transDialog,transscalezET,1.);
  85.     
  86.     SetFloatEditText(transDialog,transtransxET,0.);
  87.     SetFloatEditText(transDialog,transtransyET,0.);
  88.     SetFloatEditText(transDialog,transtranszET,0.);
  89.  
  90.     if(!obj->trans) {
  91.         obj->trans = TransScaleCreate();
  92.         obj->transtail = obj->trans;
  93.     }
  94.     do {
  95.         ModalDialog((ModalFilterProcPtr)NULL, &hitItem) ;
  96.         switch(hitItem) {
  97.             case transdoneBU:
  98.                 exit = 1 ;
  99.                 break ;
  100.             case transresetBU:
  101.                 MatrixInit(&(obj->trans)->trans);
  102.                 MatrixInit(&(obj->trans)->itrans);
  103.                 SetPort(editorDialog);
  104.                 InvalRect(&editorDialog->portRect) ;
  105.                 SetPort(transDialog);
  106.                 break;
  107.             case transaddrotateBU:
  108.                 if(GetFloatEditText(transDialog,transxaxisET,&rot.x) &&
  109.                         GetFloatEditText(transDialog,transyaxisET,&rot.y) &&
  110.                         GetFloatEditText(transDialog,transzaxisET,&rot.z) &&
  111.                         GetFloatEditText(transDialog,transthetaET,&rot.theta)) {
  112.                     trans = TransRotateCreate();
  113.                     *((Rotate *)trans->tr) = rot;
  114.                     PostTransform(obj,trans);
  115.                     SetPort(editorDialog);
  116.                     InvalRect(&editorDialog->portRect) ;
  117.                     SetPort(transDialog);
  118.                 }
  119.                 break;
  120.             case transaddscaleBU:
  121.                 if(GetFloatEditText(transDialog,transscalexET,&sca.x) &&
  122.                         GetFloatEditText(transDialog,transscaleyET,&sca.y) &&
  123.                         GetFloatEditText(transDialog,transscalezET,&sca.z)) {
  124.                     trans = TransScaleCreate();
  125.                     *((Scale *)trans->tr) = sca;
  126.                     PostTransform(obj,trans);
  127.                     SetPort(editorDialog);
  128.                     InvalRect(&editorDialog->portRect) ;
  129.                     SetPort(transDialog);
  130.                 }
  131.                 break;
  132.             case transaddtranslateBU:
  133.                 if(GetFloatEditText(transDialog,transtransxET,&tra.x) &&
  134.                         GetFloatEditText(transDialog,transtransyET,&tra.y) &&
  135.                         GetFloatEditText(transDialog,transtranszET,&tra.z)) {
  136.                     trans = TransTranslateCreate();
  137.                     *((Translate *)trans->tr) = tra;
  138.                     PostTransform(obj,trans);
  139.                     SetPort(editorDialog);
  140.                     InvalRect(&editorDialog->portRect) ;
  141.                     SetPort(transDialog);
  142.                 }
  143.                 break;
  144.         }
  145.     } while (!exit) ;
  146.     DisposDialog(transDialog) ;
  147.     SetPort(editorDialog);
  148.     InvalRect(&editorDialog->portRect) ;
  149.     SetPort(currPort);
  150. }
  151.