public static void Ensure(ref ProbeVolumePayload payload, int length) { if (payload.dataSHL01 == null || payload.dataSHL01.Length != (length * GetDataSHL01Stride())) { ProbeVolumePayload.Dispose(ref payload); ProbeVolumePayload.Allocate(ref payload, length); } }
public static void SetSphericalHarmonicsL2FromIndex(ref ProbeVolumePayload payload, SphericalHarmonicsL2 sh, int indexProbe) { int strideSHL01 = GetDataSHL01Stride(); int indexDataBaseSHL01 = indexProbe * strideSHL01; int indexDataEndSHL01 = indexDataBaseSHL01 + strideSHL01; Debug.Assert(payload.dataSHL01 != null); Debug.Assert(payload.dataSHL01.Length >= indexDataEndSHL01); int strideSHL2 = GetDataSHL2Stride(); int indexDataBaseSHL2 = indexProbe * strideSHL2; int indexDataEndSHL2 = indexDataBaseSHL2 + strideSHL2; Debug.Assert(payload.dataSHL2 != null); Debug.Assert(payload.dataSHL2.Length >= indexDataEndSHL2); // Constant (DC terms): payload.dataSHL01[indexDataBaseSHL01 + 0] = sh[0, 0]; // shAr.w payload.dataSHL01[indexDataBaseSHL01 + 1] = sh[1, 0]; // shAg.w payload.dataSHL01[indexDataBaseSHL01 + 2] = sh[2, 0]; // shAb.w // Linear: (used by L1 and L2) // Swizzle the coefficients to be in { x, y, z } order. payload.dataSHL01[indexDataBaseSHL01 + 3] = sh[0, 3]; // shAr.x payload.dataSHL01[indexDataBaseSHL01 + 4] = sh[0, 1]; // shAr.y payload.dataSHL01[indexDataBaseSHL01 + 5] = sh[0, 2]; // shAr.z payload.dataSHL01[indexDataBaseSHL01 + 6] = sh[1, 3]; // shAg.x payload.dataSHL01[indexDataBaseSHL01 + 7] = sh[1, 1]; // shAg.y payload.dataSHL01[indexDataBaseSHL01 + 8] = sh[1, 2]; // shAg.z payload.dataSHL01[indexDataBaseSHL01 + 9] = sh[2, 3]; // shAb.x payload.dataSHL01[indexDataBaseSHL01 + 10] = sh[2, 1]; // shAb.y payload.dataSHL01[indexDataBaseSHL01 + 11] = sh[2, 2]; // shAb.z // Quadratic: (used by L2) payload.dataSHL2[indexDataBaseSHL2 + 0] = sh[0, 4]; // shBr.x payload.dataSHL2[indexDataBaseSHL2 + 1] = sh[0, 5]; // shBr.y payload.dataSHL2[indexDataBaseSHL2 + 2] = sh[0, 6]; // shBr.z payload.dataSHL2[indexDataBaseSHL2 + 3] = sh[0, 7]; // shBr.w payload.dataSHL2[indexDataBaseSHL2 + 4] = sh[1, 4]; // shBg.x payload.dataSHL2[indexDataBaseSHL2 + 5] = sh[1, 5]; // shBg.y payload.dataSHL2[indexDataBaseSHL2 + 6] = sh[1, 6]; // shBg.z payload.dataSHL2[indexDataBaseSHL2 + 7] = sh[1, 7]; // shBg.w payload.dataSHL2[indexDataBaseSHL2 + 8] = sh[2, 4]; // shBb.x payload.dataSHL2[indexDataBaseSHL2 + 9] = sh[2, 5]; // shBb.y payload.dataSHL2[indexDataBaseSHL2 + 10] = sh[2, 6]; // shBb.z payload.dataSHL2[indexDataBaseSHL2 + 11] = sh[2, 7]; // shBb.w payload.dataSHL2[indexDataBaseSHL2 + 12] = sh[0, 8]; // shCr.x payload.dataSHL2[indexDataBaseSHL2 + 13] = sh[1, 8]; // shCr.y payload.dataSHL2[indexDataBaseSHL2 + 14] = sh[2, 8]; // shCr.z }
public static void Copy(ref ProbeVolumePayload payloadSrc, ref ProbeVolumePayload payloadDst, int length) { Array.Copy(payloadSrc.dataSHL01, payloadDst.dataSHL01, length * GetDataSHL01Stride()); Array.Copy(payloadSrc.dataSHL2, payloadDst.dataSHL2, length * GetDataSHL2Stride()); Array.Copy(payloadSrc.dataValidity, payloadDst.dataValidity, length); if (payloadSrc.dataOctahedralDepth != null && payloadDst.dataOctahedralDepth != null) { Array.Copy(payloadSrc.dataOctahedralDepth, payloadDst.dataOctahedralDepth, length * 8 * 8); } }
public static void Allocate(ref ProbeVolumePayload payload, int length) { payload.dataSHL01 = new float[length * GetDataSHL01Stride()]; payload.dataSHL2 = new float[length * GetDataSHL2Stride()]; // TODO: Only allocate dataValidity and dataOctahedralDepth if those payload slices are in use. payload.dataValidity = new float[length]; payload.dataOctahedralDepth = null; if (ShaderConfig.s_ProbeVolumesBilateralFilteringMode == ProbeVolumesBilateralFilteringModes.OctahedralDepth) { payload.dataOctahedralDepth = new float[length * 8 * 8]; } }
void ApplyMigrationAddProbeVolumesAtlasEncodingModes() { Debug.Assert(probeVolumeAsset != null && probeVolumeAsset.Version == (int)ProbeVolumeAsset.AssetVersion.First); probeVolumeAsset.m_Version = (int)ProbeVolumeAsset.AssetVersion.AddProbeVolumesAtlasEncodingModes; int probeLength = probeVolumeAsset.dataSH.Length; ProbeVolumePayload.Allocate(ref probeVolumeAsset.payload, probeLength); for (int i = 0; i < probeLength; ++i) { ProbeVolumePayload.SetSphericalHarmonicsL1FromIndex(ref probeVolumeAsset.payload, probeVolumeAsset.dataSH[i], i); } probeVolumeAsset.dataSH = null; probeVolumeAsset.dataValidity = null; probeVolumeAsset.dataOctahedralDepth = null; }
public static int GetLength(ref ProbeVolumePayload payload) { // No need to explicitly store probe length - dataValidity is one value per probe, so we can just query the length here. return(payload.dataValidity.Length); }
public static bool IsNull(ref ProbeVolumePayload payload) { return(payload.dataSHL01 == null); }
public static void GetSphericalHarmonicsL1FromIndex(ref SphericalHarmonicsL1 sh, ref ProbeVolumePayload payload, int indexProbe) { int strideSHL01 = GetDataSHL01Stride(); int indexDataBaseSHL01 = indexProbe * strideSHL01; int indexDataEndSHL01 = indexDataBaseSHL01 + strideSHL01; Debug.Assert(payload.dataSHL01 != null); Debug.Assert(payload.dataSHL01.Length >= indexDataEndSHL01); // Constant (DC terms): sh.shAr.w = payload.dataSHL01[indexDataBaseSHL01 + 0]; // shAr.w sh.shAg.w = payload.dataSHL01[indexDataBaseSHL01 + 1]; // shAg.w sh.shAb.w = payload.dataSHL01[indexDataBaseSHL01 + 2]; // shAb.w // Linear: (used by L1 and L2) // Swizzle the coefficients to be in { x, y, z } order. sh.shAr.x = payload.dataSHL01[indexDataBaseSHL01 + 3]; // shAr.x sh.shAr.y = payload.dataSHL01[indexDataBaseSHL01 + 4]; // shAr.y sh.shAr.z = payload.dataSHL01[indexDataBaseSHL01 + 5]; // shAr.z sh.shAg.x = payload.dataSHL01[indexDataBaseSHL01 + 6]; // shAg.x sh.shAg.y = payload.dataSHL01[indexDataBaseSHL01 + 7]; // shAg.y sh.shAg.z = payload.dataSHL01[indexDataBaseSHL01 + 8]; // shAg.z sh.shAb.x = payload.dataSHL01[indexDataBaseSHL01 + 9]; // shAb.x sh.shAb.y = payload.dataSHL01[indexDataBaseSHL01 + 10]; // shAb.y sh.shAb.z = payload.dataSHL01[indexDataBaseSHL01 + 11]; // shAb.z }
public static void Copy(ref ProbeVolumePayload payloadSrc, ref ProbeVolumePayload payloadDst) { Debug.Assert(ProbeVolumePayload.GetLength(ref payloadSrc) == ProbeVolumePayload.GetLength(ref payloadDst)); ProbeVolumePayload.Copy(ref payloadSrc, ref payloadDst, ProbeVolumePayload.GetLength(ref payloadSrc)); }