/***********************************************************************/ /* Open Visualization Data Explorer */ /* (C) Copyright IBM Corp. 1989,1999 */ /* ALL RIGHTS RESERVED */ /* This code licensed under the */ /* "IBM PUBLIC LICENSE - Open Visualization Data Explorer" */ /***********************************************************************/ /* * $Header: /home/gda/dxcvs/dx/src/exec/dxmods/rotate.c,v 1.3 1999/05/10 15:45:30 gda Exp $ */ #include #include #include static int getdim(Object dimo, int *dim); static int getmatrix(int dim, float deg, Matrix *m); /* should the default rotation be 90? */ #define DEF_AXIS 1 #define DEF_DEG 0.0 #define MAXINPUTS 45 /* obj + 2 inputs w/defaults + 2 w/o + 20 repeat pairs */ int m_Rotate(Object *in, Object *out) { float deg = DEF_DEG; int i, dim = DEF_AXIS; int seen_null = 0; int say_warn = 0; Object xformed = NULL; Matrix m; out[0] = NULL; if (!in[0]) { DXSetError(ERROR_BAD_PARAMETER, "#10000", "input"); return ERROR; } i = 1; /* handle the first 2 parameters because they have default values. */ if (!in[1] || !in[2]) { if (in[1] && !getdim(in[1], &dim)) return ERROR; if (in[2] && !DXExtractFloat(in[2], °)) { DXSetError(ERROR_BAD_PARAMETER, "#10080", "rotation"); return ERROR; } if (!getmatrix(dim, deg, &m)) return ERROR; xformed = (Object)DXNewXform(in[0], m); if (!xformed) return ERROR; /* start at 3rd parm */ i = 3; } /* parse rest of parms in pairs: axis letter, number of degrees * if either of the first two parms was null, this loop starts at 3. * otherwise it starts at 1. */ for ( ; i 3) goto error; } else goto error; return OK; error: DXErrorReturn(ERROR_BAD_PARAMETER, "axis must be X, Y, Z or 0, 1, 2"); } static int getmatrix(int dim, float deg, Matrix *m) { /* set rotation matrix */ switch (dim) { case 0: *m = DXRotateX(deg * DEG); break; case 1: *m = DXRotateY(deg * DEG); break; case 2: *m = DXRotateZ(deg * DEG); break; default: DXSetError(ERROR_BAD_PARAMETER, "axis must be X, Y, Z or 0, 1, 2"); return ERROR; } return OK; }