ULONG csg(ULONG *arg) { int operation; void *csg; rsiResult err; err = rsiCreateCSG(CTXT, &csg); if(err) return err; if(arg[0]) { if(KEYWORD((char*)arg[0], "UNION")) operation = rsiFCSGUnion; else if(KEYWORD((char*)arg[0], "INTERSECTION")) operation = rsiFCSGIntersection; else if(KEYWORD((char*)arg[0], "DIFFERENCE")) operation = rsiFCSGDifference; else return ERROR_CSGOPERATOR; err = rsiSetCSG(CTXT, csg, rsiTCSGOperator, operation, rsiTDone); if(err) return err; } if(arg[1]) { err = rsiSetCSG(CTXT, csg, rsiTCSGFlags, rsiFCSGInverted, rsiTDone); if(err) return err; } if(insideCSG > 0) { SetCSGObject(csg); insideCSG--; } if(!AddCSGItem(csg)) return ERROR_MEM; insideCSG += 2; return rsiERR_NONE; }
/************* * FUNCTION: SetCSGObject * DESCRIPTION: Set one object for a CSG object * INPUT: obj object * OUTPUT: TRUE if ok else FALSE *************/ BOOL SetCSGObject(void *obj) { CSGSTACK *next; rsiResult err; if(!root) return FALSE; if(root->first) { #if defined(__PPC__) && defined(LIB_ARG) err = rsiSetCSG(RayStormBase, rc, root->csg, rsiTCSGObject1, obj, rsiTDone); #else err = rsiSetCSG(rc, root->csg, rsiTCSGObject1, obj, rsiTDone); #endif if(err) return FALSE; root->first = FALSE; } else { #if defined(__PPC__) && defined(LIB_ARG) err = rsiSetCSG(RayStormBase, rc, root->csg, rsiTCSGObject2, obj, rsiTDone); #else err = rsiSetCSG(rc, root->csg, rsiTCSGObject2, obj, rsiTDone); #endif if(err) return FALSE; next = root->next; delete root; root = next; } return TRUE; }