Example #1
0
miBoolean contour_shader_widthfromcolor(
	miContour_endpoint	  *result,
	miStdInfo		  *info_near,
	miStdInfo		  *info_far,
	miState			  *state,
	Widthfromcolor_Parameters *paras)
{
	double			  maxcolor;
	miScalar		  min_width;

	/* Contour color given by a parameter */
	result->color = *mi_eval_color(&paras->color);

	/* The contour gets wider when the material color is dark */
	maxcolor = mi_MAX(info_near->color.r, info_near->color.g);
	maxcolor = mi_MAX(info_near->color.b, maxcolor);

	/* Softimage likes to have rgb colors larger than 1.0 */
	if (maxcolor > 1.0)
		maxcolor = 1.0;
	miASSERT(0.0 <= maxcolor && maxcolor <= 1.0);

	min_width = *mi_eval_scalar(&paras->min_width);
	result->width = (*mi_eval_scalar(&paras->max_width) - min_width) *
					(1.0 - maxcolor) + min_width;
	return(miTRUE);
}
Example #2
0
miBoolean contour_shader_widthfromlightdir(
	miContour_endpoint  *result,
	miStdInfo	    *info_near,
	miStdInfo	    *info_far,
	miState		    *state,
	Lightdir_Parameters *paras)
{
	double		    d;
	miVector	    dir;
	miScalar	    max_width;
	miScalar	    min_width;

	/* Contour color given by a parameter */
	result->color = *mi_eval_color(&paras->color);

	/* Normalize light direction (just in case user didn't) */
	dir = *mi_eval_vector(&paras->light_dir);
	mi_vector_normalize(&dir);

	/* The contour gets wider the more the normal differs from the light
	   source direction */
	d = mi_vector_dot(&dir, &info_near->normal);

	min_width     = *mi_eval_scalar(&paras->min_width);
	max_width     = *mi_eval_scalar(&paras->max_width);
	result->width = min_width + 0.5 * (max_width - min_width) * (1.0 - d);

	miASSERT(min_width <= result->width && result->width <= max_width);
	return(miTRUE);
}
Example #3
0
miBoolean contour_shader_curvature(
	miContour_endpoint	  *result,
	miStdInfo		  *info_near,
	miStdInfo		  *info_far,
	miState			  *state,
	Widthfromcolor_Parameters *paras)
{
	double			  d;
	miScalar		  min_width;
	miScalar		  max_width;
	miASSERT(info_near || info_far);

	/* Constant contour color */
	result->color = *mi_eval_color(&paras->color);
	max_width     = *mi_eval_scalar(&paras->max_width);
	min_width     = *mi_eval_scalar(&paras->min_width);

	if ((info_near == NULL) != (info_far == NULL)) {
		/* Max contour width if one point hit background */
		result->width = max_width;

	} else if (fabs(info_near->point.z - info_far->point.z) > 1.0) {
		/* Max contour width if large difference in depth */
		result->width = max_width;
	} else {
		/* Otherwise, the contour width depends on the curvature */
		d = mi_vector_dot(&info_near->normal, &info_far->normal);
		miASSERT(-1.0 <= d && d <= 1.0);
		result->width = min_width + 
				0.5 * (1.0 - d) * (max_width-min_width);
	}
	miASSERT(min_width <= result->width && result->width <= max_width);
	return(miTRUE);
}
DLLEXPORT void domeAFL_FOV_Stereo_init(
	miState	*state,
	struct dsDomeAFL_FOV_Stereo *params,
	miBoolean *inst_init_req)
{
	if (!params) {
		// version output
		mi_info(_VER_);
		*inst_init_req = miTRUE;
	} else {
		fov_angle = *mi_eval_scalar(&params->FOV_Angle);
		viewport_offset = *mi_eval_vector(&params->View_Offset);
		camera = *mi_eval_integer(&params->Camera);
		dome_radius = *mi_eval_scalar(&params->Dome_Radius);
		dome_tilt = *mi_eval_scalar(&params->Dome_Tilt);
		cameras_separation = *mi_eval_scalar(&params->Cameras_Separation);
		dome_tilt_compensation = *mi_eval_boolean(&params->Dome_Tilt_Compensation);
		vertical_mode = *mi_eval_boolean(&params->Vertical_Mode);
//mi_info("II-> fov=%f,cam=%i,rad=%f,tilt=%f,sep=%f,comp=%i,vert=%i",fov_angle,camera,dome_radius,dome_tilt,cameras_separation,dome_tilt_compensation,vertical_mode);

		// Convert input angles from degrees to radians...
		fov_angle = (miScalar)(fov_angle*M_PI/180.0);
		dome_tilt = (miScalar)(dome_tilt*M_PI/180.0);
	}
}
Example #5
0
miBoolean contour_shader_factorcolor(
	miContour_endpoint	*result,
	miStdInfo		*info_near,
	miStdInfo		*info_far,
	miState			*state,
	Factorcolor_Parameters  *paras)
{
	miScalar	f = *mi_eval_scalar(&paras->factor);
	miScalar	w = *mi_eval_scalar(&paras->width);

	miASSERT(info_near->color.r >= 0.0 && info_near->color.g >= 0.0);
	miASSERT(info_near->color.b >= 0.0);
	miASSERT(f >= 0.0 && w >= 0.0);

	/*
	 * Set contour color to a factor times material color.  The opacity
	 * color->a is set to 1.0, otherwise the material will shine through
	 * the contour.
	 */
	result->color.r = f * info_near->color.r;
	result->color.g = f * info_near->color.g;
	result->color.b = f * info_near->color.b;
	result->color.a = 1.0;

	/* The contour width is a parameter */
	result->width = w;
	return(miTRUE);
}
bool checkScreenSpace(miState *state, mrParticleGeoShader_paras *paras, miVector pos, miVector& bottomLeft, miVector& topRight)
{
	miScalar minPixelSize = *mi_eval_scalar(&paras->minPixelSize);
	miScalar maxPixelSize = *mi_eval_scalar(&paras->maxPixelSize);
	int minSizeBehaviour = *mi_eval_integer(&paras->minSizeBehaviour); // 0 = delete, 1 = resize
	if(maxPixelSize <= 0.0f )
		maxPixelSize = 100000000.0f;

	miVector screenBottomLeft = bottomLeft;
	miVector screenTopRight = topRight;
	mi_point_from_camera(state, &screenBottomLeft, &screenBottomLeft);
	mi_point_from_camera(state, &screenTopRight, &screenTopRight);
	mi_point_to_raster(state, &screenBottomLeft, &screenBottomLeft);
	mi_point_to_raster(state, &screenTopRight, &screenTopRight);
	miScalar screenDist = mi_vector_dist(&screenBottomLeft, &screenTopRight);
	miScalar dist = mi_vector_dist(&bottomLeft, &topRight);
	
	//mi_info("screenDist %f  minPixelSize %f", screenDist, minPixelSize);
	// nonsense no check will be done
	if(minPixelSize > maxPixelSize)
		return true;

	float minClip = 0.001f;

	if( screenDist < minPixelSize )
	{
		if( minSizeBehaviour == 0)
			return false;
		//mi_info("screenDist %f < minPixelSize %f", screenDist, minPixelSize);
		float resizeFactor = minPixelSize/screenDist;
		float resizeDist = dist * resizeFactor/2.0f;
		topRight = pos;
		bottomLeft = pos;
		topRight.x += resizeDist;
		topRight.y += resizeDist;
		bottomLeft.x -= resizeDist;
		bottomLeft.y -= resizeDist;

		return true;
	}
	if( screenDist > maxPixelSize )
	{
		float resizeFactor = maxPixelSize/screenDist;
		float resizeDist = dist * resizeFactor/2.0f;
		topRight = pos;
		bottomLeft = pos;
		topRight.x += resizeDist;
		topRight.y += resizeDist;
		bottomLeft.x -= resizeDist;
		bottomLeft.y -= resizeDist;

		return true;

	}
	return true;
}
Example #7
0
extern "C" DLLEXPORT miBoolean mib_color_interpolate(
	miColor		*result,
	miState		*state,
	struct mib_color_interpolate *paras)
{
	miInteger	num = *mi_eval_integer(&paras->num);
	miScalar	input;
	miScalar	ominput;
	miScalar	prev = 0;
	miScalar	next = 1;
	int		i;

