home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CDPD Public Domain Collection for CDTV 3
/
CDPDIII.bin
/
pd
/
graphics
/
3d
/
icoons
/
source
/
intui.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-20
|
36KB
|
1,375 lines
/* :ts=8 */
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include "general.h"
#include "globals.h"
#include "intui.h"
#include "spl_gfx.h"
#include "spl_util.h"
#include "timer.h"
#include "file.h"
#include "windows.h"
#include "commands.h"
#include "config.h"
#include "knotinfo.h"
#include "rotate_p.h"
#include "pan.h"
#include "center.h"
#include "group.h"
#include "scale_g.h"
#include "rotate_g.h"
#include "move.h"
#include "origin.h"
#include "render.h"
Window_Info_T Windows[Max_Nbr_Windows];
#ifdef NTSC
/* Positions of the four small views on the screen: */
View_T Views_Small[4] = {
341, 108, 633, 196, 0, 0, /* 0 = V_X : Y - Z */
25, 108, 317, 196, 0, 0, /* 1 = V_Y : X - Z */
25, 12, 317, 104, 0, 0, /* 2 = V_Z : X - Y */
341, 12, 633, 104, 0, 0 /* 3 = V_P : Persp */
};
/* Positions of the four big views on the screen: */
View_T Views_Big[4] = {
21, 12, 633, 196, 0, 0, /* 0 = V_X : Y - Z */
21, 12, 633, 196, 0, 0, /* 1 = V_Y : X - Z */
21, 12, 633, 196, 0, 0, /* 2 = V_Z : X - Y */
21, 12, 633, 196, 0, 0 /* 3 = V_P : Persp */
};
#else
/* Positions of the four small views on the screen: */
View_T Views_Small[4] = {
341, 131, 633, 247, 0, 0, /* 0 = V_X : Y - Z */
25, 131, 317, 247, 0, 0, /* 1 = V_Y : X - Z */
25, 12, 317, 128, 0, 0, /* 2 = V_Z : X - Y */
341, 12, 633, 128, 0, 0 /* 3 = V_P : Persp */
};
/* Positions of the four big views on the screen: */
View_T Views_Big[4] = {
21, 12, 633, 247, 0, 0, /* 0 = V_X : Y - Z */
21, 12, 633, 247, 0, 0, /* 1 = V_Y : X - Z */
21, 12, 633, 247, 0, 0, /* 2 = V_Z : X - Y */
21, 12, 633, 247, 0, 0 /* 3 = V_P : Persp */
};
#endif
/* The currently used views: */
View_T *Views = Views_Small;
Window_Id_T Id_Active_Window = W_Main;
/* Size of IDCMP mouse queue. If this is 0, then redraw will be */
/* done when there's no more messages waiting, otherwise redraw */
/* will be done whenever a mouse move event happens. */
unsigned long MQ_Size_KnotInfo = 2;
unsigned long MQ_Size_Rotate_P = 2;
unsigned long MQ_Size_Rotate_G = 2;
unsigned long MQ_Size_Scale_G = 2;
unsigned long MQ_Size_Move_G = 2;
unsigned long MQ_Size_Move = 0;
/* TRUE when redrawing for each mouse move event */
Boolean_T Redraw_Always;
struct MsgPort *User_Port = NULL;
static USHORT *Mouse_Image = NULL;
static USHORT *Busy_Image = NULL;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Library *GadToolsBase;
struct Library *AslBase;
#define Mouse_Image_Size 100
#define Busy_Image_Size 200
/* Global text buffer for error messages */
char Error_Msg[Buffer_Length+1];
/* Window title, this MUST be 80 characters long */
char Window_Title[] =
"ICoons ";
void Set_Window_Title(char *Title)
/************************************************************************/
/* */
/* Set the window title (first 40 chars) in the title bar. */
/* The remaining characters are reserved for messages. */
/* */
/* if 'Title' is NULL, reset the title to 'ICoons'. */
/* */
/************************************************************************/
{
int i;
char *Cp;
char Buffer[Buffer_Length+1];
if (Title == NULL) {
if (Select_Spline != NULL) {
sprintf(Buffer, "ICoons Id:%d %s %s",
Select_Point_Id,
Group_Mode ? "Group" : "",
Points_Hidden ? "H" : "");
} else {
sprintf(Buffer, "ICoons Id:NONE %s %s",
Group_Mode ? "Group" : "",
Points_Hidden ? "H" : "");
}
Title = Buffer;
}
for (i = 0, Cp = Title; i < 40 && *Cp != '\0'; i++,Cp++)
Window_Title[i] = *Cp;
while (i < 40) Window_Title[i++] = ' ';
SetWindowTitles(Windows[Id_Active_Window].Window,
Window_Title, (UBYTE *) -1);
} /* Set_Window_Title */
void Display_Status(char *Message)
/************************************************************************/
/* */
/* Show the text 'Message' in the last 40 characters of the title bar. */
/* if 'Message' is NULL, then remove any message. */
/* */
/************************************************************************/
{
int i;
char *Cp;
if (Message == NULL) {
for (i = 40; i < 80; i++) Window_Title[i] = ' ';
} else {
for (Cp = Message, i = 40; i < 80 && *Cp != '\0'; i++)
Window_Title[i] = *Cp++;
while (i < 80) Window_Title[i++] = ' ';
}
SetWindowTitles(Windows[Id_Active_Window].Window,
Window_Title, (UBYTE *) -1);
} /* Display_Status */
void Display_Message(char *Message)
/************************************************************************/
/* */
/* Show the text 'Message' to the user, and wait until he clicks a */
/* 'Continue' button. */
/* 'Message' may contain \n do denote new lines. */
/* */
/************************************************************************/
{
struct EasyStruct Requester;
Requester.es_StructSize = sizeof(struct EasyStruct);
Requester.es_Flags = 0;
Requester.es_Title = "ICoons";
Requester.es_TextFormat = Message;
Requester.es_GadgetFormat = "Continue";
(void) EasyRequest(Windows[Id_Active_Window].Window, &Requester, NULL);
} /* Display_Message */
void Display_Error_Message(char *Message)
/************************************************************************/
/* */
/* Show the text 'Message' to the user in an ALERT, and wait until he */
/* clicks a button. */
/* Only the first 60 characters of the message is shown. */
/* */
/************************************************************************/
{
UBYTE Buffer[Buffer_Length+1];
int Length;
int Pos;
Length = strlen(Message);
if (Length > 60) Length = 60;
Pos = 0;
Buffer[Pos++] = 0x00;
Buffer[Pos++] = 0x30; /* 16 bit X coordinate in pixels */
Buffer[Pos++] = 0x14; /* 8 bit Y coordinate in pixels */
strncpy(&Buffer[Pos], Message, Length); Pos += Length;
Buffer[Pos++] = '\0'; /* End of string */
Buffer[Pos] = '\0'; /* End of message */
(void) DisplayAlert(RECOVERY_ALERT, Buffer, /* Heigth = */ 42);
} /* Display_Message */
int Ask_Question(char *Question, char *Choices)
/************************************************************************/
/* */
/* Ask the question 'Question' and let him choose between the choices */
/* in 'Choices'. */
/* 'Question' may contain \n do denote new lines. */
/* The choices are separated with vertical bars (ex: "Ok|Cancel"). */
/* */
/* The function will return a number identifying the response: */
/* 1 for the leftmost button, 2 for the next button etc. AND */
/* 0 for the rightmost button (!!!!) */
/* */
/* Example: Ask_Question("Quit now?", "Yes|Maybe|No") */
/* will return 1 for YES 2 for MAYBE and 0 for NO. */
/* */
/************************************************************************/
{
struct EasyStruct Requester;
int Status;
Requester.es_StructSize = sizeof(struct EasyStruct);
Requester.es_Flags = 0;
Requester.es_Title = "ICoons";
Requester.es_TextFormat = Question;
Requester.es_GadgetFormat = Choices;
Status = EasyRequest(Windows[Id_Active_Window].Window, &Requester, NULL);
return(Status);
} /* Ask_Question */
static
void Windows_Init()
/************************************************************************/
/* */
/* Initialize the Windows array. */
/* */
/************************************************************************/
{
int i;
static Boolean_T Init_Done = FALSE;
if (Init_Done) return;
Init_Done = TRUE;
for (i = 0; i < Max_Nbr_Windows; i++) {
Windows[i].Window = NULL;
Windows[i].ViewPort = NULL;
Windows[i].RastPort = NULL;
} /* for */
Views = Views_Small;
for (i = 0; i < 4; i++) {
Views_Small[i].X_Center = (Views_Small[i].X_Min +
Views_Small[i].X_Max) / 2;
Views_Small[i].Y_Center = (Views_Small[i].Y_Min +
Views_Small[i].Y_Max) / 2;
Views_Big[i].X_Center = (Views_Big[i].X_Min +
Views_Big[i].X_Max) / 2;
Views_Big[i].Y_Center = (Views_Big[i].Y_Min +
Views_Big[i].Y_Max) / 2;
} /* for */
} /* Windows_Init */
static
void Set_Normal_Pointer(Window_Id_T Id)
/************************************************************************/
/* */
/* Define a custom pointer for the window defined by Id. */
/* */
/************************************************************************/
{
USHORT *M;
if (Windows[Id].Window == NULL) return;
if (Mouse_Image == NULL) {
Mouse_Image = (USHORT *) AllocMem(Mouse_Image_Size, MEMF_CHIP);
if (Mouse_Image == NULL) {
Display_Error_Message("Couldn't allocate memory");
CloseStuff();
exit(1);
}
M = Mouse_Image;
*M++ = 0x0000, *M++ = 0x0000;
/* plane 1, plane 2 */
*M++ = 0x0400; *M++ = 0x0400; /* Line 1 */
*M++ = 0x0400; *M++ = 0x0400; /* Line 2 */
*M++ = 0x0400; *M++ = 0x0400; /* Line 3 */
*M++ = 0x0400; *M++ = 0x0400; /* Line 4 */
*M++ = 0x0000; *M++ = 0x0000; /* Line 5 */
*M++ = 0xf5f0; *M++ = 0xf5f0; /* Line 6 */
*M++ = 0x0000; *M++ = 0x0000; /* Line 7 */
*M++ = 0x0400; *M++ = 0x0400; /* Line 8 */
*M++ = 0x0400; *M++ = 0x0400; /* Line 9 */
*M++ = 0x0400; *M++ = 0x0400; /* Line 10 */
*M++ = 0x0400; *M++ = 0x0400; /* Line 11 */
*M++ = 0x0000; *M++ = 0x0000;
}
switch (Id) {
case W_Main:
case W_ExpandedView:
SetPointer(Windows[Id].Window, Mouse_Image, 11, 11, -5, -5);
break;
default: /* Normal intuition pointer */
ClearPointer(Windows[Id].Window);
break;
} /* switch */
} /* Set_Normal_Pointer */
static
void Set_Busy_Pointer(Window_Id_T Id)
/************************************************************************/
/* */
/* Define a custom pointer for the window defined by Id. */
/* */
/************************************************************************/
{
USHORT *M;
if (Windows[Id].Window == NULL) return;
if (Busy_Image == NULL) {
Busy_Image = (USHORT *) AllocMem(Busy_Image_Size, MEMF_CHIP);
if (Busy_Image == NULL) {
Display_Error_Message("Couldn't allocate memory");
CloseStuff();
exit(1);
}
M = Busy_Image;
*M++ = 0x0000, *M++ = 0x0000;
/* plane 1, plane 2 */
*M++ = 0x0400; *M++ = 0x07c0; /* Line 1 */
*M++ = 0x0000; *M++ = 0x07c0; /* Line 2 */
*M++ = 0x0100; *M++ = 0x0380; /* Line 3 */
*M++ = 0x0000; *M++ = 0x07e0; /* Line 4 */
*M++ = 0x07c0; *M++ = 0x1ff8; /* Line 5 */
*M++ = 0x1ff0; *M++ = 0x3fec; /* Line 6 */
*M++ = 0x3ff8; *M++ = 0x7fde; /* Line 7 */
*M++ = 0x3ff8; *M++ = 0x7fbe; /* Line 8 */
*M++ = 0x7ffc; *M++ = 0xff7f; /* Line 9 */
*M++ = 0x7efc; *M++ = 0xffff; /* Line 10 */
*M++ = 0x7ffc; *M++ = 0xffff; /* Line 11 */
*M++ = 0x3ff8; *M++ = 0x7ffe; /* Line 12 */
*M++ = 0x3ff8; *M++ = 0x7ffe; /* Line 13 */
*M++ = 0x1ff0; *M++ = 0x3ffc; /* Line 14 */
*M++ = 0x07c0; *M++ = 0x1ff8; /* Line 15 */
*M++ = 0x0000; *M++ = 0x07e0; /* Line 16 */
*M++ = 0x0000; *M++ = 0x0000;
}
SetPointer(Windows[Id].Window, Busy_Image, 16, 16, -6, 0);
} /* Set_Busy_Pointer */
void Set_Pointer(Boolean_T Busy)
/************************************************************************/
/* */
/* Set pointer to busy pointer in all windows if 'Busy' is TRUE, other- */
/* set default pointer. */
/* */
/************************************************************************/
{
if (Busy) {
Set_Busy_Pointer(W_Config);
Set_Busy_Pointer(W_ExpandedView);
Set_Busy_Pointer(W_Move_Group);
Set_Busy_Pointer(W_Rotate_Group);
Set_Busy_Pointer(W_Scale_Group);
Set_Busy_Pointer(W_KnotInfo);
Set_Busy_Pointer(W_Main);
} else {
Set_Normal_Pointer(W_Config);
Set_Normal_Pointer(W_ExpandedView);
Set_Normal_Pointer(W_Move_Group);
Set_Normal_Pointer(W_Rotate_Group);
Set_Normal_Pointer(W_Scale_Group);
Set_Normal_Pointer(W_KnotInfo);
Set_Normal_Pointer(W_Main);
} /* if .. else .. */
} /* Set_Pointer */
void Set_RMBTrap(Boolean_T On)
/************************************************************************/
/* */
/* Activate or deactivate RMBTrap. */
/* */
/* If RMBTrap is active, then the menu is disabled, and the application */
/* can receive MENUDOWN and MENUUP events. */
/* */
/************************************************************************/
{
int i;
Forbid(); /* Disable multitasking while doing this (RKMLib p. 110) */
for (i = 0; i < Max_Nbr_Windows; i++) {
if (Windows[i].Window != NULL) {
if (On) Windows[i].Window->Flags |= WFLG_RMBTRAP;
else Windows[i].Window->Flags &= ~WFLG_RMBTRAP;
} /* if */
} /* for */
Permit();
} /* Set_RMBTrap */
void StripIntuiMessages(struct MsgPort *mp, struct Window *win)
/************************************************************************/
/* */
/* Function to remove and reply all IntuiMessages on a port that have */
/* been sent to a particular window. */
/* Taken from RKM:Libraries p. 255 */
/* */
/************************************************************************/
{
struct IntuiMessage *msg;
struct Node *succ;
msg = (struct IntuiMessage *)mp->mp_MsgList.lh_Head;
while (succ = msg->ExecMessage.mn_Node.ln_Succ) {
if (msg->IDCMPWindow == win) {
/* Intuition is about to free this message
** Make sure that we have politely sent it back.
*/
Remove( (struct Node *) msg);
ReplyMsg( (struct Message *) msg);
} /* if */
msg = (struct IntuiMessage *) succ;
} /* while */
} /* StripIntuiMessages */
void RemovePort(struct Window *win, Boolean_T Do_Free)
/************************************************************************/
/* */
/* Remove the userport from the window 'win'. */
/* If Do_Free is TRUE the port will be deleted. */
/* */
/************************************************************************/
{
/* We forbid here to keep out of race conditions with Intuition */
Forbid();
/* Send back any messages for this window that have not yet been
** processed.
*/
StripIntuiMessages(win->UserPort, win);
/* Clear UserPort so Intuition will not free it */
if (!Do_Free) win->UserPort = NULL;
ModifyIDCMP(win, 0L);
/* Turn multitasking back on */
Permit();
} /* RemovePort */
void Window_Close(Window_Id_T Id)
/************************************************************************/
/* */
/* */
/************************************************************************/
{
if (Windows[Id].Window == NULL) return;
switch (Id) {
case W_Main:
CloseMainWindow();
break;
case W_KnotInfo:
RemovePort(Windows[Id].Window, FALSE);
ClearMenuStrip(Windows[Id].Window);
CloseKnotInfoWindow();
break;
case W_Scale_Group:
RemovePort(Windows[Id].Window, FALSE);
ClearMenuStrip(Windows[Id].Window);
CloseScale_GroupWindow();
break;
case W_Rotate_Group:
RemovePort(Windows[Id].Window, FALSE);
ClearMenuStrip(Windows[Id].Window);
CloseRotate_GroupWindow();
break;
case W_Move_Group:
RemovePort(Windows[Id].Window, FALSE);
ClearMenuStrip(Windows[Id].Window);
CloseMove_GroupWindow();
break;
case W_ExpandedView:
RemovePort(Windows[Id].Window, FALSE);
ClearMenuStrip(Windows[Id].Window);
CloseExpandedViewWindow();
Id_Active_Window = W_Main;
break;
case W_Config:
RemovePort(Windows[Id].Window, FALSE);
ClearMenuStrip(Windows[Id].Window);
CloseConfigWindow();
break;
default:
sprintf(Error_Msg, "Unknown window id %d", Id);
Display_Error_Message(Error_Msg);
CloseStuff();
} /* switch */
Windows[ Id].Window = NULL;
} /* Window_Close */
void Window_Open(Window_Id_T Id)
/************************************************************************/
/* */
/* Open a window. The main window should always be opened first, as */
/* its UserPort is used for other windows. */
/* */
/************************************************************************/
{
long Status;
ULONG IDCMP_Flags;
if (Windows[Id].Window != NULL) return;
if (Id == W_Main) {
Status = OpenMainWindow();
if (Status != NULL) {
sprintf(Error_Msg, "Couldn't open window %d, Status = %d",
Id, Status);
Display_Error_Message(Error_Msg);
CloseStuff();
exit(1);
}
Windows[Id].Window = MainWnd;
User_Port = Windows[Id].Window->UserPort;
} else {
if (Windows[W_Main].Window == NULL) {
Display_Error_Message("Main window should be opened first.");
CloseStuff();
exit(1);
} /* if */
switch (Id) {
case W_KnotInfo:
Status = OpenKnotInfoWindow();
Windows[Id].Window = KnotInfoWnd;
break;
case W_Scale_Group:
Status = OpenScale_GroupWindow();
Windows[Id].Window = Scale_GroupWnd;
break;
case W_Rotate_Group:
Status = OpenRotate_GroupWindow();
Windows[Id].Window = Rotate_GroupWnd;
break;
case W_Move_Group:
Status = OpenMove_GroupWindow();
Windows[Id].Window = Move_GroupWnd;
break;
case W_ExpandedView:
Status = OpenExpandedViewWindow();
Windows[Id].Window = ExpandedViewWnd;
break;
case W_Config:
Status = OpenConfigWindow();
Windows[Id].Window = ConfigWnd;
break;
default:
sprintf(Error_Msg, "Unknown window id %d", Id);
Display_Error_Message(Error_Msg);
CloseStuff();
exit(1);
} /* switch */
if (Status != NULL) {
sprintf(Error_Msg, "Couldn't open window %d, Status = %d",
Id, Status);
Display_Error_Message(Error_Msg);
CloseStuff();
exit(1);
} /* if */
IDCMP_Flags = Windows[Id].Window->IDCMPFlags;
/* Remove and delete the old port: */
RemovePort(Windows[Id].Window, TRUE);
/* User same port as main window: */
Windows[Id].Window->UserPort = User_Port;
if (ModifyIDCMP(Windows[Id].Window, IDCMP_Flags) == NULL) {
Display_Error_Message("Couldn't modify IDCMP port\n");
CloseStuff();
exit(1);
} /* if */
/* Use same menu as on the main window for all windows */
SetMenuStrip(Windows[Id].Window, MainMenus);
} /* if .. else .. */
Windows[Id].RastPort = Windows[Id].Window->RPort;
Windows[Id].ViewPort = ViewPortAddress(Windows[Id].Window);
Set_Normal_Pointer(Id);
} /* Window_Open */
void CloseStuff()
/************************************************************************/
/* */
/* Close libraries, windows, screens etc. */
/* */
/* Free allocated memory. */
/* */
/************************************************************************/
{
Window_Close(W_Config);
Window_Close(W_ExpandedView);
Window_Close(W_Move_Group);
Window_Close(W_Rotate_Group);
Window_Close(W_Scale_Group);
Window_Close(W_KnotInfo);
Window_Close(W_Main); /* Should always be closed last! */
if (Mouse_Image != NULL) FreeMem(Mouse_Image, Mouse_Image_Size);
if (Busy_Image != NULL) FreeMem(Busy_Image, Busy_Image_Size);
CloseDownScreen();
if (GfxBase) CloseLibrary((struct Library *) GfxBase);
if (AslBase) CloseLibrary((struct Library *) AslBase);
if (GadToolsBase) CloseLibrary((struct Library *) GadToolsBase);
if (IntuitionBase) CloseLibrary((struct Library *) IntuitionBase);
Splines_Init();
Render_Cleanup();
} /* CloseStuff */
void OpenStuff()
/************************************************************************/
/* */
/* */
/************************************************************************/
{
long Status;
Windows_Init();
IntuitionBase =
(struct IntuitionBase*)OpenLibrary("intuition.library",37L);
if (IntuitionBase == NULL) {
Display_Error_Message("Couldn't open intuition.library");
CloseStuff();
exit(1);
} /* if */
GadToolsBase = (struct Library *)OpenLibrary("gadtools.library", 37L);
if (GadToolsBase == NULL) {
Display_Error_Message("Couldn't open gadtools.library");
CloseStuff();
exit(1);
} /* if */
AslBase = (struct Library *)OpenLibrary("asl.library", 37L);
if (AslBase == NULL) {
Display_Error_Message("Couldn't open asl.library");
CloseStuff();
exit(1);
} /* if */
GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L);
if (GfxBase == NULL) {
Display_Error_Message("Couldn't open graphics.library");
CloseStuff();
exit(1);
} /* if */
Status = SetupScreen();
if (Status != NULL) {
sprintf(Error_Msg, "Couldn't open screen, Status = %d", Status);
Display_Error_Message(Error_Msg);
CloseStuff();
exit(1);
}
ShowTitle(Scr, 0L); /* Put screen title behind backdrop */
Window_Open(W_Main); /* Should always be opened first ! */
Id_Active_Window = W_Main;
} /* OpenStuff */
void Finish()
/************************************************************************/
/* */
/* */
/************************************************************************/
{
struct IntuiMessage *Msg;
while ((Msg = GT_GetIMsg(User_Port)) != NULL) {
GT_ReplyIMsg(Msg);
} /* while */
CloseStuff();
} /* Finish */
void Clear_All(long What)
/************************************************************************/
/* */
/* Clear the drawing area. */
/* */
/************************************************************************/
{
SetAPen(Windows[Id_Active_Window].RastPort, Pen_Background);
SetDrMd(Windows[Id_Active_Window].RastPort, JAM2);
Windows[Id_Active_Window].RastPort->Mask = 0xff;
What &= What_Mask;
if (What & What_X) {
RectFill(Windows[Id_Active_Window].RastPort,
Views[V_X].X_Min, Views[V_X].Y_Min,
Views[V_X].X_Max, Views[V_X].Y_Max);
}
if (What & What_Y) {
RectFill(Windows[Id_Active_Window].RastPort,
Views[V_Y].X_Min, Views[V_Y].Y_Min,
Views[V_Y].X_Max, Views[V_Y].Y_Max);
}
if (What & What_Z) {
RectFill(Windows[Id_Active_Window].RastPort,
Views[V_Z].X_Min, Views[V_Z].Y_Min,
Views[V_Z].X_Max, Views[V_Z].Y_Max);
}
if (What & What_P) {
RectFill(Windows[Id_Active_Window].RastPort,
Views[V_P].X_Min, Views[V_P].Y_Min,
Views[V_P].X_Max, Views[V_P].Y_Max);
}
} /* Clear_All */
void Clear_Plane(int Plane, long What)
{
SetAPen(Windows[Id_Active_Window].RastPort, Pen_Background);
Windows[Id_Active_Window].RastPort->Mask = 1 << Plane;
SetDrMd(Windows[Id_Active_Window].RastPort, JAM2);
What &= What_Mask;
if (What & What_X) {
RectFill(Windows[Id_Active_Window].RastPort,
Views[V_X].X_Min, Views[V_X].Y_Min,
Views[V_X].X_Max, Views[V_X].Y_Max);
}
if (What & What_Y) {
RectFill(Windows[Id_Active_Window].RastPort,
Views[V_Y].X_Min, Views[V_Y].Y_Min,
Views[V_Y].X_Max, Views[V_Y].Y_Max);
}
if (What & What_Z) {
RectFill(Windows[Id_Active_Window].RastPort,
Views[V_Z].X_Min, Views[V_Z].Y_Min,
Views[V_Z].X_Max, Views[V_Z].Y_Max);
}
if (What & What_P) {
RectFill(Windows[Id_Active_Window].RastPort,
Views[V_P].X_Min, Views[V_P].Y_Min,
Views[V_P].X_Max, Views[V_P].Y_Max);
}
} /* Clear_Plane */
void Handle_Gadget_Event(struct IntuiMessage *Msg)
/************************************************************************/
/* */
/* Dispatcher for gadget events. */
/* */
/************************************************************************/
{
struct Gadget *Gad = (struct Gadget *) Msg->IAddress;
if (Msg->Code == 0x09) { /* TAB */
return;
}
else if (Msg->Code == 0x5f) { /* HELP */
return;
}
switch (Gad->GadgetID) {
case GD_G_X_Expand:
Command_X_Expand();
break;
case GD_G_Y_Expand:
Command_Y_Expand();
break;
case GD_G_Z_Expand:
Command_Z_Expand();
break;
case GD_G_Persp_Expand:
Command_Persp_Expand();
break;
case GD_G_Persp_Rotate:
case GD_G_Persp_Rotate_E:
Set_Mode_Rotate_P();
break;
case GD_G_Unexpand:
Command_Unexpand();
Window_Close(W_ExpandedView);
break;
/* KnotInfo window: */
case GD_G_Tension:
Handle_G_Tension();
break;
case GD_G_Tension_Value:
Handle_G_Tension_Value();
break;
case GD_G_Bias:
Handle_G_Bias();
break;
case GD_G_Bias_Value:
Handle_G_Bias_Value();
break;
case GD_G_Continuity:
Handle_G_Continuity();
break;
case GD_G_Continuity_Value:
Handle_G_Continuity_Value();
break;
/* Scale_Group window: */
case GD_Scale_Group_Factor:
Handle_Scale_Group_Factor();
break;
case GD_Scale_Group_Factor_Value:
Handle_Scale_Group_Factor_Value();
break;
/* Rotate_Group window: */
case GD_Rotate_Group_Axis:
Handle_Rotate_Group_Axis(Msg->Code);
break;
case GD_Rotate_Group_Angle:
Handle_Rotate_Group_Angle();
break;
case GD_Rotate_Group_Angle_Value:
Handle_Rotate_Group_Angle_Value();
break;
/* Move_Group window: */
case GD_Move_Group_X_Value:
Handle_Move_Group_X_Value();
break;
case GD_Move_Group_Y_Value:
Handle_Move_Group_Y_Value();
break;
case GD_Move_Group_Z_Value:
Handle_Move_Group_Z_Value();
break;
case GD_Move_Group_Move:
Handle_Move_Group_Move();
break;
} /* switch */
} /* Handle_Gadget_Event */
void Handle_Menu_Event(struct IntuiMessage *Msg)
/************************************************************************/
/* */
/* Dispatcher for menu events. */
/* */
/************************************************************************/
{
UWORD MenuNumber;
UWORD ItemNumber;
UWORD SubNumber;
if (Msg->Code == MENUNULL) return;
MenuNumber = MENUNUM(Msg->Code);
ItemNumber = ITEMNUM(Msg->Code);
SubNumber = SUBNUM(Msg->Code);
switch (MenuNumber) {
case 0: /* PROJECT */
switch (ItemNumber) {
case 0: /* About */
Command_About();
break;
case 1: /* New */
Command_New();
break;
case 2: /* Load */
switch (SubNumber) {
case 0: /* Icoons obj. */
Command_Load_Object();
break;
case 1: /* JMan obj. */
Command_Load_JMan_Object();
break;
} /* switch (SubNumber) */
break;
case 3: /* Save */
Command_Save_Object();
break;
case 4: /* Generate */
switch (SubNumber) {
case 0: /* TTDDD */
Command_Generate_TTDDD_File();
break;
} /* switch */
break;
case 5: /* Configuration*/
switch (SubNumber) {
case 0: /* Load */
Command_Load_Config();
break;
case 1: /* Save */
Command_Save_Config();
break;
case 2: /* Edit */
Edit_Configuration();
break;
} /* switch (SubNumber) */
break;
case 6: /* Quit */
Command_Quit();
break;
} /* switch (ItemNumber) */
break;
case 1: /* DISPLAY */
switch (ItemNumber) {
case 0: /* Zoom in */
Command_ZoomIn();
break;
case 1: /* Zoom out */
Command_ZoomOut();
break;
case 2: /* Center */
Set_Mode_Center();
break;
case 3: /* Rotate P. */
Set_Mode_Rotate_P();
break;
case 4: /* Pan */
Set_Mode_Pan();
break;
case 5: /* Grid */
Grid_Active = !Grid_Active;
Redraw_Mask |= What_All;
break;
case 6: /* Grid snap */
Grid_Snap_Active = !Grid_Snap_Active;
break;
case 7: /* Resolution */
switch (SubNumber) {
case 0: /* Up */
Command_Resolution_Up();
break;
case 1: /* Down */
Command_Resolution_Down();
break;
} /* switch */
break;
case 8: /* Redraw */
Redraw_Mask |= What_All;
break;
} /* switch (ItemNumber) */
break;
case 2: /* WINDOWS */
switch (ItemNumber) {
case 0: /* Knot */
Command_Show_KnotInfo();
break;
case 1: /* Scale G */
Command_Scale_Group();
break;
case 2: /* Rotate G */
Command_Rotate_Group();
break;
case 3: /* Move G */
Command_Move_Group();
break;
} /* switch (ItemNumber) */
break;
case 3: /* RENDER */
switch (ItemNumber) {
case 0: /* Mode */
switch (SubNumber) {
case 0: /* Line */
Rendering_Mode = RM_Line;
break;
case 1: /* Flat */
Rendering_Mode = RM_Flat;
break;
case 2: /* Gouraud */
Rendering_Mode = RM_Gouraud;
break;
case 3: /* Phong */
Rendering_Mode = RM_Phong;
break;
} /* switch */
break;
case 1: /* Render */
Render_Tesselate_Object();
break;
case 2: /* Re-render */
Render_Object();
break;
} /* switch (ItemNumber) */
break;
case 4: /* Select */
switch (ItemNumber) {
case 0: /* Toggle Group */
Set_Mode_Group();
break;
case 1: /* Toggle Spline*/
Command_Toggle_Select_Spline();
break;
case 2: /* Toggle All */
Command_Toggle_Select_All();
break;
case 3: /* Knot */
if (Select_Point_Id >= 0) {
Group_Mode = TRUE;
Set_Window_Title(NULL);
} /* if */
break;
case 4: /* Next */
Command_Select_Next();
break;
case 5: /* Deselect all */
Command_Deselect_All();
break;
} /* switch (ItemNumber) */
break;
case 5: /* Commands */
switch (ItemNumber) {
case 0: /* Add */
Command_Add();
break;
case 1: /* Combine */
Command_Combine();
break;
case 2: /* Cut */
Command_Cut();
break;
case 3: /* Delete */
Command_Delete();
break;
case 4: /* Disconnect */
Command_Disconnect();
break;
case 5: /* Hide */
Command_Hide();
break;
case 6: /* Move origin */
Set_Mode_Origin();
break;
} /* switch (ItemNumber) */
break;
} /* switch (MenuNum) */
} /* Handle_Menu_Event */
void Check_Event()
/************************************************************************/
/* */
/* Check for an event and handle it. */
/* */
/************************************************************************/
{
struct IntuiMessage *Msg_Ptr;
struct IntuiMessage Msg;
struct Gadget *Gad;
Boolean_T Event_Used;
WaitPort(User_Port);
while ((Msg_Ptr = GT_GetIMsg(User_Port)) != NULL) {
Msg = *Msg_Ptr;
GT_ReplyIMsg(Msg_Ptr);
switch (Msg.Class) {
case IDCMP_INTUITICKS:
if (Handle_IntuiTick_Message(&Msg)) State.Timeout();
break;
case IDCMP_REFRESHWINDOW:
GT_BeginRefresh(Msg.IDCMPWindow);
if (Msg.IDCMPWindow == Windows[W_Main].Window) MainRender();
if (Msg.IDCMPWindow == Windows[W_Config].Window) ConfigRender();
GT_EndRefresh(Msg.IDCMPWindow, TRUE);
break;
case IDCMP_CLOSEWINDOW:
if (Msg.IDCMPWindow == Windows[W_Main].Window) {
Command_Quit();
} else if (Msg.IDCMPWindow == Windows[W_KnotInfo].Window) {
Window_Close(W_KnotInfo);
} else if (Msg.IDCMPWindow == Windows[W_Scale_Group].Window) {
Window_Close(W_Scale_Group);
} else if (Msg.IDCMPWindow == Windows[W_Rotate_Group].Window) {
Window_Close(W_Rotate_Group);
} else if (Msg.IDCMPWindow == Windows[W_Move_Group].Window) {
Window_Close(W_Move_Group);
} else if (Msg.IDCMPWindow == Windows[W_ExpandedView].Window) {
Command_Unexpand();
Window_Close(W_ExpandedView);
} else if (Msg.IDCMPWindow == Windows[W_Config].Window) {
Window_Close(W_Config);
} /* if */
break;
case IDCMP_GADGETUP:
case IDCMP_GADGETDOWN:
Handle_Gadget_Event(&Msg);
break;
case IDCMP_MENUPICK:
Handle_Menu_Event(&Msg);
break;
default:
Event_Used = State.Handle_Event(&Msg);
if (Event_Used) break;
if (Msg.Class == IDCMP_MOUSEBUTTONS &&
Msg.Code == SELECTUP) Set_Mode_Normal();
break;
} /* switch */
} /* while */
if (Redraw_Mask) {
State.Redraw(Redraw_Mask);
Redraw_Mask = 0;
} /* if */
} /* Check_Event */
int Wait_For_Key()
/************************************************************************/
/* */
/* Wait until the user presses a key, and return it. */
/* */
/************************************************************************/
{
struct IntuiMessage *Msg_Ptr;
struct IntuiMessage Msg;
for (;;) {
WaitPort(User_Port);
while ((Msg_Ptr = GT_GetIMsg(User_Port)) != NULL) {
Msg = *Msg_Ptr;
GT_ReplyIMsg(Msg_Ptr);
if (Msg.Class == IDCMP_VANILLAKEY) return((int) Msg.Code);
} /* while */
} /* for (;;) */
} /* Wait_For_Key */