void Destroy_Parametric(OBJECT* Object) { Destroy_Transform(((PARAMETRIC *)Object)->Trans); Destroy_Function(((PARAMETRIC *)Object)->Function[0]); Destroy_Function(((PARAMETRIC *)Object)->Function[1]); Destroy_Function(((PARAMETRIC *)Object)->Function[2]); Destroy_PrecompParVal(((PARAMETRIC *)Object)->PData); POV_FREE(Object); }
void Destroy_IsoSurface(OBJECT* Object) { ISOSURFACE *Isosrf = (ISOSURFACE *)Object; ISO_Max_Gradient *mginfo = Isosrf->mginfo; mginfo->refcnt--; mginfo->gradient = max(Isosrf->gradient, mginfo->gradient); mginfo->max_gradient = max(Isosrf->max_gradient, mginfo->max_gradient); if((Stage == STAGE_SHUTDOWN) && (mginfo->refcnt == 0)) { FunctionCode *fn = POVFPU_GetFunction(*(Isosrf->Function)); if(fn != NULL) { if(Isosrf->eval == false) { // Only show the warning if necessary! // BTW, not being too picky here is a feature and not a bug ;-) [trf] if((mginfo->gradient > EPSILON) && (mginfo->max_gradient > EPSILON)) { DBL diff = mginfo->max_gradient - mginfo->gradient; DBL prop = fabs(mginfo->max_gradient / mginfo->gradient); if(((prop <= 0.9) && (diff <= -0.5)) || (((prop <= 0.95) || (diff <= -0.1)) && (mginfo->max_gradient < 10.0))) { WarningAt(0, fn->filename, fn->filepos.lineno, fn->filepos.offset, "The maximum gradient found was %0.3f, but max_gradient of the\n" "isosurface was set to %0.3f. The isosurface may contain holes!\n" "Adjust max_gradient to get a proper rendering of the isosurface.", (float)(mginfo->gradient), (float)(mginfo->max_gradient)); } else if((diff >= 10.0) || ((prop >= 1.1) && (diff >= 0.5))) { WarningAt(0, fn->filename, fn->filepos.lineno, fn->filepos.offset, "The maximum gradient found was %0.3f, but max_gradient of\n" "the isosurface was set to %0.3f. Adjust max_gradient to\n" "get a faster rendering of the isosurface.", (float)(mginfo->gradient), (float)(mginfo->max_gradient)); } } } else { DBL diff = (mginfo->eval_max / max(mginfo->eval_max - mginfo->eval_var, EPSILON)); if((Isosrf->eval_param[0] > mginfo->eval_max) || (Isosrf->eval_param[1] > diff)) { mginfo->eval_cnt = max(mginfo->eval_cnt, 1.0); // make sure it won't be zero WarningAt(0, fn->filename, fn->filepos.lineno, fn->filepos.offset, "Evaluate found a maximum gradient of %0.3f and an average\n" "gradient of %0.3f. The maximum gradient variation was %0.3f.\n", (float)(mginfo->eval_max), (float)(mginfo->eval_gradient_sum / mginfo->eval_cnt), (float)(mginfo->eval_var)); if(opts.Options & VERBOSE) { diff = max(diff, 1.0); // prevent contradicting output Debug_Info("It is recommended to adjust the parameters of 'evaluate' to:\n" "First parameter less than %0.3f\n" "Second parameter less than %0.3f and greater than 1.0\n" "Third parameter greater than %0.3f and less than 1.0\n", (float)(mginfo->eval_max), (float)(diff), (float)(1.0 / diff)); } } } } } if(mginfo->refcnt == 0) POV_FREE(mginfo); Destroy_Function(Isosrf->Function); Destroy_Transform(Isosrf->Trans); POV_FREE(Object); }