	if (num < 1) {
		result->r = result->g = result->b = result->a = 0;
		return(miTRUE);
	}
	if (num == 1) {
		*result = *mi_eval_color(&paras->color[0]);
		return(miTRUE);
	}
	if (num > 8)
		num = 8;

	input = *mi_eval_scalar(&paras->input);
	if (input <= 0) {
		*result = *mi_eval_color(&paras->color[0]);
		return(miTRUE);
	}
	if (input >= 1) {
		*result = *mi_eval_color(&paras->color[num-1]);
		return(miTRUE);
	}
	for (i=0; i < num-2; i++) {
		next = *mi_eval_scalar(&paras->weight[i]);
		if (input <= next)
			break;
		prev = next;
		next = 1;
	}
	input	= (input - prev) / (next - prev);
	ominput	= 1 - input;
	if (input == 0)
		*result = *mi_eval_color(&paras->color[i]);
	else if (input == 1)
		*result = *mi_eval_color(&paras->color[i+1]);
	else {
		miColor *pcol = mi_eval_color(&paras->color[i]);
		miColor *ncol = mi_eval_color(&paras->color[i+1]);
		result->r = ominput * pcol->r + input * ncol->r;
		result->g = ominput * pcol->g + input * ncol->g;
		result->b = ominput * pcol->b + input * ncol->b;
		result->a = ominput * pcol->a + input * ncol->a;
	}
	return(miTRUE);
}
Example #8
0
extern "C" DLLEXPORT miBoolean mib_texture_filter_lookup(
	miColor		*result,
	miState		*state,
	struct mib_texture_filter_lookup *paras)
{
	miTag		tex = *mi_eval_tag(&paras->tex);
	miVector	*coord;
	miUint		space;
	miTag		remap;
	miVector	p[3], t[3];
	miMatrix	ST;
	miTexfilter	ell_opt;
	miScalar	disc_r;

