示例#1
0
static float seam_cut_cost(Mesh *me, int e1, int e2, int vert, int target)
{
	MVert *v = me->mvert + vert;
	MEdge *med1 = me->medge + e1, *med2 = me->medge + e2;
	MEdge *tar = me->medge + target;
	MVert *v1 = me->mvert + ((med1->v1 == vert)? med1->v2: med1->v1);
	MVert *v2 = me->mvert + ((med2->v1 == vert)? med2->v2: med2->v1);
	MVert *tarvert1 = me->mvert + tar->v1;
	MVert *tarvert2 = me->mvert + tar->v2;
	float cost, d1[3], d2[3], EdgeVector[3];		// Heading[3],
	float TargetVector1[3], TargetVector2[3], TargetVector3[3], TargetVector4[3];
	cost = VecLenf(v1->co, v->co);
	cost += VecLenf(v->co, v2->co);

	VecSubf(d1, v1->co, v->co);
	VecSubf(d2, v->co, v2->co);

	VecSubf(TargetVector1, tarvert1->co, v1->co);
	VecSubf(TargetVector2, tarvert1->co, v2->co);
	VecSubf(TargetVector3, tarvert2->co, v1->co);
	VecSubf(TargetVector4, tarvert2->co, v2->co);

	float DistToTarget1 = TargetVector1[0] * TargetVector1[0] + TargetVector1[1] * TargetVector1[1] + TargetVector1[2] * TargetVector1[2];
	DistToTarget1 = sqrt(DistToTarget1);

	float DistToTarget2 = TargetVector2[0] * TargetVector2[0] + TargetVector2[1] * TargetVector2[1] + TargetVector2[2] * TargetVector2[2];
	DistToTarget2 = sqrt(DistToTarget2);

	float DistToTarget3 = TargetVector3[0] * TargetVector3[0] + TargetVector3[1] * TargetVector3[1] + TargetVector3[2] * TargetVector3[2];
	DistToTarget3 = sqrt(DistToTarget3);

	float DistToTarget4 = TargetVector4[0] * TargetVector4[0] + TargetVector4[1] * TargetVector4[1] + TargetVector4[2] * TargetVector4[2];
	DistToTarget4 = sqrt(DistToTarget4);

	float MinDist = DistToTarget1;
	if(DistToTarget2 < MinDist) MinDist = DistToTarget2;
	if(DistToTarget3 < MinDist) MinDist = DistToTarget3;
	if(DistToTarget4 < MinDist) MinDist = DistToTarget4;


	MVert *edgev1 = me->mvert + med2->v1;
	MVert *edgev2 = me->mvert + med2->v2;
	VecSubf(EdgeVector, edgev1->co, edgev2->co);
/*
	Normalise(TargetVector);
	Normalise(EdgeVector);

	Heading[0] = TargetVector[0] * EdgeVector[0];
	Heading[1] = TargetVector[1] * EdgeVector[1];
	Heading[2] = TargetVector[2] * EdgeVector[2];
*/
//	Normalise(Heading);

/*
	float VecX = d1[0]*d2[0];
	float VecY = d1[1]*d2[1];
	float VecZ = d1[2]*d2[2];

	float Length = (VecX * VecX + VecY * VecY + VecZ * VecZ);
	Length = (float)sqrt(Length);

	if(Length != 0)
	{
		VecX /= Length;
		VecY /= Length;
		VecZ /= Length;
	}

//	float Angle = acos(VecX + VecY + VecZ);

	float HeadingLength = Heading[0] * Heading[0] + Heading[1] * Heading[1] + Heading[2] * Heading[2];
	HeadingLength = sqrt(HeadingLength);


	if(HeadingLength != 0)
	{
		Heading[0] /= HeadingLength;
		Heading[1] /= HeadingLength;
		Heading[2] /= HeadingLength;
	}
*/
//	float Angle = acos(fabs(Heading[0] + Heading[1] + Heading[2]));	// heading towards target


//	cost = cost + 0.5f*cost*(2.0f + fabs(Angle));		//fabs(d1[0]*d2[0] + d1[1]*d2[1] + d1[2]*d2[2]));		// dodgy bastards!  Fixed that up for ya's
	cost = MinDist;		/// 50.0f + Angle;	// + fabs(Angle);
	//	cost = cost + 0.5f*cost*(2.0f - fabs(d1[0]*d2[0] + d1[1]*d2[1] + d1[2]*d2[2]));

	return cost;
}
示例#2
0
文件: volumetric.c 项目: jinjoh/NOOR
void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar, float *lacol)
{
	float visifac, lv[3], lampdist;
	float tr[3]={1.0,1.0,1.0};
	float hitco[3], *atten_co;
	float p, ref_col[3];
	
	if (lar->mode & LA_LAYER) if((lar->lay & shi->obi->lay)==0) return;
	if ((lar->lay & shi->lay)==0) return;
	if (lar->energy == 0.0) return;
	
	if ((visifac= lamp_get_visibility(lar, co, lv, &lampdist)) == 0.f) return;
	
	VecCopyf(lacol, &lar->r);
	
	if(lar->mode & LA_TEXTURE) {
		shi->osatex= 0;
		do_lamp_tex(lar, lv, shi, lacol, LA_TEXTURE);
	}

	VecMulf(lacol, visifac);

	if (ELEM(lar->type, LA_SUN, LA_HEMI))
		VECCOPY(lv, lar->vec);
	VecMulf(lv, -1.0f);
	
	if (shi->mat->vol.shade_type == MA_VOL_SHADE_SHADOWED) {
		VecMulf(lacol, vol_get_shadow(shi, lar, co));
	}
	else if (shi->mat->vol.shade_type == MA_VOL_SHADE_SHADED)
	{
		Isect is;
		
		if (shi->mat->vol.shadeflag & MA_VOL_RECV_EXT_SHADOW) {
			VecMulf(lacol, vol_get_shadow(shi, lar, co));
			if (luminance(lacol) < 0.001f) return;
		}
		
		/* find minimum of volume bounds, or lamp coord */
		if (vol_get_bounds(shi, co, lv, hitco, &is, VOL_BOUNDS_SS)) {
			float dist = VecLenf(co, hitco);
			VlakRen *vlr = (VlakRen *)is.hit.face;
			
			/* simple internal shadowing */
			if (vlr->mat->material_type == MA_TYPE_SURFACE) {
				lacol[0] = lacol[1] = lacol[2] = 0.0f;
				return;
			}

			if (ELEM(lar->type, LA_SUN, LA_HEMI))
				/* infinite lights, can never be inside volume */
				atten_co = hitco;
			else if ( lampdist < dist ) {
				atten_co = lar->co;
			} else
				atten_co = hitco;
			
			vol_get_transmittance(shi, tr, co, atten_co);
			
			VecMulVecf(lacol, lacol, tr);
		}
		else {
			/* Point is on the outside edge of the volume,
			 * therefore no attenuation, full transmission.
			 * Radiance from lamp remains unchanged */
		}
	}
	
	if (luminance(lacol) < 0.001f) return;
	
	p = vol_get_phasefunc(shi, shi->mat->vol.asymmetry, shi->view, lv);
	
	/* physically based scattering with non-physically based RGB gain */
	vol_get_reflection_color(shi, ref_col, co);
	
	lacol[0] *= p * ref_col[0];
	lacol[1] *= p * ref_col[1];
	lacol[2] *= p * ref_col[2];
}