public void Init()
        {
            // TODO: cmds

            /*cmdSystem->AddCommand( "listModels", ListModels_f, CMD_FL_RENDERER, "lists all models" );
             * cmdSystem->AddCommand( "printModel", PrintModel_f, CMD_FL_RENDERER, "prints model info", idCmdSystem::ArgCompletion_ModelName );
             * cmdSystem->AddCommand( "reloadModels", ReloadModels_f, CMD_FL_RENDERER|CMD_FL_CHEAT, "reloads models" );
             * cmdSystem->AddCommand( "touchModel", TouchModel_f, CMD_FL_RENDERER, "touches a model", idCmdSystem::ArgCompletion_ModelName );*/

            _insideLevelLoad = false;

            // create a default model
            idRenderModel_Static model = new idRenderModel_Static();

            model.InitEmpty("_DEFAULT");
            model.MakeDefault();
            model.IsLevelLoadReferenced = true;

            _defaultModel = model;

            AddModel(model);

            // create the beam model
            // TODO: beam

            /*idRenderModelStatic *beam = new idRenderModelBeam;
             * beam->InitEmpty( "_BEAM" );
             * beam->SetLevelLoadReferenced( true );
             * beamModel = beam;
             * AddModel( beam );*/

            // TODO: sprite

            /*idRenderModelStatic *sprite = new idRenderModelSprite;
             * sprite->InitEmpty( "_SPRITE" );
             * sprite->SetLevelLoadReferenced( true );
             * spriteModel = sprite;
             * AddModel( sprite );*/
        }
        private idRenderModel GetModel(string name, bool createIfNotFound)
        {
            idRenderModel model;
            string        extension;

            if (_models.ContainsKey(name) == true)
            {
                model = _models[name];

                if (model.IsLoaded == false)
                {
                    // reload it if it was purged
                    model.Load();
                }
                else if ((_insideLevelLoad == true) && (model.IsLevelLoadReferenced == false))
                {
                    // we are reusing a model already in memory, but
                    // touch all the materials to make sure they stay
                    // in memory as well
                    model.TouchData();
                }

                model.IsLevelLoadReferenced = true;

                return(model);
            }

            model     = null;
            extension = Path.GetExtension(name).ToLower();

            // see if we can load it
            // determine which subclass of idRenderModel to initialize
            switch (extension)
            {
            case ".ase":
            case ".lwo":
            case ".flt":
            case ".ma":
                model = new idRenderModel_Static();
                model.InitFromFile(name);
                break;

            case ".md5mesh":
                model = new idRenderModel_MD5();
                model.InitFromFile(name);
                break;

            case ".md3":
                idConsole.Warning("TODO: md3");
                break;

            case ".prt":
                model = new idRenderModel_PRT();
                model.InitFromFile(name);
                break;

            case ".liquid":
                idConsole.Warning("TODO: liquid");
                break;
            }

            if (model == null)
            {
                if (extension != string.Empty)
                {
                    idConsole.Warning("unknown model type '{0}'", name);
                }

                if (createIfNotFound == false)
                {
                    return(null);
                }

                model = new idRenderModel_Static();
                model.InitEmpty(name);
                model.MakeDefault();
            }

            model.IsLevelLoadReferenced = true;

            if ((createIfNotFound == false) && (model.IsDefault == true))
            {
                model.Dispose();

                return(null);
            }


            AddModel(model);

            return(model);
        }
		private idRenderModel GetModel(string name, bool createIfNotFound)
		{
			idRenderModel model;
			string extension;

			if(_models.ContainsKey(name) == true)
			{
				model = _models[name];

				if(model.IsLoaded == false)
				{
					// reload it if it was purged
					model.Load();
				}
				else if((_insideLevelLoad == true) && (model.IsLevelLoadReferenced == false))
				{
					// we are reusing a model already in memory, but
					// touch all the materials to make sure they stay
					// in memory as well
					model.TouchData();
				}

				model.IsLevelLoadReferenced = true;

				return model;
			}
		
			model = null;
			extension = Path.GetExtension(name).ToLower();

			// see if we can load it	
			// determine which subclass of idRenderModel to initialize
			switch(extension)
			{
				case ".ase":
				case ".lwo":
				case ".flt":
				case ".ma":
					model = new idRenderModel_Static();
					model.InitFromFile(name);
					break;

				case ".md5mesh":
					model = new idRenderModel_MD5();
					model.InitFromFile(name);
					break;

				case ".md3":
					idConsole.Warning("TODO: md3");
					break;

				case ".prt":
					model = new idRenderModel_PRT();
					model.InitFromFile(name);
					break;

				case ".liquid":
					idConsole.Warning("TODO: liquid");
					break;
			}

			if(model == null)
			{
				if(extension != string.Empty)
				{
					idConsole.Warning("unknown model type '{0}'", name);
				}

				if(createIfNotFound == false)
				{
					return null;
				}

				model = new idRenderModel_Static();
				model.InitEmpty(name);
				model.MakeDefault();
			}

			model.IsLevelLoadReferenced = true;

			if((createIfNotFound == false) && (model.IsDefault == true))
			{
				model.Dispose();

				return null;
			}


			AddModel(model);

			return model;
		}
		public void Init()
		{
			// TODO: cmds
			/*cmdSystem->AddCommand( "listModels", ListModels_f, CMD_FL_RENDERER, "lists all models" );
			cmdSystem->AddCommand( "printModel", PrintModel_f, CMD_FL_RENDERER, "prints model info", idCmdSystem::ArgCompletion_ModelName );
			cmdSystem->AddCommand( "reloadModels", ReloadModels_f, CMD_FL_RENDERER|CMD_FL_CHEAT, "reloads models" );
			cmdSystem->AddCommand( "touchModel", TouchModel_f, CMD_FL_RENDERER, "touches a model", idCmdSystem::ArgCompletion_ModelName );*/

			_insideLevelLoad = false;
			
			// create a default model
			idRenderModel_Static model = new idRenderModel_Static();
			model.InitEmpty("_DEFAULT");
			model.MakeDefault();
			model.IsLevelLoadReferenced = true;

			_defaultModel = model;

			AddModel(model);

			// create the beam model
			// TODO: beam
			/*idRenderModelStatic *beam = new idRenderModelBeam;
			beam->InitEmpty( "_BEAM" );
			beam->SetLevelLoadReferenced( true );
			beamModel = beam;
			AddModel( beam );*/

			// TODO: sprite
			/*idRenderModelStatic *sprite = new idRenderModelSprite;
			sprite->InitEmpty( "_SPRITE" );
			sprite->SetLevelLoadReferenced( true );
			spriteModel = sprite;
			AddModel( sprite );*/
		}