	if (!tex) {
		result->r = result->g = result->b = result->a = 0;
		return(miFALSE);
	}
	coord  = mi_eval_vector(&paras->coord);
	space  = *mi_eval_integer(&paras->space);
	disc_r = *mi_eval_scalar(&paras->disc_r);
	if (disc_r <= 0)
		disc_r = DISC_R;
	if (state->reflection_level == 0 &&
	    mi_texture_filter_project(p, t, state, disc_r, space) &&
	    (remap = *mi_eval_tag(&paras->remap))) {
		mi_call_shader_x((miColor*)&t[0], miSHADER_TEXTURE,
						state, remap, &t[0]);
		mi_call_shader_x((miColor*)&t[1], miSHADER_TEXTURE,
						state, remap, &t[1]);
		mi_call_shader_x((miColor*)&t[2], miSHADER_TEXTURE,
						state, remap, &t[2]);
		if (mi_texture_filter_transform(ST, p, t)) {
			ell_opt.eccmax	  = *mi_eval_scalar(&paras->eccmax);
			ell_opt.max_minor = *mi_eval_scalar(&paras->maxminor);
			ell_opt.bilinear  = *mi_eval_boolean(&paras->bilinear);
			ell_opt.circle_radius = CIRCLE_R;
			/*
			 * when no bump-mapping is used, coord and ST[..]
			 * are identical. for bump mapping, the projection
			 * matrix is calculated for the current raster
			 * position, the ellipse is translated to the
			 * bump position
			 */
			ST[2*4+0] = coord->x;
			ST[2*4+1] = coord->y;
			if (mi_lookup_filter_color_texture(result, state,
							tex, &ell_opt, ST))
				return(miTRUE);
		}
	}
	/* fallback to standard pyramid or nonfiltered texture lookup */
	return(mi_lookup_color_texture(result, state, tex, coord));
}
Example #9
0
extern "C" DLLEXPORT miBoolean mib_dielectric(
	miColor		*result,
	miState		*state,
	struct md	*paras)
{
	miScalar	refract;
	miColor		inp, absorb;
	miVector	dir;
	miScalar	ior;
	double	        dist;
 
        /* check for illegal calls */
	if (state->type == miRAY_SHADOW || state->type == miRAY_DISPLACE)
       		return(miFALSE);
	
	refract = *mi_eval_scalar(&paras->refract);
	if (refract == 0.0)
		*result = *mi_eval_color(&paras->input);
	else {
		ior = *mi_eval_scalar(&paras->ior);
		if (ior==0.0 || ior==1.0)
			mi_trace_transparent(result, state);
		else {
			if (mi_refraction_dir(&dir, state, 1.0, ior))
				mi_trace_refraction(result, state, &dir);
			else {	/* total internal reflection */
				mi_reflection_dir(&dir, state);
				mi_trace_reflection(result, state, &dir);
			}
		}
                dist = state->child ? state->child->dist : 0.0;
		absorb = *mi_eval_color(&paras->absorb);
		if(absorb.r > 0.0f)
			result->r *= (miScalar) exp(log(absorb.r) * dist);
		if(absorb.g > 0.0f)
			result->g *= (miScalar) exp(log(absorb.g) * dist);
		if(absorb.b > 0.0f)
			result->b *= (miScalar) exp(log(absorb.b) * dist);
		if(absorb.a > 0.0f)
			result->a *= (miScalar) exp(log(absorb.a) * dist);

		if (refract < 1.0f) {
			inp = *mi_eval_color(&paras->input);
			result->r = result->r * refract + inp.r * (1-refract);
			result->g = result->g * refract + inp.g * (1-refract);
			result->b = result->b * refract + inp.b * (1-refract);
			result->a = result->a * refract + inp.a * (1-refract);
		}
	}

	return(miTRUE);
}
Example #10
0
extern "C" DLLEXPORT miBoolean mib_volume(
	miColor		*result,	/* in: color at far end, out */
	miState		*state,
	struct mib_volume *paras)
{
	miColor		*color;		/* fog color */
	miScalar	max, fade;	/* max opcity distance, fade factor */

	if (!*mi_eval_boolean(&paras->lightrays) && state->type==miRAY_LIGHT)
		return(miTRUE);				/* ignore light rays?*/

	color =  mi_eval_color (&paras->color);
	max   = *mi_eval_scalar(&paras->max);
	if (state->dist <= 0 ||				/* infinite distance */
	    state->dist >= max) {			/* full-opacity dist */
		fade = 1 - color->a;
		result->r = fade * result->r + color->r;
		result->g = fade * result->g + color->g;
		result->b = fade * result->b + color->b;
		result->a = fade * result->a + color->a;
		return(miTRUE);
	}

	fade = (float)state->dist / max;			/* fade to fog color */
	fade = (1 - fade * fade) * color->a;

	result->r = fade * result->r + (1-fade) * color->r;
	result->g = fade * result->g + (1-fade) * color->g;
	result->b = fade * result->b + (1-fade) * color->b;
	result->a = fade * result->a + (1-fade) * color->a;
	return(miTRUE);
}
Example #11
0
miBoolean contour_shader_layerthinner(
	miContour_endpoint	*result,
	miStdInfo		*info_near,
	miStdInfo		*info_far,
	miState			*state,
	Layerthinner_Parameters *paras)
{
	/* Constant contour color */
	result->color = *mi_eval_color(&paras->color);

	/* Width decreases by factor for each refraction_level */
	result->width = *mi_eval_scalar(&paras->width) *
			pow( (double)(*mi_eval_scalar(&paras->factor)), 
					(double)info_near->level - 1.0);
	return(miTRUE);
}
Example #12
0
extern "C" DLLEXPORT miBoolean mib_photon_basic(
	miColor		*flux,
	miState		*state,
	struct mib_photon_basic *paras)
{
	miColor		rdiff, *spec, *transp, nflux;
	miScalar	ior_frac;
	miVector	dir;
	miRay_type	type;
	miColor		tspec, rspec;

	rdiff   = *mi_eval_color(&paras->diffuse);
	spec    =  mi_eval_color(&paras->specular);
	transp  =  mi_eval_color(&paras->transp);
	tspec.r = spec->r * transp->r;
	tspec.g = spec->g * transp->g;
	tspec.b = spec->b * transp->b;
	rspec.r = spec->r * (1.0 - transp->r);
	rspec.g = spec->g * (1.0 - transp->g);
	rspec.b = spec->b * (1.0 - transp->b);

	if (rdiff.r > 0.0 || rdiff.g > 0.0 || rdiff.b > 0.0)
		mi_store_photon(flux, state);

	type = mi_choose_simple_scatter_type(state, &rdiff, &rspec, 0, &tspec);

	switch(type) {
	  case miPHOTON_REFLECT_SPECULAR:
		nflux.r = flux->r * rspec.r;
		nflux.g = flux->g * rspec.g;
		nflux.b = flux->b * rspec.b;
		mi_reflection_dir_specular(&dir, state);
		return(mi_photon_reflection_specular(&nflux, state, &dir));

	  case miPHOTON_REFLECT_DIFFUSE:
		nflux.r = flux->r * rdiff.r;
		nflux.g = flux->g * rdiff.g;
		nflux.b = flux->b * rdiff.b;
		mi_reflection_dir_diffuse(&dir, state);
		return(mi_photon_reflection_diffuse(&nflux, state, &dir));

	  case miPHOTON_TRANSMIT_SPECULAR:
		nflux.r = flux->r * tspec.r;
		nflux.g = flux->g * tspec.g;
		nflux.b = flux->b * tspec.b;
		ior_frac = *mi_eval_scalar(&paras->ior_frac);
		if (ior_frac == 1.0)
			return(mi_photon_transparent(&nflux, state));

		else if (mi_transmission_dir_specular(&dir, state, 1,ior_frac))
			return(mi_photon_transmission_specular(&nflux, state,
									&dir));
		else
			return(miFALSE);

	  default:
		return(miTRUE);
	}
}
Example #13
0
extern "C" DLLEXPORT miBoolean mib_color_spread(
	register miColor  *result,
	miState		  *state,
	struct mib_color_spread *paras)
{
	register int	  i, n = *mi_eval_integer(&paras->num);
	register miScalar r, g, b, a;
	register miScalar weight;
	miColor		  *input;

	input = mi_eval_color(&paras->input);
	r = input->r;
	g = input->g;
	b = input->b;
	a = input->a;
	if (n > 8) n = 8;

