diff --git a/GameEngine/resources/GameEngineTest.model b/GameEngine/resources/GameEngineTest.model index fd85733..f1ee23b 100644 --- a/GameEngine/resources/GameEngineTest.model +++ b/GameEngine/resources/GameEngineTest.model @@ -1,92 +1,101 @@ init { -{ - "001": { - "transform": { - "rotation": { - "x": 0.0, - "y": 0.0, - "z": 0.0 +scene := { + "entities": { + "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 + } }, - "scale": { - "x": 1.0, - "y": 1.0, - "z": 1.0 - }, - "position": { - "x": 0.0, - "y": 0.0, - "z": 0.0 + "mesh": { + "sprite": "GameEngine/resources/enemy1.png", + "type": "sprite" } }, - "mesh": { - "sprite": GameEngine/resources/test.png, - "type": sprite - } - }, - "002": { - "transform": { - "rotation": { - "x": 0.0, - "y": 0.0, - "z": 0.0 + "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 + } }, - "scale": { - "x": 1.0, - "y": 1.0, - "z": 1.0 - }, - "position": { - "x": 0.0, - "y": 0.0, - "z": 0.0 + "mesh": { + "sprite": "GameEngine/resources/enemy1.png", + "type": "sprite" } - }, - "mesh": { - "sprite": GameEngine/resources/test.png, - "type": sprite } } } } -channel KeyEvent { - out state(curState:Int,keyEvent(nextState)) = nextState +native channel KeyEvent(kno:Int) { + out scene.keys.{kno:Int}.state(curState:Int,keyEvent(nextState)) = nextState } -channel SceneUpdateEvent { - out time(time:Long,updateEvent(dt:Long)) = (time+dt) +native channel SceneUpdateEvent { + out scene.time(time:Long,updateEvent(dt:Long)) = (time+dt) } -channel TimerEvent { - out count(count:Long,tick()) = (count+1) +native channel TimerEvent(tid:Str) { + out timers.{tid:Str}.count(count:Long,tick()) = (count+1) } -channel EntitySpriteUpdate { - in mesh(curMesh:Json,updateSprite(spritePath:Str)) = { - ""sprite"": spritePath, - ""type"": "sprite" +channel UpdateCameraPosition { + out scene.camera.transform.position(curPos:Json,updateCameraPosition(x:Double,y:Double,z:Double)) = { + "x": x, + "y": y, + "z": z } } -channel EntityScaleUpdate { - in scale(curScale:Json,updateScale(nextScale.{x},nextScale.{y},nextScale.{z})) = nextScale +native channel EntitySpriteUpdate(eid:Str) { + in scene.entities.{eid:Str}.mesh(curMesh:Json,updateSprite(spritePath:Str)) = { + "sprite": spritePath, + "type": "sprite" } -channel EntityPositionUpdate { - in position(curPos:Json,updatePosition(nextPos.{x},nextPos.{y},nextPos.{z})) = nextPos } -channel CameraProjectionUpdate { - in projection(curProj:Json,updateProjection(curProj,nextProj)) = nextProj +native channel EntityScaleUpdate(eid:Str) { + in scene.entities.{eid:Str}.transform.scale(curScale:Json,updateScale(nextScale.x,nextScale.y,nextScale.z)) = nextScale } -channel TimersUpdated { +native channel EntityPositionUpdate(eid:Str) { + in scene.entities.{eid:Str}.transform.position(curPos:Json,updatePosition(nextPos.x,nextPos.y,nextPos.z)) = nextPos +} +native channel CameraProjectionUpdate { + in scene.camera.projection(curProj:Json,updateProjection(curProj,nextProj)) = nextProj +} +native channel TimersUpdated { in timers(curTimers:Map,update(curTimers,nextTimers)) = nextTimers } -channel CameraPositionUpdate { - in position(curPos:Json,updatePosition(nextPos.{x},nextPos.{y},nextPos.{z})) = nextPos +native channel CameraPositionUpdate { + in scene.camera.transform.position(curPos:Json,updatePosition(nextPos.x,nextPos.y,nextPos.z)) = nextPos } -channel SceneUpdate { +native channel SceneUpdate { in scene(curSc:Json,update(curSc,nextSc)) = nextSc } -channel CameraScaleUpdate { - in scale(curScale:Json,updateScale(nextScale.{x},nextScale.{y},nextScale.{z})) = nextScale +native channel CameraScaleUpdate { + in scene.camera.transform.scale(curScale:Json,updateScale(nextScale.x,nextScale.y,nextScale.z)) = nextScale } -channel EntityRotationUpdate { - in rotation(curRot:Json,updateRotation(nextRot.{x},nextRot.{y},nextRot.{z})) = nextRot +native channel EntityRotationUpdate(eid:Str) { + in scene.entities.{eid:Str}.transform.rotation(curRot:Json,updateRotation(nextRot.x,nextRot.y,nextRot.z)) = nextRot } -channel CameraRotationUpdate { - in rotation(curRot:Json,updateRotation(nextRot.{x},nextRot.{y},nextRot.{z})) = nextRot +native channel CameraRotationUpdate { + in scene.camera.transform.rotation(curRot:Json,updateRotation(nextRot.x,nextRot.y,nextRot.z)) = nextRot } diff --git a/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java b/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java index 0f09d3f..3b4cf32 100644 --- a/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java +++ b/GameEngine/src/main/java/gameEngine/GameEngineModelFileGenerator.java @@ -11,10 +11,14 @@ import parser.Parser; import parser.Parser.TokenStream; import parser.exceptions.*; +import simulator.Event; +import simulator.ResourceIdentifier; import simulator.Simulator; import gameEngine.simulator.interfaces.GameEnginePresenter; +import simulator.SystemState; import simulator.interfaces.timers.TimerService; +import javax.xml.crypto.Data; import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -73,7 +77,7 @@ 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"); + DataTransferChannel sceneUpdateChannel = 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"); @@ -85,23 +89,30 @@ 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", DataConstraintModel.typeString)),"count: Long","tick()","count + 1"); + DataTransferChannel updateCameraPosChannel = addInputChannel(stream,parser,scene_camera_transform_position, new DataTransferChannel("UpdateCameraPosition"), "curPos: Json","updateCameraPosition(x: Double, y: Double, z: Double)", "{\"x\": x, \"y\": y, \"z\": z}"); + if (stream.hasNext()) stream.next(); + save(); + + TypeInference.infer(model); + Simulator simulator = new Simulator(model); + SystemState initialState = simulator.init(); + Window window = Window.get(); + window.changeScene(1); + GameEnginePresenter presenter = new GameEnginePresenter(window.getScene(), simulator); + TimerService timerService = new TimerService(simulator); + //simulator.addNativeReceiver(presenter, sceneUpdateChannel); + + stream.addLine("updateCameraPosition(0.0,0.0,0.0)"); + Expression messageUpdateCPos = parser.parseTerm(stream, model); + Event updateCameraPos = new Event(updateCameraPosChannel, messageUpdateCPos, scene_camera_transform_position, initialState.getResource(ResourceIdentifier.createFrom(scene_camera_transform_position))); + simulator.transition(updateCameraPos); } catch (Exception e) { e.printStackTrace(); } - - 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(){ @@ -126,16 +137,19 @@ transformTerm.addMember("scale", scaleTerm); JsonTerm meshTerm = new JsonTerm(); - meshTerm.addMember("type", new Constant("sprite")); - meshTerm.addMember("sprite", new Constant(Window.resourcePath + "test.png")); + meshTerm.addMember("type", new Constant("sprite", DataConstraintModel.typeString)); + meshTerm.addMember("sprite", new Constant(Window.resourcePath + "enemy1.png", DataConstraintModel.typeString)); JsonTerm entityTerm = new JsonTerm(); entityTerm.addMember("transform", transformTerm); entityTerm.addMember("mesh", meshTerm); + JsonTerm entitiesTerm = new JsonTerm(); + entitiesTerm.addMember("001", entityTerm); + entitiesTerm.addMember("002", entityTerm); + JsonTerm sceneTerm = new JsonTerm(); - sceneTerm.addMember("001", entityTerm); - sceneTerm.addMember("002", entityTerm); + sceneTerm.addMember("entities",entitiesTerm); return sceneTerm; } @@ -163,7 +177,7 @@ } - private void addNativeOutputChannel(TokenStream stream, Parser parser, ResourcePath path, + private DataTransferChannel addNativeOutputChannel(TokenStream stream, Parser parser, ResourcePath path, DataTransferChannel dataTransferChannel, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { DataTransferChannel outputChannel = dataTransferChannel; outputChannel.setNative(true); @@ -179,9 +193,10 @@ out.getStateTransition().setNextStateExpression(nextState); outputChannel.addChannelMemberAsInput(out); model.addChannel(outputChannel); + return outputChannel; } - private void addNativeInputChannel(TokenStream stream, Parser parser, ResourcePath path, + private DataTransferChannel addNativeInputChannel(TokenStream stream, Parser parser, ResourcePath path, DataTransferChannel dataTransferChannel, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { DataTransferChannel inputChannel = dataTransferChannel; inputChannel.setNative(true); @@ -197,7 +212,45 @@ in.getStateTransition().setNextStateExpression(nextState); inputChannel.addChannelMemberAsOutput(in); model.addInputChannel(inputChannel); + return inputChannel; + } + private DataTransferChannel addOutputChannel(TokenStream stream, Parser parser, ResourcePath path, + DataTransferChannel dataTransferChannel, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + DataTransferChannel outputChannel = dataTransferChannel; + outputChannel.setNative(false); + ChannelMember out = new ChannelMember(path); + stream.addLine(curStateName); + Expression curState = parser.parseTerm(stream, model); + stream.addLine(messageName); + Expression message = parser.parseTerm(stream, model); + stream.addLine(nextStateName); + Expression nextState = parser.parseTerm(stream, model); + out.getStateTransition().setCurStateExpression(curState); + out.getStateTransition().setMessageExpression(message); + out.getStateTransition().setNextStateExpression(nextState); + outputChannel.addChannelMemberAsInput(out); + model.addChannel(outputChannel); + return outputChannel; + } + + private DataTransferChannel addInputChannel(TokenStream stream, Parser parser, ResourcePath path, + DataTransferChannel dataTransferChannel, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { + DataTransferChannel inputChannel = dataTransferChannel; + inputChannel.setNative(false); + ChannelMember in = new ChannelMember(path); + stream.addLine(curStateName); + Expression curState = parser.parseTerm(stream, model); + stream.addLine(messageName); + Expression message = parser.parseTerm(stream, model); + stream.addLine(nextStateName); + Expression nextState = parser.parseTerm(stream, model); + in.getStateTransition().setCurStateExpression(curState); + in.getStateTransition().setMessageExpression(message); + in.getStateTransition().setNextStateExpression(nextState); + inputChannel.addChannelMemberAsOutput(in); + model.addInputChannel(inputChannel); + return inputChannel; } }