Enable deserializing widget definitions in :engine
This commit is contained in:
@@ -5,6 +5,7 @@ import com.bartlomiejpluta.base.api.game.runner.GameRunner;
|
||||
import com.bartlomiejpluta.base.engine.context.model.DefaultContext;
|
||||
import com.bartlomiejpluta.base.engine.core.engine.GameEngine;
|
||||
import com.bartlomiejpluta.base.engine.gui.manager.FontManager;
|
||||
import com.bartlomiejpluta.base.engine.gui.manager.WidgetDefinitionManager;
|
||||
import com.bartlomiejpluta.base.engine.gui.xml.inflater.ComponentInflater;
|
||||
import com.bartlomiejpluta.base.engine.project.config.ProjectConfiguration;
|
||||
import com.bartlomiejpluta.base.engine.project.serial.ProjectDeserializer;
|
||||
@@ -35,6 +36,7 @@ public class DefaultContextManager implements ContextManager {
|
||||
private final EntityManager entityManager;
|
||||
private final ClassLoader classLoader;
|
||||
private final ComponentInflater inflater;
|
||||
private final WidgetDefinitionManager widgetDefinitionManager;
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
@@ -49,6 +51,7 @@ public class DefaultContextManager implements ContextManager {
|
||||
project.getImageAssets().forEach(imageManager::registerAsset);
|
||||
project.getEntitySetAssets().forEach(entitySetManager::registerAsset);
|
||||
project.getFontAssets().forEach(fontManager::registerAsset);
|
||||
project.getWidgetDefinitionAssets().forEach(widgetDefinitionManager::registerAsset);
|
||||
|
||||
log.info("Creating game runner instance");
|
||||
var runnerClass = classLoader.<GameRunner>loadClass(project.getRunner());
|
||||
@@ -62,6 +65,7 @@ public class DefaultContextManager implements ContextManager {
|
||||
.mapManager(mapManager)
|
||||
.fontManager(fontManager)
|
||||
.inflater(inflater)
|
||||
.widgetDefinitionManager(widgetDefinitionManager)
|
||||
.gameRunner(gameRunner)
|
||||
.projectName(project.getName())
|
||||
.build();
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.bartlomiejpluta.base.api.game.screen.Screen;
|
||||
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
||||
import com.bartlomiejpluta.base.engine.core.engine.GameEngine;
|
||||
import com.bartlomiejpluta.base.engine.gui.manager.FontManager;
|
||||
import com.bartlomiejpluta.base.engine.gui.manager.WidgetDefinitionManager;
|
||||
import com.bartlomiejpluta.base.engine.gui.render.NanoVGGUI;
|
||||
import com.bartlomiejpluta.base.engine.gui.xml.inflater.ComponentInflater;
|
||||
import com.bartlomiejpluta.base.engine.world.entity.manager.EntityManager;
|
||||
@@ -49,6 +50,9 @@ public class DefaultContext implements Context {
|
||||
@NonNull
|
||||
private final ComponentInflater inflater;
|
||||
|
||||
@NonNull
|
||||
private final WidgetDefinitionManager widgetDefinitionManager;
|
||||
|
||||
@Getter
|
||||
@NonNull
|
||||
private final GameRunner gameRunner;
|
||||
@@ -104,7 +108,7 @@ public class DefaultContext implements Context {
|
||||
@Override
|
||||
public GUI newGUI() {
|
||||
log.info("Creating new GUI");
|
||||
var gui = new NanoVGGUI(this, fontManager, imageManager, inflater);
|
||||
var gui = new NanoVGGUI(this, fontManager, imageManager, inflater, widgetDefinitionManager);
|
||||
|
||||
guis.add(gui);
|
||||
gui.init(screen);
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.bartlomiejpluta.base.engine.gui.asset;
|
||||
|
||||
import com.bartlomiejpluta.base.engine.common.asset.Asset;
|
||||
import lombok.NonNull;
|
||||
|
||||
public class WidgetDefinitionAsset extends Asset {
|
||||
|
||||
public WidgetDefinitionAsset(@NonNull String uid, @NonNull String source) {
|
||||
super(uid, source);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.bartlomiejpluta.base.engine.gui.manager;
|
||||
|
||||
import com.bartlomiejpluta.base.engine.error.AppException;
|
||||
import com.bartlomiejpluta.base.engine.gui.asset.WidgetDefinitionAsset;
|
||||
import com.bartlomiejpluta.base.engine.project.config.ProjectConfiguration;
|
||||
import com.bartlomiejpluta.base.engine.util.res.ResourcesManager;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class DefaultWidgetDefinitionManager implements WidgetDefinitionManager {
|
||||
private final Map<String, WidgetDefinitionAsset> assets = new HashMap<>();
|
||||
private final ProjectConfiguration projectConfiguration;
|
||||
private final ResourcesManager resourcesManager;
|
||||
|
||||
@Override
|
||||
public void registerAsset(WidgetDefinitionAsset asset) {
|
||||
log.info("Registering [{}] widget definition asset under UID: [{}]", asset.getSource(), asset.getUid());
|
||||
assets.put(asset.getUid(), asset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream loadObject(String uid) {
|
||||
var asset = assets.get(uid);
|
||||
|
||||
if (asset == null) {
|
||||
throw new AppException("The widget definition asset with UID: [%s] does not exist", uid);
|
||||
}
|
||||
|
||||
var source = projectConfiguration.projectFile("widgets", asset.getSource());
|
||||
|
||||
return resourcesManager.loadResourceAsStream(source);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.bartlomiejpluta.base.engine.gui.manager;
|
||||
|
||||
import com.bartlomiejpluta.base.engine.common.manager.AssetManager;
|
||||
import com.bartlomiejpluta.base.engine.gui.asset.WidgetDefinitionAsset;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
public interface WidgetDefinitionManager extends AssetManager<WidgetDefinitionAsset, InputStream> {
|
||||
}
|
||||
@@ -3,11 +3,13 @@ package com.bartlomiejpluta.base.engine.gui.render;
|
||||
import com.bartlomiejpluta.base.api.game.camera.Camera;
|
||||
import com.bartlomiejpluta.base.api.game.context.Context;
|
||||
import com.bartlomiejpluta.base.api.game.gui.base.*;
|
||||
import com.bartlomiejpluta.base.api.game.gui.component.Component;
|
||||
import com.bartlomiejpluta.base.api.game.input.KeyEvent;
|
||||
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
||||
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
||||
import com.bartlomiejpluta.base.engine.error.AppException;
|
||||
import com.bartlomiejpluta.base.engine.gui.manager.FontManager;
|
||||
import com.bartlomiejpluta.base.engine.gui.manager.WidgetDefinitionManager;
|
||||
import com.bartlomiejpluta.base.engine.gui.widget.ScreenWidget;
|
||||
import com.bartlomiejpluta.base.engine.gui.xml.inflater.ComponentInflater;
|
||||
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
|
||||
@@ -33,7 +35,8 @@ public class NanoVGGUI implements GUI {
|
||||
private final Context context;
|
||||
private final FontManager fontManager;
|
||||
private final ImageManager imageManager;
|
||||
private final ComponentInflater componentInflater;
|
||||
private final ComponentInflater inflater;
|
||||
private final WidgetDefinitionManager widgetDefinitionManager;
|
||||
|
||||
private long nvg;
|
||||
private ScreenWidget screenWidget;
|
||||
@@ -62,6 +65,13 @@ public class NanoVGGUI implements GUI {
|
||||
nvgEndFrame(nvg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component inflateComponent(String widgetUid) {
|
||||
log.info("Inflating component by widget definition with UID: [{}]", widgetUid);
|
||||
var is = widgetDefinitionManager.loadObject(widgetUid);
|
||||
return inflater.inflate(is, context, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Widget getRoot() {
|
||||
return screenWidget.getRoot();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.bartlomiejpluta.base.engine.project.model;
|
||||
|
||||
import com.bartlomiejpluta.base.engine.gui.asset.FontAsset;
|
||||
import com.bartlomiejpluta.base.engine.gui.asset.WidgetDefinitionAsset;
|
||||
import com.bartlomiejpluta.base.engine.world.entity.asset.EntitySetAsset;
|
||||
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
|
||||
import com.bartlomiejpluta.base.engine.world.map.asset.GameMapAsset;
|
||||
@@ -35,4 +36,7 @@ public class Project {
|
||||
|
||||
@NonNull
|
||||
private final List<FontAsset> fontAssets;
|
||||
|
||||
@NonNull
|
||||
private final List<WidgetDefinitionAsset> widgetDefinitionAssets;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.bartlomiejpluta.base.engine.project.serial;
|
||||
|
||||
import com.bartlomiejpluta.base.engine.gui.asset.FontAsset;
|
||||
import com.bartlomiejpluta.base.engine.gui.asset.WidgetDefinitionAsset;
|
||||
import com.bartlomiejpluta.base.engine.project.model.Project;
|
||||
import com.bartlomiejpluta.base.engine.world.entity.asset.EntitySetAsset;
|
||||
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
|
||||
@@ -26,8 +27,9 @@ public class ProtobufProjectDeserializer extends ProjectDeserializer {
|
||||
var imageAssets = proto.getImagesList().stream().map(this::parseImageAsset).collect(toList());
|
||||
var entitySetAssets = proto.getEntitySetsList().stream().map(this::parseEntitySetAsset).collect(toList());
|
||||
var fontAssets = proto.getFontsList().stream().map(this::parseFontAsset).collect(toList());
|
||||
var widgetAssets = proto.getWidgetsList().stream().map(this::parseWidgetAsset).collect(toList());
|
||||
|
||||
return new Project(name, runner, tileSetAssets, mapAssets, imageAssets, entitySetAssets, fontAssets);
|
||||
return new Project(name, runner, tileSetAssets, mapAssets, imageAssets, entitySetAssets, fontAssets, widgetAssets);
|
||||
}
|
||||
|
||||
private TileSetAsset parseTileSetAsset(ProjectProto.TileSetAsset proto) {
|
||||
@@ -49,4 +51,8 @@ public class ProtobufProjectDeserializer extends ProjectDeserializer {
|
||||
private FontAsset parseFontAsset(ProjectProto.FontAsset proto) {
|
||||
return new FontAsset(proto.getUid(), proto.getSource());
|
||||
}
|
||||
|
||||
private WidgetDefinitionAsset parseWidgetAsset(ProjectProto.WidgetAsset proto) {
|
||||
return new WidgetDefinitionAsset(proto.getUid(), proto.getSource());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,8 +11,12 @@ import java.util.Scanner;
|
||||
|
||||
@Component
|
||||
public class ResourcesManager {
|
||||
public InputStream loadResourceAsStream(String fileName) {
|
||||
return ResourcesManager.class.getResourceAsStream(fileName);
|
||||
}
|
||||
|
||||
public String loadResourceAsString(String fileName) {
|
||||
try (InputStream in = ResourcesManager.class.getResourceAsStream(fileName);
|
||||
try (InputStream in = loadResourceAsStream(fileName);
|
||||
Scanner scanner = new Scanner(in, java.nio.charset.StandardCharsets.UTF_8.name())) {
|
||||
return scanner.useDelimiter("\\A").next();
|
||||
} catch (Exception e) {
|
||||
@@ -22,7 +26,7 @@ public class ResourcesManager {
|
||||
|
||||
public ByteBuffer loadResourceAsByteBuffer(String fileName) {
|
||||
try {
|
||||
var bytes = ResourcesManager.class.getResourceAsStream(fileName).readAllBytes();
|
||||
var bytes = loadResourceAsStream(fileName).readAllBytes();
|
||||
return ByteBuffer
|
||||
.allocateDirect(bytes.length)
|
||||
.order(ByteOrder.nativeOrder())
|
||||
|
||||
Reference in New Issue
Block a user