All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.badlogic.gdx.graphics.g3d.particles.ParticleEffectLoader Maven / Gradle / Ivy

There is a newer version: 1.13.1
Show newest version

package com.badlogic.gdx.graphics.g3d.particles;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

import com.badlogic.gdx.Application.ApplicationType;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetDescriptor;
import com.badlogic.gdx.assets.AssetLoaderParameters;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader;
import com.badlogic.gdx.assets.loaders.FileHandleResolver;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.g3d.particles.ResourceData.AssetData;
import com.badlogic.gdx.graphics.g3d.particles.batches.ParticleBatch;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.reflect.ClassReflection;

/** This class can save and load a {@link ParticleEffect}. It should be added as {@link AsynchronousAssetLoader} to the
 * {@link AssetManager} so it will be able to load the effects. It's important to note that the two classes
 * {@link ParticleEffectLoadParameter} and {@link ParticleEffectSaveParameter} should be passed in whenever possible, because when
 * present the batches settings will be loaded automatically. When the load and save parameters are absent, once the effect will
 * be created, one will have to set the required batches manually otherwise the {@link ParticleController} instances contained
 * inside the effect will not be able to render themselves.
 * @author inferno */
public class ParticleEffectLoader extends
	AsynchronousAssetLoader {
	protected Array>> items = new Array>>();

	public ParticleEffectLoader (FileHandleResolver resolver) {
		super(resolver);
	}

	@Override
	public void loadAsync (AssetManager manager, String fileName, FileHandle file, ParticleEffectLoadParameter parameter) {
	}

	@Override
	public Array getDependencies (String fileName, FileHandle file, ParticleEffectLoadParameter parameter) {
		Json json = new Json();
		ResourceData data = json.fromJson(ResourceData.class, file);
		Array assets = null;
		synchronized (items) {
			ObjectMap.Entry> entry = new ObjectMap.Entry>();
			entry.key = fileName;
			entry.value = data;
			items.add(entry);
			assets = data.getAssets();
		}

		Array descriptors = new Array();
		for (AssetData assetData : assets) {

			// If the asset doesn't exist try to load it from loading effect directory
			if (!resolve(assetData.filename).exists()) {
				assetData.filename = file.parent().child(Gdx.files.internal(assetData.filename).name()).path();
			}

			if (assetData.type == ParticleEffect.class) {
				descriptors.add(new AssetDescriptor(assetData.filename, assetData.type, parameter));
			} else
				descriptors.add(new AssetDescriptor(assetData.filename, assetData.type));
		}

		return descriptors;

	}

	/** Saves the effect to the given file contained in the passed in parameter. */
	public void save (ParticleEffect effect, ParticleEffectSaveParameter parameter) throws IOException {
		ResourceData data = new ResourceData(effect);

		// effect assets
		effect.save(parameter.manager, data);

		// Batches configurations
		if (parameter.batches != null) {
			for (ParticleBatch batch : parameter.batches) {
				boolean save = false;
				for (ParticleController controller : effect.getControllers()) {
					if (controller.renderer.isCompatible(batch)) {
						save = true;
						break;
					}
				}

				if (save) batch.save(parameter.manager, data);
			}
		}

		// save
		Json json = new Json();
		json.toJson(data, parameter.file);
	}

	@Override
	public ParticleEffect loadSync (AssetManager manager, String fileName, FileHandle file, ParticleEffectLoadParameter parameter) {
		ResourceData effectData = null;
		synchronized (items) {
			for (int i = 0; i < items.size; ++i) {
				ObjectMap.Entry> entry = items.get(i);
				if (entry.key.equals(fileName)) {
					effectData = entry.value;
					items.removeIndex(i);
					break;
				}
			}
		}

		effectData.resource.load(manager, effectData);
		if (parameter != null) {
			if (parameter.batches != null) {
				for (ParticleBatch batch : parameter.batches) {
					batch.load(manager, effectData);
				}
			}
			effectData.resource.setBatch(parameter.batches);
		}
		return effectData.resource;
	}

	private  T find (Array array, Class type) {
		for (Object object : array) {
			if (ClassReflection.isAssignableFrom(type, object.getClass())) return (T)object;
		}
		return null;
	}

	public static class ParticleEffectLoadParameter extends AssetLoaderParameters {
		Array> batches;

		public ParticleEffectLoadParameter (Array> batches) {
			this.batches = batches;
		}
	}

	public static class ParticleEffectSaveParameter extends AssetLoaderParameters {
		/** Optional parameters, but should be present to correctly load the settings */
		Array> batches;

		/** Required parameters */
		FileHandle file;
		AssetManager manager;

		public ParticleEffectSaveParameter (FileHandle file, AssetManager manager, Array> batches) {
			this.batches = batches;
			this.file = file;
			this.manager = manager;
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy