HIDDEN int envmap_setup(register struct region *rp, struct bu_vls *matparm, void **UNUSED(dpp), const struct mfuncs *UNUSED(mfp), struct rt_i *rtip) { struct mfuncs *shaders = MF_NULL; BU_CK_VLS(matparm); RT_CK_RTI(rtip); if (env_region.reg_mfuncs) { bu_log("envmap_setup: second environment map ignored\n"); return 0; /* drop region */ } env_region = *rp; /* struct copy */ /* Get copies of, or eliminate, references to dynamic structures */ env_region.reg_name = bu_strdup(rp->reg_name); env_region.reg_treetop = TREE_NULL; env_region.l.forw = BU_LIST_NULL; env_region.l.back = BU_LIST_NULL; env_region.reg_mfuncs = (char *)0; env_region.reg_mater.ma_shader = bu_vls_strdup(matparm); /* get list of available shaders */ if (!shaders) { optical_shader_init(&shaders); } if (mlib_setup(&shaders, &env_region, rtip) < 0) bu_log("envmap_setup() material '%s' failed\n", env_region.reg_mater.ma_shader); return 0; /* This region should be dropped */ }
/* * Go poke the rgb values of a region, on the fly. * This does not update the inmemory database, * so any changes will vanish on next re-prep unless other measures * are taken. */ int sh_directchange_shader(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc, const char *argv[]) { long int rtip_val; struct rt_i *rtip; struct region *regp; struct directory *dp; struct bu_vls shader = BU_VLS_INIT_ZERO; if ( argc < 4 ) { Tcl_AppendResult(interp, "Usage: sh_directchange_shader $rtip comb shader_arg(s)\n", NULL); return TCL_ERROR; } rtip_val = atol(argv[1]); rtip = (struct rt_i *)rtip_val; RT_CK_RTI(rtip); if ( rtip->needprep ) { Tcl_AppendResult(interp, "rt_prep() hasn't been called yet, error.\n", NULL); return TCL_ERROR; } if ( (dp = db_lookup( rtip->rti_dbip, argv[2], LOOKUP_NOISY)) == RT_DIR_NULL ) { Tcl_AppendResult(interp, argv[2], ": not found\n", NULL); return TCL_ERROR; } bu_vls_from_argv(&shader, argc-3, argv+3); bu_vls_trimspace(&shader); /* Find all region names which match /comb/ pattern */ for ( BU_LIST_FOR( regp, region, &rtip->HeadRegion ) ) { /* if ( dp->d_flags & RT_DIR_REGION ) { */ /* name will occur at end of region string w/leading slash */ /* } else { */ /* name will occur anywhere, bracketed by slashes */ /* } */ /* XXX quick hack */ if ( strstr( regp->reg_name, argv[2] ) == NULL ) continue; /* Modify the region's shader string */ bu_log("sh_directchange_shader() changing %s\n", regp->reg_name); if ( regp->reg_mater.ma_shader ) bu_free( (void *)regp->reg_mater.ma_shader, "reg_mater.ma_shader"); regp->reg_mater.ma_shader = bu_vls_strdup(&shader); /* Update the shader */ mlib_free(regp); if ( mlib_setup( &mfHead, regp, rtip ) != 1 ) { Tcl_AppendResult(interp, regp->reg_name, ": mlib_setup() failure\n", NULL); } } bu_vls_free(&shader); return TCL_OK; }
/** * b u _ v l s _ s t r g r a b * * Like bu_vls_strdup(), but destructively grab the string from the * source argument 'vp'. This is more efficient than bu_vls_strdup() * for those instances where the source argument 'vp' is no longer * needed by the caller, as it avoides a potentially long buffer copy. * * The source string is destroyed, as if bu_vls_free() had been * called. */ char * bu_vls_strgrab(register struct bu_vls *vp) { register char *str; BU_CK_VLS(vp); if ( vp->vls_offset != 0 ) { str = bu_vls_strdup( vp ); bu_vls_free( vp ); return str; } str = bu_vls_addr( vp ); vp->vls_str = (char *)0; vp->vls_offset = vp->vls_len = vp->vls_max = 0; return str; }
static int plot_shaded_eval( struct ged *gedp, const char *path_name, struct _ged_client_data *dgcdp) { int ret; const char *av[3]; const char *tmp_basename = "tmp_shaded_eval_obj"; char *brep_name; /* make a name for the temp brep */ av[0] = "make_name"; av[1] = tmp_basename; ged_make_name(gedp, 2, (const char **)av); brep_name = bu_vls_strdup(gedp->ged_result_str); bu_vls_trunc(gedp->ged_result_str, 0); /* create temp evaluated brep from named object */ av[0] = "brep"; av[1] = path_name; av[2] = brep_name; ret = ged_brep(gedp, 3, av); if (ret == GED_OK) { int brep_made = 0; struct db_tree_state ts; struct rt_db_internal brep_intern; struct db_full_path input_path, brep_path; RT_DB_INTERNAL_INIT(&brep_intern); db_full_path_init(&input_path); db_full_path_init(&brep_path); /* get brep internal */ ret = get_path_and_state(&ts, &brep_path, brep_name, gedp); if (ret == GED_OK) { struct directory *dp = DB_FULL_PATH_CUR_DIR(&brep_path); if (dp->d_flags & RT_DIR_COMB) { ret = rt_db_get_internal(&brep_intern, dp, ts.ts_dbip, NULL, ts.ts_resp); } else { ret = rt_db_get_internal(&brep_intern, dp, ts.ts_dbip, ts.ts_mat, ts.ts_resp); } if (ret >= 0) { brep_made = 1; } db_free_full_path(&brep_path); } /* plot brep, but use the path and state of the input object */ if (brep_made) { ret = get_path_and_state(&ts, &input_path, path_name, gedp); if (ret == GED_OK) { plot_shaded(&ts, &input_path, &brep_intern, dgcdp); rt_db_free_internal(&brep_intern); db_free_full_path(&input_path); } } /* kill temp brep */ av[0] = "kill"; av[1] = brep_name; ged_kill(gedp, 2, av); } bu_free((char *)brep_name, "vls_strdup"); return ret; }