Terrain Viewer — MDX/SlimDX Demo

Опубликовано Июн 27, 2010 в .NET | Нет комментариев

Создаём Portable версию Terrain Viewer

Теперь немного улучшим демонстрационное приложение Terrain Viewer. Эти преобразования не касаются DirectX.
Для создания переносимой или portable версии приложения, желательно, чтобы все требуемые ресурсы размещались в самом файле приложения. В тоже время мы оставим возможность приложению работать с отдельным файлом maps.xml.
Добавим минимально необходимые для работы программы внешние файлы Application.ico maps.xml Earth_Map.png default_sky.jpg default_side.png default_texture.png sample_dem.bil sample_texture.png в проект в каталог Resources и установим для них всех Build Action «Embedded Resource».


Теперь к ним можно обратиться так:

    // Ресурсы из файла
    //this.Icon = new Icon("Application.ico");
    
    // Встроенные русурсы
    using (Stream s = GetResourceAsStream("Application.ico", false))
    {
        this.Icon = new System.Drawing.Icon(s); // s может быть null
    }
    
    // Текстуры
    string skyFilePath = GetFullPathTo(skyFileName);
    Stream stream = GetResourceAsStream(skyFilePath, _IsMapListLoadedFromFile);
    if (stream != null)
    {
        skyTexture = Texture.FromStream(device, stream);
        // ...
    }

Создаём универсальный метод, загружающий embeded ресурс по имени, а если такового не нашлось, делающий попытку загрузить ресурсы из локального файла.

    // Загрузка ресурсов из embeded resources или с файловой системы
    public const string _resourcesNamespace = "TerrainViewer.Resources.";
    
    public static Stream GetResourceAsStream(string resourceName, bool fromFileOnly)
    {
        Stream stream = null;
    
        if (!fromFileOnly)
        {
            string fullResourceName = _resourcesNamespace + resourceName;
            Assembly assembly = Assembly.GetExecutingAssembly();
    
            stream = assembly.GetManifestResourceStream(fullResourceName);
        }
    
        if (stream == null) // Не нашлось embeded ресурса
        {
            //stream = new FileStream(resourceName, FileMode.Open); // Загружаем из локального файла
            stream = File.OpenRead(resourceName); // Загружаем из локального файла
        }
    
        return stream;
    }

Оставить комментарий