home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / graphics / 3d / icoons / source / scale_g.c < prev    next >
C/C++ Source or Header  |  1992-10-05  |  10KB  |  302 lines

  1. /* :ts=8 */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <math.h>
  7.  
  8. #include "general.h"
  9. #include "globals.h"
  10. #include "intui.h"
  11. #include "timer.h"
  12. #include "spl_math.h"
  13. #include "spl_util.h"
  14. #include "spl_gfx.h"
  15. #include "scale_g.h"
  16.  
  17. /* Get Stringinfo buffer for the Scale_Group gadget with id 'G':    */
  18. #define Get_Gadget_String(G) (((struct StringInfo *) \
  19.             (Scale_GroupGadgets[G]->SpecialInfo))->Buffer)
  20.  
  21.     /* Set string to 'S' in string gadget 'G':    */
  22. #define Set_Gadget_String(G, S) \
  23.         GT_SetGadgetAttrs(Scale_GroupGadgets[G], \
  24.             Windows[W_Scale_Group].Window, NULL, \
  25.             GTST_String, S)
  26.  
  27.     /* Set check state to  to 'On_Off' in check gadget 'G':    */
  28. #define Set_Gadget_State(G, On_Off) \
  29.         GT_SetGadgetAttrs(Scale_GroupGadgets[G], \
  30.             Windows[W_Scale_Group].Window, NULL, \
  31.             GTCB_Checked, (BOOL) (On_Off))
  32.  
  33.     /* Get gadget state for check gadget 'G':    */
  34. #define Get_Gadget_State(G) \
  35.         (Scale_GroupGadgets[G]->Flags & GFLG_SELECTED)
  36.  
  37. static Boolean_T    Scale_Group_Active;
  38. static short        Orig_Scale_Group_X;
  39. static short        Prev_Scale_Group_X;
  40. static double        Scale_Group_Factor;
  41. static Vector_T        Box_Min, Box_Max;
  42.  
  43. static
  44. void Set_Scale_Group_Factor_Value(double Factor)
  45. /************************************************************************/
  46. /*                                                                      */
  47. /* Set scale factor value gadget to 'Factor'.                */
  48. /*                                                                      */
  49. /************************************************************************/
  50. {
  51.     char Buffer[Buffer_Length+1];
  52.  
  53.     if (Windows[W_Scale_Group].Window == NULL) return;
  54.  
  55.     sprintf(Buffer, " %.2lf", Factor);
  56.     Set_Gadget_String(GDX_Scale_Group_Factor_Value, Buffer);
  57.  
  58. } /* Set_Scale_Group_Factor_Value */
  59.  
  60. static 
  61. void Scale_Group_Timeout()
  62. /************************************************************************/
  63. /*                                                                      */
  64. /* Function called when timer expires: Draw all splines.        */
  65. /*                                                                      */
  66. /************************************************************************/
  67. {    
  68.     Boolean_T    Do_Scale_Group_X;
  69.     Boolean_T    Do_Scale_Group_Y;
  70.     Boolean_T    Do_Scale_Group_Z;
  71.  
  72.     Do_Scale_Group_X =  Get_Gadget_State(GDX_Scale_Group_X);
  73.     Do_Scale_Group_Y =  Get_Gadget_State(GDX_Scale_Group_Y);
  74.     Do_Scale_Group_Z =  Get_Gadget_State(GDX_Scale_Group_Z);
  75.  
  76.     Points_Scale(Scale_Group_Factor, 
  77.          Do_Scale_Group_X, Do_Scale_Group_Y, Do_Scale_Group_Z);
  78.  
  79.     Compute_Splines();
  80.     Clear_All(What_All);
  81.     Draw_All(What_All);
  82.  
  83.     Redraw_Mask = 0;
  84.     Stop_Timer();
  85.  
  86. } /* Scale_Group_Timeout */
  87.  
  88. static 
  89. void Scale_Group_Redraw(long What)
  90. /************************************************************************/
  91. /*                                                                      */
  92. /* Function called to redraw screen while scaling points.        */
  93. /*                                                                      */
  94. /************************************************************************/
  95. {    
  96.     Boolean_T    Do_Scale_Group_X;
  97.     Boolean_T    Do_Scale_Group_Y;
  98.     Boolean_T    Do_Scale_Group_Z;
  99.     Vector_T    B_Min, B_Max;
  100.  
  101.     if (Windows[W_Scale_Group].Window == NULL) return;
  102.  
  103.     Set_Scale_Group_Factor_Value(Scale_Group_Factor);
  104.  
  105.     Do_Scale_Group_X =  Get_Gadget_State(GDX_Scale_Group_X);
  106.     Do_Scale_Group_Y =  Get_Gadget_State(GDX_Scale_Group_Y);
  107.     Do_Scale_Group_Z =  Get_Gadget_State(GDX_Scale_Group_Z);
  108.  
  109.     if (Do_Scale_Group_X) {
  110.     B_Min[0] = Scale_Group_Factor * Box_Min[0];
  111.     B_Max[0] = Scale_Group_Factor * Box_Max[0];
  112.     } else {
  113.     B_Min[0] = Box_Min[0];
  114.     B_Max[0] = Box_Max[0];
  115.     }
  116.     if (Do_Scale_Group_Y) {
  117.     B_Min[1] = Scale_Group_Factor * Box_Min[1];
  118.     B_Max[1] = Scale_Group_Factor * Box_Max[1];
  119.     } else {
  120.     B_Min[1] = Box_Min[1];
  121.     B_Max[1] = Box_Max[1];
  122.     }
  123.     if (Do_Scale_Group_Z) {
  124.     B_Min[2] = Scale_Group_Factor * Box_Min[2];
  125.     B_Max[2] = Scale_Group_Factor * Box_Max[2];
  126.     } else {
  127.     B_Min[2] = Box_Min[2];
  128.     B_Max[2] = Box_Max[2];
  129.     }
  130.  
  131.     Clear_Plane(3, What_All);
  132.     Draw_Box(B_Min, B_Max, NULL, DM_Plane, What_All);
  133.  
  134.     Start_Timer(Delay_Draw_Seconds, Delay_Draw_Micros);
  135.     Redraw_Mask = 0;
  136.  
  137. } /* Scale_Group_Redraw */
  138.  
  139. static
  140. void Scale_Group_Select_Up(short X, short Y)
  141. /************************************************************************/
  142. /*                                                                      */
  143. /* X, Y are the actual coordinates in the active window.        */
  144. /*                                                                      */
  145. /************************************************************************/
  146. {
  147.     /* If the timer hasn't expired, then call the timeout handler to*/
  148.     /* compute and draw the splines.                */
  149.  
  150.     if (!Check_Timer()) Scale_Group_Timeout();
  151.  
  152.     Set_Scale_Group_Factor_Value(1.0);
  153.     Set_Mode_Normal();
  154.  
  155. } /* Scale_Group_Select_Up */
  156.  
  157. static 
  158. void Scale_Group_Select_Down(short X, short Y)
  159. /************************************************************************/
  160. /*                                                                      */
  161. /* X, Y are the actual coordinates in the active window.        */
  162. /*                                                                      */
  163. /************************************************************************/
  164. {
  165.  
  166.     if (X < 0) return;
  167.     if (Get_Select_Bounding_Box(Box_Min, Box_Max)) {
  168.     Display_Message("No points selected");
  169.     return;
  170.     }
  171.     Draw_Box(Box_Min, Box_Max, NULL, DM_Plane, What_All);
  172.  
  173.     Scale_Group_Active = TRUE;
  174.  
  175.     Orig_Scale_Group_X = X;
  176.     Prev_Scale_Group_X = X;
  177.  
  178.     Scale_Group_Factor = 1.0;
  179.  
  180.     if (MQ_Size_Scale_G > 0) {
  181.     SetMouseQueue(Windows[Id_Active_Window].Window, MQ_Size_Scale_G); 
  182.     Redraw_Always = TRUE;
  183.     } else Redraw_Always = FALSE;
  184.  
  185. } /* Scale_Group_Select_Down */
  186.  
  187. static 
  188. void  Scale_Group_Move(short X, short Y)
  189. /************************************************************************/
  190. /*                                                                      */
  191. /* Function called when mouse is moved to scale points.            */
  192. /* X, Y are the actual coordinates in the active window.        */
  193. /*                                                                      */
  194. /************************************************************************/
  195. {
  196.     if (X < 0) return;
  197.  
  198.     if (!Scale_Group_Active) return;
  199.     if (ABS(X - Prev_Scale_Group_X) < 5) return;
  200.  
  201.     Scale_Group_Factor = (X - Orig_Scale_Group_X);
  202.     Scale_Group_Factor = 1.0 + (Scale_Group_Factor / 100.0);
  203.  
  204.     Prev_Scale_Group_X = X;
  205.  
  206.     if (Redraw_Always) Scale_Group_Redraw(What_All);
  207.     else               Redraw_Mask = What_All;
  208.  
  209. } /* Scale_Group_Move */
  210.  
  211. static
  212. Boolean_T Scale_Group_Handle_Event(struct IntuiMessage *Msg)
  213. /************************************************************************/
  214. /*                                                                      */
  215. /* Event handler routine for the 'SCALE GROUP' mode.            */
  216. /* Events handled:                            */
  217. /*    Select down: Start scaling.                    */
  218. /*    Select up  : Stop scaling.                    */
  219. /*    Mouse move : Change scale factor.                */
  220. /*                                                                      */
  221. /************************************************************************/
  222. {
  223.  
  224.     switch (Msg->Class) {
  225.  
  226.  
  227.     case IDCMP_MOUSEBUTTONS:
  228.         /* Msg->Code contain id of button pressed         */
  229.         /* Msg->MouseX and Msg->MouseY contain mouse position             */
  230.  
  231.     switch (Msg->Code) {
  232.  
  233.     case SELECTDOWN:
  234.         Scale_Group_Select_Down(Msg->MouseX, Msg->MouseY);
  235.         return(TRUE);
  236.  
  237.     case SELECTUP:
  238.         Scale_Group_Select_Up(Msg->MouseX, Msg->MouseY);
  239.         return(TRUE);
  240.  
  241.     } /* switch (Msg->Code) */
  242.     break;
  243.  
  244.     case IDCMP_MOUSEMOVE:
  245.     Scale_Group_Move(Msg->MouseX, Msg->MouseY);
  246.     return(TRUE);
  247.  
  248.     } /* switch (Msg->Class) */
  249.  
  250.     return(FALSE);
  251.  
  252. } /* Scale_Group_Handle_Event */
  253.  
  254. void Handle_Scale_Group_Factor()
  255. /************************************************************************/
  256. /*                                                                      */
  257. /* Change to SCALE GROUP mode.                        */
  258. /*                                                                      */
  259. /************************************************************************/
  260. {
  261.     if (Windows[W_Scale_Group].Window == NULL) return;
  262.  
  263.     Scale_Group_Active        = FALSE;
  264.     State.Handle_Event        = Scale_Group_Handle_Event;
  265.     State.Timeout        = Scale_Group_Timeout;
  266.     State.Redraw        = Scale_Group_Redraw;
  267.  
  268.     sprintf(Error_Msg, "Scale group");
  269.     Display_Status(Error_Msg);
  270.  
  271.     Points_Save();
  272.  
  273. } /* Handle_Scale_Group_Factor */
  274.  
  275. void Handle_Scale_Group_Factor_Value()
  276. /************************************************************************/
  277. /*                                                                      */
  278. /* Handle a Scale_Group_Factor_Value gadget event.            */
  279. /*                                                                      */
  280. /************************************************************************/
  281. {
  282.     Boolean_T    Do_Scale_Group_X;
  283.     Boolean_T    Do_Scale_Group_Y;
  284.     Boolean_T    Do_Scale_Group_Z;
  285.  
  286.     if (Windows[W_Scale_Group].Window == NULL) return;
  287.  
  288.     Points_Save();
  289.     Scale_Group_Factor = atof(Get_Gadget_String(GDX_Scale_Group_Factor_Value));
  290.     Do_Scale_Group_X   =  Get_Gadget_State(GDX_Scale_Group_X);
  291.     Do_Scale_Group_Y   =  Get_Gadget_State(GDX_Scale_Group_Y);
  292.     Do_Scale_Group_Z   =  Get_Gadget_State(GDX_Scale_Group_Z);
  293.  
  294.     Points_Scale(Scale_Group_Factor, 
  295.              Do_Scale_Group_X, Do_Scale_Group_Y, Do_Scale_Group_Z);
  296.  
  297.     Scale_Group_Timeout(); /* Compute and draw the splines */
  298.  
  299.     Set_Scale_Group_Factor_Value(1.0);
  300.  
  301. } /* Handle_Scale_Group_Factor_Value */
  302.