home *** CD-ROM | disk | FTP | other *** search
- /*
- * Mactrans.c
- */
-
- #include <MacHeaders>
- #include <Windows.h>
- #include <QuickDraw.h>
- #include <Controls.h>
- #include <Dialogs.h>
- #include <Types.h>
-
- #include "geom.h"
-
- #include "rotate.h"
- #include "scale.h"
- #include "translate.h"
-
- #include "macmodify.h"
- #include "maceditor.h"
- #include "macdialog.h"
-
- extern DialogPtr editorDialog ;
- extern Geom *Objects ; /* Named objects */
- extern Geom *World;
-
- void PostTransform(Geom *obj, Trans *trans)
- {
- Trans *TransHead, *TransTail;
-
- TransHead = obj->trans;
- TransTail = obj->transtail;
-
- TransPropagate(trans);
- if (TransHead == (Trans *)NULL) {
- /* we're the list, head and tail */
- TransHead = TransTail = trans;
- } else {
- if (trans->animated || TransTail->animated) {
- /* new tail */
- trans->prev = TransTail;
- TransTail->next = trans;
- TransTail = trans;
- } else {
- /* collapse with tail */
- TransCompose(TransTail, trans, TransTail);
- TransFree(trans);
- }
- }
- obj->trans = TransHead;
- obj->transtail = TransTail;
- }
-
- Trans *EditTransforms(Geom *obj)
- {
- GrafPtr currPort;
- Geom dummyobject ;
- ControlHandle itemHandle ;
- Rect itemRect, bounds ;
- DialogPtr transDialog ;
- short hitItem, itemType, loop ;
- char exit = 0 ;
- Trans *trans;
- Rotate rot;
- Scale sca;
- Translate tra;
-
- int type ;
-
- transDialog = GetNewDialog(transdialogR, 0L, (WindowPtr)-1) ;
- /* Turn our user item into a transform list */
- DrawDialog(transDialog) ;
- DrawHilite(transDialog,transdoneBU) ;
- GetPort(&currPort);
- SetPort(transDialog);
-
- /* Some Default values */
- SetFloatEditText(transDialog,transxaxisET,0.);
- SetFloatEditText(transDialog,transyaxisET,0.);
- SetFloatEditText(transDialog,transzaxisET,1.);
- SetFloatEditText(transDialog,transthetaET,0.);
-
- SetFloatEditText(transDialog,transscalexET,1.);
- SetFloatEditText(transDialog,transscaleyET,1.);
- SetFloatEditText(transDialog,transscalezET,1.);
-
- SetFloatEditText(transDialog,transtransxET,0.);
- SetFloatEditText(transDialog,transtransyET,0.);
- SetFloatEditText(transDialog,transtranszET,0.);
-
- if(!obj->trans) {
- obj->trans = TransScaleCreate();
- obj->transtail = obj->trans;
- }
- do {
- ModalDialog((ModalFilterProcPtr)NULL, &hitItem) ;
- switch(hitItem) {
- case transdoneBU:
- exit = 1 ;
- break ;
- case transresetBU:
- MatrixInit(&(obj->trans)->trans);
- MatrixInit(&(obj->trans)->itrans);
- SetPort(editorDialog);
- InvalRect(&editorDialog->portRect) ;
- SetPort(transDialog);
- break;
- case transaddrotateBU:
- if(GetFloatEditText(transDialog,transxaxisET,&rot.x) &&
- GetFloatEditText(transDialog,transyaxisET,&rot.y) &&
- GetFloatEditText(transDialog,transzaxisET,&rot.z) &&
- GetFloatEditText(transDialog,transthetaET,&rot.theta)) {
- trans = TransRotateCreate();
- *((Rotate *)trans->tr) = rot;
- PostTransform(obj,trans);
- SetPort(editorDialog);
- InvalRect(&editorDialog->portRect) ;
- SetPort(transDialog);
- }
- break;
- case transaddscaleBU:
- if(GetFloatEditText(transDialog,transscalexET,&sca.x) &&
- GetFloatEditText(transDialog,transscaleyET,&sca.y) &&
- GetFloatEditText(transDialog,transscalezET,&sca.z)) {
- trans = TransScaleCreate();
- *((Scale *)trans->tr) = sca;
- PostTransform(obj,trans);
- SetPort(editorDialog);
- InvalRect(&editorDialog->portRect) ;
- SetPort(transDialog);
- }
- break;
- case transaddtranslateBU:
- if(GetFloatEditText(transDialog,transtransxET,&tra.x) &&
- GetFloatEditText(transDialog,transtransyET,&tra.y) &&
- GetFloatEditText(transDialog,transtranszET,&tra.z)) {
- trans = TransTranslateCreate();
- *((Translate *)trans->tr) = tra;
- PostTransform(obj,trans);
- SetPort(editorDialog);
- InvalRect(&editorDialog->portRect) ;
- SetPort(transDialog);
- }
- break;
- }
- } while (!exit) ;
- DisposDialog(transDialog) ;
- SetPort(editorDialog);
- InvalRect(&editorDialog->portRect) ;
- SetPort(currPort);
- }
-