assets 0.3.0

asynchronous asset management
Documentation
extern crate assets;
extern crate futures;
extern crate futures_cpupool;
extern crate specs;
extern crate specs_time;

use futures_cpupool::CpuPool;

use assets::{
    FileExporter, FileImporter, ImageAsset, ImageAssetExportOptions, ImageAssetImportOptions,
    JSONAsset, Manager,
};
use specs::{DispatcherBuilder, ReadExpect, System, World};
use specs_time::{Time, TimeSystem};

use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::{thread, time};

pub type JSONManager = Manager<JSONAsset, FileImporter<PathBuf>, FileExporter<PathBuf>>;
pub type ImageManager = Manager<ImageAsset, FileImporter<PathBuf>, FileExporter<PathBuf>>;

pub struct SimpleSystem {
    done: Arc<AtomicBool>,
}

impl Default for SimpleSystem {
    fn default() -> Self {
        SimpleSystem {
            done: Arc::new(AtomicBool::new(false)),
        }
    }
}

impl SimpleSystem {
    pub fn new(done: Arc<AtomicBool>) -> Self {
        SimpleSystem { done: done }
    }
}

impl<'system> System<'system> for SimpleSystem {
    type SystemData = (
        ReadExpect<'system, ImageManager>,
        ReadExpect<'system, JSONManager>,
    );

    fn run(&mut self, (image_handler, json_handler): Self::SystemData) {
        println!(
            "Images importing {:?}, imported {:?}",
            image_handler.importing_count(),
            image_handler.imported_count()
        );
        println!(
            "JSONs importing {:?}, imported {:?}",
            json_handler.importing_count(),
            json_handler.imported_count()
        );

        for event in image_handler.poll_events() {
            println!("{:?}", event);
        }
        for event in json_handler.poll_events() {
            println!("{:?}", event);
        }

        if image_handler.importing_count() == 0 && json_handler.importing_count() == 0 {
            self.done.store(true, Ordering::SeqCst);
        }
    }
}

fn main() {
    let pool = Arc::new(CpuPool::new_num_cpus());
    let file_importer = Arc::new(FileImporter::new());
    let file_exporter = Arc::new(FileExporter::new());

    let mut image_handler =
        ImageManager::new(file_importer.clone(), file_exporter.clone(), pool.clone());
    let mut json_handler = JSONManager::new(file_importer, file_exporter, pool);

    let done = Arc::new(AtomicBool::new(false));
    let mut image_handles = Vec::new();
    let mut json_handles = Vec::new();

    let assets = if cfg!(target_os = "android") {
        Path::new("")
    } else {
        Path::new("assets")
    };

    for _ in 0..4 {
        json_handles.push(json_handler.add(
            assets.join("person.json"),
            (),
            (),
            assets.join("person.json"),
            (),
            (),
            true,
        ));
    }
    for _ in 0..4 {
        image_handles.push(image_handler.add(
            assets.join("crate.jpg"),
            (),
            ImageAssetImportOptions::default(),
            assets.join("crate.jpg"),
            (),
            ImageAssetExportOptions::default(),
            true,
        ));
    }
    for _ in 0..4 {
        json_handles.push(json_handler.add(
            assets.join("person.json"),
            (),
            (),
            assets.join("person.json"),
            (),
            (),
            true,
        ));
    }
    for _ in 0..4 {
        image_handles.push(image_handler.add(
            assets.join("crate.jpg"),
            (),
            ImageAssetImportOptions::default(),
            assets.join("crate.jpg"),
            (),
            ImageAssetExportOptions::default(),
            true,
        ));
    }

    let mut world = World::new();

    world.add_resource(image_handler);
    world.add_resource(json_handler);
    world.add_resource(Time::<f32>::default());

    let mut dispatcher = DispatcherBuilder::new()
        .with(TimeSystem::<f32>::new(), "time_system", &[])
        .with(SimpleSystem::new(done.clone()), "simple_system", &[])
        .build();

    while !done.load(Ordering::Relaxed) {
        dispatcher.dispatch(&mut world.res);
        thread::sleep(time::Duration::from_millis(100));
    }

    let time = world.read_resource::<Time<f32>>();
    println!(
        "Total: {}s {}fps {} frames",
        time.current(),
        time.fps(),
        time.frame()
    );
}