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; }
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]; }