	for (i=0; i < n; i++, result++) {
		weight = *mi_eval_scalar(&paras->weight[i]);
		switch(*mi_eval_integer(&paras->mode[i])) {
		  default:
		  case 0:
			result->r = r * weight;
			result->g = g * weight;
			result->b = b * weight;
			result->a = a * weight;
			break;

		  case 1:
			result->r =
			result->g =
			result->b =
			result->a = a * weight;
			break;

		  case 2:
			result->r =
			result->g =
			result->b =
			result->a = (a + r + g)/3 * weight;
			break;

		  case 3:
			result->r =
			result->g =
			result->b =
			result->a = (.299 * r + .587 * g + .114 * b) * weight;
			break;

		  case 4:
			result->r =
			result->g =
			result->b =
			result->a = r * weight;
			break;
		}
	}
	return(miTRUE);
}
Example #14
0
miBoolean contour_shader_framefade(
	miContour_endpoint   *result,
	miStdInfo	     *info_near,
	miStdInfo	     *info_far,
	miState		     *state,
	Framefade_Parameters *paras)
{
	int		     frame = state->camera->frame;
	double		     w1, w2;
	int		     frame1, frame2;

	miASSERT(frame >= 0);

	frame1 = *mi_eval_integer(&paras->frame1);
	frame2 = *mi_eval_integer(&paras->frame2);

	miASSERT(frame1 >= 0 && frame2 >= 0);

	if (frame <= frame1) {		/* before frame1 */
		result->color = *mi_eval_color(&paras->color1);
		result->width = *mi_eval_scalar(&paras->width1);
	} else if (frame2 <= frame) {	/* after frame2 */
		result->color = *mi_eval_color(&paras->color2);
		result->width = *mi_eval_scalar(&paras->width2);
	} else {				/* between frame1 and frame2 */
		/* Weights w1 and w2 depend on frame number */
		miColor color1 = *mi_eval_color(&paras->color1);
		miColor color2 = *mi_eval_color(&paras->color2);

		miASSERT(frame1 < frame2);
		w1 = ((double)frame2 - frame) / (frame2 - frame1);
		miASSERT(0.0 <= w1 && w1 <= 1.0);
		w2 = 1.0 - w1;

		/* Mix of color1 and color2 according to weights */
		result->color.r = w1 * color1.r + w2 * color2.r;
		result->color.g = w1 * color1.g + w2 * color2.g;
		result->color.b = w1 * color1.b + w2 * color2.b;
		result->color.a = w1 * color1.a + w2 * color2.a;

		/* Width depending on weights */
		result->width   = w1 * *mi_eval_scalar(&paras->width1)
				+ w2 * *mi_eval_scalar(&paras->width2);
	}
	return(miTRUE);
}
Example #15
0
extern "C" DLLEXPORT miBoolean mib_lens_stencil(
	miColor*	result,
	miState*	state,
	mibStencil_t*	paras)
{
	miScalar 	f  = *mi_eval_scalar(&paras->floor);
	miScalar 	c  = *mi_eval_scalar(&paras->ceiling);
	miColor  	fc = *mi_eval_color(&paras->floor_color);
	miColor  	cc = *mi_eval_color(&paras->ceil_color);
	miTag    	st = *mi_eval_tag(&paras->stencil);

	miScalar 	s;
	miVector 	coord;

	/* handle default parameter values */
	if (c == 0.0f) {
		c = 1.0f;
	}

	if (!st || f >= c) {
		return mi_trace_eye(result, state, &state->org, &state->dir);
	} 

	coord.x = state->raster_x / state->camera->x_resolution;
	coord.y = state->raster_y / state->camera->y_resolution;
	coord.z = 0.0f;

	mi_lookup_scalar_texture(&s, state, st, &coord);
	s = (s-f)/(c-f);
	if (s < 0.0f) {
		*result = fc;
	} else if ( s > 1.0f) {
		*result = cc;
	} else {
		miColor col = { 0.0, 0.0, 0.0, 1.0};
        	miScalar sn = 1.0f - s;

		(void) mi_trace_eye(&col, state, &state->org, &state->dir);

		result->r = s * col.r + sn * fc.r;
		result->g = s * col.g + sn * fc.g;
		result->b = s * col.b + sn * fc.b;
		result->a =     col.a;
	}
	return miTRUE;
}
Example #16
0
extern "C" DLLEXPORT miBoolean mib_lens_clamp(
	miColor*	result,
	miState*	state,
	mibClamp_t*	paras)
{
	miBoolean 	res;
	miScalar 	f = *mi_eval_scalar(&paras->floor);
	miScalar 	c = *mi_eval_scalar(&paras->ceiling);
	miBoolean	b = *mi_eval_boolean(&paras->luminance);

	if (c == 0.0f) {
		c = 1.0f;
	}
	if (f == c) {
		f = 0.0f;
	}

	res = mi_trace_eye(result, state, &state->org, &state->dir);

	if(b) {
		/* clamp based on luminance. */
		miScalar	lum = mi_luminance(state, result);
	
		if(lum < f) {
			*result = *mi_eval_color(&paras->floor_color);
		} else if (lum > c) {
			*result = *mi_eval_color(&paras->ceil_color);
		} else {
			lum = (lum - f)/(c - f);
			result->r *= lum;
			result->g *= lum;
			result->b *= lum;
		}
	} else {	
		/* clamp based on color components */
		result->r = result->r > f ? 
			(result->r < c ? (result->r-f)/(c-f) : 1) : 0;
		result->g = result->g > f ? 
			(result->g < c ? (result->g-f)/(c-f) : 1) : 0;
		result->b = result->b > f ? 
			(result->b < c ? (result->b-f)/(c-f) : 1) : 0;
	}

	return res;
}
Example #17
0
DLLEXPORT
miBoolean td_scalar_kernel ( miScalar *result, miState *state, struct td_scalar_kernel *params ){

  miVector newPoint = *mi_eval_vector( &params->point );

  state->point = newPoint;

  *result = *mi_eval_scalar( &params->value );
  
  return miTRUE;
}
Example #18
0
miBoolean contour_shader_widthfromlight(
	miContour_endpoint *result,
	miStdInfo	   *info_near,
	miStdInfo	   *info_far,
	miState		   *state,
	Light_Parameters   *paras)
{
	miVector	   orgp;	/* light source origin */
	miVector	   dirp;	/* light source direction */
	miVector	   dir;
	double		   d;
	miScalar	   min_width;
	miScalar	   max_width;

	/* Contour color given by a parameter */
	result->color = *mi_eval_color(&paras->color);

	/* Get light origin or direction */
	mi_light_info(*mi_eval_tag(&paras->light), &orgp, &dirp, 0);
	/* Now orgp or dirp is different from the null vector */

	/* Compute direction from light to point */
	if (mi_vector_dot(&orgp, &orgp) > miEPS) {   /* point light source */
		mi_vector_sub(&dir, &info_near->point, &orgp);

	} else {				/* directional light source */
		miASSERT(mi_vector_dot(&dirp, &dirp) > miEPS);
		dir = dirp;
	}
	mi_vector_normalize(&dir);

	/* The contour gets wider the more the normal is pointing in the same
	   direction as the light source */
	d = mi_vector_dot(&dir, &info_near->normal);
	min_width = *mi_eval_scalar(&paras->min_width);
	max_width = *mi_eval_scalar(&paras->max_width);
	result->width = min_width + 0.5 * (max_width - min_width) * (d+1.0);

	miASSERT(min_width <= result->width && result->width <= max_width);
	return(miTRUE);
}
DLLEXPORT void LatLong_Stereo_init(
	miState	*state,
	struct dsLatLong_Stereo *params,
	miBoolean *inst_init_req)
{
	if (!params) {
		// Version output
		mi_info(_VER_);
		*inst_init_req = miTRUE;
	} else {
		fov_vert_angle = *mi_eval_scalar(&params->FOV_Vert_Angle);
		fov_horiz_angle = *mi_eval_scalar(&params->FOV_Horiz_Angle);
		camera = *mi_eval_integer(&params->Camera);
		parallax_distance = *mi_eval_scalar(&params->Parallax_Distance);
		cameras_separation = *mi_eval_scalar(&params->Cameras_Separation);
//mi_info("II-> fovV=%f,fovH=%f,cam=%i,rad=%f,sep=%f",fov_vert_angle,fov_horiz_angle,camera,parallax_distance,cameras_separation);

		// Convert input angles from degrees to radians...
		fov_vert_angle = (miScalar)(fov_vert_angle*M_PI/180.0);
		fov_horiz_angle = (miScalar)(fov_horiz_angle*M_PI/180.0);
	}
}
Example #20
0
static miBoolean polka_dot(
	miColor		*result,
	miState		*state,
	struct mtp	*paras,
	double		x,
	double		y,
	double		z)
{
	*result = sqrt(x*x + y*y + z*z) < *mi_eval_scalar(&paras->radius)
						? *mi_eval_color(&paras->fg)
						: *mi_eval_color(&paras->bg);

	return(miTRUE);
}
extern "C" DLLEXPORT miBoolean mrParticleGeoShader(
	miTag             *result,
	miState                 *state,
	mrParticleGeoShader_paras   *paras)
{
	
	mi_info("mrParticleGeoShader: Version %s", VERSION);

	int			geometryType = *mi_eval_integer(&paras->geometryType);
	miScalar	minPixelSize = *mi_eval_scalar(&paras->minPixelSize);
	miScalar	maxPixelSize = *mi_eval_scalar(&paras->maxPixelSize);
	int i_m = *mi_eval_integer(&paras->i_particleFiles);
	int n_m = *mi_eval_integer(&paras->n_particleFiles);
	miTag *particleFiles = mi_eval_tag(paras->particleFiles) + i_m;

	for(int i = 0; i < n_m; i++)
	{
		if (particleFiles[i])
		{
			std::string fileName = tag_to_string(particleFiles[i]);
			std::string correctedFileName = getCorrectFileName(state, paras, fileName);
			mi_info("reading cacheFile %s", correctedFileName.c_str());
			PartioContainer pc(correctedFileName);
			if( geometryType == 0)
			{
				miTag particleTag = createMeshParticles(state, paras, pc);
				if( particleTag != miNULLTAG)
					miBoolean done = mi_geoshader_add_result( result, particleTag);
			}else{
				miTag particleTag = createNativeParticles(state, paras, pc);
				if( particleTag != miNULLTAG)
					miBoolean done = mi_geoshader_add_result( result, particleTag);
			}
		}
	}
	return miTRUE;
}
Example #22
0
extern "C" DLLEXPORT miBoolean MYMR_Alluminum(
		struct MYMR_Alluminum_o *resultStruct ,
		miState *state, 
		struct MYMR_Alluminum_p *paras)
{
	
