Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
        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
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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];
            }
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
 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);
 }
Ejemplo n.º 7
0
 public static bool IsNull(ref ProbeVolumePayload payload)
 {
     return(payload.dataSHL01 == null);
 }
Ejemplo n.º 8
0
        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
        }
Ejemplo n.º 9
0
        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));
        }