void OnEnable()
        {
            //When this inspector is created, also create the built-in inspector
            defaultEditor = CreateEditor(targets, Type.GetType("UnityEditor.Texture3DInspector, UnityEditor"));

            //Find all types of I3DMaterialOverride, and query whether there's a valid material for the current target.

                        #if UNITY_2018_1_OR_NEWER
            IEnumerable <Type> i3DMaterialOverrideTypes = (IEnumerable <Type>)Type.GetType("UnityEditor.EditorAssemblies, UnityEditor").GetMethod(
                "GetAllTypesWithInterface", BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(Type) }, null
                ).Invoke(null, new object[] { typeof(I3DMaterialOverride) });
                        #else
            IEnumerable <Type> i3DMaterialOverrideTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(p => p != typeof(I3DMaterialOverride) && typeof(I3DMaterialOverride).IsAssignableFrom(p));
                        #endif

            foreach (Type i3DMaterialOverrideType in i3DMaterialOverrideTypes)
            {
                I3DMaterialOverride i3DMaterialOverride = (I3DMaterialOverride)Activator.CreateInstance(i3DMaterialOverrideType);
                m_Material = i3DMaterialOverride.GetMaterial((Texture3D)target);
                if (m_Material != null)
                {
                    materialOverride = i3DMaterialOverride;
                    break;
                }
            }

            rCallback = r => { material.SetFloat("_R", r ? 1 : 0); };
            gCallback = g => { material.SetFloat("_G", g ? 1 : 0); };
            bCallback = b => { material.SetFloat("_B", b ? 1 : 0); };
            x         = 1;
            y         = 1;
            z         = 1;
            SetXYZFloats();
        }
        void OnEnable()
        {
            //When this inspector is created, also create the built-in inspector
            defaultEditor = CreateEditor(targets, Type.GetType("UnityEditor.Texture3DInspector, UnityEditor"));

            //Find all types of I3DMaterialOverride, and query whether there's a valid material for the current target.
            IEnumerable <Type> i3DMaterialOverrideTypes = (IEnumerable <Type>)Type.GetType("UnityEditor.EditorAssemblies, UnityEditor").GetMethod(
                "GetAllTypesWithInterface", BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(Type) }, null
                ).Invoke(null, new object[] { typeof(I3DMaterialOverride) });

            //Safe cast to allow Render Texture 3D to fall-back to this class.
            Texture3D texture3D = target as Texture3D;

            if (texture3D != null)
            {
                foreach (Type i3DMaterialOverrideType in i3DMaterialOverrideTypes)
                {
                    I3DMaterialOverride i3DMaterialOverride = (I3DMaterialOverride)Activator.CreateInstance(i3DMaterialOverrideType);
                    m_Material3D = i3DMaterialOverride.GetMaterial(texture3D);
                    if (m_Material3D != null)
                    {
                        materialOverride = i3DMaterialOverride;
                        break;
                    }
                }
            }

            rCallback = r => { material3D.SetFloat(R, r ? 1 : 0); };
            gCallback = g => { material3D.SetFloat(G, g ? 1 : 0); };
            bCallback = b => { material3D.SetFloat(B, b ? 1 : 0); };
            x         = 1;
            y         = 1;
            z         = 1;
            SetXYZFloats();
        }
        protected override void OnEnable()
        {
            //Find all types of I3DMaterialOverride, and query whether there's a valid material for the current target.
            IEnumerable <Type> i3DMaterialOverrideTypes = (IEnumerable <Type>)Type.GetType("UnityEditor.EditorAssemblies, UnityEditor").GetMethod(
                "GetAllTypesWithInterface", BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(Type) }, null
                ).Invoke(null, new object[] { typeof(I3DMaterialOverride) });

            //Safe cast to allow Render Texture 3D to fall-back to this class.
            Texture texture3D = target as Texture;

            if (texture3D != null)
            {
                foreach (Type i3DMaterialOverrideType in i3DMaterialOverrideTypes)
                {
                    I3DMaterialOverride i3DMaterialOverride = (I3DMaterialOverride)Activator.CreateInstance(i3DMaterialOverrideType);
                    override3DMaterial = i3DMaterialOverride.GetMaterial(texture3D);
                    if (override3DMaterial == null)
                    {
                        continue;
                    }
                    materialOverride = i3DMaterialOverride;
                    break;
                }
            }

            rCallback = r => {
                Material m = override3DMaterial != null ? override3DMaterial : material3D;
                m.SetFloat(R, r ? 1 : 0);
            };
            gCallback = g =>
            {
                Material m = override3DMaterial != null ? override3DMaterial : material3D;
                m.SetFloat(G, g ? 1 : 0);
            };
            bCallback = b =>
            {
                Material m = override3DMaterial != null ? override3DMaterial : material3D;
                m.SetFloat(B, b ? 1 : 0);
            };
            x = 1;
            y = 1;
            z = 1;
            SetXYZFloats();
            base.OnEnable();
        }