	//Param values
	miColor *specular = mi_eval_color(&paras->specular);
	miScalar specular_exponent = *mi_eval_scalar(&paras->specular_exponent);
	miColor *diffuse = mi_eval_color(&paras->diffuse);
	miColor *result = mi_eval_color(&resultStruct->result);
	
	//At least it should get the ambient color. I think that somehow ambient should be an ambient light or something....to be studied
	*result = *mi_eval_color(&paras->ambient);
		
	//Do lighting shit
	//Get all the lights
	do_diffuse_and_spec(result,state,diffuse,specular,specular_exponent);
	
	// Do the refraction stuff
	miScalar reflection_factor = *mi_eval_scalar(&paras->reflection_factor);
	miColor *reflection = mi_eval_color(&paras->reflection);
	do_reflections(result,state,reflection,reflection_factor);
	
	// Do the transparency stuff
	//miScalar refraction_factor = *mi_eval_scalar(&paras->refraction_factor);
	//miColor *refraction = mi_eval_color(&paras->refraction);
	//miScalar ior = *mi_eval_scalar(&paras->ior);
	//calculate_ior(state,ior);
	//printf("in:%f out:%f\n",state->ior,state->ior_in);
	//do_refractions(result,state,refraction,refraction_factor);
	
	//printf("\e[33mPost Red: %f\tGreen: %f\tBlue: %f\e[0m\n",result->r,result->g,result->b);

