public void Init ()
      {
         if (extensions.Count == 0)
         {
            string[] paths = AssetDatabase.FindAssets ("microsplat_ t:TextAsset");
            for (int i = 0; i < paths.Length; ++i)
            {
               paths [i] = AssetDatabase.GUIDToAssetPath (paths [i]);
            }


            // init extensions
            var types = System.Reflection.Assembly.GetExecutingAssembly ().GetTypes ();
            var possible = (from System.Type type in types
                                    where type.IsSubclassOf (typeof(FeatureDescriptor))
                                    select type).ToArray ();

            for (int i = 0; i < possible.Length; ++i)
            {
               var typ = possible [i];
               FeatureDescriptor ext = System.Activator.CreateInstance (typ) as FeatureDescriptor;
               ext.InitCompiler (paths);
               extensions.Add (ext);
            }
            extensions.Sort (delegate (FeatureDescriptor p1, FeatureDescriptor p2)
            {
               if (p1.DisplaySortOrder () != 0 || p2.DisplaySortOrder () != 0)
               {
                  return p1.DisplaySortOrder ().CompareTo (p2.DisplaySortOrder ());
               }
               return p1.GetType ().Name.CompareTo (p2.GetType ().Name);
            });


            var adapters = (from System.Type type in types
                                    where (type.GetInterfaces ().Contains (typeof(IRenderLoopAdapter)))
                                    select type).ToArray ();

            availableRenderLoops.Clear ();
            for (int i = 0; i < adapters.Length; ++i)
            {
               var typ = adapters [i];
               IRenderLoopAdapter adapter = System.Activator.CreateInstance (typ) as IRenderLoopAdapter;
               adapter.Init (paths);
               availableRenderLoops.Add (adapter);
            }

         }
      }