-
Notifications
You must be signed in to change notification settings - Fork 23
Gestalt Asset Core Quick Start
Immortius edited this page Jun 8, 2015
·
21 revisions
There are two important classes when defining a new asset type.
Firstly, the AssetData class provides an implementation-agnostic representation of the data needed to create the asset:
public class BookData implements AssetData {
private String title;
private String body;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
Then there is the Asset class itself, which may be implementation specific (e.g. OpenGLTexture):
public class Book extends Asset<BookData> {
private String title;
private String body;
public Book(ResourceUrn urn, AssetType<?, BookData> type, BookData data) {
super(urn, type);
reload(data);
}
@Override
protected void doReload(BookData data) {
title = data.getTitle();
body = data.getBody();
}
@Override
protected void doDispose() {
title = "";
body = "";
}
public String getTitle() {
return title;
}
public String getBody() {
return body;
}
}
Additionally, you may need a AssetFactory class depending on how the asset type will be registered. A factory class looks like:
public class BookFactory implements AssetFactory<Book, BookData> {
@Override
public Book build(ResourceUrn urn, AssetType<? super Book, BookData> type, BookData data) {
return new Book(urn, type, data);
}
}
although if your constructor meets the signature, you may be able to get away with a method reference (e.g. BookAsset::new
AssetTypeManager is is the central manager for all asset types. ModuleAwareAssetTypeManager will set up asset types to read
ModuleAwareAssetTypeManager assetTypeManager = new ModuleAwareAssetTypeManager();
assetTypeManager.registerCoreAssetType(Book.class, Book::new, "books");
assetTypeManager.switchEnvironment(moduleEnvironment);
You can also have asset types automatically register using the @RegisterAssetType annotation:
import org.terasology.assets.module.annotations.RegisterAssetType;
@RegisterAssetType(folderName = "books", factoryClass = BookFactory.class)
public class Book extends Asset<BookData> {
\\ ...
}
AssetManager assetManager = new AssetManager(assetTypeManager);
Optional<Book> myBook = assetManager.getAsset("engine:mybook", Book.class);
Optional<Book> myBook = assetManager.getAsset("engine:mybook", Book.class);
Set<ResourceUrn> bookUrns = assetManager.getAvailableAssets(Book.class);
BookData data = new BookData();
Book myBook = assetManager.loadAsset(new ResourceUrn("engine:mybook"), data, Book.class);
BookData data = new BookData();
myBook.reload(data);