	return miTRUE;
}
Example #23
0
miBoolean contour_shader_silhouette(
	miContour_endpoint *result,
	miStdInfo	   *info_near,
	miStdInfo	   *info_far,
	miState		   *state,
	Simple_Parameters  *paras)
{
	if (info_far) {
		result->color.a = 0.0;
		result->width   = 0.0;
	} else {
		result->color   = *mi_eval_color(&paras->color);
		result->width   = *mi_eval_scalar(&paras->width);
	}
	miASSERT(result->color.r >= 0.0 && result->color.g >= 0.0);
	miASSERT(result->color.b >= 0.0 && result->width >= 0.0);

	return(miTRUE);
}
Example #24
0
miBoolean contour_shader_maxcolor(
	miContour_endpoint *result,
	miStdInfo	   *info_near,
	miStdInfo	   *info_far,
	miState		   *state,
	float		   *width)		/* only one parameter */
{
	/* Contour color is max of info_near->color and info_far->color */
	if (info_far) {
		result->color.r = mi_MAX(info_near->color.r,info_far->color.r);
		result->color.g = mi_MAX(info_near->color.g,info_far->color.g);
		result->color.b = mi_MAX(info_near->color.b,info_far->color.b);
		result->color.a = 1.0;
	} else
		result->color = info_near->color;

	/* Contour width given by a parameter */
	result->width = *mi_eval_scalar(width);
	return(miTRUE);
}
Example #25
0
extern "C" DLLEXPORT miBoolean mib_texture_lookup2(
    miColor		*result,
    miState		*state,
    struct mib_texture_lookup2 *paras)
{
    miTag	tex   = *mi_eval_tag(&paras->tex);
    miVector	coord;
    miScalar	factor = *mi_eval_scalar(&paras->factor);

    if (tex )
    {
	coord.x = state->tex_list[0].x * factor;
	coord.y = state->tex_list[0].y * factor;
	mi_lookup_color_texture(result, state, tex, &coord);
	return(miTRUE);
    }
	

    result->r = result->g = result->b = result->a = 0;
    return(miFALSE);
}
Example #26
0
miBoolean contour_shader_simple(
	miContour_endpoint *result,
	miStdInfo	   *info_near,
	miStdInfo	   *info_far,
	miState		   *state,
	Simple_Parameters  *paras)
{
	miASSERT(paras->color.r >= 0.0 && paras->color.g >= 0.0);
	miASSERT(paras->color.b >= 0.0 && paras->width >= 0.0);

	/*
	 * Contour color given by a parameter
	 */
	result->color = *mi_eval_color(&paras->color);

	/*
	 * Contour width given by a parameter
	 */
	result->width = *mi_eval_scalar(&paras->width);
	return(miTRUE);
}
void point_distances3(miState *state,texture_worleynoise3d_t *param, 
                      miVector *pt,
                      miScalar *f1, miVector *p1,
                      miScalar *f2, miVector *p2,
                      miScalar *f3, miVector *p3) {  
  miScalar cube_dist = CUBE_DIST * (*mi_eval_scalar(&param->scale));
  miVector cube = point_cube3(pt,cube_dist);
  
  worley_context3 *context;
  mi_query(miQ_FUNC_TLS_GET, state, miNULLTAG, &context);
  
  miInteger dist_measure = *mi_eval_integer(&param->distance_measure);
  *f3 = FLT_MAX;
  *f2 = *f3 - 1;
  *f1 = *f2 - 1;

  update_cache3(context, &cube, cube_dist);
  
  miVector *cache = context->cacheVals;
  
  for(int i=0; i < CACHE_SIZE; ++i) { 
    miVector p = cache[i];
    miScalar d = distance3(dist_measure, pt, &p);
    if(d < *f3) {
      if(d < *f2) {
        *f3 = *f2; *p3 = *p2;
        if(d < *f1) {
          *f2 = *f1; *p2 = *p1;
          *f1 = d; *p1 = p;
        }
        else {
          *f2 = d; *p2 = p;
        }
      }
      else {
        *f3 = d; *p3 = p;
      }
    }
  }
}
Example #28
0
extern "C" DLLEXPORT miBoolean mib_ray_marcher(
	miColor		*result,
	miState		*state,
	struct mrm	*p)
{
	struct mrm	pe;
	miScalar	scale;

	result->r = result->g = result->b = result->a = 0.0;

	/*
	 * copy all parameters to a static structure to
	 * avoid all the mi_eval_* calls in the code
	 */
	pe.s        = *mi_eval_tag(&p->s);
	pe.distance = *mi_eval_scalar(&p->distance);
	pe.num      = *mi_eval_integer(&p->num);
	pe.subdiv   = *mi_eval_integer(&p->subdiv);
	pe.contrast = *mi_eval_color(&p->contrast);

	if (pe.num == 0.0)
		if (pe.distance > 0.0)
			pe.num = state->dist / pe.distance;
		else
			pe.num = 4; /* default #samples */
	if (pe.num < 2)
		pe.num = 2;

	/* go! */
	raymarch(result, state, &pe);

