diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java index 4482a27..1c5225a 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java @@ -986,7 +986,7 @@ for (ResourceHierarchy resource: resourceHierarchies.values()) { String initializer = resource.getInitText(); if (initializer != null) { - init += initializer; + init += initializer + "\n"; } } if (init.length() > 0) { diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java index dd213a8..70fc2a4 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java @@ -51,12 +51,30 @@ } public String toString() { - String jsonStr = "{"; - String delim = ""; - for (String key: keyToIndex.keySet()) { - jsonStr += delim + key + ": " + getChild(keyToIndex.get(key)).toString(); - delim = ", "; - } - return jsonStr + "}"; + return toString(0); } -} + + private String toString(int indentLevel) { + StringBuilder jsonStr = new StringBuilder("{"); + String delim = "\n"; + String indent = " ".repeat(indentLevel + 1); + + for (String key : keyToIndex.keySet()) { + jsonStr.append(delim).append(indent) + .append("\"").append(key).append("\": ") + .append(formatValue(getChild(keyToIndex.get(key)), indentLevel + 1)); + delim = ",\n"; + } + + jsonStr.append("\n").append(" ".repeat(indentLevel)).append("}"); + return jsonStr.toString(); + } + + private String formatValue(Expression value, int indentLevel) { + if (value instanceof JsonTerm) { + return ((JsonTerm) value).toString(indentLevel); + } else { + return value.toString(); // Handle constants or other types of expressions + } + } +} \ No newline at end of file diff --git a/GameEngine/resources/GameEngineTest.model b/GameEngine/resources/GameEngineTest.model index 4b5a525..fd85733 100644 --- a/GameEngine/resources/GameEngineTest.model +++ b/GameEngine/resources/GameEngineTest.model @@ -1,3 +1,53 @@ +init { +{ + "001": { + "transform": { + "rotation": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + }, + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "mesh": { + "sprite": GameEngine/resources/test.png, + "type": sprite + } + }, + "002": { + "transform": { + "rotation": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + }, + "position": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "mesh": { + "sprite": GameEngine/resources/test.png, + "type": sprite + } + } +} +} channel KeyEvent { out state(curState:Int,keyEvent(nextState)) = nextState } @@ -8,7 +58,10 @@ out count(count:Long,tick()) = (count+1) } channel EntitySpriteUpdate { - in mesh(curMesh:Json,updateSprite(spritePath:Str)) = {"sprite": spritePath, "type": "sprite"} + in mesh(curMesh:Json,updateSprite(spritePath:Str)) = { + ""sprite"": spritePath, + ""type"": "sprite" +} } channel EntityScaleUpdate { in scale(curScale:Json,updateScale(nextScale.{x},nextScale.{y},nextScale.{z})) = nextScale diff --git a/GameEngine/resources/test.png b/GameEngine/resources/test.png index c0e8f4b..75891d3 100644 --- a/GameEngine/resources/test.png +++ b/GameEngine/resources/test.png Binary files differ diff --git a/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java b/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java index 69e47c5..3c06196 100644 --- a/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java +++ b/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java @@ -1,26 +1,25 @@ package gameEngine; +import gameEngine.views.Window; +import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Variable; -import models.dataConstraintModel.ChannelMember; -import models.dataConstraintModel.ResourcePath; +import models.dataConstraintModel.*; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferModel; import parser.Parser; import parser.Parser.TokenStream; -import parser.exceptions.ExpectedColon; -import parser.exceptions.ExpectedDoubleQuotation; -import parser.exceptions.ExpectedRightBracket; -import parser.exceptions.WrongJsonExpression; +import parser.exceptions.*; +import simulator.Simulator; +import simulator.interfaces.gameEngine.GameEnginePresenter; +import simulator.interfaces.timers.TimerService; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import static org.junit.Assert.assertEquals; - public class GameEngineModelFileGenerator { - DataTransferModel model; + private DataTransferModel model; private final String modelFilePath = "GameEngine/resources/"; public void generate(){ @@ -39,7 +38,7 @@ ResourcePath scene_camera_projection = new ResourcePath(scene_camera, "projection"); // "scene.camera.projection" ResourcePath entities = new ResourcePath(scene, "entities"); // "scene.entities" - ResourcePath entity = new ResourcePath(entities, new Variable("eid")); // "scene.entities.{eid}" + ResourcePath entity = new ResourcePath(entities, new Variable("eid", DataConstraintModel.typeString)); // "scene.entities.{eid}" ResourcePath entity_transform = new ResourcePath(entity, "transform"); // "scene.entities.{eid}.transform" ResourcePath entity_transform_position = new ResourcePath(entity_transform, "position"); // "scene.entities.{eid}.transform.position" ResourcePath entity_transform_rotation = new ResourcePath(entity_transform, "rotation"); // "scene.entities.{eid}.transform.rotation" @@ -47,11 +46,11 @@ ResourcePath entity_mesh = new ResourcePath(entity, "mesh"); // "scene.entities.{eid}.mesh" ResourcePath keys = new ResourcePath(scene, "keys"); // "scene.keys" - ResourcePath key = new ResourcePath(keys, new Variable("kno")); // "scene.keys.{kno}" + ResourcePath key = new ResourcePath(keys, new Variable("kno", DataConstraintModel.typeInt)); // "scene.keys.{kno}" ResourcePath key_state = new ResourcePath(key, "state"); // "scene.keys.{kno}.state ResourcePath timers = new ResourcePath("timers"); // "timers" - ResourcePath timer = new ResourcePath(timers, new Variable("tid")); // "timers.{tid}" + ResourcePath timer = new ResourcePath(timers, new Variable("tid", DataConstraintModel.typeString)); // "timers.{tid}" ResourcePath timer_count = new ResourcePath(timer, "count"); //"timer.{tid}.count model.addResourcePath(scene_time); @@ -70,19 +69,24 @@ model.addResourcePath(timers); model.addResourcePath(timer_count); + addInit(); + addNativeInputChannel(stream, parser, scene_time, new DataTransferChannel("SceneUpdateEvent"), "time: Long", "updateEvent(dt: Long)", "time + dt"); addNativeOutputChannel(stream, parser, scene,new DataTransferChannel("SceneUpdate"), "curSc: Json", "update(curSc, nextSc)", "nextSc"); addNativeOutputChannel(stream, parser, scene_camera_transform_position,new DataTransferChannel("CameraPositionUpdate"),"curPos: Json","updatePosition(nextPos.x, nextPos.y, nextPos.z)","nextPos"); addNativeOutputChannel(stream, parser, scene_camera_transform_rotation,new DataTransferChannel("CameraRotationUpdate"),"curRot: Json","updateRotation(nextRot.x, nextRot.y, nextRot.z)","nextRot"); addNativeOutputChannel(stream, parser, scene_camera_transform_scale,new DataTransferChannel("CameraScaleUpdate"),"curScale: Json","updateScale(nextScale.x, nextScale.y, nextScale.z)","nextScale"); addNativeOutputChannel(stream, parser, scene_camera_projection,new DataTransferChannel("CameraProjectionUpdate"),"curProj: Json","updateProjection(curProj, nextProj)","nextProj"); - addNativeOutputChannel(stream, parser, entity_transform_position, new DataTransferChannel("EntityPositionUpdate", new Variable("eid")),"curPos: Json","updatePosition(nextPos.x, nextPos.y, nextPos.z)","nextPos"); - addNativeOutputChannel(stream, parser, entity_transform_rotation,new DataTransferChannel("EntityRotationUpdate", new Variable("eid")),"curRot: Json","updateRotation(nextRot.x, nextRot.y, nextRot.z)","nextRot"); - addNativeOutputChannel(stream, parser, entity_transform_scale,new DataTransferChannel("EntityScaleUpdate", new Variable("eid")),"curScale: Json","updateScale(nextScale.x, nextScale.y, nextScale.z)","nextScale"); - addNativeOutputChannel (stream, parser, entity_mesh,new DataTransferChannel("EntitySpriteUpdate", new Variable("eid")),"curMesh: Json","updateSprite(spritePath: Str)","{\"type\": \"sprite\", \"sprite\": spritePath}"); - addNativeInputChannel(stream, parser, key_state,new DataTransferChannel("KeyEvent", new Variable("kno")),"curState: Int","keyEvent(nextState)","nextState"); + addNativeOutputChannel(stream, parser, entity_transform_position, new DataTransferChannel("EntityPositionUpdate", new Variable("eid", DataConstraintModel.typeString)),"curPos: Json","updatePosition(nextPos.x, nextPos.y, nextPos.z)","nextPos"); + addNativeOutputChannel(stream, parser, entity_transform_rotation,new DataTransferChannel("EntityRotationUpdate", new Variable("eid", DataConstraintModel.typeString)),"curRot: Json","updateRotation(nextRot.x, nextRot.y, nextRot.z)","nextRot"); + addNativeOutputChannel(stream, parser, entity_transform_scale,new DataTransferChannel("EntityScaleUpdate", new Variable("eid", DataConstraintModel.typeString)),"curScale: Json","updateScale(nextScale.x, nextScale.y, nextScale.z)","nextScale"); + addNativeOutputChannel (stream, parser, entity_mesh,new DataTransferChannel("EntitySpriteUpdate", new Variable("eid", DataConstraintModel.typeString)),"curMesh: Json","updateSprite(spritePath: Str)","{\"type\": \"sprite\", \"sprite\": spritePath}"); + addNativeInputChannel(stream, parser, key_state,new DataTransferChannel("KeyEvent", new Variable("kno", DataConstraintModel.typeInt)),"curState: Int","keyEvent(nextState)","nextState"); addNativeOutputChannel(stream, parser, timers ,new DataTransferChannel("TimersUpdated"),"curTimers: Map","update(curTimers, nextTimers)","nextTimers"); - addNativeInputChannel(stream, parser, timer_count,new DataTransferChannel("TimerEvent" , new Variable("tid")),"count: Long","tick()","count + 1"); + addNativeInputChannel(stream, parser, timer_count,new DataTransferChannel("TimerEvent" , new Variable("tid", DataConstraintModel.typeString)),"count: Long","tick()","count + 1"); + + if (stream.hasNext()) stream.next(); + } catch (Exception e) { e.printStackTrace(); @@ -90,6 +94,50 @@ save(); + //TypeInference.infer(model); + Simulator simulator = new Simulator(model); + simulator.init(); + Window window = Window.get(); + window.changeScene(1); + GameEnginePresenter presenter = new GameEnginePresenter(window.getScene(), simulator); + TimerService timerService = new TimerService(simulator); + } + + public JsonTerm createJsonTerm(){ + JsonTerm positionTerm = new JsonTerm(); + positionTerm.addMember("x", new Constant(String.valueOf(0.0))); + positionTerm.addMember("y", new Constant(String.valueOf(0.0))); + positionTerm.addMember("z", new Constant(String.valueOf(0.0))); + + JsonTerm rotationTerm = new JsonTerm(); + rotationTerm.addMember("x", new Constant(String.valueOf(0.0))); + rotationTerm.addMember("y", new Constant(String.valueOf(0.0))); + rotationTerm.addMember("z", new Constant(String.valueOf(0.0))); + + JsonTerm scaleTerm = new JsonTerm(); + scaleTerm.addMember("x", new Constant(String.valueOf(1.0))); + scaleTerm.addMember("y", new Constant(String.valueOf(1.0))); + scaleTerm.addMember("z", new Constant(String.valueOf(1.0))); + + JsonTerm transformTerm = new JsonTerm(); + transformTerm.addMember("position", positionTerm); + transformTerm.addMember("rotation", rotationTerm); + transformTerm.addMember("scale", scaleTerm); + + JsonTerm meshTerm = new JsonTerm(); + meshTerm.addMember("type", new Constant("sprite")); + meshTerm.addMember("sprite", new Constant(Window.get().resourcePath + "test.png")); + + JsonTerm entityTerm = new JsonTerm(); + entityTerm.addMember("transform", transformTerm); + entityTerm.addMember("mesh", meshTerm); + + JsonTerm sceneTerm = new JsonTerm(); + sceneTerm.addMember("001", entityTerm); + sceneTerm.addMember("002", entityTerm); + + System.out.println(sceneTerm); + return sceneTerm; } public void save() { @@ -107,6 +155,15 @@ } } + private void addInit(){ + ResourceHierarchy hierarchy = new ResourceHierarchy("scene", DataConstraintModel.typeJson); + hierarchy = model.getOrPutResourceHierarchy(hierarchy); + JsonTerm rightTerm = createJsonTerm(); + hierarchy.setInitialValue(rightTerm); + hierarchy.setInitText(rightTerm.toString()); + + } + private void addNativeOutputChannel(TokenStream stream, Parser parser, ResourcePath path, DataTransferChannel dataTransferChannel, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { DataTransferChannel outputChannel = dataTransferChannel;