home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 41
/
Amiga_Dream_41.iso
/
Amiga
/
Pro
/
3d
/
ICoons1_0.lzh
/
icoons
/
source
/
move.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-10-12
|
13KB
|
446 lines
/* :ts=8 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include "general.h"
#include "globals.h"
#include "intui.h"
#include "timer.h"
#include "spl_math.h"
#include "spl_util.h"
#include "spl_gfx.h"
#include "move.h"
/* Get Stringinfo buffer for the Move gadget with id 'G': */
#define Get_Gadget_String(G) (((struct StringInfo *) \
(Move_GroupGadgets[G]->SpecialInfo))->Buffer)
/* Set string to 'S' in string gadget 'G': */
#define Set_Gadget_String(G, S) \
GT_SetGadgetAttrs(Move_GroupGadgets[G], \
Windows[W_Move_Group].Window, NULL, \
GTST_String, S)
static Boolean_T Move_Group_Active;
static short Old_X;
static short Old_Y;
static Vector_T Orig_Pos;
static Vector_T Box_Min, Box_Max;
void Set_Move_Group_Position(Vector_T Pos)
/************************************************************************/
/* */
/* Set move position gadgets to 'Pos'. */
/* */
/************************************************************************/
{
char Buffer[Buffer_Length+1];
if (Windows[W_Move_Group].Window == NULL) return;
sprintf(Buffer, " %.2lf", Pos[0]);
Set_Gadget_String(GDX_Move_Group_X_Value, Buffer);
sprintf(Buffer, " %.2lf", Pos[1]);
Set_Gadget_String(GDX_Move_Group_Y_Value, Buffer);
sprintf(Buffer, " %.2lf", Pos[2]);
Set_Gadget_String(GDX_Move_Group_Z_Value, Buffer);
} /* Set_Move_Group_Position */
static
void Move_Timeout()
/************************************************************************/
/* */
/* Function called when timer expires: Draw all splines. */
/* */
/************************************************************************/
{
Vector_T Distance;
if (Group_Mode) {
Distance[0] = Current_Pos[0] - Orig_Pos[0];
Distance[1] = Current_Pos[1] - Orig_Pos[1];
Distance[2] = Current_Pos[2] - Orig_Pos[2];
Points_Move(Distance);
}
Compute_Splines();
Clear_All(What_All);
Draw_All(What_All);
Redraw_Mask = 0;
Stop_Timer();
} /* Move_Timeout */
static
void Move_Redraw(long Mask)
/************************************************************************/
/* */
/* Function called to redraw screen while moving points. */
/* */
/************************************************************************/
{
Vector_T B_Min, B_Max;
if (Select_Point_Id >= 0) {
Set_Move_Group_Position(Points[Select_Point_Id].Pos);
KnotInfo_Show_Pos(Points[Select_Point_Id].Pos);
} /* if */
if (Group_Mode) {
B_Min[0] = Box_Min[0] + Current_Pos[0] - Orig_Pos[0];
B_Min[1] = Box_Min[1] + Current_Pos[1] - Orig_Pos[1];
B_Min[2] = Box_Min[2] + Current_Pos[2] - Orig_Pos[2];
B_Max[0] = Box_Max[0] + Current_Pos[0] - Orig_Pos[0];
B_Max[1] = Box_Max[1] + Current_Pos[1] - Orig_Pos[1];
B_Max[2] = Box_Max[2] + Current_Pos[2] - Orig_Pos[2];
Clear_Plane(3, What_All);
Draw_Box(B_Min, B_Max, NULL, DM_Plane, What_All);
Start_Timer(Delay_Draw_Seconds, Delay_Draw_Micros);
} else {
Point_Move(Select_Point_Id, Current_Pos);
Compute_Marked_Segments();
Clear_Plane(3, What_All);
Draw_Marked_Segments(DM_Plane, What_All);
} /* if .. else .. */
Redraw_Mask = 0;
} /* Move_Redraw */
static
void Move_Select_Up(short X, short Y)
/************************************************************************/
/* */
/* X, Y are the actual coordinates in the active window. */
/* */
/************************************************************************/
{
if (Group_Mode) {
/* If the timer hasn't expired, then call the timeout handler to*/
/* compute and draw the splines. */
if (!Check_Timer()) Move_Timeout();
} else {
if (Grid_Snap_Active) {
Current_Pos[0] = Points[Select_Point_Id].Pos[0];
Current_Pos[1] = Points[Select_Point_Id].Pos[1];
Current_Pos[2] = Points[Select_Point_Id].Pos[2];
Snap_To_Grid(Current_Pos);
} /* if */
Point_Move(Select_Point_Id, Current_Pos);
Compute_Marked_Segments();
Clear_Plane(3, What_All);
Draw_Marked_Segments(DM_Normal, What_All);
Draw_Knots(DM_Normal, What_All);
Set_RMBTrap(FALSE);
} /* if .. else .. */
Set_Mode_Normal();
} /* Move_Select_Up */
static
void Move_Select_Down(short X, short Y)
/************************************************************************/
/* */
/* X, Y are the actual coordinates in the active window. */
/* */
/************************************************************************/
{
Select_View_Id = Screen_To_World(X, Y, Current_Pos);
if (Select_View_Id < 0) return;
if (Get_Select_Bounding_Box(Box_Min, Box_Max)) {
Display_Message("No points selected");
return;
}
Draw_Box(Box_Min, Box_Max, NULL, DM_Plane, What_All);
Orig_Pos[0] = Current_Pos[0];
Orig_Pos[1] = Current_Pos[1];
Orig_Pos[2] = Current_Pos[2];
Old_X = X;
Old_Y = Y;
Move_Group_Active = TRUE;
} /* Move_Select_Down */
static
void Move_Move(short X, short Y)
/************************************************************************/
/* */
/* Function called when mouse is moved to move points. */
/* X, Y are the actual coordinates in the active window. */
/* */
/************************************************************************/
{
short View_Id;
if (Group_Mode && !Move_Group_Active) return;
View_Id = Screen_To_World(X, Y, Current_Pos);
if (View_Id != Select_View_Id) return;
if (Old_X == X && Old_Y == Y) return;
Old_X = X;
Old_Y = Y;
if (Redraw_Always) Move_Redraw(What_All);
else Redraw_Mask = What_All;
} /* Move_Move */
static
Boolean_T Move_Handle_Event(struct IntuiMessage *Msg)
/************************************************************************/
/* */
/* Event handler routine for the 'MOVE GROUP' mode. */
/* Events handled: */
/* Select down: Start move. */
/* Select up: Stop move. */
/* Mouse move: Change position. */
/* */
/************************************************************************/
{
switch (Msg->Class) {
case IDCMP_MOUSEBUTTONS:
/* Msg->Code contain id of button pressed */
/* Msg->MouseX and Msg->MouseY contain mouse position */
switch (Msg->Code) {
case SELECTDOWN:
Move_Select_Down(Msg->MouseX, Msg->MouseY);
return(TRUE);
case SELECTUP:
Move_Select_Up(Msg->MouseX, Msg->MouseY);
return(TRUE);
case MENUDOWN:
if (!Group_Mode) Command_Connect(); /* May return to normal mode */
} /* switch (Msg->Code) */
break;
case IDCMP_MOUSEMOVE:
Move_Move(Msg->MouseX, Msg->MouseY);
return(TRUE);
case IDCMP_VANILLAKEY:
switch(Msg->Code) {
case 'C': /* C */
if (!Group_Mode) Command_Combine();
return(TRUE);
} /* switch (Msg->Code) */
break;
} /* switch (Msg->Class) */
return(FALSE);
} /* Move_Handle_Event */
void Set_Mode_Move(short X, short Y)
/************************************************************************/
/* */
/* Start moving the currently selected point, or if GROUP MODE, then */
/* move all selected points. */
/* X, Y is the current mouse position. */
/* */
/************************************************************************/
{
short Point_Id;
short Tmp1, Tmp2;
Vector_T Current_Pos;
if (Select_Point_Id < 0 && !Group_Mode) return;
if (Select_Spline != NULL)
Set_Move_Group_Position(Points[Select_Point_Id].Pos);
KnotInfo_Show_Info(Select_Spline, Select_Knot);
Set_Window_Title(NULL);
Display_Status(NULL);
if (Group_Mode) {
Move_Group_Active = FALSE;
State.Handle_Event = Move_Handle_Event;
State.Timeout = Move_Timeout;
State.Redraw = Move_Redraw;
if (MQ_Size_Move_G > 0) {
SetMouseQueue(Windows[Id_Active_Window].Window, MQ_Size_Move_G);
Redraw_Always = TRUE;
} else Redraw_Always = FALSE;
Points_Save();
sprintf(Error_Msg, "Move group");
Display_Status(Error_Msg);
Move_Select_Down(X, Y);
} else {
State.Handle_Event = Move_Handle_Event;
State.Redraw = Move_Redraw;
Mark_Connected_Segments(Select_Point_Id);
Draw_Marked_Segments(DM_Erase, What_All);
Draw_Marked_Segments(DM_Plane, What_All);
Old_X = X; Old_Y = Y;
if (MQ_Size_Move > 0) {
SetMouseQueue(Windows[Id_Active_Window].Window, MQ_Size_Move);
Redraw_Always = TRUE;
} else Redraw_Always = FALSE;
/* Disable menu and receive RMBTraps */
Set_RMBTrap(TRUE);
sprintf(Error_Msg, "Move");
Display_Status(Error_Msg);
} /* if .. else .. */
} /* Set_Mode_Move */
void Handle_Move_Group_Move()
/************************************************************************/
/* */
/* Change to MOVE GROUP mode. */
/* */
/************************************************************************/
{
if (Select_Point_Id < 0) return;
Move_Group_Active = FALSE;
State.Handle_Event = Move_Handle_Event;
State.Timeout = Move_Timeout;
State.Redraw = Move_Redraw;
sprintf(Error_Msg, "Move group");
Display_Status(Error_Msg);
Points_Save();
} /* Handle_Move_Group_Move */
void Handle_Move_Group_X_Value()
/************************************************************************/
/* */
/* Handle a Move_Group_X_Value gadget event. */
/* */
/************************************************************************/
{
Vector_T Distance;
if (Windows[W_Move_Group].Window == NULL) return;
if (Select_Point_Id < 0) return;
Points_Save();
Distance[0] = atof(Get_Gadget_String(GDX_Move_Group_X_Value)) -
Points[Select_Point_Id].Pos[0];
Distance[1] = 0.0;
Distance[2] = 0.0;
Points_Move(Distance);
Move_Timeout(); /* Compute and draw splines */
} /* Handle_Move_Group_X_Value */
void Handle_Move_Group_Y_Value()
/************************************************************************/
/* */
/* Handle a Move_Group_Y_Value gadget event. */
/* */
/************************************************************************/
{
Vector_T Distance;
if (Windows[W_Move_Group].Window == NULL) return;
if (Select_Point_Id < 0) return;
Points_Save();
Distance[0] = 0.0;
Distance[1] = atof(Get_Gadget_String(GDX_Move_Group_Y_Value)) -
Points[Select_Point_Id].Pos[1];
Distance[2] = 0.0;
Points_Move(Distance);
Move_Timeout(); /* Compute and draw splines */
} /* Handle_Move_Group_Y_Value */
void Handle_Move_Group_Z_Value()
/************************************************************************/
/* */
/* Handle a Move_Group_Z_Value gadget event. */
/* */
/************************************************************************/
{
Vector_T Distance;
if (Windows[W_Move_Group].Window == NULL) return;
if (Select_Point_Id < 0) return;
Points_Save();
Distance[0] = 0.0;
Distance[1] = 0.0;
Distance[2] = atof(Get_Gadget_String(GDX_Move_Group_Z_Value)) -
Points[Select_Point_Id].Pos[2];
Points_Move(Distance);
Move_Timeout(); /* Compute and draw splines */
} /* Handle_Move_Group_Z_Value */