/* * Sort of a surface spot transparency shader. Picks transparency * based upon noise value of surface spot. */ int tsplat_render(struct application *ap, const struct partition *pp, struct shadework *swp, void *dp) { register struct scloud_specific *scloud_sp = (struct scloud_specific *)dp; point_t in_pt; /* point where ray enters scloud solid */ double val; RT_CHECK_PT(pp); RT_AP_CHECK(ap); RT_CK_REGION(pp->pt_regionp); /* just shade the surface with a transparency */ MAT4X3PNT(in_pt, scloud_sp->mtos, swp->sw_hit.hit_point); val = bn_noise_fbm(in_pt, scloud_sp->h_val, scloud_sp->lacunarity, scloud_sp->octaves); CLAMP(val, 0.0, 1.0); swp->sw_transmit = 1.0 - val; if (swp->sw_reflect > 0 || swp->sw_transmit > 0) (void)rr_render(ap, pp, swp); return 1; }
/* * usage: bn_noise_fbm X Y Z h_val lacunarity octaves * */ int bn_cmd_noise(ClientData clientData, Tcl_Interp *interp, int argc, char **argv) { point_t pt; double h_val; double lacunarity; double octaves; double val; if (argc != 7) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " X Y Z h_val lacunarity octaves\"", NULL); return TCL_ERROR; } pt[0] = atof(argv[1]); pt[1] = atof(argv[2]); pt[2] = atof(argv[3]); h_val = atof(argv[4]); lacunarity = atof(argv[5]); octaves = atof(argv[6]); if (!strcmp("bn_noise_turb", argv[0])) { val = bn_noise_turb(pt, h_val, lacunarity, octaves); Tcl_SetObjResult( interp, Tcl_NewDoubleObj(val) ); } else if (!strcmp("bn_noise_fbm", argv[0])) { val = bn_noise_fbm(pt, h_val, lacunarity, octaves); Tcl_SetObjResult( interp, Tcl_NewDoubleObj(val) ); } else { Tcl_AppendResult(interp, "Unknown noise type \"", argv[0], "\"", NULL); return TCL_ERROR; } return TCL_OK; }
/** * @brief * usage: noise_slice xdim ydim inv h_val lac octaves dX dY dZ sX [sY sZ] * * The idea here is to get a whole slice of noise at once, thereby * avoiding the overhead of doing this in Tcl. */ int bn_cmd_noise_slice(ClientData clientData, Tcl_Interp *interp, int argc, char **argv) { double h_val; double lacunarity; double octaves; vect_t delta; /* translation to noise space */ vect_t scale; /* scale to noise space */ unsigned xdim; /* # samples X direction */ unsigned ydim; /* # samples Y direction */ unsigned xval, yval; #define NOISE_FBM 0 #define NOISE_TURB 1 int noise_type = NOISE_FBM; double val; point_t pt; if (argc != 7) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " Xdim Ydim Zval h_val lacunarity octaves\"", NULL); return TCL_ERROR; } xdim = atoi(argv[0]); ydim = atoi(argv[1]); VSETALL(delta, 0.0); VSETALL(scale, 1.); pt[Z] = delta[Z] = atof(argv[2]); h_val = atof(argv[3]); lacunarity = atof(argv[4]); octaves = atof(argv[5]); switch (noise_type) { case NOISE_FBM: for (yval = 0; yval < ydim; yval++) { pt[Y] = yval * scale[Y] + delta[Y]; for (xval = 0; xval < xdim; xval++) { pt[X] = xval * scale[X] + delta[X]; val = bn_noise_fbm(pt, h_val, lacunarity, octaves); } } break; case NOISE_TURB: for (yval = 0; yval < ydim; yval++) { pt[Y] = yval * scale[Y] + delta[Y]; for (xval = 0; xval < xdim; xval++) { pt[X] = xval * scale[X] + delta[X]; val = bn_noise_turb(pt, h_val, lacunarity, octaves); } } break; } pt[0] = atof(argv[1]); pt[1] = atof(argv[2]); pt[2] = atof(argv[3]); h_val = atof(argv[4]); lacunarity = atof(argv[5]); octaves = atof(argv[6]); if (!strcmp("bn_noise_turb", argv[0])) { val = bn_noise_turb(pt, h_val, lacunarity, octaves); Tcl_SetObjResult( interp, Tcl_NewDoubleObj(val) ); } else if (!strcmp("bn_noise_fbm", argv[0])) { val = bn_noise_fbm(pt, h_val, lacunarity, octaves); Tcl_SetObjResult( interp, Tcl_NewDoubleObj(val) ); } else { Tcl_AppendResult(interp, "Unknown noise type \"", argv[0], "\"", NULL); return TCL_ERROR; } return TCL_OK; }