public VolumeFalloffEngineData ConvertToEngineData() { VolumeFalloffEngineData data = new VolumeFalloffEngineData(); data.weight = weight; // Clamp to avoid NaNs. float3 fadePositive = this.fadePositive; float3 fadeNegative = this.fadeNegative; data.rcpFaceFadePos.x = (fadePositive.x < 1e-5f) ? float.MaxValue : (1.0f / fadePositive.x); data.rcpFaceFadePos.y = (fadePositive.y < 1e-5f) ? float.MaxValue : (1.0f / fadePositive.y); data.rcpFaceFadePos.z = (fadePositive.z < 1e-5f) ? float.MaxValue : (1.0f / fadePositive.z); data.rcpFaceFadeNeg.y = (fadeNegative.x < 1e-5f) ? float.MaxValue : (1.0f / fadeNegative.x); data.rcpFaceFadeNeg.x = (fadeNegative.y < 1e-5f) ? float.MaxValue : (1.0f / fadeNegative.y); data.rcpFaceFadeNeg.z = (fadeNegative.z < 1e-5f) ? float.MaxValue : (1.0f / fadeNegative.z); float distFadeLen = Mathf.Max(0.00001526f, distanceFadeEnd - distanceFadeStart); data.rcpDistFadeLen = 1.0f / distFadeLen; data.endTimesRcpDistFadeLen = distanceFadeEnd * data.rcpDistFadeLen; return(data); }
public static float Evaluate(ref VolumeFalloffEngineData falloff, ref OrientedBBox obb, float3 positionWS, float distanceWS) { float3x3 obbFrame = new float3x3(obb.right, obb.up, math.cross(obb.up, obb.right)); float3 obbExtents = new float3(obb.extentX, obb.extentY, obb.extentZ); float3 samplePositionBS = math.mul(obbFrame, positionWS - obb.center); float3 samplePositionBCS = samplePositionBS / obbExtents; bool isInsideVolume = math.max(math.abs(samplePositionBCS.x), math.max(math.abs(samplePositionBCS.y), math.abs(samplePositionBCS.z))) < 1.0f; if (!isInsideVolume) { return(0.0f); } float3 samplePositionBNDC = samplePositionBCS * 0.5f + 0.5f; float volumeWeight = VolumeFalloff.ComputeVolumeFalloffWeight( samplePositionBNDC, distanceWS, falloff.rcpFaceFadePos, falloff.rcpFaceFadeNeg, falloff.rcpDistFadeLen, falloff.endTimesRcpDistFadeLen ); volumeWeight *= falloff.weight; return(volumeWeight); }