	/* normalize result */
	scale = 1.0 / (miScalar)pe.num;
	result->r *= scale;
	result->g *= scale;
	result->b *= scale;
	result->a *= scale;
	return(miTRUE);
}
Example #29
0
miBoolean contour_shader_depthfade(
	miContour_endpoint   *result,
	miStdInfo	     *info_near,
	miStdInfo	     *info_far,
	miState		     *state,
	Depthfade_Parameters *paras)
{
	miScalar	     depth = info_near->point.z;
	double		     near_z, far_z, w_near, w_far;

	/* Ensure that near_z and far_z are negative as they should be */
	near_z = -fabs(*mi_eval_scalar(&paras->near_z));
	far_z  = -fabs(*mi_eval_scalar(&paras->far_z));

	if (depth > near_z) {		/* contour is closer than near_z */
		result->color = *mi_eval_color(&paras->near_color);
		result->width = *mi_eval_scalar(&paras->near_width);
	} else if (depth < far_z) {	/* contour is more distant than far_z*/
		result->color = *mi_eval_color(&paras->far_color);
		result->width = *mi_eval_scalar(&paras->far_width);
	} else {			/* contour is betwn near_z and far_z */
		miColor near_color = *mi_eval_color(&paras->near_color);
		miColor far_color  = *mi_eval_color(&paras->far_color);

		/* Weights w_near and w_far depend on depth */
		w_near = (depth - far_z) / (near_z - far_z);
		miASSERT(0.0 <= w_near && w_near <= 1.0);
		w_far = 1.0 - w_near;

		/* Mix of near_color and far_color according to weights */
		result->color.r = w_near * near_color.r + w_far * far_color.r;
		result->color.g = w_near * near_color.g + w_far * far_color.g;
		result->color.b = w_near * near_color.b + w_far * far_color.b;
		result->color.a = w_near * near_color.a + w_far * far_color.a;
		/* Width depending on weights */
		result->width = w_near * *mi_eval_scalar(&paras->near_width) 
			      + w_far  * *mi_eval_scalar(&paras->far_width);
	}
	return(miTRUE);
}
miScalar worleynoise3d_val(miState *state,texture_worleynoise3d_t *param) {
  miScalar f1, f2, f3;
  miVector p1, p2, p3;
  
  // ways to get the current point:
  // state->tex_list[0]; // yields good results only in the x and y coordinate
  // state->point // usable for 3D, but problematic for getting a smooth 2D texture as x,y and z all have to be somehow incorporated in the 2D vector to use
  // state->tex // does not yield usable results / seems to be constant
	// 
	// instead, we just take an u and v value explicitly; they would usually be provided by a 2D placement node.
	
	// note: getting current values must always be wrapped in mi_eval... calls!
	miVector pt;
	miScalar *m = mi_eval_transform(&param->matrix);
	mi_point_transform(&pt,&state->point,m);
	
  point_distances3(state,param,&pt,&f1,&p1,&f2,&p2,&f3,&p3);
  
  miInteger dist_measure = *mi_eval_integer(&param->distance_measure);
  
  miScalar scale = dist_scale(dist_measure) * (*mi_eval_scalar(&param->scale)) * (*mi_eval_scalar(&param->scaleX));
	miBoolean jagged = *mi_eval_boolean(&param->jagged_gap);
  
  miScalar s = 1.0;
  {
    miScalar gap_size = *mi_eval_scalar(&param->gap_size);
    
    miVector ptX = pt;
		
		// jagged edges. useful for broken earth crusts
		if(jagged) {
			miVector seed = pt;	 mi_vector_mul(&seed,3 / scale);
			miScalar jaggingX = (mi_unoise_3d(&seed) - 0.5) * scale * 0.2;
			ptX.x += jaggingX; seed.x += 1000;
			miScalar jaggingY = (mi_unoise_3d(&seed) - 0.5) * scale * 0.2;
			ptX.y += jaggingY; seed.y += 1000;
			miScalar jaggingZ = (mi_unoise_3d(&seed) - 0.5) * scale * 0.2;
			ptX.z += jaggingZ;
		}
		
    miScalar f1X, f2X, f3X;
    miVector p1X, p2X, p3X;
    
    point_distances3(state,param,&ptX,&f1X,&p1X,&f2X,&p2X,&f3X,&p3X);
     
    // based on code from "Advanced Renderman"
    // this leads to gaps of equal width, in contrast to just simple thresholding of f2 - f1.
    miScalar scaleFactor = (distance3(dist_measure, &p1X, &p2X) * scale) / (f1X + f2X);
    
    // FIXME: there may be some adjustment needed for distance measures that are not just dist_linear
    if(gap_size * scaleFactor > f2X - f1X) //  on left side
      s = -1.0;
  }
  
  {
    f1 /= scale;
    f2 /= scale;
    f3 /= scale;
  }
  
  miScalar dist = 0.0;
  {
    miInteger dist_mode = *mi_eval_integer(&param->distance_mode);
    switch(dist_mode) {
      case DIST_F1: dist = f1; break;
      case DIST_F2_M_F1: dist = f2 - f1; break;
      case DIST_F1_P_F2: dist = (2 * f1 + f2) / 3; break;
      case DIST_F3_M_F2_M_F1: dist = (2 * f3 - f2 - f1) / 2; break;
      case DIST_F1_P_F2_P_F3: dist = (0.5 * f1 + 0.33 * f2 + (1 - 0.5 - 0.33) * f3); break;
      default: ;
    }
  }
  
   return s * scaling_function(dist);
}