diff --git a/examples/3d-lane-runner/3d-lane-runner.json b/examples/3d-lane-runner/3d-lane-runner.json index 254fcb9e8..77613f7ee 100644 --- a/examples/3d-lane-runner/3d-lane-runner.json +++ b/examples/3d-lane-runner/3d-lane-runner.json @@ -538,15 +538,6 @@ "name": "Yellow Button_Pressed.png" } }, - { - "alwaysLoaded": false, - "file": "Camera.png", - "kind": "image", - "metadata": "", - "name": "Camera.png", - "smoothed": true, - "userAdded": true - }, { "alwaysLoaded": false, "file": "assets/Particle.png", @@ -564,18 +555,31 @@ "folderName": "__ROOT" }, "objectsGroups": [], - "variables": [], + "variables": [ + { + "folded": true, + "name": "Score", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "PlayerName", + "type": "string", + "value": "" + } + ], "layouts": [ { - "b": 223, + "b": 182, "disableInputWhenNotFocused": true, "mangledName": "Game", "name": "Game", - "r": 226, + "r": 182, "standardSortMethod": true, "stopSoundsOnStartup": false, "title": "", - "v": 226, + "v": 182, "uiSettings": { "grid": true, "gridType": "rectangular", @@ -586,12 +590,12 @@ "gridColor": 10401023, "gridAlpha": 0.8, "snap": true, - "zoomFactor": 0.3925161175488267, + "zoomFactor": 0.4950840073748954, "windowMask": false }, "objectsGroups": [ { - "name": "Platforms", + "name": "Platform", "objects": [ { "name": "Ground" @@ -613,7 +617,7 @@ ] }, { - "name": "AllObjects", + "name": "LevelElement", "objects": [ { "name": "Ground" @@ -632,46 +636,24 @@ ], "variables": [ { - "folded": true, - "name": "Randomizer", + "name": "Coins", "type": "number", "value": 0 }, { "folded": true, - "name": "RisingPitch", - "type": "number", - "value": 0.8 - }, - { - "name": "Coins", + "name": "HighScore", "type": "number", "value": 0 }, { "folded": true, - "name": "HighScore", - "type": "number", - "value": 0 + "name": "GameState", + "type": "string", + "value": "\"Playing\"" } ], "instances": [ - { - "angle": 0, - "customSize": false, - "height": 0, - "layer": "", - "name": "Camera", - "persistentUuid": "48ad2bba-6062-4941-9415-85c3908b26de", - "width": 0, - "x": 64, - "y": 160, - "z": 160, - "zOrder": 1, - "numberProperties": [], - "stringProperties": [], - "initialVariables": [] - }, { "angle": 0, "customSize": false, @@ -680,8 +662,8 @@ "name": "Player", "persistentUuid": "386469df-5174-48d4-bd2b-7c45a143a091", "width": 0, - "x": 431, - "y": 329, + "x": 434, + "y": 345, "z": 160, "zOrder": 2, "numberProperties": [], @@ -719,14 +701,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -743,14 +718,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -767,14 +735,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -807,14 +768,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -831,14 +785,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -855,14 +802,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -882,8 +822,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -895,14 +834,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -919,19 +851,11 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -943,19 +867,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -967,14 +883,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -991,14 +900,7 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -1015,19 +917,11 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -1042,8 +936,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -1058,8 +951,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -1071,19 +963,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -1095,19 +979,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -1122,8 +998,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -1135,14 +1010,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": -45, @@ -1159,14 +1027,7 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": -45, @@ -1183,14 +1044,7 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": -45, @@ -1207,14 +1061,7 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -1260,71 +1107,57 @@ "numberProperties": [], "stringProperties": [], "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "UI", + "name": "ScoreLabel", + "persistentUuid": "4c53d15b-82e5-4684-a11d-24b82030dbc8", + "width": 0, + "x": 8, + "y": 0, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "UI", + "name": "HighScoreLabel", + "persistentUuid": "98faaccd-e19c-4615-8952-c2f49c005f51", + "width": 0, + "x": 8, + "y": 57, + "zOrder": 13, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] } ], "objects": [ - { - "assetStoreId": "", - "name": "Camera", - "type": "Scene3D::Cube3DObject", - "variables": [ - { - "folded": true, - "name": "StartXPosition", - "type": "number", - "value": 0 - } - ], - "effects": [], - "behaviors": [], - "content": { - "width": 30, - "height": 30, - "depth": 1, - "enableTextureTransparency": false, - "facesOrientation": "Y", - "frontFaceResourceName": "Camera.png", - "backFaceResourceName": "", - "backFaceUpThroughWhichAxisRotation": "X", - "leftFaceResourceName": "", - "rightFaceResourceName": "", - "topFaceResourceName": "", - "bottomFaceResourceName": "", - "frontFaceVisible": true, - "backFaceVisible": false, - "leftFaceVisible": false, - "rightFaceVisible": false, - "topFaceVisible": false, - "bottomFaceVisible": false, - "frontFaceResourceRepeat": false, - "backFaceResourceRepeat": false, - "leftFaceResourceRepeat": false, - "rightFaceResourceRepeat": false, - "topFaceResourceRepeat": false, - "bottomFaceResourceRepeat": false, - "materialType": "Basic" - } - }, { "assetStoreId": "54b38ee3a7082557b70bfd9a5c139b4ed7327c9f1fd846c861b8d45970a2b127", "name": "Player", "type": "Scene3D::Model3DObject", - "variables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - }, - { - "folded": true, - "name": "TargetedLane", - "type": "number", - "value": 1 - } - ], + "variables": [], "effects": [], "behaviors": [ + { + "name": "LaneCharacter", + "type": "LanePlatformer::LaneCharacter", + "Object3D": "Object3D", + "Tween": "Tween", + "LaneDepth": 160, + "Lane": 0, + "TargetedLane": 0 + }, { "name": "PlatformerObject", "type": "PlatformBehavior::PlatformerObjectBehavior", @@ -1345,6 +1178,14 @@ "xGrabTolerance": 10, "yGrabOffset": 0 }, + { + "name": "SmoothCameraZ", + "type": "LanePlatformer::SmoothCameraZ", + "OffsetX": 0, + "OffsetY": -100, + "ElevationAngle": 25, + "Distance": 440 + }, { "name": "Tween", "type": "Tween::TweenBehavior" @@ -1479,14 +1320,7 @@ "assetStoreId": "", "name": "Ground", "type": "Scene3D::Cube3DObject", - "variables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ], + "variables": [], "effects": [], "behaviors": [ { @@ -1529,14 +1363,7 @@ "assetStoreId": "", "name": "GroundElevated", "type": "Scene3D::Cube3DObject", - "variables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ], + "variables": [], "effects": [], "behaviors": [ { @@ -1579,16 +1406,14 @@ "assetStoreId": "e3f504ba9b05bd7bbb1e24348772eb7d4509175e93fe55f3f1c39e4f3903967c", "name": "SpikeGroup", "type": "Scene3D::Model3DObject", - "variables": [ + "variables": [], + "effects": [], + "behaviors": [ { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 + "name": "LaneObject", + "type": "LanePlatformer::LaneObject" } ], - "effects": [], - "behaviors": [], "content": { "centerLocation": "ObjectCenter", "depth": 99, @@ -1608,20 +1433,22 @@ "assetStoreId": "b8200f0619b25c76e3d392f1d0d16d7547bf1c96097bc23af81b68cf11e57677", "name": "Coin", "type": "Scene3D::Model3DObject", - "variables": [ + "variables": [], + "effects": [], + "behaviors": [ { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 + "name": "Collectible", + "type": "Collectible::Collectible" + }, + { + "name": "LaneObject", + "type": "LanePlatformer::LaneObject" } ], - "effects": [], - "behaviors": [], "content": { "centerLocation": "ModelOrigin", - "depth": 31, - "height": 31, + "depth": 18.752, + "height": 62.66935348510742, "keepAspectRatio": true, "materialType": "KeepOriginal", "modelResourceName": "Coin.glb", @@ -1629,7 +1456,7 @@ "rotationX": 0, "rotationY": 0, "rotationZ": 0, - "width": 31, + "width": 59.60209369659424, "animations": [] } }, @@ -1637,7 +1464,7 @@ "assetStoreId": "", "bold": false, "italic": false, - "name": "CoinsScore", + "name": "ScoreLabel", "smoothed": true, "type": "TextObject::Text", "underlined": false, @@ -1678,7 +1505,7 @@ "assetStoreId": "", "bold": false, "italic": false, - "name": "HighScore", + "name": "HighScoreLabel", "smoothed": true, "type": "TextObject::Text", "underlined": false, @@ -1757,8 +1584,14 @@ } }, { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, "assetStoreId": "", - "name": "CoinPickUp", + "name": "CoinExplosion", "type": "ParticleEmitter3D::ParticleEmitter3D", "variables": [], "effects": [], @@ -1838,7 +1671,38 @@ } ] } - } + }, + "instances": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ] } ], "objectsFolderStructure": { @@ -1848,19 +1712,16 @@ "folderName": "UI", "children": [ { - "objectName": "CoinsScore" + "objectName": "ScoreLabel" }, { - "objectName": "HighScore" + "objectName": "HighScoreLabel" }, { "objectName": "TutorialText" } ] }, - { - "objectName": "Camera" - }, { "objectName": "Player" }, @@ -1883,7 +1744,7 @@ "objectName": "Coin" }, { - "objectName": "CoinPickUp" + "objectName": "CoinExplosion" } ] }, @@ -1903,7 +1764,7 @@ "actions": [ { "type": { - "value": "ModVarSceneTxt" + "value": "SetStringVariable" }, "parameters": [ "GameState", @@ -1954,21 +1815,19 @@ }, { "type": { - "value": "Cache" + "value": "LanePlatformer::LaneCharacter::EnablePlatformOnLane" }, "parameters": [ - "Camera" + "Player", + "LaneCharacter", + "Platform", + "Object3D", + "Platform", + "" ] } ], "events": [ - { - "type": "BuiltinCommonInstructions::Link", - "include": { - "includeConfig": 0 - }, - "target": "LaneCheck" - }, { "type": "BuiltinCommonInstructions::Comment", "color": { @@ -1987,7 +1846,7 @@ "actions": [ { "type": { - "value": "LireFichierExp" + "value": "ReadNumberFromStorage" }, "parameters": [ "\"GameHighscore\"", @@ -2001,21 +1860,10 @@ "value": "TextContainerCapability::TextContainerBehavior::SetValue" }, "parameters": [ - "CoinsScore", - "Text", - "=", - "\"Coins: \" + ToString(Variable(Coins))" - ] - }, - { - "type": { - "value": "TextContainerCapability::TextContainerBehavior::SetValue" - }, - "parameters": [ - "HighScore", + "HighScoreLabel", "Text", "=", - "\"Highscore: \" + ToString(Variable(HighScore))" + "\"Highscore: \" + HighScore" ] } ] @@ -2037,9 +1885,11 @@ "conditions": [ { "type": { - "value": "SystemInfo::IsMobile" + "value": "SystemInfo::HasTouchScreen" }, - "parameters": [] + "parameters": [ + "" + ] } ], "actions": [ @@ -2068,174 +1918,12 @@ } ] }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Camera controls", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Adjusting the default camera position." - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "DepartScene" - }, - "parameters": [ - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "Scene3D::SetCameraZ" - }, - "parameters": [ - "", - "=", - "Camera.Z() + 5", - "", - "" - ] - }, - { - "type": { - "value": "CentreCamera" - }, - "parameters": [ - "", - "Camera", - "", - "", - "" - ] - }, - { - "type": { - "value": "Scene3D::TurnCameraTowardObject" - }, - "parameters": [ - "", - "Player", - "", - "", - "" - ] - }, - { - "type": { - "value": "Scene3D::SetCameraRotationY" - }, - "parameters": [ - "", - "=", - "-90", - "", - "" - ] - }, - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Camera", - "StartXPosition", - "=", - "Camera.X() - Player.X()" - ] - }, - { - "type": { - "value": "SetCameraCenterY" - }, - "parameters": [ - "", - "-", - "100", - "", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Constant camera movement to follow the player." - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "Scene3D::SetCameraZ" - }, - "parameters": [ - "", - "=", - "lerp(Scene3D::CameraZ(), Player.Object3D::Z(), 0.05 * 60 * TimeDelta())", - "", - "" - ] - }, - { - "type": { - "value": "SetCameraCenterX" - }, - "parameters": [ - "", - "=", - "Camera.X()", - "", - "" - ] - }, - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Camera", - "=", - "Player.X() + Camera.Variable(StartXPosition)" - ] - } - ] - } - ], - "parameters": [] - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "VarSceneTxt" + "value": "StringVariable" }, "parameters": [ "GameState", @@ -2264,6 +1952,18 @@ "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make the character move ahead." + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], @@ -2337,12 +2037,6 @@ ] } ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] } ], "actions": [ @@ -2358,118 +2052,25 @@ } ] }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Lane change end" - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "VarObjet" - }, - "parameters": [ - "Player", - "Lane", - "!=", - "Player.Variable(TargetedLane)" - ] - }, - { - "type": { - "value": "Tween::HasFinished" + "inverted": true, + "value": "CollisionNP" }, "parameters": [ "Player", - "Tween", - "\"Move\"" + "GroundElevated", + "", + "", + "yes" ] } ], - "actions": [ - { - "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Player", - "Lane", - "=", - "Player.Variable(TargetedLane)" - ] - }, - { - "type": { - "value": "Tween::RemoveTween" - }, - "parameters": [ - "Player", - "Tween", - "\"Move\"" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Checking which objects are valid after the player changes lanes." - }, - { - "type": "BuiltinCommonInstructions::Link", - "include": { - "includeConfig": 0 - }, - "target": "LaneCheck" - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Player", - "Lane", - "=", - "Player.Variable(TargetedLane)" - ] - }, - { - "type": { - "inverted": true, - "value": "CollisionNP" - }, - "parameters": [ - "Player", - "GroundElevated", - "", - "", - "yes" - ] - } - ], - "actions": [], - "events": [ + "actions": [], + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [ @@ -2536,46 +2137,17 @@ ] } ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Player", - "Lane", - "<", - "2" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] } ], "actions": [ { "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Player", - "TargetedLane", - "+", - "1" - ] - }, - { - "type": { - "value": "AnimatableCapability::AnimatableBehavior::SetName" + "value": "LanePlatformer::LaneCharacter::MoveRight" }, "parameters": [ "Player", - "Animation", - "=", - "\"RunRight\"" + "LaneCharacter", + "" ] } ] @@ -2646,46 +2218,17 @@ ] } ] - }, - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Player", - "Lane", - ">", - "0" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] } ], "actions": [ { "type": { - "value": "ModVarObjet" - }, - "parameters": [ - "Player", - "TargetedLane", - "-", - "1" - ] - }, - { - "type": { - "value": "AnimatableCapability::AnimatableBehavior::SetName" + "value": "LanePlatformer::LaneCharacter::MoveLeft" }, "parameters": [ "Player", - "Animation", - "=", - "\"RunLeft\"" + "LaneCharacter", + "" ] } ] @@ -2702,99 +2245,33 @@ "textG": 0, "textR": 0 }, - "comment": "Avoid to cut animation when players move from 2 lanes in a row" - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Player", - "Lane", - "=", - "Player.Variable(TargetedLane)" - ] - }, - { - "type": { - "value": "AnimatableCapability::AnimatableBehavior::Name" - }, - "parameters": [ - "Player", - "Animation", - "!=", - "\"Run\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "AnimatableCapability::AnimatableBehavior::SetName" - }, - "parameters": [ - "Player", - "Animation", - "=", - "\"Run\"" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Lane change start" + "comment": "Lane change end\nChecking which objects are valid after the player changes lanes." }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "VarObjet" - }, - "parameters": [ - "Player", - "Lane", - "!=", - "Player.Variable(TargetedLane)" - ] - }, - { - "type": { - "inverted": true, - "value": "Tween::Exists" + "value": "LanePlatformer::LaneCharacter::HasChangedOfLane" }, "parameters": [ "Player", - "Tween", - "\"Move\"" + "LaneCharacter", + "" ] } ], "actions": [ { "type": { - "value": "Tween::AddObjectPositionZTween2" + "value": "LanePlatformer::LaneCharacter::EnablePlatformOnLane" }, "parameters": [ "Player", - "Tween", + "LaneCharacter", + "Platform", "Object3D", - "\"Move\"", - "Player.Variable(TargetedLane) * 160", - "\"linear\"", - "0.3", + "Platform", "" ] } @@ -2829,13 +2306,14 @@ "conditions": [ { "type": { - "value": "VarObjet" + "value": "LanePlatformer::LaneObject::IsObjectOnSameLane" }, "parameters": [ "Coin", - "Lane", - "=", - "Player.Variable(Lane)" + "LaneObject", + "Player", + "LaneCharacter", + "" ] }, { @@ -2854,95 +2332,75 @@ "actions": [ { "type": { - "value": "PlaySound" - }, - "parameters": [ - "", - "CoinPickUp", - "", - "50", - "Variable(RisingPitch)" - ] - }, - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "RisingPitch", - "*", - "1.03" - ] - }, - { - "type": { - "value": "Create" + "value": "SetNumberVariable" }, "parameters": [ - "", - "CoinPickUp", - "Coin.CenterX()", - "Coin.CenterY()", - "" + "Coins", + "+", + "1" ] }, { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetZ" + "value": "TextContainerCapability::TextContainerBehavior::SetValue" }, "parameters": [ - "CoinPickUp", + "ScoreLabel", + "Text", "=", - "Coin.Object3D::CenterZ()", - "" + "\"Coins: \" + Coins" ] }, { "type": { - "value": "Delete" + "value": "ChangeTimeScale" }, "parameters": [ - "Coin", - "" + "", + "TimeScale() * 1.003" ] }, { "type": { - "value": "ResetTimer" + "value": "Create" }, "parameters": [ "", - "\"RisingPitch\"" + "CoinExplosion", + "Coin.CenterX()", + "Coin.CenterY()", + "" ] }, { "type": { - "value": "ChangeTimeScale" + "value": "Scene3D::Base3DBehavior::SetCenterZ" }, "parameters": [ - "", - "TimeScale() * 1.003" + "CoinExplosion", + "Object3D", + "=", + "Coin.Object3D::CenterZ()" ] }, { "type": { - "value": "ModVarScene" + "value": "Scene3D::Base3DBehavior::SetRotationY" }, "parameters": [ - "Coins", - "+", - "1" + "CoinExplosion", + "Object3D", + "=", + "-90" ] }, { "type": { - "value": "TextContainerCapability::TextContainerBehavior::SetValue" + "value": "Delete" }, "parameters": [ - "CoinsScore", - "Text", - "=", - "\"Coins: \" + ToString(Variable(Coins))" + "Coin", + "" ] } ] @@ -2988,7 +2446,7 @@ "actions": [ { "type": { - "value": "ModVarSceneTxt" + "value": "SetStringVariable" }, "parameters": [ "GameState", @@ -3015,13 +2473,14 @@ "conditions": [ { "type": { - "value": "VarObjet" + "value": "LanePlatformer::LaneObject::IsObjectOnSameLane" }, "parameters": [ "SpikeGroup", - "Lane", - "=", - "Player.Variable(Lane)" + "LaneObject", + "Player", + "LaneCharacter", + "" ] }, { @@ -3040,7 +2499,7 @@ "actions": [ { "type": { - "value": "ModVarSceneTxt" + "value": "SetStringVariable" }, "parameters": [ "GameState", @@ -3063,7 +2522,7 @@ "conditions": [ { "type": { - "value": "VarSceneTxt" + "value": "StringVariable" }, "parameters": [ "GameState", @@ -3133,12 +2592,12 @@ "conditions": [ { "type": { - "value": "VarScene" + "value": "NumberVariable" }, "parameters": [ "Coins", ">", - "Variable(HighScore)" + "HighScore" ] } ], @@ -3150,17 +2609,17 @@ "parameters": [ "\"GameHighscore\"", "\"GameHighscore\"", - "Variable(Coins)" + "Coins" ] }, { "type": { - "value": "ModVarGlobal" + "value": "SetNumberVariable" }, "parameters": [ "Score", "=", - "Variable(Coins)" + "Coins" ] }, { @@ -3168,7 +2627,7 @@ "value": "TextObject::ChangeColor" }, "parameters": [ - "CoinsScore", + "ScoreLabel", "\"248;231;28\"" ] }, @@ -3197,12 +2656,12 @@ "conditions": [ { "type": { - "value": "VarScene" + "value": "NumberVariable" }, "parameters": [ "Coins", "<=", - "Variable(HighScore)" + "HighScore" ] } ], @@ -3239,7 +2698,7 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Object collisions and behaviors", + "name": "Spawning/Deleting levels", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ @@ -3253,113 +2712,26 @@ "textG": 0, "textR": 0 }, - "comment": "Rotating the coins in game." + "comment": "Picking a random layout from the list and creating it ahead of the player." }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "Scene3D::Base3DBehavior::SetRotationY" + "value": "PosX" }, "parameters": [ - "Coin", - "Object3D", - "+", - "60 * TimeDelta()" + "StartMarker", + "<", + "Player.X()" ] } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Reseting the rising pitch variable after being adjusted in the coin collision event." - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + ], + "actions": [ { "type": { - "value": "CompareTimer" - }, - "parameters": [ - "", - "\"RisingPitch\"", - ">", - "1" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::Once" - }, - "parameters": [] - } - ], - "actions": [ - { - "type": { - "value": "ModVarScene" - }, - "parameters": [ - "RisingPitch", - "=", - "0.8" - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Spawning/Deleting levels", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Picking a random layout from the list and creating it ahead of the player." - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "PosX" - }, - "parameters": [ - "StartMarker", - "<", - "Player.X()" - ] - } - ], - "actions": [ - { - "type": { - "value": "Delete" + "value": "Delete" }, "parameters": [ "StartMarker", @@ -3398,11 +2770,23 @@ ], "events": [ { - "type": "BuiltinCommonInstructions::Link", - "include": { - "includeConfig": 0 - }, - "target": "LaneCheck" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::EnablePlatformOnLane" + }, + "parameters": [ + "Player", + "LaneCharacter", + "Platform", + "Object3D", + "Platform", + "" + ] + } + ] } ] } @@ -3428,7 +2812,7 @@ "value": "PosX" }, "parameters": [ - "AllObjects", + "LevelElement", "<", "Player.X() - 1060" ] @@ -3440,7 +2824,7 @@ "value": "Delete" }, "parameters": [ - "AllObjects", + "LevelElement", "" ] } @@ -3544,6 +2928,10 @@ "name": "Animation", "type": "AnimatableCapability::AnimatableBehavior" }, + { + "name": "Collectible", + "type": "Collectible::Collectible" + }, { "name": "Effect", "type": "EffectCapability::EffectBehavior" @@ -3552,6 +2940,14 @@ "name": "Flippable", "type": "FlippableCapability::FlippableBehavior" }, + { + "name": "LaneCharacter", + "type": "LanePlatformer::LaneCharacter" + }, + { + "name": "LaneObject", + "type": "LanePlatformer::LaneObject" + }, { "name": "Object3D", "type": "Scene3D::Base3DBehavior" @@ -3576,6 +2972,10 @@ "name": "Scale", "type": "ScalableCapability::ScalableBehavior" }, + { + "name": "SmoothCameraZ", + "type": "LanePlatformer::SmoothCameraZ" + }, { "name": "Text", "type": "TextContainerCapability::TextContainerBehavior" @@ -3614,7 +3014,7 @@ "name": "PanelContent", "objects": [ { - "name": "ScoreText" + "name": "ScoreLabel" }, { "name": "PlayerNameInput" @@ -3671,7 +3071,7 @@ "customSize": false, "height": 67, "layer": "", - "name": "ScoreText", + "name": "ScoreLabel", "persistentUuid": "722f1233-75ba-4128-8905-4ac5dd26bc1e", "width": 384, "x": 98, @@ -3748,7 +3148,7 @@ "assetStoreId": "", "bold": false, "italic": false, - "name": "ScoreText", + "name": "ScoreLabel", "smoothed": true, "type": "TextObject::Text", "underlined": false, @@ -3821,6 +3221,12 @@ } }, { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, "assetStoreId": "bfab3a269992cf43081e2cb8053c28aaef11f2f9e0d0cbdc00207ea271f69c2c", "name": "SubmitButton", "type": "PanelSpriteButton::PanelSpriteButton", @@ -3907,9 +3313,46 @@ "topMargin": 32, "width": 256 } - } + }, + "instances": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ] }, { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, "assetStoreId": "bfab3a269992cf43081e2cb8053c28aaef11f2f9e0d0cbdc00207ea271f69c2c", "name": "RestartButton", "type": "PanelSpriteButton::PanelSpriteButton", @@ -3996,7 +3439,38 @@ "topMargin": 32, "width": 256 } - } + }, + "instances": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ] }, { "assetStoreId": "", @@ -4021,7 +3495,19 @@ "variables": [ { "folded": true, - "name": "Lane", + "name": "RotationX", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "RotationY", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "RotationZ", "type": "number", "value": 0 } @@ -4060,7 +3546,7 @@ "folderName": "__ROOT", "children": [ { - "objectName": "ScoreText" + "objectName": "ScoreLabel" }, { "objectName": "PlayerNameInput" @@ -4098,10 +3584,10 @@ "value": "TextContainerCapability::TextContainerBehavior::SetValue" }, "parameters": [ - "ScoreText", + "ScoreLabel", "Text", "=", - "\"Score: \" + GlobalVariableString(Score)" + "\"Score: \" + Score" ] }, { @@ -4176,7 +3662,7 @@ }, { "type": { - "value": "VarGlobalTxt" + "value": "StringVariable" }, "parameters": [ "PlayerName", @@ -4194,7 +3680,7 @@ "PlayerNameInput", "Text", "=", - "GlobalVariableString(PlayerName)" + "PlayerName" ] } ] @@ -4358,7 +3844,7 @@ "parameters": [ "", "\"2392ae63-5ed6-4d1b-9ca5-157d64602a81\"", - "GlobalVariable(Score)" + "Score" ] } ] @@ -4382,13 +3868,13 @@ "parameters": [ "", "\"2392ae63-5ed6-4d1b-9ca5-157d64602a81\"", - "GlobalVariable(Score)", + "Score", "PlayerNameInput.Text()" ] }, { "type": { - "value": "ModVarGlobalTxt" + "value": "SetStringVariable" }, "parameters": [ "PlayerName", @@ -4509,7 +3995,7 @@ }, { "type": { - "value": "ModVarObjet" + "value": "SetNumberObjectVariable" }, "parameters": [ "Coin", @@ -4520,7 +4006,7 @@ }, { "type": { - "value": "ModVarObjet" + "value": "SetNumberObjectVariable" }, "parameters": [ "Coin", @@ -4531,7 +4017,7 @@ }, { "type": { - "value": "ModVarObjet" + "value": "SetNumberObjectVariable" }, "parameters": [ "Coin", @@ -4600,7 +4086,7 @@ "Coin", "Object3D", "+", - "Coin.Variable(RotationX) * TimeDelta()" + "Coin.RotationX * TimeDelta()" ] }, { @@ -4611,7 +4097,7 @@ "Coin", "Object3D", "+", - "Coin.Variable(RotationY) * TimeDelta()" + "Coin.RotationY * TimeDelta()" ] }, { @@ -4621,7 +4107,7 @@ "parameters": [ "Coin", "+", - "Coin.Variable(RotationZ) * TimeDelta()" + "Coin.RotationZ * TimeDelta()" ] } ] @@ -4694,6 +4180,34 @@ } ], "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Object3D", + "type": "Scene3D::Base3DBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, { "name": "ScreenWrap", "type": "ScreenWrap::ScreenWrap" @@ -4701,87 +4215,27 @@ { "name": "Sticker", "type": "Sticker::Sticker" - } - ] - } - ], - "externalEvents": [ - { - "associatedLayout": "Game", - "lastChangeTimeStamp": 0, - "name": "LaneCheck", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Platforms", - "Lane", - "!=", - "Player.Variable(Lane)" - ] - } - ], - "actions": [ - { - "type": { - "value": "ActivateBehavior" - }, - "parameters": [ - "Platforms", - "Platform", - "" - ] - } - ] }, { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "VarObjet" - }, - "parameters": [ - "Platforms", - "Lane", - "=", - "Player.Variable(Lane)" - ] - } - ], - "actions": [ - { - "type": { - "value": "ActivateBehavior" - }, - "parameters": [ - "Platforms", - "Platform", - "yes" - ] - } - ] + "name": "Text", + "type": "TextContainerCapability::TextContainerBehavior" } ] } ], + "externalEvents": [], "eventsFunctionsExtensions": [ { "author": "", "category": "Visual effect", "extensionNamespace": "", - "fullName": "3D particle emitter (experimental)", + "fullName": "3D particle emitter", "helpPath": "", "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWZpcmUiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTcuNjYgMTEuMkMxNy40MyAxMC45IDE3LjE1IDEwLjY0IDE2Ljg5IDEwLjM4QzE2LjIyIDkuNzggMTUuNDYgOS4zNSAxNC44MiA4LjcyQzEzLjMzIDcuMjYgMTMgNC44NSAxMy45NSAzQzEzIDMuMjMgMTIuMTcgMy43NSAxMS40NiA0LjMyQzguODcgNi40IDcuODUgMTAuMDcgOS4wNyAxMy4yMkM5LjExIDEzLjMyIDkuMTUgMTMuNDIgOS4xNSAxMy41NUM5LjE1IDEzLjc3IDkgMTMuOTcgOC44IDE0LjA1QzguNTcgMTQuMTUgOC4zMyAxNC4wOSA4LjE0IDEzLjkzQzguMDggMTMuODggOC4wNCAxMy44MyA4IDEzLjc2QzYuODcgMTIuMzMgNi42OSAxMC4yOCA3LjQ1IDguNjRDNS43OCAxMCA0Ljg3IDEyLjMgNSAxNC40N0M1LjA2IDE0Ljk3IDUuMTIgMTUuNDcgNS4yOSAxNS45N0M1LjQzIDE2LjU3IDUuNyAxNy4xNyA2IDE3LjdDNy4wOCAxOS40MyA4Ljk1IDIwLjY3IDEwLjk2IDIwLjkyQzEzLjEgMjEuMTkgMTUuMzkgMjAuOCAxNy4wMyAxOS4zMkMxOC44NiAxNy42NiAxOS41IDE1IDE4LjU2IDEyLjcyTDE4LjQzIDEyLjQ2QzE4LjIyIDEyIDE3LjY2IDExLjIgMTcuNjYgMTEuMk0xNC41IDE3LjVDMTQuMjIgMTcuNzQgMTMuNzYgMTggMTMuNCAxOC4xQzEyLjI4IDE4LjUgMTEuMTYgMTcuOTQgMTAuNSAxNy4yOEMxMS42OSAxNyAxMi40IDE2LjEyIDEyLjYxIDE1LjIzQzEyLjc4IDE0LjQzIDEyLjQ2IDEzLjc3IDEyLjMzIDEzQzEyLjIxIDEyLjI2IDEyLjIzIDExLjYzIDEyLjUgMTAuOTRDMTIuNjkgMTEuMzIgMTIuODkgMTEuNyAxMy4xMyAxMkMxMy45IDEzIDE1LjExIDEzLjQ0IDE1LjM3IDE0LjhDMTUuNDEgMTQuOTQgMTUuNDMgMTUuMDggMTUuNDMgMTUuMjNDMTUuNDYgMTYuMDUgMTUuMSAxNi45NSAxNC41IDE3LjVIMTQuNVoiIC8+PC9zdmc+", "name": "ParticleEmitter3D", "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/f2e5a34bf465f781866677762d385d6c8e9e8d203383f2df9a3b7e0fad6a2cb5_fire.svg", "shortDescription": "Display a large number of particles to create visual effects.", - "version": "1.2.0", + "version": "2.0.2", "description": [ "Particle emitters can be used to display:", "- Fire", @@ -4789,8 +4243,11 @@ "- Splashes", "- Lights", "", - "Breaking change from 1.0.0:", - "- Particles were 3 times too small" + "Breaking change", + "- 2.0.0", + " - Object properties for position and rotation have been removed. They must be set with the instance editor or the action.", + "- 1.0.0", + " - Particles were 3 times too small" ], "origin": { "identifier": "ParticleEmitter3D", @@ -4809,6 +4266,8 @@ "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" ], "dependencies": [], + "globalVariables": [], + "sceneVariables": [], "eventsFunctions": [ { "description": "Define helper classes JavaScript code.", @@ -4819,7858 +4278,6723 @@ "sentence": "Define helper classes JavaScript code", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GlobalVariableAsBoolean" - }, - "parameters": [ - "_ParticleEmmiter3DExtension_ClassesDefined", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetGlobalVariableAsBoolean" - }, - "parameters": [ - "_ParticleEmmiter3DExtension_ClassesDefined", - "True" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "gdjs.__particleEmmiter3DExtension = gdjs.__particleEmmiter3DExtension || {};", - "", - "/**", - " * @param {string} colorString", - " * @param {THREE.Vector4} threeColor", - " */", - "const setThreeColor = (colorString, threeColor = new THREE.Vector4()) => {", - " const integerColor = gdjs.rgbOrHexToRGBColor(colorString);", - " threeColor.x = integerColor[0] / 255;", - " threeColor.y = integerColor[1] / 255;", - " threeColor.z = integerColor[2] / 255;", - "};", - "", - "/**", - " * @param {string} integerOpacity", - " * @param {THREE.Vector4} threeColor", - " */", - "const setThreeOpacity = (integerOpacity, threeColor = new THREE.Vector4()) => {", - " threeColor.w = integerOpacity / 255;", - "};", - "", - "class ParticleEmitterAdapter {", - " /**", - " * @param particleSystem {ParticleSystem}", - " * @param colorOverLife {ColorOverLife}", - " * @param sizeOverLife {SizeOverLife}", - " * @param applyForce {ApplyForce}", - " */", - " constructor(particleSystem, colorOverLife, sizeOverLife, applyForce) {", - " this.particleSystem = particleSystem;", - " this.colorOverLife = colorOverLife;", - " this.sizeOverLife = sizeOverLife;", - " this.applyForce = applyForce;", - " }", - "", - " /**", - " * @param startColor {string}", - " */", - " setStartColor(startColor) {", - " setThreeColor(startColor, this.colorOverLife.color.color.keys[0][0]);", - " }", - "", - " /**", - " * @param endColor {string}", - " */", - " setEndColor(endColor) {", - " setThreeColor(endColor, this.colorOverLife.color.color.keys[1][0]);", - " }", - "", - " /**", - " * @param startOpacity {number}", - " */", - " setStartOpacity(startOpacity) {", - " this.colorOverLife.color.alpha.keys[0][0] = startOpacity / 255;", - " }", - "", - " /**", - " * @param endOpacity {number}", - " */", - " setEndOpacity(endOpacity) {", - " this.colorOverLife.color.alpha.keys[1][0] = endOpacity / 255;", - " }", - "", - " /**", - " * @param flow {number}", - " */", - " setFlow(flow) {", - " this.particleSystem.emissionOverTime.value = flow;", - " }", - "", - " /**", - " * @param startMinSize {number}", - " */", - " setStartMinSize(startMinSize) {", - " this.particleSystem.startSize.a = startMinSize;", - " }", - "", - " /**", - " * @param startMaxSize {number}", - " */", - " setStartMaxSize(startMaxSize) {", - " this.particleSystem.startSize.b = startMaxSize;", - " }", - "", - " /**", - " * @param endScale {number}", - " */", - " setEndScale(endScale) {", - " /** @type Bezier */", - " const bezier = this.sizeOverLife.size.functions[0][0];", - " bezier.p[0] = 1;", - " bezier.p[1] = gdjs.evtTools.common.lerp(1, endScale, 1 / 3);", - " bezier.p[2] = gdjs.evtTools.common.lerp(1, endScale, 2 / 3);", - " bezier.p[3] = endScale;", - " }", - "", - " /**", - " * @param startSpeedMin {number}", - " */", - " setStartSpeedMin(startSpeedMin) {", - " this.particleSystem.startSpeed.a = startSpeedMin;", - " }", - "", - " /**", - " * @param startSpeedMax {number}", - " */", - " setStartSpeedMax(startSpeedMax) {", - " this.particleSystem.startSpeed.b = startSpeedMax;", - " }", - "", - " /**", - " * @param lifespanMin {number}", - " */", - " setLifespanMin(lifespanMin) {", - " this.particleSystem.startLife.a = lifespanMin;", - " }", - "", - " /**", - " * @param lifespanMax {number}", - " */", - " setLifespanMax(lifespanMax) {", - " this.particleSystem.startLife.b = lifespanMax;", - " }", - "", - " /**", - " * @param duration {number}", - " */", - " setDuration(duration) {", - " this.particleSystem.duration = duration || Number.POSITIVE_INFINITY;", - " }", - "", - " /**", - " * @param areParticlesRelative {boolean}", - " */", - " setParticlesRelative(areParticlesRelative) {", - " this.particleSystem.worldSpace = !areParticlesRelative;", - " }", - "", - " /**", - " * @param sprayConeAngle {number}", - " */", - " setSprayConeAngle(sprayConeAngle) {", - " if (0 < sprayConeAngle && sprayConeAngle <= 180) {", - " if (!this.particleSystem.emitterShape.angle) {", - " this.particleSystem.emitterShape = new ConeEmitter({ radius: 0.1, angle: Math.PI / 8 });", - " }", - " this.particleSystem.emitterShape.angle = sprayConeAngle * Math.PI / 180;", - " }", - " else {", - " if (this.particleSystem.emitterShape.angle) {", - " this.particleSystem.emitterShape = new PointEmitter();", - " }", - " }", - " }", - "", - " /**", - " * @param blending {string}", - " */", - " setBlending(blendingString) {", - " const blending =", - " blendingString === \"Additive\" ? THREE.AdditiveBlending :", - " blendingString === \"Normal\" ? THREE.NormalBlending :", - " blendingString === \"Subtractive\" ? THREE.SubtractiveBlending :", - " blendingString === \"Multiply\" ? THREE.MultiplyBlending :", - " blendingString === \"None\" ? THREE.NoBlending :", - " THREE.AdditiveBlending;", - " // TODO This doesn't work.", - " this.particleSystem.blending = blending;", - " }", - "", - " /**", - " * @param gravity {number}", - " */", - " setGravity(gravity) {", - " this.applyForce.magnitude.value = gravity;", - " }", - "", - " /**", - " * @param gravityTop {string}", - " */", - " setGravityTop(gravityTop) {", - " // TODO Make gravity absolute even when \"relative\" is enabled. ", - " switch (gravityTop) {", - " case \"Z+\":", - " this.applyForce.direction.set(0, 0, -1);", - " break;", - "", - " case \"Y-\":", - " this.applyForce.direction.set(0, 1, 0);", - " break;", - " }", - " }", - "}", - "", - "gdjs.__particleEmmiter3DExtension.ParticleEmitterAdapter = ParticleEmitterAdapter;", - "", - "", - "", - "", - "", - "/**", - " * three.quarks v0.11.2 build Mon Jan 22 2024", - " * https://github.com/Alchemist0823/three.quarks#readme", - " * Copyright 2024 Alchemist0823 , MIT", - " */", - "", - "class ParticleEmitter extends THREE.Object3D {", - " constructor(system) {", - " super();", - " this.type = 'ParticleEmitter';", - " this.system = system;", - " }", - " clone() {", - " const system = this.system.clone();", - " system.emitter.copy(this, true);", - " return system.emitter;", - " }", - " dispose() { }", - " extractFromCache(cache) {", - " const values = [];", - " for (const key in cache) {", - " const data = cache[key];", - " delete data.metadata;", - " values.push(data);", - " }", - " return values;", - " }", - " toJSON(meta, options = {}) {", - " const isRootObject = meta === undefined || typeof meta === 'string';", - " const output = {};", - " if (isRootObject) {", - " meta = {", - " geometries: {},", - " materials: {},", - " textures: {},", - " images: {},", - " shapes: {},", - " skeletons: {},", - " animations: {},", - " nodes: {},", - " };", - " output.metadata = {", - " version: 4.5,", - " type: 'Object',", - " generator: 'Object3D.toJSON',", - " };", - " }", - " const object = {};", - " object.uuid = this.uuid;", - " object.type = this.type;", - " if (this.name !== '')", - " object.name = this.name;", - " if (this.castShadow === true)", - " object.castShadow = true;", - " if (this.receiveShadow === true)", - " object.receiveShadow = true;", - " if (this.visible === false)", - " object.visible = false;", - " if (this.frustumCulled === false)", - " object.frustumCulled = false;", - " if (this.renderOrder !== 0)", - " object.renderOrder = this.renderOrder;", - " if (JSON.stringify(this.userData) !== '{}')", - " object.userData = this.userData;", - " object.layers = this.layers.mask;", - " object.matrix = this.matrix.toArray();", - " if (this.matrixAutoUpdate === false)", - " object.matrixAutoUpdate = false;", - " if (this.system !== null)", - " object.ps = this.system.toJSON(meta, options);", - " if (this.children.length > 0) {", - " object.children = [];", - " for (let i = 0; i < this.children.length; i++) {", - " if (this.children[i].type !== 'ParticleSystemPreview') {", - " object.children.push(this.children[i].toJSON(meta).object);", - " }", - " }", - " }", - " if (isRootObject) {", - " const geometries = this.extractFromCache(meta.geometries);", - " const materials = this.extractFromCache(meta.materials);", - " const textures = this.extractFromCache(meta.textures);", - " const images = this.extractFromCache(meta.images);", - " if (geometries.length > 0)", - " output.geometries = geometries;", - " if (materials.length > 0)", - " output.materials = materials;", - " if (textures.length > 0)", - " output.textures = textures;", - " if (images.length > 0)", - " output.images = images;", - " }", - " output.object = object;", - " return output;", - " }", - "}", - "", - "class LinkedListNode {", - " constructor(data) {", - " this.data = data;", - " this.next = null;", - " this.prev = null;", - " }", - " hasPrev() {", - " return this.prev !== null;", - " }", - " hasNext() {", - " return this.next !== null;", - " }", - "}", - "class LinkedList {", - " constructor() {", - " this.length = 0;", - " this.head = this.tail = null;", - " }", - " isEmpty() {", - " return this.head === null;", - " }", - " clear() {", - " this.length = 0;", - " this.head = this.tail = null;", - " }", - " front() {", - " if (this.head === null)", - " return null;", - " return this.head.data;", - " }", - " back() {", - " if (this.tail === null)", - " return null;", - " return this.tail.data;", - " }", - " dequeue() {", - " if (this.head) {", - " const value = this.head.data;", - " this.head = this.head.next;", - " if (!this.head) {", - " this.tail = null;", - " }", - " else {", - " this.head.prev = null;", - " }", - " this.length--;", - " return value;", - " }", - " return undefined;", - " }", - " pop() {", - " if (this.tail) {", - " const value = this.tail.data;", - " this.tail = this.tail.prev;", - " if (!this.tail) {", - " this.head = null;", - " }", - " else {", - " this.tail.next = null;", - " }", - " this.length--;", - " return value;", - " }", - " return undefined;", - " }", - " queue(data) {", - " const node = new LinkedListNode(data);", - " if (!this.tail) {", - " this.tail = node;", - " }", - " if (this.head) {", - " this.head.prev = node;", - " node.next = this.head;", - " }", - " this.head = node;", - " this.length++;", - " }", - " push(data) {", - " const node = new LinkedListNode(data);", - " if (!this.head) {", - " this.head = node;", - " }", - " if (this.tail) {", - " this.tail.next = node;", - " node.prev = this.tail;", - " }", - " this.tail = node;", - " this.length++;", - " }", - " insertBefore(node, data) {", - " const newNode = new LinkedListNode(data);", - " newNode.next = node;", - " newNode.prev = node.prev;", - " if (newNode.prev !== null) {", - " newNode.prev.next = newNode;", - " }", - " newNode.next.prev = newNode;", - " if (node == this.head) {", - " this.head = newNode;", - " }", - " this.length++;", - " }", - " remove(data) {", - " if (this.head === null || this.tail === null) {", - " return;", - " }", - " let tempNode = this.head;", - " if (data === this.head.data) {", - " this.head = this.head.next;", - " }", - " if (data === this.tail.data) {", - " this.tail = this.tail.prev;", - " }", - " while (tempNode.next !== null && tempNode.data !== data) {", - " tempNode = tempNode.next;", - " }", - " if (tempNode.data === data) {", - " if (tempNode.prev !== null)", - " tempNode.prev.next = tempNode.next;", - " if (tempNode.next !== null)", - " tempNode.next.prev = tempNode.prev;", - " this.length--;", - " }", - " }", - " *values() {", - " let current = this.head;", - " while (current !== null) {", - " yield current.data;", - " current = current.next;", - " }", - " }", - "}", - "", - "class NodeParticle {", - " constructor() {", - " this.position = new THREE.Vector3();", - " this.velocity = new THREE.Vector3();", - " this.age = 0;", - " this.life = 1;", - " this.size = 1;", - " this.rotation = 0;", - " this.color = new THREE.Vector4(1, 1, 1, 1);", - " this.uvTile = 0;", - " }", - " get died() {", - " return this.age >= this.life;", - " }", - " reset() {", - " this.position.set(0, 0, 0);", - " this.velocity.set(0, 0, 0);", - " this.age = 0;", - " this.life = 1;", - " this.size = 1;", - " this.rotation = 0;", - " this.color.set(1, 1, 1, 1);", - " this.uvTile = 0;", - " }", - "}", - "class SpriteParticle {", - " constructor() {", - " this.startSpeed = 0;", - " this.startColor = new THREE.Vector4();", - " this.startSize = 1;", - " this.position = new THREE.Vector3();", - " this.velocity = new THREE.Vector3();", - " this.age = 0;", - " this.life = 1;", - " this.size = 1;", - " this.speedModifier = 1;", - " this.rotation = 0;", - " this.color = new THREE.Vector4();", - " this.uvTile = 0;", - " }", - " get died() {", - " return this.age >= this.life;", - " }", - "}", - "class RecordState {", - " constructor(position, size, color) {", - " this.position = position;", - " this.size = size;", - " this.color = color;", - " }", - "}", - "class TrailParticle {", - " constructor() {", - " this.startSpeed = 0;", - " this.startColor = new THREE.Vector4();", - " this.startSize = 1;", - " this.position = new THREE.Vector3();", - " this.velocity = new THREE.Vector3();", - " this.age = 0;", - " this.life = 1;", - " this.size = 1;", - " this.length = 100;", - " this.speedModifier = 1;", - " this.color = new THREE.Vector4();", - " this.previous = new LinkedList();", - " this.uvTile = 0;", - " }", - " update() {", - " if (this.age <= this.life) {", - " this.previous.push(new RecordState(this.position.clone(), this.size, this.color.clone()));", - " }", - " else {", - " if (this.previous.length > 0) {", - " this.previous.dequeue();", - " }", - " }", - " while (this.previous.length > this.length) {", - " this.previous.dequeue();", - " }", - " }", - " get died() {", - " return this.age >= this.life;", - " }", - " reset() {", - " this.previous.clear();", - " }", - "}", - "", - "class Bezier {", - " constructor(p1, p2, p3, p4) {", - " this.p = [p1, p2, p3, p4];", - " }", - " genValue(t) {", - " const t2 = t * t;", - " const t3 = t * t * t;", - " const mt = 1 - t;", - " const mt2 = mt * mt;", - " const mt3 = mt2 * mt;", - " return this.p[0] * mt3 + this.p[1] * mt2 * t * 3 + this.p[2] * mt * t2 * 3 + this.p[3] * t3;", - " }", - " derivativeCoefficients(points) {", - " const dpoints = [];", - " for (let p = points, c = p.length - 1; c > 0; c--) {", - " const list = [];", - " for (let j = 0; j < c; j++) {", - " const dpt = c * (p[j + 1] - p[j]);", - " list.push(dpt);", - " }", - " dpoints.push(list);", - " p = list;", - " }", - " return dpoints;", - " }", - " getSlope(t) {", - " const p = this.derivativeCoefficients(this.p)[0];", - " const mt = 1 - t;", - " const a = mt * mt;", - " const b = mt * t * 2;", - " const c = t * t;", - " return a * p[0] + b * p[1] + c * p[2];", - " }", - " controlCurve(d0, d1) {", - " this.p[1] = d0 / 3 + this.p[0];", - " this.p[2] = this.p[3] - d1 / 3;", - " }", - " hull(t) {", - " let p = this.p;", - " let _p = [], pt, idx = 0, i = 0, l = 0;", - " const q = [];", - " q[idx++] = p[0];", - " q[idx++] = p[1];", - " q[idx++] = p[2];", - " q[idx++] = p[3];", - " while (p.length > 1) {", - " _p = [];", - " for (i = 0, l = p.length - 1; i < l; i++) {", - " pt = t * p[i] + (1 - t) * p[i + 1];", - " q[idx++] = pt;", - " _p.push(pt);", - " }", - " p = _p;", - " }", - " return q;", - " }", - " split(t) {", - " const q = this.hull(t);", - " const result = {", - " left: new Bezier(q[0], q[4], q[7], q[9]),", - " right: new Bezier(q[9], q[8], q[6], q[3]),", - " span: q", - " };", - " return result;", - " }", - " clone() {", - " return new Bezier(this.p[0], this.p[1], this.p[2], this.p[3]);", - " }", - " toJSON() {", - " return {", - " p0: this.p[0],", - " p1: this.p[1],", - " p2: this.p[2],", - " p3: this.p[3],", - " };", - " }", - " static fromJSON(json) {", - " return new Bezier(json.p0, json.p1, json.p2, json.p3);", - " }", - "}", - "", - "const ColorToJSON = (color) => {", - " return { r: color.x, g: color.y, b: color.z, a: color.w };", - "};", - "const JSONToColor = (json) => {", - " return new THREE.Vector4(json.r, json.g, json.b, json.a);", - "};", - "const JSONToValue = (json, type) => {", - " switch (type) {", - " case 'Vector3':", - " return new THREE.Vector3(json.x, json.y, json.z);", - " case 'Vector4':", - " return new THREE.Vector4(json.x, json.y, json.z, json.w);", - " case 'Color':", - " return new THREE.Vector3(json.r, json.g, json.b);", - " case 'Number':", - " return json;", - " default:", - " return json;", - " }", - "};", - "const ValueToJSON = (value, type) => {", - " switch (type) {", - " case 'Vector3':", - " return { x: value.x, y: value.y, z: value.z };", - " case 'Vector4':", - " return { x: value.x, y: value.y, z: value.z, w: value.w };", - " case 'Color':", - " return { r: value.x, g: value.y, b: value.z };", - " case 'Number':", - " return value;", - " default:", - " return value;", - " }", - "};", - "", - "class RandomColor {", - " constructor(a, b) {", - " this.a = a;", - " this.b = b;", - " this.type = \"value\";", - " }", - " genColor(color) {", - " const rand = Math.random();", - " return color.copy(this.a).lerp(this.b, rand);", - " }", - " toJSON() {", - " return {", - " type: \"RandomColor\",", - " a: ColorToJSON(this.a),", - " b: ColorToJSON(this.b),", - " };", - " }", - " static fromJSON(json) {", - " return new RandomColor(JSONToColor(json.a), JSONToColor(json.b));", - " }", - " clone() {", - " return new RandomColor(this.a.clone(), this.b.clone());", - " }", - "}", - "", - "class ColorRange {", - " constructor(a, b) {", - " this.a = a;", - " this.b = b;", - " this.type = 'value';", - " }", - " genColor(color, t) {", - " return color.copy(this.a).lerp(this.b, Math.random());", - " }", - " toJSON() {", - " return {", - " type: 'ColorRange',", - " a: ColorToJSON(this.a),", - " b: ColorToJSON(this.b),", - " };", - " }", - " static fromJSON(json) {", - " return new ColorRange(JSONToColor(json.a), JSONToColor(json.b));", - " }", - " clone() {", - " return new ColorRange(this.a.clone(), this.b.clone());", - " }", - "}", - "", - "class ContinuousLinearFunction {", - " constructor(keys, subType) {", - " this.subType = subType;", - " this.type = 'function';", - " this.keys = keys;", - " }", - " findKey(t) {", - " let mid = 0;", - " let left = 0, right = this.keys.length - 1;", - " while (left + 1 < right) {", - " mid = Math.floor((left + right) / 2);", - " if (t < this.getStartX(mid))", - " right = mid - 1;", - " else if (t > this.getEndX(mid))", - " left = mid + 1;", - " else", - " return mid;", - " }", - " for (let i = left; i <= right; i++) {", - " if (t >= this.getStartX(i) && t <= this.getEndX(i))", - " return i;", - " }", - " return -1;", - " }", - " getStartX(index) {", - " return this.keys[index][1];", - " }", - " getEndX(index) {", - " if (index + 1 < this.keys.length)", - " return this.keys[index + 1][1];", - " return 1;", - " }", - " genValue(value, t) {", - " const index = this.findKey(t);", - " if (this.subType === 'Number') {", - " if (index === -1) {", - " return this.keys[0][0];", - " }", - " else if (index + 1 >= this.keys.length) {", - " return this.keys[this.keys.length - 1][0];", - " }", - " return ((this.keys[index + 1][0] - this.keys[index][0]) *", - " ((t - this.getStartX(index)) / (this.getEndX(index) - this.getStartX(index))) +", - " this.keys[index][0]);", - " }", - " else {", - " if (index === -1) {", - " return value.copy(this.keys[0][0]);", - " }", - " if (index + 1 >= this.keys.length) {", - " return value.copy(this.keys[this.keys.length - 1][0]);", - " }", - " return value", - " .copy(this.keys[index][0])", - " .lerp(this.keys[index + 1][0], (t - this.getStartX(index)) / (this.getEndX(index) - this.getStartX(index)));", - " }", - " }", - " toJSON() {", - " this.keys[0][0].constructor.name;", - " return {", - " type: 'CLinearFunction',", - " subType: this.subType,", - " keys: this.keys.map(([color, pos]) => ({ value: ValueToJSON(color, this.subType), pos: pos })),", - " };", - " }", - " static fromJSON(json) {", - " return new ContinuousLinearFunction(json.keys.map((pair) => [JSONToValue(pair.value, json.subType), pair.pos]), json.subType);", - " }", - " clone() {", - " if (this.subType === 'Number') {", - " return new ContinuousLinearFunction(this.keys.map(([value, pos]) => [value, pos]), this.subType);", - " }", - " else {", - " return new ContinuousLinearFunction(this.keys.map(([value, pos]) => [value.clone(), pos]), this.subType);", - " }", - " }", - "}", - "", - "const tempVec3 = new THREE.Vector3();", - "class Gradient {", - " constructor(color = [", - " [new THREE.Vector3(0, 0, 0), 0],", - " [new THREE.Vector3(1, 1, 1), 0],", - " ], alpha = [", - " [1, 0],", - " [1, 1],", - " ]) {", - " this.type = 'function';", - " this.color = new ContinuousLinearFunction(color, 'Color');", - " this.alpha = new ContinuousLinearFunction(alpha, 'Number');", - " }", - " genColor(color, t) {", - " this.color.genValue(tempVec3, t);", - " return color.set(tempVec3.x, tempVec3.y, tempVec3.z, this.alpha.genValue(1, t));", - " }", - " toJSON() {", - " return {", - " type: 'Gradient',", - " color: this.color.toJSON(),", - " alpha: this.alpha.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " if (json.functions) {", - " const keys = json.functions.map((func) => [ColorRange.fromJSON(func.function).a, func.start]);", - " if (json.functions.length > 0) {", - " keys.push([ColorRange.fromJSON(json.functions[json.functions.length - 1].function).b, 1]);", - " }", - " return new Gradient(keys.map((key) => [new THREE.Vector3(key[0].x, key[0].y, key[0].z), key[1]]), keys.map((key) => [key[0].w, key[1]]));", - " }", - " else {", - " const gradient = new Gradient();", - " gradient.alpha = ContinuousLinearFunction.fromJSON(json.alpha);", - " gradient.color = ContinuousLinearFunction.fromJSON(json.color);", - " return gradient;", - " }", - " }", - " clone() {", - " const gradient = new Gradient();", - " gradient.alpha = this.alpha.clone();", - " gradient.color = this.color.clone();", - " return gradient;", - " }", - "}", - "", - "const tempColor = new THREE.Vector4();", - "class RandomColorBetweenGradient {", - " constructor(gradient1, gradient2) {", - " this.type = 'memorizedFunction';", - " this.gradient1 = gradient1;", - " this.gradient2 = gradient2;", - " }", - " startGen(memory) {", - " memory.rand = Math.random();", - " }", - " genColor(color, t, memory) {", - " this.gradient1.genColor(color, t);", - " this.gradient2.genColor(tempColor, t);", - " if (memory && memory.rand) {", - " color.lerp(tempColor, memory.rand);", - " }", - " else {", - " color.lerp(tempColor, Math.random());", - " }", - " return color;", - " }", - " toJSON() {", - " return {", - " type: 'RandomColorBetweenGradient',", - " gradient1: this.gradient1.toJSON(),", - " gradient2: this.gradient2.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new RandomColorBetweenGradient(Gradient.fromJSON(json.gradient1), Gradient.fromJSON(json.gradient2));", - " }", - " clone() {", - " return new RandomColorBetweenGradient(this.gradient1.clone(), this.gradient2.clone());", - " }", - "}", - "", - "class ConstantColor {", - " constructor(color) {", - " this.color = color;", - " this.type = 'value';", - " }", - " genColor(color) {", - " return color.copy(this.color);", - " }", - " toJSON() {", - " return {", - " type: 'ConstantColor',", - " color: ColorToJSON(this.color),", - " };", - " }", - " static fromJSON(json) {", - " return new ConstantColor(JSONToColor(json.color));", - " }", - " clone() {", - " return new ConstantColor(this.color.clone());", - " }", - "}", - "function ColorGeneratorFromJSON(json) {", - " switch (json.type) {", - " case 'ConstantColor':", - " return ConstantColor.fromJSON(json);", - " case 'ColorRange':", - " return ColorRange.fromJSON(json);", - " case 'RandomColor':", - " return RandomColor.fromJSON(json);", - " case 'Gradient':", - " return Gradient.fromJSON(json);", - " case 'RandomColorBetweenGradient':", - " return RandomColorBetweenGradient.fromJSON(json);", - " default:", - " return new ConstantColor(new THREE.Vector4(1, 1, 1, 1));", - " }", - "}", - "", - "class ConstantValue {", - " constructor(value) {", - " this.value = value;", - " this.type = 'value';", - " }", - " genValue() {", - " return this.value;", - " }", - " toJSON() {", - " return {", - " type: \"ConstantValue\",", - " value: this.value", - " };", - " }", - " static fromJSON(json) {", - " return new ConstantValue(json.value);", - " }", - " clone() {", - " return new ConstantValue(this.value);", - " }", - "}", - "", - "class IntervalValue {", - " constructor(a, b) {", - " this.a = a;", - " this.b = b;", - " this.type = 'value';", - " }", - " genValue() {", - " return THREE.MathUtils.lerp(this.a, this.b, Math.random());", - " }", - " toJSON() {", - " return {", - " type: 'IntervalValue',", - " a: this.a,", - " b: this.b,", - " };", - " }", - " static fromJSON(json) {", - " return new IntervalValue(json.a, json.b);", - " }", - " clone() {", - " return new IntervalValue(this.a, this.b);", - " }", - "}", - "", - "class PiecewiseFunction {", - " constructor() {", - " this.functions = new Array();", - " }", - " findFunction(t) {", - " let mid = 0;", - " let left = 0, right = this.functions.length - 1;", - " while (left + 1 < right) {", - " mid = Math.floor((left + right) / 2);", - " if (t < this.getStartX(mid))", - " right = mid - 1;", - " else if (t > this.getEndX(mid))", - " left = mid + 1;", - " else", - " return mid;", - " }", - " for (let i = left; i <= right; i++) {", - " if (t >= this.functions[i][1] && t <= this.getEndX(i))", - " return i;", - " }", - " return -1;", - " }", - " getStartX(index) {", - " return this.functions[index][1];", - " }", - " setStartX(index, x) {", - " if (index > 0)", - " this.functions[index][1] = x;", - " }", - " getEndX(index) {", - " if (index + 1 < this.functions.length)", - " return this.functions[index + 1][1];", - " return 1;", - " }", - " setEndX(index, x) {", - " if (index + 1 < this.functions.length)", - " this.functions[index + 1][1] = x;", - " }", - " insertFunction(t, func) {", - " const index = this.findFunction(t);", - " this.functions.splice(index + 1, 0, [func, t]);", - " }", - " removeFunction(index) {", - " return this.functions.splice(index, 1)[0][0];", - " }", - " getFunction(index) {", - " return this.functions[index][0];", - " }", - " setFunction(index, func) {", - " this.functions[index][0] = func;", - " }", - " get numOfFunctions() {", - " return this.functions.length;", - " }", - "}", - "", - "class PiecewiseBezier extends PiecewiseFunction {", - " constructor(curves = [[new Bezier(0, 1.0 / 3, 1.0 / 3 * 2, 1), 0]]) {", - " super();", - " this.type = \"function\";", - " this.functions = curves;", - " }", - " genValue(t = 0) {", - " const index = this.findFunction(t);", - " if (index === -1) {", - " return 0;", - " }", - " return this.functions[index][0].genValue((t - this.getStartX(index)) / (this.getEndX(index) - this.getStartX(index)));", - " }", - " toSVG(length, segments) {", - " if (segments < 1)", - " return \"\";", - " let result = [\"M\", 0, this.functions[0][0].p[0]].join(\" \");", - " for (let i = 1.0 / segments; i <= 1; i += 1.0 / segments) {", - " result = [result, \"L\", i * length, this.genValue(i)].join(\" \");", - " }", - " return result;", - " }", - " toJSON() {", - " return {", - " type: \"PiecewiseBezier\",", - " functions: this.functions.map(([bezier, start]) => ({ function: bezier.toJSON(), start: start })),", - " };", - " }", - " static fromJSON(json) {", - " return new PiecewiseBezier(json.functions.map((piecewiseFunction) => ([Bezier.fromJSON(piecewiseFunction.function), piecewiseFunction.start])));", - " }", - " clone() {", - " return new PiecewiseBezier(this.functions.map(([bezier, start]) => ([bezier.clone(), start])));", - " }", - "}", - "", - "function ValueGeneratorFromJSON(json) {", - " switch (json.type) {", - " case 'ConstantValue':", - " return ConstantValue.fromJSON(json);", - " case 'IntervalValue':", - " return IntervalValue.fromJSON(json);", - " case 'PiecewiseBezier':", - " return PiecewiseBezier.fromJSON(json);", - " default:", - " return new ConstantValue(0);", - " }", - "}", - "", - "class RandomQuatGenerator {", - " constructor() {", - " this.type = \"rotation\";", - " }", - " genValue(quat, t) {", - " let x, y, z, u, v, w;", - " do {", - " x = Math.random() * 2 - 1;", - " y = Math.random() * 2 - 1;", - " z = x * x + y * y;", - " } while (z > 1);", - " do {", - " u = Math.random() * 2 - 1;", - " v = Math.random() * 2 - 1;", - " w = u * u + v * v;", - " } while (w > 1);", - " const s = Math.sqrt((1 - z) / w);", - " quat.set(x, y, s * u, s * v);", - " return quat;", - " }", - " toJSON() {", - " return {", - " type: \"RandomQuat\"", - " };", - " }", - " static fromJSON(json) {", - " return new RandomQuatGenerator();", - " }", - " clone() {", - " return new RandomQuatGenerator();", - " }", - "}", - "", - "class AxisAngleGenerator {", - " constructor(axis, angle) {", - " this.axis = axis;", - " this.angle = angle;", - " this.type = 'rotation';", - " }", - " genValue(quat, t) {", - " return quat.setFromAxisAngle(this.axis, this.angle.genValue(t));", - " }", - " toJSON() {", - " return {", - " type: 'AxisAngle',", - " axis: { x: this.axis.x, y: this.axis.y, z: this.axis.z },", - " angle: this.angle.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new AxisAngleGenerator(new THREE.Vector3(json.axis.x, json.axis.y, json.axis.z), ValueGeneratorFromJSON(json.angle));", - " }", - " clone() {", - " return new AxisAngleGenerator(this.axis.clone(), this.angle.clone());", - " }", - "}", - "", - "class EulerGenerator {", - " constructor(angleX, angleY, angleZ, eulerOrder) {", - " this.angleX = angleX;", - " this.angleY = angleY;", - " this.angleZ = angleZ;", - " this.type = 'rotation';", - " this.eular = new THREE.Euler(0, 0, 0, eulerOrder);", - " }", - " genValue(quat, t) {", - " this.eular.set(this.angleX.genValue(t), this.angleY.genValue(t), this.angleZ.genValue(t));", - " return quat.setFromEuler(this.eular);", - " }", - " toJSON() {", - " return {", - " type: 'Euler',", - " angleX: this.angleX.toJSON(),", - " angleY: this.angleY.toJSON(),", - " angleZ: this.angleZ.toJSON(),", - " eulerOrder: this.eular.order,", - " };", - " }", - " static fromJSON(json) {", - " return new EulerGenerator(ValueGeneratorFromJSON(json.angleX), ValueGeneratorFromJSON(json.angleY), ValueGeneratorFromJSON(json.angleZ), json.eulerOrder);", - " }", - " clone() {", - " return new EulerGenerator(this.angleX, this.angleY, this.angleZ, this.eular.order);", - " }", - "}", - "", - "function RotationGeneratorFromJSON(json) {", - " switch (json.type) {", - " case 'AxisAngle':", - " return AxisAngleGenerator.fromJSON(json);", - " case 'Euler':", - " return EulerGenerator.fromJSON(json);", - " case 'RandomQuat':", - " return RandomQuatGenerator.fromJSON(json);", - " default:", - " return new RandomQuatGenerator();", - " }", - "}", - "", - "function GeneratorFromJSON(json) {", - " switch (json.type) {", - " case 'ConstantValue':", - " case 'IntervalValue':", - " case 'PiecewiseBezier':", - " return ValueGeneratorFromJSON(json);", - " case 'AxisAngle':", - " case 'RandomQuat':", - " case 'Euler':", - " return RotationGeneratorFromJSON(json);", - " default:", - " return new ConstantValue(0);", - " }", - "}", - "", - "class ColorOverLife {", - " constructor(color) {", - " this.color = color;", - " this.type = 'ColorOverLife';", - " }", - " initialize(particle) {", - " if (this.color.type === 'memorizedFunction') {", - " particle.colorOverLifeMemory = {};", - " this.color.startGen(particle.colorOverLifeMemory);", - " }", - " }", - " update(particle, delta) {", - " if (this.color.type === 'memorizedFunction') {", - " this.color.genColor(particle.color, particle.age / particle.life, particle.colorOverLifeMemory);", - " }", - " else {", - " this.color.genColor(particle.color, particle.age / particle.life);", - " }", - " particle.color.x *= particle.startColor.x;", - " particle.color.y *= particle.startColor.y;", - " particle.color.z *= particle.startColor.z;", - " particle.color.w *= particle.startColor.w;", - " }", - " frameUpdate(delta) { }", - " toJSON() {", - " return {", - " type: this.type,", - " color: this.color.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new ColorOverLife(ColorGeneratorFromJSON(json.color));", - " }", - " clone() {", - " return new ColorOverLife(this.color.clone());", - " }", - " reset() { }", - "}", - "", - "class RotationOverLife {", - " constructor(angularVelocity) {", - " this.angularVelocity = angularVelocity;", - " this.type = 'RotationOverLife';", - " this.dynamic = !(angularVelocity instanceof ConstantValue || angularVelocity instanceof IntervalValue);", - " }", - " initialize(particle) {", - " this.dynamic = !(this.angularVelocity instanceof ConstantValue || this.angularVelocity instanceof IntervalValue);", - " if (!this.dynamic && typeof particle.rotation === 'number') {", - " particle.angularVelocity = this.angularVelocity.genValue();", - " }", - " }", - " update(particle, delta) {", - " if (!this.dynamic) {", - " if (typeof particle.rotation === 'number') {", - " particle.rotation += delta * particle.angularVelocity;", - " }", - " }", - " else {", - " if (typeof particle.rotation === 'number') {", - " particle.rotation +=", - " delta * this.angularVelocity.genValue(particle.age / particle.life);", - " }", - " }", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " angularVelocity: this.angularVelocity.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new RotationOverLife(ValueGeneratorFromJSON(json.angularVelocity));", - " }", - " frameUpdate(delta) { }", - " clone() {", - " return new RotationOverLife(this.angularVelocity.clone());", - " }", - " reset() { }", - "}", - "", - "const IdentityQuaternion = new THREE.Quaternion();", - "class Rotation3DOverLife {", - " constructor(angularVelocity) {", - " this.angularVelocity = angularVelocity;", - " this.type = 'Rotation3DOverLife';", - " this.tempQuat = new THREE.Quaternion();", - " this.dynamic = !(angularVelocity instanceof RandomQuatGenerator);", - " }", - " initialize(particle) {", - " this.dynamic = !(this.angularVelocity instanceof RandomQuatGenerator);", - " if (particle.rotation instanceof THREE.Quaternion) {", - " particle.angularVelocity = new THREE.Quaternion();", - " this.angularVelocity.genValue(particle.angularVelocity);", - " }", - " }", - " update(particle, delta) {", - " if (particle.rotation instanceof THREE.Quaternion) {", - " if (!this.dynamic) {", - " this.tempQuat.slerpQuaternions(IdentityQuaternion, particle.angularVelocity, delta);", - " particle.rotation.multiply(this.tempQuat);", - " }", - " else {", - " this.angularVelocity.genValue(this.tempQuat, particle.age / particle.life);", - " this.tempQuat.slerpQuaternions(IdentityQuaternion, this.tempQuat, delta);", - " particle.rotation.multiply(this.tempQuat);", - " }", - " }", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " angularVelocity: this.angularVelocity.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new Rotation3DOverLife(RotationGeneratorFromJSON(json.angularVelocity));", - " }", - " frameUpdate(delta) { }", - " clone() {", - " return new Rotation3DOverLife(this.angularVelocity.clone());", - " }", - " reset() { }", - "}", - "", - "class ForceOverLife {", - " initialize(particle) { }", - " constructor(x, y, z) {", - " this.x = x;", - " this.y = y;", - " this.z = z;", - " this.type = 'ForceOverLife';", - " this._temp = new THREE.Vector3();", - " }", - " update(particle, delta) {", - " this._temp.set(this.x.genValue(particle.age / particle.life), this.y.genValue(particle.age / particle.life), this.z.genValue(particle.age / particle.life));", - " particle.velocity.addScaledVector(this._temp, delta);", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " x: this.x.toJSON(),", - " y: this.y.toJSON(),", - " z: this.z.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new ForceOverLife(ValueGeneratorFromJSON(json.x), ValueGeneratorFromJSON(json.y), ValueGeneratorFromJSON(json.z));", - " }", - " frameUpdate(delta) { }", - " clone() {", - " return new ForceOverLife(this.x.clone(), this.y.clone(), this.z.clone());", - " }", - " reset() { }", - "}", - "", - "class SizeOverLife {", - " initialize(particle) {", - " }", - " constructor(size) {", - " this.size = size;", - " this.type = 'SizeOverLife';", - " }", - " update(particle) {", - " particle.size = particle.startSize * this.size.genValue(particle.age / particle.life);", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " size: this.size.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new SizeOverLife(ValueGeneratorFromJSON(json.size));", - " }", - " frameUpdate(delta) {", - " }", - " clone() {", - " return new SizeOverLife(this.size.clone());", - " }", - " reset() {", - " }", - "}", - "", - "class SpeedOverLife {", - " initialize(particle) {", - " }", - " constructor(speed) {", - " this.speed = speed;", - " this.type = 'SpeedOverLife';", - " }", - " update(particle) {", - " particle.speedModifier = this.speed.genValue(particle.age / particle.life);", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " speed: this.speed.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new SpeedOverLife(ValueGeneratorFromJSON(json.speed));", - " }", - " frameUpdate(delta) {", - " }", - " clone() {", - " return new SpeedOverLife(this.speed.clone());", - " }", - " reset() {", - " }", - "}", - "", - "class FrameOverLife {", - " constructor(frame) {", - " this.frame = frame;", - " this.type = 'FrameOverLife';", - " }", - " initialize(particle) {", - " if (!(this.frame instanceof PiecewiseBezier)) {", - " particle.uvTile = Math.floor(this.frame.genValue(0) + 0.001);", - " }", - " }", - " update(particle, delta) {", - " if (this.frame instanceof PiecewiseBezier) {", - " particle.uvTile = Math.floor(this.frame.genValue(particle.age / particle.life) + 0.001);", - " }", - " }", - " frameUpdate(delta) { }", - " toJSON() {", - " return {", - " type: this.type,", - " frame: this.frame.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new FrameOverLife(ValueGeneratorFromJSON(json.frame));", - " }", - " clone() {", - " return new FrameOverLife(this.frame.clone());", - " }", - " reset() { }", - "}", - "", - "new THREE.Vector3(0, 0, 1);", - "class OrbitOverLife {", - " constructor(orbitSpeed, axis = new THREE.Vector3(0, 1, 0)) {", - " this.orbitSpeed = orbitSpeed;", - " this.axis = axis;", - " this.type = 'OrbitOverLife';", - " this.temp = new THREE.Vector3();", - " this.rotation = new THREE.Quaternion();", - " this.line = new THREE.Line3();", - " }", - " initialize(particle) {", - " }", - " update(particle, delta) {", - " this.line.set(new THREE.Vector3(0, 0, 0), this.axis);", - " this.line.closestPointToPoint(particle.position, false, this.temp);", - " this.rotation.setFromAxisAngle(this.axis, this.orbitSpeed.genValue(particle.age / particle.life) * delta);", - " particle.position.sub(this.temp);", - " particle.position.applyQuaternion(this.rotation);", - " particle.position.add(this.temp);", - " }", - " frameUpdate(delta) {", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " orbitSpeed: this.orbitSpeed.toJSON(),", - " axis: [this.axis.x, this.axis.y, this.axis.z],", - " };", - " }", - " static fromJSON(json) {", - " return new OrbitOverLife(ValueGeneratorFromJSON(json.orbitSpeed), json.axis ? new THREE.Vector3(json.axis[0], json.axis[1], json.axis[2]) : undefined);", - " }", - " clone() {", - " return new OrbitOverLife(this.orbitSpeed.clone());", - " }", - " reset() {", - " }", - "}", - "", - "class WidthOverLength {", - " initialize(particle) {", - " }", - " constructor(width) {", - " this.width = width;", - " this.type = 'WidthOverLength';", - " }", - " update(particle) {", - " if (particle instanceof TrailParticle) {", - " const iter = particle.previous.values();", - " for (let i = 0; i < particle.previous.length; i++) {", - " const cur = iter.next();", - " cur.value.size = this.width.genValue((particle.previous.length - i) / particle.length);", - " }", - " }", - " }", - " frameUpdate(delta) {", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " width: this.width.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new WidthOverLength(ValueGeneratorFromJSON(json.width));", - " }", - " clone() {", - " return new WidthOverLength(this.width.clone());", - " }", - " reset() {", - " }", - "}", - "", - "class ApplyForce {", - " constructor(direction, magnitude) {", - " this.direction = direction;", - " this.magnitude = magnitude;", - " this.type = 'ApplyForce';", - " this.magnitudeValue = this.magnitude.genValue();", - " }", - " initialize(particle) {", - " }", - " update(particle, delta) {", - " particle.velocity.addScaledVector(this.direction, this.magnitudeValue * delta);", - " }", - " frameUpdate(delta) {", - " this.magnitudeValue = this.magnitude.genValue();", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " direction: [this.direction.x, this.direction.y, this.direction.z],", - " magnitude: this.magnitude.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " var _a;", - " return new ApplyForce(new THREE.Vector3(json.direction[0], json.direction[1], json.direction[2]), ValueGeneratorFromJSON((_a = json.magnitude) !== null && _a !== void 0 ? _a : json.force));", - " }", - " clone() {", - " return new ApplyForce(this.direction.clone(), this.magnitude.clone());", - " }", - " reset() {", - " }", - "}", - "", - "class GravityForce {", - " constructor(center, magnitude) {", - " this.center = center;", - " this.magnitude = magnitude;", - " this.type = 'GravityForce';", - " this.temp = new THREE.Vector3();", - " }", - " initialize(particle) {", - " }", - " update(particle, delta) {", - " this.temp.copy(this.center).sub(particle.position).normalize();", - " particle.velocity.addScaledVector(this.temp, this.magnitude / particle.position.distanceToSquared(this.center) * delta);", - " }", - " frameUpdate(delta) {", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " center: [this.center.x, this.center.y, this.center.z],", - " magnitude: this.magnitude,", - " };", - " }", - " static fromJSON(json) {", - " return new GravityForce(new THREE.Vector3(json.center[0], json.center[1], json.center[2]), json.magnitude);", - " }", - " clone() {", - " return new GravityForce(this.center.clone(), this.magnitude);", - " }", - " reset() {", - " }", - "}", - "", - "new THREE.Vector3(0, 0, 1);", - "class ChangeEmitDirection {", - " constructor(angle) {", - " this.angle = angle;", - " this.type = 'ChangeEmitDirection';", - " this._temp = new THREE.Vector3();", - " this._q = new THREE.Quaternion();", - " }", - " initialize(particle) {", - " const len = particle.velocity.length();", - " if (len == 0)", - " return;", - " particle.velocity.normalize();", - " if (particle.velocity.x === 0 && particle.velocity.y === 0) {", - " this._temp.set(0, particle.velocity.z, 0);", - " }", - " else {", - " this._temp.set(-particle.velocity.y, particle.velocity.x, 0);", - " }", - " this._q.setFromAxisAngle(this._temp.normalize(), this.angle.genValue());", - " this._temp.copy(particle.velocity);", - " particle.velocity.applyQuaternion(this._q);", - " this._q.setFromAxisAngle(this._temp, Math.random() * Math.PI * 2);", - " particle.velocity.applyQuaternion(this._q);", - " particle.velocity.setLength(len);", - " }", - " update(particle, delta) {", - " }", - " frameUpdate(delta) {", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " angle: this.angle.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new ChangeEmitDirection(ValueGeneratorFromJSON(json.angle));", - " }", - " clone() {", - " return new ChangeEmitDirection(this.angle);", - " }", - " reset() {", - " }", - "}", - "", - "const VECTOR_ONE = new THREE.Vector3(1, 1, 1);", - "const VECTOR_Z = new THREE.Vector3(0, 0, 1);", - "gdjs.__particleEmmiter3DExtension.SubParticleEmitMode = void 0;", - "(function (SubParticleEmitMode) {", - " SubParticleEmitMode[SubParticleEmitMode[\"Death\"] = 0] = \"Death\";", - " SubParticleEmitMode[SubParticleEmitMode[\"Birth\"] = 1] = \"Birth\";", - " SubParticleEmitMode[SubParticleEmitMode[\"Frame\"] = 2] = \"Frame\";", - "})(gdjs.__particleEmmiter3DExtension.SubParticleEmitMode || (gdjs.__particleEmmiter3DExtension.SubParticleEmitMode = {}));", - "class EmitSubParticleSystem {", - " constructor(particleSystem, useVelocityAsBasis, subParticleSystem, mode = gdjs.__particleEmmiter3DExtension.SubParticleEmitMode.Frame, emitProbability = 1) {", - " this.particleSystem = particleSystem;", - " this.useVelocityAsBasis = useVelocityAsBasis;", - " this.subParticleSystem = subParticleSystem;", - " this.mode = mode;", - " this.emitProbability = emitProbability;", - " this.type = 'EmitSubParticleSystem';", - " this.q_ = new THREE.Quaternion();", - " this.v_ = new THREE.Vector3();", - " this.v2_ = new THREE.Vector3();", - " this.subEmissions = new Array();", - " if (this.subParticleSystem && this.subParticleSystem.system) {", - " this.subParticleSystem.system.onlyUsedByOther = true;", - " }", - " }", - " initialize(particle) {", - " }", - " update(particle, delta) {", - " if (this.mode === gdjs.__particleEmmiter3DExtension.SubParticleEmitMode.Frame) {", - " this.emit(particle, delta);", - " }", - " else if (this.mode === gdjs.__particleEmmiter3DExtension.SubParticleEmitMode.Birth && particle.age === 0) {", - " this.emit(particle, delta);", - " }", - " else if (this.mode === gdjs.__particleEmmiter3DExtension.SubParticleEmitMode.Death && particle.age + delta >= particle.life) {", - " this.emit(particle, delta);", - " }", - " }", - " emit(particle, delta) {", - " if (!this.subParticleSystem)", - " return;", - " if (Math.random() > this.emitProbability) {", - " return;", - " }", - " const m = new THREE.Matrix4();", - " this.setMatrixFromParticle(m, particle);", - " this.subEmissions.push({", - " burstIndex: 0,", - " burstWaveIndex: 0,", - " time: 0,", - " waitEmiting: 0,", - " matrix: m,", - " travelDistance: 0,", - " particle: particle,", - " });", - " }", - " frameUpdate(delta) {", - " if (!this.subParticleSystem)", - " return;", - " for (let i = 0; i < this.subEmissions.length; i++) {", - " if (this.subEmissions[i].time >= this.subParticleSystem.system.duration) {", - " this.subEmissions[i] = this.subEmissions[this.subEmissions.length - 1];", - " this.subEmissions.length = this.subEmissions.length - 1;", - " i--;", - " }", - " else {", - " let subEmissionState = this.subEmissions[i];", - " if (subEmissionState.particle && subEmissionState.particle.age < subEmissionState.particle.life) {", - " this.setMatrixFromParticle(subEmissionState.matrix, subEmissionState.particle);", - " }", - " else {", - " subEmissionState.particle = undefined;", - " }", - " this.subParticleSystem.system.emit(delta, subEmissionState, subEmissionState.matrix);", - " }", - " }", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " subParticleSystem: this.subParticleSystem ? this.subParticleSystem.uuid : '',", - " useVelocityAsBasis: this.useVelocityAsBasis,", - " mode: this.mode,", - " emitProbability: this.emitProbability,", - " };", - " }", - " static fromJSON(json, particleSystem) {", - " return new EmitSubParticleSystem(particleSystem, json.useVelocityAsBasis, json.subParticleSystem, json.mode, json.emitProbability);", - " }", - " clone() {", - " return new EmitSubParticleSystem(this.particleSystem, this.useVelocityAsBasis, this.subParticleSystem, this.mode, this.emitProbability);", - " }", - " reset() { }", - " setMatrixFromParticle(m, particle) {", - " let rotation;", - " if (particle.rotation === undefined || this.useVelocityAsBasis) {", - " if (particle.velocity.x === 0 &&", - " particle.velocity.y === 0 &&", - " (particle.velocity.z === 1 || particle.velocity.z === 0)) {", - " m.set(1, 0, 0, particle.position.x, 0, 1, 0, particle.position.y, 0, 0, 1, particle.position.z, 0, 0, 0, 1);", - " }", - " else {", - " this.v_.copy(VECTOR_Z).cross(particle.velocity);", - " this.v2_.copy(particle.velocity).cross(this.v_);", - " const len = this.v_.length();", - " const len2 = this.v2_.length();", - " m.set(this.v_.x / len, this.v2_.x / len2, particle.velocity.x, particle.position.x, this.v_.y / len, this.v2_.y / len2, particle.velocity.y, particle.position.y, this.v_.z / len, this.v2_.z / len2, particle.velocity.z, particle.position.z, 0, 0, 0, 1);", - " }", - " }", - " else {", - " if (particle.rotation instanceof THREE.Quaternion) {", - " rotation = particle.rotation;", - " }", - " else {", - " this.q_.setFromAxisAngle(VECTOR_Z, particle.rotation);", - " rotation = this.q_;", - " }", - " m.compose(particle.position, rotation, VECTOR_ONE);", - " }", - " if (!this.particleSystem.worldSpace) {", - " m.multiplyMatrices(this.particleSystem.emitter.matrixWorld, m);", - " }", - " }", - "}", - "", - "const F2 = 0.5 * (Math.sqrt(3.0) - 1.0);", - "const G2 = (3.0 - Math.sqrt(3.0)) / 6.0;", - "const F3 = 1.0 / 3.0;", - "const G3 = 1.0 / 6.0;", - "const F4 = (Math.sqrt(5.0) - 1.0) / 4.0;", - "const G4 = (5.0 - Math.sqrt(5.0)) / 20.0;", - "const grad3 = new Float32Array([1, 1, 0,", - " -1, 1, 0,", - " 1, -1, 0,", - " -1, -1, 0,", - " 1, 0, 1,", - " -1, 0, 1,", - " 1, 0, -1,", - " -1, 0, -1,", - " 0, 1, 1,", - " 0, -1, 1,", - " 0, 1, -1,", - " 0, -1, -1]);", - "const grad4 = new Float32Array([0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1,", - " 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1,", - " 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1,", - " -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1,", - " 1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1,", - " -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1,", - " 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0,", - " -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0]);", - "class SimplexNoise {", - " constructor(randomOrSeed = Math.random) {", - " const random = typeof randomOrSeed == 'function' ? randomOrSeed : alea(randomOrSeed);", - " this.p = buildPermutationTable(random);", - " this.perm = new Uint8Array(512);", - " this.permMod12 = new Uint8Array(512);", - " for (let i = 0; i < 512; i++) {", - " this.perm[i] = this.p[i & 255];", - " this.permMod12[i] = this.perm[i] % 12;", - " }", - " }", - " noise2D(x, y) {", - " const permMod12 = this.permMod12;", - " const perm = this.perm;", - " let n0 = 0;", - " let n1 = 0;", - " let n2 = 0;", - " const s = (x + y) * F2;", - " const i = Math.floor(x + s);", - " const j = Math.floor(y + s);", - " const t = (i + j) * G2;", - " const X0 = i - t;", - " const Y0 = j - t;", - " const x0 = x - X0;", - " const y0 = y - Y0;", - " let i1, j1;", - " if (x0 > y0) {", - " i1 = 1;", - " j1 = 0;", - " }", - " else {", - " i1 = 0;", - " j1 = 1;", - " }", - " const x1 = x0 - i1 + G2;", - " const y1 = y0 - j1 + G2;", - " const x2 = x0 - 1.0 + 2.0 * G2;", - " const y2 = y0 - 1.0 + 2.0 * G2;", - " const ii = i & 255;", - " const jj = j & 255;", - " let t0 = 0.5 - x0 * x0 - y0 * y0;", - " if (t0 >= 0) {", - " const gi0 = permMod12[ii + perm[jj]] * 3;", - " t0 *= t0;", - " n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0);", - " }", - " let t1 = 0.5 - x1 * x1 - y1 * y1;", - " if (t1 >= 0) {", - " const gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3;", - " t1 *= t1;", - " n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1);", - " }", - " let t2 = 0.5 - x2 * x2 - y2 * y2;", - " if (t2 >= 0) {", - " const gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3;", - " t2 *= t2;", - " n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2);", - " }", - " return 70.0 * (n0 + n1 + n2);", - " }", - " noise3D(x, y, z) {", - " const permMod12 = this.permMod12;", - " const perm = this.perm;", - " let n0, n1, n2, n3;", - " const s = (x + y + z) * F3;", - " const i = Math.floor(x + s);", - " const j = Math.floor(y + s);", - " const k = Math.floor(z + s);", - " const t = (i + j + k) * G3;", - " const X0 = i - t;", - " const Y0 = j - t;", - " const Z0 = k - t;", - " const x0 = x - X0;", - " const y0 = y - Y0;", - " const z0 = z - Z0;", - " let i1, j1, k1;", - " let i2, j2, k2;", - " if (x0 >= y0) {", - " if (y0 >= z0) {", - " i1 = 1;", - " j1 = 0;", - " k1 = 0;", - " i2 = 1;", - " j2 = 1;", - " k2 = 0;", - " }", - " else if (x0 >= z0) {", - " i1 = 1;", - " j1 = 0;", - " k1 = 0;", - " i2 = 1;", - " j2 = 0;", - " k2 = 1;", - " }", - " else {", - " i1 = 0;", - " j1 = 0;", - " k1 = 1;", - " i2 = 1;", - " j2 = 0;", - " k2 = 1;", - " }", - " }", - " else {", - " if (y0 < z0) {", - " i1 = 0;", - " j1 = 0;", - " k1 = 1;", - " i2 = 0;", - " j2 = 1;", - " k2 = 1;", - " }", - " else if (x0 < z0) {", - " i1 = 0;", - " j1 = 1;", - " k1 = 0;", - " i2 = 0;", - " j2 = 1;", - " k2 = 1;", - " }", - " else {", - " i1 = 0;", - " j1 = 1;", - " k1 = 0;", - " i2 = 1;", - " j2 = 1;", - " k2 = 0;", - " }", - " }", - " const x1 = x0 - i1 + G3;", - " const y1 = y0 - j1 + G3;", - " const z1 = z0 - k1 + G3;", - " const x2 = x0 - i2 + 2.0 * G3;", - " const y2 = y0 - j2 + 2.0 * G3;", - " const z2 = z0 - k2 + 2.0 * G3;", - " const x3 = x0 - 1.0 + 3.0 * G3;", - " const y3 = y0 - 1.0 + 3.0 * G3;", - " const z3 = z0 - 1.0 + 3.0 * G3;", - " const ii = i & 255;", - " const jj = j & 255;", - " const kk = k & 255;", - " let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;", - " if (t0 < 0)", - " n0 = 0.0;", - " else {", - " const gi0 = permMod12[ii + perm[jj + perm[kk]]] * 3;", - " t0 *= t0;", - " n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0 + grad3[gi0 + 2] * z0);", - " }", - " let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;", - " if (t1 < 0)", - " n1 = 0.0;", - " else {", - " const gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;", - " t1 *= t1;", - " n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1 + grad3[gi1 + 2] * z1);", - " }", - " let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;", - " if (t2 < 0)", - " n2 = 0.0;", - " else {", - " const gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;", - " t2 *= t2;", - " n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2 + grad3[gi2 + 2] * z2);", - " }", - " let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;", - " if (t3 < 0)", - " n3 = 0.0;", - " else {", - " const gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;", - " t3 *= t3;", - " n3 = t3 * t3 * (grad3[gi3] * x3 + grad3[gi3 + 1] * y3 + grad3[gi3 + 2] * z3);", - " }", - " return 32.0 * (n0 + n1 + n2 + n3);", - " }", - " noise4D(x, y, z, w) {", - " const perm = this.perm;", - " let n0, n1, n2, n3, n4;", - " const s = (x + y + z + w) * F4;", - " const i = Math.floor(x + s);", - " const j = Math.floor(y + s);", - " const k = Math.floor(z + s);", - " const l = Math.floor(w + s);", - " const t = (i + j + k + l) * G4;", - " const X0 = i - t;", - " const Y0 = j - t;", - " const Z0 = k - t;", - " const W0 = l - t;", - " const x0 = x - X0;", - " const y0 = y - Y0;", - " const z0 = z - Z0;", - " const w0 = w - W0;", - " let rankx = 0;", - " let ranky = 0;", - " let rankz = 0;", - " let rankw = 0;", - " if (x0 > y0)", - " rankx++;", - " else", - " ranky++;", - " if (x0 > z0)", - " rankx++;", - " else", - " rankz++;", - " if (x0 > w0)", - " rankx++;", - " else", - " rankw++;", - " if (y0 > z0)", - " ranky++;", - " else", - " rankz++;", - " if (y0 > w0)", - " ranky++;", - " else", - " rankw++;", - " if (z0 > w0)", - " rankz++;", - " else", - " rankw++;", - " const i1 = rankx >= 3 ? 1 : 0;", - " const j1 = ranky >= 3 ? 1 : 0;", - " const k1 = rankz >= 3 ? 1 : 0;", - " const l1 = rankw >= 3 ? 1 : 0;", - " const i2 = rankx >= 2 ? 1 : 0;", - " const j2 = ranky >= 2 ? 1 : 0;", - " const k2 = rankz >= 2 ? 1 : 0;", - " const l2 = rankw >= 2 ? 1 : 0;", - " const i3 = rankx >= 1 ? 1 : 0;", - " const j3 = ranky >= 1 ? 1 : 0;", - " const k3 = rankz >= 1 ? 1 : 0;", - " const l3 = rankw >= 1 ? 1 : 0;", - " const x1 = x0 - i1 + G4;", - " const y1 = y0 - j1 + G4;", - " const z1 = z0 - k1 + G4;", - " const w1 = w0 - l1 + G4;", - " const x2 = x0 - i2 + 2.0 * G4;", - " const y2 = y0 - j2 + 2.0 * G4;", - " const z2 = z0 - k2 + 2.0 * G4;", - " const w2 = w0 - l2 + 2.0 * G4;", - " const x3 = x0 - i3 + 3.0 * G4;", - " const y3 = y0 - j3 + 3.0 * G4;", - " const z3 = z0 - k3 + 3.0 * G4;", - " const w3 = w0 - l3 + 3.0 * G4;", - " const x4 = x0 - 1.0 + 4.0 * G4;", - " const y4 = y0 - 1.0 + 4.0 * G4;", - " const z4 = z0 - 1.0 + 4.0 * G4;", - " const w4 = w0 - 1.0 + 4.0 * G4;", - " const ii = i & 255;", - " const jj = j & 255;", - " const kk = k & 255;", - " const ll = l & 255;", - " let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;", - " if (t0 < 0)", - " n0 = 0.0;", - " else {", - " const gi0 = (perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32) * 4;", - " t0 *= t0;", - " n0 = t0 * t0 * (grad4[gi0] * x0 + grad4[gi0 + 1] * y0 + grad4[gi0 + 2] * z0 + grad4[gi0 + 3] * w0);", - " }", - " let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;", - " if (t1 < 0)", - " n1 = 0.0;", - " else {", - " const gi1 = (perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32) * 4;", - " t1 *= t1;", - " n1 = t1 * t1 * (grad4[gi1] * x1 + grad4[gi1 + 1] * y1 + grad4[gi1 + 2] * z1 + grad4[gi1 + 3] * w1);", - " }", - " let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;", - " if (t2 < 0)", - " n2 = 0.0;", - " else {", - " const gi2 = (perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32) * 4;", - " t2 *= t2;", - " n2 = t2 * t2 * (grad4[gi2] * x2 + grad4[gi2 + 1] * y2 + grad4[gi2 + 2] * z2 + grad4[gi2 + 3] * w2);", - " }", - " let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;", - " if (t3 < 0)", - " n3 = 0.0;", - " else {", - " const gi3 = (perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32) * 4;", - " t3 *= t3;", - " n3 = t3 * t3 * (grad4[gi3] * x3 + grad4[gi3 + 1] * y3 + grad4[gi3 + 2] * z3 + grad4[gi3 + 3] * w3);", - " }", - " let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;", - " if (t4 < 0)", - " n4 = 0.0;", - " else {", - " const gi4 = (perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32) * 4;", - " t4 *= t4;", - " n4 = t4 * t4 * (grad4[gi4] * x4 + grad4[gi4 + 1] * y4 + grad4[gi4 + 2] * z4 + grad4[gi4 + 3] * w4);", - " }", - " return 27.0 * (n0 + n1 + n2 + n3 + n4);", - " }", - "}", - "function buildPermutationTable(random) {", - " const p = new Uint8Array(256);", - " for (let i = 0; i < 256; i++) {", - " p[i] = i;", - " }", - " for (let i = 0; i < 255; i++) {", - " const r = i + ~~(random() * (256 - i));", - " const aux = p[i];", - " p[i] = p[r];", - " p[r] = aux;", - " }", - " return p;", - "}", - "function alea(seed) {", - " let s0 = 0;", - " let s1 = 0;", - " let s2 = 0;", - " let c = 1;", - " const mash = masher();", - " s0 = mash(' ');", - " s1 = mash(' ');", - " s2 = mash(' ');", - " s0 -= mash(seed);", - " if (s0 < 0) {", - " s0 += 1;", - " }", - " s1 -= mash(seed);", - " if (s1 < 0) {", - " s1 += 1;", - " }", - " s2 -= mash(seed);", - " if (s2 < 0) {", - " s2 += 1;", - " }", - " return function () {", - " const t = 2091639 * s0 + c * 2.3283064365386963e-10;", - " s0 = s1;", - " s1 = s2;", - " return s2 = t - (c = t | 0);", - " };", - "}", - "function masher() {", - " let n = 0xefc8249d;", - " return function (data) {", - " data = data.toString();", - " for (let i = 0; i < data.length; i++) {", - " n += data.charCodeAt(i);", - " let h = 0.02519603282416938 * n;", - " n = h >>> 0;", - " h -= n;", - " h *= n;", - " n = h >>> 0;", - " h -= n;", - " n += h * 0x100000000;", - " }", - " return (n >>> 0) * 2.3283064365386963e-10;", - " };", - "}", - "", - "class TurbulenceField {", - " constructor(scale, octaves, velocityMultiplier, timeScale) {", - " this.scale = scale;", - " this.octaves = octaves;", - " this.velocityMultiplier = velocityMultiplier;", - " this.timeScale = timeScale;", - " this.type = 'TurbulenceField';", - " this.generator = new SimplexNoise();", - " this.timeOffset = new THREE.Vector3();", - " this.temp = new THREE.Vector3();", - " this.temp2 = new THREE.Vector3();", - " this.timeOffset.x = Math.random() / this.scale.x * this.timeScale.x;", - " this.timeOffset.y = Math.random() / this.scale.y * this.timeScale.y;", - " this.timeOffset.z = Math.random() / this.scale.z * this.timeScale.z;", - " }", - " initialize(particle) {", - " }", - " update(particle, delta) {", - " const x = particle.position.x / this.scale.x;", - " const y = particle.position.y / this.scale.y;", - " const z = particle.position.z / this.scale.z;", - " this.temp.set(0, 0, 0);", - " let lvl = 1;", - " for (let i = 0; i < this.octaves; i++) {", - " this.temp2.set(this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.x * lvl) / lvl, this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.y * lvl) / lvl, this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.z * lvl) / lvl);", - " this.temp.add(this.temp2);", - " lvl *= 2;", - " }", - " this.temp.multiply(this.velocityMultiplier);", - " particle.velocity.addScaledVector(this.temp, delta);", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " scale: [this.scale.x, this.scale.y, this.scale.z],", - " octaves: this.octaves,", - " velocityMultiplier: [this.velocityMultiplier.x, this.velocityMultiplier.y, this.velocityMultiplier.z],", - " timeScale: [this.timeScale.x, this.timeScale.y, this.timeScale.z],", - " };", - " }", - " frameUpdate(delta) {", - " this.timeOffset.x += delta * this.timeScale.x;", - " this.timeOffset.y += delta * this.timeScale.y;", - " this.timeOffset.z += delta * this.timeScale.z;", - " }", - " static fromJSON(json) {", - " return new TurbulenceField(new THREE.Vector3(json.scale[0], json.scale[1], json.scale[2]), json.octaves, new THREE.Vector3(json.velocityMultiplier[0], json.velocityMultiplier[1], json.velocityMultiplier[2]), new THREE.Vector3(json.timeScale[0], json.timeScale[1], json.timeScale[2]));", - " }", - " clone() {", - " return new TurbulenceField(this.scale.clone(), this.octaves, this.velocityMultiplier.clone(), this.timeScale.clone());", - " }", - " reset() {", - " }", - "}", - "", - "function randomInt(a, b) {", - " return Math.floor(Math.random() * (b - a)) + a;", - "}", - "", - "const generators = [];", - "const tempV$2 = new THREE.Vector3();", - "const tempQ$2 = new THREE.Quaternion();", - "class Noise {", - " constructor(frequency, power, positionAmount = new ConstantValue(1), rotationAmount = new ConstantValue(0)) {", - " this.frequency = frequency;", - " this.power = power;", - " this.positionAmount = positionAmount;", - " this.rotationAmount = rotationAmount;", - " this.type = 'Noise';", - " this.duration = 0;", - " if (generators.length === 0) {", - " for (let i = 0; i < 100; i++) {", - " generators.push(new SimplexNoise());", - " }", - " }", - " }", - " initialize(particle) {", - " particle.lastPosNoise = new THREE.Vector3();", - " if (typeof particle.rotation === 'number') {", - " particle.lastRotNoise = 0;", - " }", - " else {", - " particle.lastRotNoise = new THREE.Quaternion();", - " }", - " particle.generatorIndex = [randomInt(0, 100), randomInt(0, 100), randomInt(0, 100), randomInt(0, 100)];", - " }", - " update(particle, _) {", - " let frequency = this.frequency.genValue(particle.age / particle.life);", - " let power = this.power.genValue(particle.age / particle.life);", - " let positionAmount = this.positionAmount.genValue(particle.age / particle.life);", - " let rotationAmount = this.rotationAmount.genValue(particle.age / particle.life);", - " if (positionAmount > 0 && particle.lastPosNoise !== undefined) {", - " particle.position.sub(particle.lastPosNoise);", - " tempV$2.set(generators[particle.generatorIndex[0]].noise2D(0, particle.age * frequency) *", - " power *", - " positionAmount, generators[particle.generatorIndex[1]].noise2D(0, particle.age * frequency) *", - " power *", - " positionAmount, generators[particle.generatorIndex[2]].noise2D(0, particle.age * frequency) *", - " power *", - " positionAmount);", - " particle.position.add(tempV$2);", - " particle.lastPosNoise.copy(tempV$2);", - " }", - " if (rotationAmount > 0 && particle.lastRotNoise !== undefined) {", - " if (typeof particle.rotation === 'number') {", - " particle.rotation -= particle.lastRotNoise;", - " particle.rotation +=", - " generators[particle.generatorIndex[3]].noise2D(0, particle.age * frequency) *", - " Math.PI *", - " power *", - " rotationAmount;", - " }", - " else {", - " particle.lastRotNoise.invert();", - " particle.rotation.multiply(particle.lastRotNoise);", - " tempQ$2", - " .set(generators[particle.generatorIndex[0]].noise2D(0, particle.age * frequency) *", - " power *", - " rotationAmount, generators[particle.generatorIndex[1]].noise2D(0, particle.age * frequency) *", - " power *", - " rotationAmount, generators[particle.generatorIndex[2]].noise2D(0, particle.age * frequency) *", - " power *", - " rotationAmount, generators[particle.generatorIndex[3]].noise2D(0, particle.age * frequency) *", - " power *", - " rotationAmount)", - " .normalize();", - " particle.rotation.multiply(tempQ$2);", - " particle.lastRotNoise.copy(tempQ$2);", - " }", - " }", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " frequency: this.frequency.toJSON(),", - " power: this.power.toJSON(),", - " positionAmount: this.positionAmount.toJSON(),", - " rotationAmount: this.rotationAmount.toJSON(),", - " };", - " }", - " frameUpdate(delta) {", - " this.duration += delta;", - " }", - " static fromJSON(json) {", - " return new Noise(ValueGeneratorFromJSON(json.frequency), ValueGeneratorFromJSON(json.power), ValueGeneratorFromJSON(json.positionAmount), ValueGeneratorFromJSON(json.rotationAmount));", - " }", - " clone() {", - " return new Noise(this.frequency.clone(), this.power.clone(), this.positionAmount.clone(), this.rotationAmount.clone());", - " }", - " reset() { }", - "}", - "", - "class TextureSequencer {", - " constructor(scaleX = 0, scaleY = 0, position = new THREE.Vector3()) {", - " this.scaleX = scaleX;", - " this.scaleY = scaleY;", - " this.position = position;", - " this.locations = [];", - " }", - " transform(position, index) {", - " position.x = this.locations[index % this.locations.length].x * this.scaleX + this.position.x;", - " position.y = this.locations[index % this.locations.length].y * this.scaleY + this.position.y;", - " position.z = this.position.z;", - " }", - " static fromJSON(json) {", - " const textureSequencer = new TextureSequencer(json.scaleX, json.scaleY, new THREE.Vector3(json.position[0], json.position[1], json.position[2]));", - " textureSequencer.locations = json.locations.map((loc) => new THREE.Vector2(loc.x, loc.y));", - " return textureSequencer;", - " }", - " clone() {", - " const textureSequencer = new TextureSequencer(this.scaleX, this.scaleY, this.position.clone());", - " textureSequencer.locations = this.locations.map(loc => loc.clone());", - " return textureSequencer;", - " }", - " toJSON() {", - " return {", - " scaleX: this.scaleX,", - " scaleY: this.scaleY,", - " position: this.position,", - " locations: this.locations.map(loc => ({", - " x: loc.x,", - " y: loc.y,", - " }))", - " };", - " }", - " fromImage(img, threshold) {", - " const canvas = document.createElement(\"canvas\");", - " canvas.width = img.width;", - " canvas.height = img.height;", - " const ctx = canvas.getContext(\"2d\");", - " if (!ctx) {", - " return;", - " }", - " ctx.drawImage(img, 0, 0);", - " const data = ctx.getImageData(0, 0, canvas.width, canvas.height, { colorSpace: \"srgb\" });", - " canvas.remove();", - " this.locations.length = 0;", - " for (let i = 0; i < data.height; i++) {", - " for (let j = 0; j < data.width; j++) {", - " if (data.data[(i * data.width + j) * 4 + 3] > threshold) {", - " this.locations.push(new THREE.Vector2(j, data.height - i));", - " }", - " }", - " }", - " }", - "}", - "", - "function SequencerFromJSON(json) {", - " switch (json.type) {", - " case 'TextureSequencer':", - " return TextureSequencer.fromJSON(json);", - " default:", - " return new TextureSequencer();", - " }", - "}", - "", - "class ApplySequences {", - " constructor(delayBetweenParticles) {", - " this.type = 'ApplySequences';", - " this.sequencers = [];", - " this.time = 0;", - " this.index = 0;", - " this.pCount = 0;", - " this.tempV = new THREE.Vector3();", - " this.delay = delayBetweenParticles;", - " }", - " initialize(particle) {", - " particle.id = this.pCount;", - " particle.dst = new THREE.Vector3();", - " particle.begin = new THREE.Vector3();", - " particle.inMotion = false;", - " this.pCount++;", - " }", - " reset() {", - " this.time = 0;", - " this.index = 0;", - " this.pCount = 0;", - " }", - " update(particle, delta) {", - " const sequencer = this.sequencers[this.index];", - " const delay = particle.id * this.delay;", - " if (this.time >= sequencer[0].a + delay && this.time <= sequencer[0].b + delay) {", - " if (!particle.inMotion) {", - " particle.inMotion = true;", - " particle.begin.copy(particle.position);", - " sequencer[1].transform(particle.dst, particle.id);", - " }", - " particle.position.lerpVectors(particle.begin, particle.dst, ApplySequences.BEZIER.genValue((this.time - sequencer[0].a - delay) / (sequencer[0].b - sequencer[0].a)));", - " }", - " else if (this.time > sequencer[0].b + delay) {", - " particle.inMotion = false;", - " }", - " }", - " frameUpdate(delta) {", - " while (this.index + 1 < this.sequencers.length && this.time >= this.sequencers[this.index + 1][0].a) {", - " this.index++;", - " }", - " this.time += delta;", - " }", - " appendSequencer(range, sequencer) {", - " this.sequencers.push([range, sequencer]);", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " delay: this.delay,", - " sequencers: this.sequencers.map(([range, sequencer]) => ({", - " range: range.toJSON(),", - " sequencer: sequencer.toJSON(),", - " })),", - " };", - " }", - " static fromJSON(json) {", - " const seq = new ApplySequences(json.delay);", - " json.sequencers.forEach((sequencerJson) => {", - " seq.sequencers.push([ValueGeneratorFromJSON(sequencerJson.range), SequencerFromJSON(sequencerJson.sequencer)]);", - " });", - " return seq;", - " }", - " clone() {", - " const applySequences = new ApplySequences(this.delay);", - " applySequences.sequencers = this.sequencers.map(seq => [seq[0].clone(), seq[1].clone()]);", - " return applySequences;", - " }", - "}", - "ApplySequences.BEZIER = new Bezier(0, 0, 1, 1);", - "", - "let physicsResolver;", - "function setPhysicsResolver(resolver) {", - " physicsResolver = resolver;", - "}", - "function getPhysicsResolver() {", - " return physicsResolver;", - "}", - "class ApplyCollision {", - " constructor(resolver, bounce) {", - " this.resolver = resolver;", - " this.bounce = bounce;", - " this.type = 'ApplyCollision';", - " this.tempV = new THREE.Vector3();", - " }", - " initialize(particle) {", - " }", - " update(particle, delta) {", - " if (this.resolver.resolve(particle.position, this.tempV)) {", - " particle.velocity.reflect(this.tempV).multiplyScalar(this.bounce);", - " }", - " }", - " frameUpdate(delta) {", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " bounce: this.bounce,", - " };", - " }", - " static fromJSON(json) {", - " return new ApplyCollision(getPhysicsResolver(), json.bounce);", - " }", - " clone() {", - " return new ApplyCollision(this.resolver, this.bounce);", - " }", - " reset() {", - " }", - "}", - "", - "class ColorBySpeed {", - " constructor(color, speedRange) {", - " this.color = color;", - " this.speedRange = speedRange;", - " this.type = 'ColorBySpeed';", - " }", - " initialize(particle) {", - " if (this.color.type === 'memorizedFunction') {", - " particle.colorOverLifeMemory = {};", - " this.color.startGen(particle.colorOverLifeMemory);", - " }", - " }", - " update(particle, delta) {", - " const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);", - " if (this.color.type === 'memorizedFunction') {", - " this.color.genColor(particle.color, t, particle.colorOverLifeMemory);", - " }", - " else {", - " this.color.genColor(particle.color, t);", - " }", - " particle.color.x *= particle.startColor.x;", - " particle.color.y *= particle.startColor.y;", - " particle.color.z *= particle.startColor.z;", - " particle.color.w *= particle.startColor.w;", - " }", - " frameUpdate(delta) { }", - " toJSON() {", - " return {", - " type: this.type,", - " color: this.color.toJSON(),", - " speedRange: this.speedRange.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new ColorBySpeed(ColorGeneratorFromJSON(json.color), IntervalValue.fromJSON(json.speedRange));", - " }", - " clone() {", - " return new ColorBySpeed(this.color.clone(), this.speedRange.clone());", - " }", - " reset() { }", - "}", - "", - "class SizeBySpeed {", - " initialize(particle) { }", - " constructor(size, speedRange) {", - " this.size = size;", - " this.speedRange = speedRange;", - " this.type = 'SizeBySpeed';", - " }", - " update(particle) {", - " const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);", - " particle.size = particle.startSize * this.size.genValue(t);", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " size: this.size.toJSON(),", - " speedRange: this.speedRange.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new SizeBySpeed(ValueGeneratorFromJSON(json.size), IntervalValue.fromJSON(json.speedRange));", - " }", - " frameUpdate(delta) { }", - " clone() {", - " return new SizeBySpeed(this.size.clone(), this.speedRange.clone());", - " }", - " reset() { }", - "}", - "", - "class RotationBySpeed {", - " constructor(angularVelocity, speedRange) {", - " this.angularVelocity = angularVelocity;", - " this.speedRange = speedRange;", - " this.type = 'RotationBySpeed';", - " this.tempQuat = new THREE.Quaternion();", - " }", - " initialize(particle) { }", - " update(particle, delta) {", - " const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);", - " particle.rotation += delta * this.angularVelocity.genValue(t);", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " angularVelocity: this.angularVelocity.toJSON(),", - " speedRange: this.speedRange.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new RotationBySpeed(ValueGeneratorFromJSON(json.angularVelocity), IntervalValue.fromJSON(json.speedRange));", - " }", - " frameUpdate(delta) { }", - " clone() {", - " return new RotationBySpeed(this.angularVelocity.clone(), this.speedRange.clone());", - " }", - " reset() { }", - "}", - "", - "class LimitSpeedOverLife {", - " initialize(particle) { }", - " constructor(speed, dampen) {", - " this.speed = speed;", - " this.dampen = dampen;", - " this.type = 'LimitSpeedOverLife';", - " }", - " update(particle, delta) {", - " let speed = particle.velocity.length();", - " let limit = this.speed.genValue(particle.age / particle.life);", - " if (speed > limit) {", - " const percent = (speed - limit) / speed;", - " particle.velocity.multiplyScalar(1 - percent * this.dampen * delta * 20);", - " }", - " }", - " toJSON() {", - " return {", - " type: this.type,", - " speed: this.speed.toJSON(),", - " dampen: this.dampen,", - " };", - " }", - " static fromJSON(json) {", - " return new LimitSpeedOverLife(ValueGeneratorFromJSON(json.speed), json.dampen);", - " }", - " frameUpdate(delta) { }", - " clone() {", - " return new LimitSpeedOverLife(this.speed.clone(), this.dampen);", - " }", - " reset() { }", - "}", - "", - "const BehaviorTypes = {", - " ApplyForce: {", - " type: 'ApplyForce',", - " constructor: ApplyForce,", - " params: [", - " ['direction', 'vec3'],", - " ['magnitude', 'value'],", - " ],", - " loadJSON: ApplyForce.fromJSON,", - " },", - " Noise: {", - " type: 'Noise',", - " constructor: Noise,", - " params: [", - " ['frequency', 'value'],", - " ['power', 'value'],", - " ['positionAmount', 'value'],", - " ['rotationAmount', 'value'],", - " ],", - " loadJSON: Noise.fromJSON,", - " },", - " TurbulenceField: {", - " type: 'TurbulenceField',", - " constructor: TurbulenceField,", - " params: [", - " ['scale', 'vec3'],", - " ['octaves', 'number'],", - " ['velocityMultiplier', 'vec3'],", - " ['timeScale', 'vec3'],", - " ],", - " loadJSON: TurbulenceField.fromJSON,", - " },", - " GravityForce: {", - " type: 'GravityForce',", - " constructor: GravityForce,", - " params: [", - " ['center', 'vec3'],", - " ['magnitude', 'number'],", - " ],", - " loadJSON: GravityForce.fromJSON,", - " },", - " ColorOverLife: {", - " type: 'ColorOverLife',", - " constructor: ColorOverLife,", - " params: [['color', 'colorFunc']],", - " loadJSON: ColorOverLife.fromJSON,", - " },", - " RotationOverLife: {", - " type: 'RotationOverLife',", - " constructor: RotationOverLife,", - " params: [['angularVelocity', 'valueFunc']],", - " loadJSON: RotationOverLife.fromJSON,", - " },", - " Rotation3DOverLife: {", - " type: 'Rotation3DOverLife',", - " constructor: Rotation3DOverLife,", - " params: [['angularVelocity', 'rotationFunc']],", - " loadJSON: Rotation3DOverLife.fromJSON,", - " },", - " SizeOverLife: {", - " type: 'SizeOverLife',", - " constructor: SizeOverLife,", - " params: [['size', 'valueFunc']],", - " loadJSON: SizeOverLife.fromJSON,", - " },", - " ColorBySpeed: {", - " type: 'ColorBySpeed',", - " constructor: ColorBySpeed,", - " params: [", - " ['color', 'colorFunc'],", - " ['speedRange', 'range'],", - " ],", - " loadJSON: ColorBySpeed.fromJSON,", - " },", - " RotationBySpeed: {", - " type: 'RotationBySpeed',", - " constructor: RotationBySpeed,", - " params: [", - " ['angularVelocity', 'valueFunc'],", - " ['speedRange', 'range'],", - " ],", - " loadJSON: RotationBySpeed.fromJSON,", - " },", - " SizeBySpeed: {", - " type: 'SizeBySpeed',", - " constructor: SizeBySpeed,", - " params: [", - " ['size', 'valueFunc'],", - " ['speedRange', 'range'],", - " ],", - " loadJSON: SizeBySpeed.fromJSON,", - " },", - " SpeedOverLife: {", - " type: 'SpeedOverLife',", - " constructor: SpeedOverLife,", - " params: [['speed', 'valueFunc']],", - " loadJSON: SpeedOverLife.fromJSON,", - " },", - " FrameOverLife: {", - " type: 'FrameOverLife',", - " constructor: FrameOverLife,", - " params: [['frame', 'valueFunc']],", - " loadJSON: FrameOverLife.fromJSON,", - " },", - " ForceOverLife: {", - " type: 'ForceOverLife',", - " constructor: ForceOverLife,", - " params: [", - " ['x', 'valueFunc'],", - " ['y', 'valueFunc'],", - " ['z', 'valueFunc'],", - " ],", - " loadJSON: ForceOverLife.fromJSON,", - " },", - " OrbitOverLife: {", - " type: 'OrbitOverLife',", - " constructor: OrbitOverLife,", - " params: [", - " ['orbitSpeed', 'valueFunc'],", - " ['axis', 'vec3'],", - " ],", - " loadJSON: OrbitOverLife.fromJSON,", - " },", - " WidthOverLength: {", - " type: 'WidthOverLength',", - " constructor: WidthOverLength,", - " params: [['width', 'valueFunc']],", - " loadJSON: WidthOverLength.fromJSON,", - " },", - " ChangeEmitDirection: {", - " type: 'ChangeEmitDirection',", - " constructor: ChangeEmitDirection,", - " params: [['angle', 'value']],", - " loadJSON: ChangeEmitDirection.fromJSON,", - " },", - " EmitSubParticleSystem: {", - " type: 'EmitSubParticleSystem',", - " constructor: EmitSubParticleSystem,", - " params: [", - " ['particleSystem', 'self'],", - " ['useVelocityAsBasis', 'boolean'],", - " ['subParticleSystem', 'particleSystem'],", - " ['mode', 'number'],", - " ['emitProbability', 'number'],", - " ],", - " loadJSON: EmitSubParticleSystem.fromJSON,", - " },", - " LimitSpeedOverLife: {", - " type: 'LimitSpeedOverLife',", - " constructor: LimitSpeedOverLife,", - " params: [", - " ['speed', 'valueFunc'],", - " ['dampen', 'number'],", - " ],", - " loadJSON: LimitSpeedOverLife.fromJSON,", - " },", - "};", - "function BehaviorFromJSON(json, particleSystem) {", - " return BehaviorTypes[json.type].loadJSON(json, particleSystem);", - "}", - "", - "gdjs.__particleEmmiter3DExtension.EmitterMode = void 0;", - "(function (EmitterMode) {", - " EmitterMode[EmitterMode[\"Random\"] = 0] = \"Random\";", - " EmitterMode[EmitterMode[\"Loop\"] = 1] = \"Loop\";", - " EmitterMode[EmitterMode[\"PingPong\"] = 2] = \"PingPong\";", - " EmitterMode[EmitterMode[\"Burst\"] = 3] = \"Burst\";", - "})(gdjs.__particleEmmiter3DExtension.EmitterMode || (gdjs.__particleEmmiter3DExtension.EmitterMode = {}));", - "function getValueFromEmitterMode(mode, currentValue, spread) {", - " let u;", - " if (gdjs.__particleEmmiter3DExtension.EmitterMode.Random === mode) {", - " currentValue = Math.random();", - " }", - " if (spread > 0) {", - " u = Math.floor(currentValue / spread) * spread;", - " }", - " else {", - " u = currentValue;", - " }", - " switch (mode) {", - " case gdjs.__particleEmmiter3DExtension.EmitterMode.Loop:", - " u = u % 1;", - " break;", - " case gdjs.__particleEmmiter3DExtension.EmitterMode.PingPong:", - " u = Math.abs((u % 2) - 1);", - " break;", - " }", - " return u;", - "}", - "", - "class ConeEmitter {", - " constructor(parameters = {}) {", - " var _a, _b, _c, _d, _e, _f, _g;", - " this.type = 'cone';", - " this.currentValue = 0;", - " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", - " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", - " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", - " this.angle = (_d = parameters.angle) !== null && _d !== void 0 ? _d : Math.PI / 6;", - " this.mode = (_e = parameters.mode) !== null && _e !== void 0 ? _e : gdjs.__particleEmmiter3DExtension.EmitterMode.Random;", - " this.spread = (_f = parameters.spread) !== null && _f !== void 0 ? _f : 0;", - " this.speed = (_g = parameters.speed) !== null && _g !== void 0 ? _g : new ConstantValue(1);", - " }", - " update(system, delta) {", - " if (gdjs.__particleEmmiter3DExtension.EmitterMode.Random != this.mode) {", - " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", - " }", - " }", - " initialize(p) {", - " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", - " const rand = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", - " const theta = u * this.arc;", - " const r = Math.sqrt(rand);", - " const sinTheta = Math.sin(theta);", - " const cosTheta = Math.cos(theta);", - " p.position.x = r * cosTheta;", - " p.position.y = r * sinTheta;", - " p.position.z = 0;", - " const angle = this.angle * r;", - " p.velocity.set(0, 0, Math.cos(angle)).addScaledVector(p.position, Math.sin(angle)).multiplyScalar(p.startSpeed);", - " p.position.multiplyScalar(this.radius);", - " }", - " toJSON() {", - " return {", - " type: 'cone',", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " angle: this.angle,", - " mode: this.mode,", - " spread: this.spread,", - " speed: this.speed.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new ConeEmitter({", - " radius: json.radius,", - " arc: json.arc,", - " thickness: json.thickness,", - " angle: json.angle,", - " mode: json.mode,", - " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", - " spread: json.spread,", - " });", - " }", - " clone() {", - " return new ConeEmitter({", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " angle: this.angle,", - " mode: this.mode,", - " speed: this.speed.clone(),", - " spread: this.spread,", - " });", - " }", - "}", - "", - "class CircleEmitter {", - " constructor(parameters = {}) {", - " var _a, _b, _c, _d, _e, _f;", - " this.type = 'circle';", - " this.currentValue = 0;", - " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", - " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", - " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", - " this.mode = (_d = parameters.mode) !== null && _d !== void 0 ? _d : gdjs.__particleEmmiter3DExtension.EmitterMode.Random;", - " this.spread = (_e = parameters.spread) !== null && _e !== void 0 ? _e : 0;", - " this.speed = (_f = parameters.speed) !== null && _f !== void 0 ? _f : new ConstantValue(1);", - " }", - " update(system, delta) {", - " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", - " }", - " initialize(p) {", - " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", - " const r = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", - " const theta = u * this.arc;", - " p.position.x = Math.cos(theta);", - " p.position.y = Math.sin(theta);", - " p.position.z = 0;", - " p.velocity.copy(p.position).multiplyScalar(p.startSpeed);", - " p.position.multiplyScalar(this.radius * r);", - " }", - " toJSON() {", - " return {", - " type: 'circle',", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " mode: this.mode,", - " spread: this.spread,", - " speed: this.speed.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new CircleEmitter({", - " radius: json.radius,", - " arc: json.arc,", - " thickness: json.thickness,", - " mode: json.mode,", - " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", - " spread: json.spread,", - " });", - " }", - " clone() {", - " return new CircleEmitter({", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " mode: this.mode,", - " speed: this.speed.clone(),", - " spread: this.spread,", - " });", - " }", - "}", - "", - "class DonutEmitter {", - " constructor(parameters = {}) {", - " var _a, _b, _c, _d, _e, _f, _g;", - " this.type = 'donut';", - " this.currentValue = 0;", - " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", - " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", - " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", - " this.donutRadius = (_d = parameters.donutRadius) !== null && _d !== void 0 ? _d : this.radius * 0.2;", - " this.mode = (_e = parameters.mode) !== null && _e !== void 0 ? _e : gdjs.__particleEmmiter3DExtension.EmitterMode.Random;", - " this.spread = (_f = parameters.spread) !== null && _f !== void 0 ? _f : 0;", - " this.speed = (_g = parameters.speed) !== null && _g !== void 0 ? _g : new ConstantValue(1);", - " }", - " update(system, delta) {", - " if (gdjs.__particleEmmiter3DExtension.EmitterMode.Random != this.mode) {", - " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", - " }", - " }", - " initialize(p) {", - " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", - " const v = Math.random();", - " const rand = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", - " const theta = u * this.arc;", - " const phi = v * Math.PI * 2;", - " const sinTheta = Math.sin(theta);", - " const cosTheta = Math.cos(theta);", - " p.position.x = this.radius * cosTheta;", - " p.position.y = this.radius * sinTheta;", - " p.position.z = 0;", - " p.velocity.z = this.donutRadius * rand * Math.sin(phi);", - " p.velocity.x = this.donutRadius * rand * Math.cos(phi) * cosTheta;", - " p.velocity.y = this.donutRadius * rand * Math.cos(phi) * sinTheta;", - " p.position.add(p.velocity);", - " p.velocity.normalize().multiplyScalar(p.startSpeed);", - " }", - " toJSON() {", - " return {", - " type: 'donut',", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " donutRadius: this.donutRadius,", - " mode: this.mode,", - " spread: this.spread,", - " speed: this.speed.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new DonutEmitter({", - " radius: json.radius,", - " arc: json.arc,", - " thickness: json.thickness,", - " donutRadius: json.donutRadius,", - " mode: json.mode,", - " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", - " spread: json.spread,", - " });", - " }", - " clone() {", - " return new DonutEmitter({", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " donutRadius: this.donutRadius,", - " mode: this.mode,", - " speed: this.speed.clone(),", - " spread: this.spread,", - " });", - " }", - "}", - "", - "class PointEmitter {", - " constructor() {", - " this.type = 'point';", - " }", - " update(system, delta) { }", - " initialize(p) {", - " const u = Math.random();", - " const v = Math.random();", - " const theta = u * Math.PI * 2;", - " const phi = Math.acos(2.0 * v - 1.0);", - " const r = Math.cbrt(Math.random());", - " const sinTheta = Math.sin(theta);", - " const cosTheta = Math.cos(theta);", - " const sinPhi = Math.sin(phi);", - " const cosPhi = Math.cos(phi);", - " p.velocity.x = r * sinPhi * cosTheta;", - " p.velocity.y = r * sinPhi * sinTheta;", - " p.velocity.z = r * cosPhi;", - " p.velocity.multiplyScalar(p.startSpeed);", - " p.position.setScalar(0);", - " }", - " toJSON() {", - " return {", - " type: 'point',", - " };", - " }", - " static fromJSON(json) {", - " return new PointEmitter();", - " }", - " clone() {", - " return new PointEmitter();", - " }", - "}", - "", - "class SphereEmitter {", - " constructor(parameters = {}) {", - " var _a, _b, _c, _d, _e, _f;", - " this.type = 'sphere';", - " this.currentValue = 0;", - " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", - " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", - " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", - " this.mode = (_d = parameters.mode) !== null && _d !== void 0 ? _d : gdjs.__particleEmmiter3DExtension.EmitterMode.Random;", - " this.spread = (_e = parameters.spread) !== null && _e !== void 0 ? _e : 0;", - " this.speed = (_f = parameters.speed) !== null && _f !== void 0 ? _f : new ConstantValue(1);", - " }", - " update(system, delta) {", - " if (gdjs.__particleEmmiter3DExtension.EmitterMode.Random != this.mode) {", - " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", - " }", - " }", - " initialize(p) {", - " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", - " const v = Math.random();", - " const rand = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", - " const theta = u * this.arc;", - " const phi = Math.acos(2.0 * v - 1.0);", - " const sinTheta = Math.sin(theta);", - " const cosTheta = Math.cos(theta);", - " const sinPhi = Math.sin(phi);", - " const cosPhi = Math.cos(phi);", - " p.position.x = sinPhi * cosTheta;", - " p.position.y = sinPhi * sinTheta;", - " p.position.z = cosPhi;", - " p.velocity.copy(p.position).multiplyScalar(p.startSpeed);", - " p.position.multiplyScalar(this.radius * rand);", - " }", - " toJSON() {", - " return {", - " type: 'sphere',", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " mode: this.mode,", - " spread: this.spread,", - " speed: this.speed.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new SphereEmitter({", - " radius: json.radius,", - " arc: json.arc,", - " thickness: json.thickness,", - " mode: json.mode,", - " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", - " spread: json.spread,", - " });", - " }", - " clone() {", - " return new SphereEmitter({", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " mode: this.mode,", - " speed: this.speed.clone(),", - " spread: this.spread,", - " });", - " }", - "}", - "", - "class HemisphereEmitter {", - " constructor(parameters = {}) {", - " var _a, _b, _c, _d, _e, _f;", - " this.type = 'sphere';", - " this.currentValue = 0;", - " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", - " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", - " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", - " this.mode = (_d = parameters.mode) !== null && _d !== void 0 ? _d : gdjs.__particleEmmiter3DExtension.EmitterMode.Random;", - " this.spread = (_e = parameters.spread) !== null && _e !== void 0 ? _e : 0;", - " this.speed = (_f = parameters.speed) !== null && _f !== void 0 ? _f : new ConstantValue(1);", - " }", - " update(system, delta) {", - " if (gdjs.__particleEmmiter3DExtension.EmitterMode.Random != this.mode) {", - " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", - " }", - " }", - " initialize(p) {", - " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", - " const v = Math.random();", - " const rand = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", - " const theta = u * this.arc;", - " const phi = Math.acos(v);", - " const sinTheta = Math.sin(theta);", - " const cosTheta = Math.cos(theta);", - " const sinPhi = Math.sin(phi);", - " const cosPhi = Math.cos(phi);", - " p.position.x = sinPhi * cosTheta;", - " p.position.y = sinPhi * sinTheta;", - " p.position.z = cosPhi;", - " p.velocity.copy(p.position).multiplyScalar(p.startSpeed);", - " p.position.multiplyScalar(this.radius * rand);", - " }", - " toJSON() {", - " return {", - " type: 'hemisphere',", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " mode: this.mode,", - " spread: this.spread,", - " speed: this.speed.toJSON(),", - " };", - " }", - " static fromJSON(json) {", - " return new HemisphereEmitter({", - " radius: json.radius,", - " arc: json.arc,", - " thickness: json.thickness,", - " mode: json.mode,", - " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", - " spread: json.spread,", - " });", - " }", - " clone() {", - " return new HemisphereEmitter({", - " radius: this.radius,", - " arc: this.arc,", - " thickness: this.thickness,", - " mode: this.mode,", - " speed: this.speed.clone(),", - " spread: this.spread,", - " });", - " }", - "}", - "", - "class GridEmitter {", - " constructor(parameters = {}) {", - " var _a, _b, _c, _d;", - " this.type = 'grid';", - " this.width = (_a = parameters.width) !== null && _a !== void 0 ? _a : 1;", - " this.height = (_b = parameters.height) !== null && _b !== void 0 ? _b : 1;", - " this.column = (_c = parameters.column) !== null && _c !== void 0 ? _c : 10;", - " this.row = (_d = parameters.row) !== null && _d !== void 0 ? _d : 10;", - " }", - " initialize(p) {", - " const r = Math.floor(Math.random() * this.row);", - " const c = Math.floor(Math.random() * this.column);", - " p.position.x = (c * this.width) / this.column - this.width / 2;", - " p.position.y = (r * this.height) / this.row - this.height / 2;", - " p.position.z = 0;", - " p.velocity.set(0, 0, p.startSpeed);", - " }", - " toJSON() {", - " return {", - " type: 'grid',", - " width: this.width,", - " height: this.height,", - " column: this.column,", - " row: this.row,", - " };", - " }", - " static fromJSON(json) {", - " return new GridEmitter(json);", - " }", - " clone() {", - " return new GridEmitter({", - " width: this.width,", - " height: this.height,", - " column: this.column,", - " row: this.row,", - " });", - " }", - " update(system, delta) { }", - "}", - "", - "class MeshSurfaceEmitter {", - " get geometry() {", - " return this._geometry;", - " }", - " set geometry(geometry) {", - " this._geometry = geometry;", - " if (geometry === undefined) {", - " return;", - " }", - " if (typeof geometry === 'string') {", - " return;", - " }", - " const tri = new THREE.Triangle();", - " this._triangleIndexToArea.length = 0;", - " let area = 0;", - " if (!geometry.getIndex()) {", - " return;", - " }", - " const array = geometry.getIndex().array;", - " const triCount = array.length / 3;", - " this._triangleIndexToArea.push(0);", - " for (let i = 0; i < triCount; i++) {", - " tri.setFromAttributeAndIndices(geometry.getAttribute('position'), array[i * 3], array[i * 3 + 1], array[i * 3 + 2]);", - " area += tri.getArea();", - " this._triangleIndexToArea.push(area);", - " }", - " geometry.userData.triangleIndexToArea = this._triangleIndexToArea;", - " }", - " constructor(geometry) {", - " this.type = 'mesh_surface';", - " this._triangleIndexToArea = [];", - " this._tempA = new THREE.Vector3();", - " this._tempB = new THREE.Vector3();", - " this._tempC = new THREE.Vector3();", - " if (!geometry) {", - " return;", - " }", - " this.geometry = geometry;", - " }", - " initialize(p) {", - " const geometry = this._geometry;", - " if (!geometry || geometry.getIndex() === null) {", - " p.position.set(0, 0, 0);", - " p.velocity.set(0, 0, 1).multiplyScalar(p.startSpeed);", - " return;", - " }", - " const triCount = this._triangleIndexToArea.length - 1;", - " let left = 0, right = triCount;", - " const target = Math.random() * this._triangleIndexToArea[triCount];", - " while (left + 1 < right) {", - " const mid = Math.floor((left + right) / 2);", - " if (target < this._triangleIndexToArea[mid]) {", - " right = mid;", - " }", - " else {", - " left = mid;", - " }", - " }", - " let u1 = Math.random();", - " let u2 = Math.random();", - " if (u1 + u2 > 1) {", - " u1 = 1 - u1;", - " u2 = 1 - u2;", - " }", - " const index1 = geometry.getIndex().array[left * 3];", - " const index2 = geometry.getIndex().array[left * 3 + 1];", - " const index3 = geometry.getIndex().array[left * 3 + 2];", - " const positionBuffer = geometry.getAttribute('position');", - " this._tempA.fromBufferAttribute(positionBuffer, index1);", - " this._tempB.fromBufferAttribute(positionBuffer, index2);", - " this._tempC.fromBufferAttribute(positionBuffer, index3);", - " this._tempB.sub(this._tempA);", - " this._tempC.sub(this._tempA);", - " this._tempA.addScaledVector(this._tempB, u1).addScaledVector(this._tempC, u2);", - " p.position.copy(this._tempA);", - " this._tempA.copy(this._tempB).cross(this._tempC).normalize();", - " p.velocity.copy(this._tempA).normalize().multiplyScalar(p.startSpeed);", - " }", - " toJSON() {", - " return {", - " type: 'mesh_surface',", - " mesh: this._geometry ? this._geometry.uuid : '',", - " };", - " }", - " static fromJSON(json, meta) {", - " return new MeshSurfaceEmitter(meta.geometries[json.geometry]);", - " }", - " clone() {", - " return new MeshSurfaceEmitter(this._geometry);", - " }", - " update(system, delta) { }", - "}", - "", - "const EmitterShapes = {", - " circle: {", - " type: 'circle',", - " params: [", - " ['radius', 'number'],", - " ['arc', 'radian'],", - " ['thickness', 'number'],", - " ['mode', 'emitterMode'],", - " ['spread', 'number'],", - " ['speed', 'valueFunc'],", - " ],", - " constructor: CircleEmitter,", - " loadJSON: CircleEmitter.fromJSON,", - " },", - " cone: {", - " type: 'cone',", - " params: [", - " ['radius', 'number'],", - " ['arc', 'radian'],", - " ['thickness', 'number'],", - " ['angle', 'radian'],", - " ['mode', 'emitterMode'],", - " ['spread', 'number'],", - " ['speed', 'valueFunc'],", - " ],", - " constructor: ConeEmitter,", - " loadJSON: ConeEmitter.fromJSON,", - " },", - " donut: {", - " type: 'donut',", - " params: [", - " ['radius', 'number'],", - " ['arc', 'radian'],", - " ['thickness', 'number'],", - " ['donutRadius', 'number'],", - " ['mode', 'emitterMode'],", - " ['spread', 'number'],", - " ['speed', 'valueFunc'],", - " ],", - " constructor: DonutEmitter,", - " loadJSON: DonutEmitter.fromJSON,", - " },", - " point: { type: 'point', params: [], constructor: PointEmitter, loadJSON: PointEmitter.fromJSON },", - " sphere: {", - " type: 'sphere',", - " params: [", - " ['radius', 'number'],", - " ['arc', 'radian'],", - " ['thickness', 'number'],", - " ['angle', 'radian'],", - " ['mode', 'emitterMode'],", - " ['spread', 'number'],", - " ['speed', 'valueFunc'],", - " ],", - " constructor: SphereEmitter,", - " loadJSON: SphereEmitter.fromJSON,", - " },", - " hemisphere: {", - " type: 'hemisphere',", - " params: [", - " ['radius', 'number'],", - " ['arc', 'radian'],", - " ['thickness', 'number'],", - " ['angle', 'radian'],", - " ['mode', 'emitterMode'],", - " ['spread', 'number'],", - " ['speed', 'valueFunc'],", - " ],", - " constructor: HemisphereEmitter,", - " loadJSON: HemisphereEmitter.fromJSON,", - " },", - " grid: {", - " type: 'grid',", - " params: [", - " ['width', 'number'],", - " ['height', 'number'],", - " ['rows', 'number'],", - " ['column', 'number'],", - " ],", - " constructor: GridEmitter,", - " loadJSON: GridEmitter.fromJSON,", - " },", - " mesh_surface: {", - " type: 'mesh_surface',", - " params: [['geometry', 'geometry']],", - " constructor: MeshSurfaceEmitter,", - " loadJSON: MeshSurfaceEmitter.fromJSON,", - " },", - "};", - "function EmitterFromJSON(json, meta) {", - " return EmitterShapes[json.type].loadJSON(json, meta);", - "}", - "", - "gdjs.__particleEmmiter3DExtension.RenderMode = void 0;", - "(function (RenderMode) {", - " RenderMode[RenderMode[\"BillBoard\"] = 0] = \"BillBoard\";", - " RenderMode[RenderMode[\"StretchedBillBoard\"] = 1] = \"StretchedBillBoard\";", - " RenderMode[RenderMode[\"Mesh\"] = 2] = \"Mesh\";", - " RenderMode[RenderMode[\"Trail\"] = 3] = \"Trail\";", - " RenderMode[RenderMode[\"HorizontalBillBoard\"] = 4] = \"HorizontalBillBoard\";", - " RenderMode[RenderMode[\"VerticalBillBoard\"] = 5] = \"VerticalBillBoard\";", - "})(gdjs.__particleEmmiter3DExtension.RenderMode || (gdjs.__particleEmmiter3DExtension.RenderMode = {}));", - "class VFXBatch extends THREE.Mesh {", - " constructor(settings) {", - " super();", - " this.type = 'VFXBatch';", - " this.maxParticles = 1000;", - " this.systems = new Set();", - " const layers = new THREE.Layers();", - " layers.mask = settings.layers.mask;", - " const newMat = settings.material.clone();", - " newMat.defines = {};", - " Object.assign(newMat.defines, settings.material.defines);", - " this.settings = {", - " instancingGeometry: settings.instancingGeometry,", - " renderMode: settings.renderMode,", - " renderOrder: settings.renderOrder,", - " material: newMat,", - " uTileCount: settings.uTileCount,", - " vTileCount: settings.vTileCount,", - " layers: layers,", - " };", - " this.frustumCulled = false;", - " this.renderOrder = this.settings.renderOrder;", - " }", - " addSystem(system) {", - " this.systems.add(system);", - " }", - " removeSystem(system) {", - " this.systems.delete(system);", - " }", - "}", - "", - "const UP = new THREE.Vector3(0, 0, 1);", - "const tempQ$1 = new THREE.Quaternion();", - "const tempV$1 = new THREE.Vector3();", - "const tempV2$1 = new THREE.Vector3();", - "new THREE.Vector3();", - "const PREWARM_FPS$1 = 60;", - "const DEFAULT_GEOMETRY$1 = new THREE.PlaneGeometry(1, 1, 1, 1);", - "class ParticleSystem {", - " set time(time) {", - " this.emissionState.time = time;", - " }", - " get time() {", - " return this.emissionState.time;", - " }", - " get layers() {", - " return this.rendererSettings.layers;", - " }", - " get texture() {", - " return this.rendererSettings.material.map;", - " }", - " set texture(texture) {", - " this.rendererSettings.material.map = texture;", - " this.neededToUpdateRender = true;", - " }", - " get material() {", - " return this.rendererSettings.material;", - " }", - " set material(material) {", - " this.rendererSettings.material = material;", - " this.neededToUpdateRender = true;", - " }", - " get uTileCount() {", - " return this.rendererSettings.uTileCount;", - " }", - " set uTileCount(u) {", - " this.rendererSettings.uTileCount = u;", - " this.neededToUpdateRender = true;", - " }", - " get vTileCount() {", - " return this.rendererSettings.vTileCount;", - " }", - " set vTileCount(v) {", - " this.rendererSettings.vTileCount = v;", - " this.neededToUpdateRender = true;", - " }", - " get instancingGeometry() {", - " return this.rendererSettings.instancingGeometry;", - " }", - " set instancingGeometry(geometry) {", - " this.restart();", - " this.particles.length = 0;", - " this.rendererSettings.instancingGeometry = geometry;", - " this.neededToUpdateRender = true;", - " }", - " get renderMode() {", - " return this.rendererSettings.renderMode;", - " }", - " set renderMode(renderMode) {", - " if ((this.rendererSettings.renderMode != gdjs.__particleEmmiter3DExtension.RenderMode.Trail && renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) ||", - " (this.rendererSettings.renderMode == gdjs.__particleEmmiter3DExtension.RenderMode.Trail && renderMode !== gdjs.__particleEmmiter3DExtension.RenderMode.Trail)) {", - " this.restart();", - " this.particles.length = 0;", - " }", - " if (this.rendererSettings.renderMode !== renderMode) {", - " switch (renderMode) {", - " case gdjs.__particleEmmiter3DExtension.RenderMode.Trail:", - " this.rendererEmitterSettings = {", - " startLength: new ConstantValue(30),", - " followLocalOrigin: false,", - " };", - " break;", - " case gdjs.__particleEmmiter3DExtension.RenderMode.Mesh:", - " this.rendererEmitterSettings = {", - " geometry: new THREE.PlaneGeometry(1, 1),", - " };", - " this.startRotation = new AxisAngleGenerator(new THREE.Vector3(0, 1, 0), new ConstantValue(0));", - " break;", - " case gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard:", - " this.rendererEmitterSettings = { speedFactor: 0, lengthFactor: 2 };", - " if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " this.startRotation = new ConstantValue(0);", - " }", - " break;", - " case gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard:", - " case gdjs.__particleEmmiter3DExtension.RenderMode.VerticalBillBoard:", - " case gdjs.__particleEmmiter3DExtension.RenderMode.HorizontalBillBoard:", - " this.rendererEmitterSettings = {};", - " if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " this.startRotation = new ConstantValue(0);", - " }", - " break;", - " }", - " }", - " this.rendererSettings.renderMode = renderMode;", - " this.neededToUpdateRender = true;", - " }", - " get renderOrder() {", - " return this.rendererSettings.renderOrder;", - " }", - " set renderOrder(renderOrder) {", - " this.rendererSettings.renderOrder = renderOrder;", - " this.neededToUpdateRender = true;", - " }", - " get blending() {", - " return this.rendererSettings.material.blending;", - " }", - " set blending(blending) {", - " this.rendererSettings.material.blending = blending;", - " this.neededToUpdateRender = true;", - " }", - " constructor(parameters) {", - " var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;", - " this.temp = new THREE.Vector3();", - " this.travelDistance = 0;", - " this.normalMatrix = new THREE.Matrix3();", - " this.firstTimeUpdate = true;", - " this.autoDestroy = parameters.autoDestroy === undefined ? false : parameters.autoDestroy;", - " this.duration = (_a = parameters.duration) !== null && _a !== void 0 ? _a : 1;", - " this.looping = parameters.looping === undefined ? true : parameters.looping;", - " this.prewarm = parameters.prewarm === undefined ? false : parameters.prewarm;", - " this.startLife = (_b = parameters.startLife) !== null && _b !== void 0 ? _b : new ConstantValue(5);", - " this.startSpeed = (_c = parameters.startSpeed) !== null && _c !== void 0 ? _c : new ConstantValue(0);", - " this.startRotation = (_d = parameters.startRotation) !== null && _d !== void 0 ? _d : new ConstantValue(0);", - " this.startSize = (_e = parameters.startSize) !== null && _e !== void 0 ? _e : new ConstantValue(1);", - " this.startColor = (_f = parameters.startColor) !== null && _f !== void 0 ? _f : new ConstantColor(new THREE.Vector4(1, 1, 1, 1));", - " this.emissionOverTime = (_g = parameters.emissionOverTime) !== null && _g !== void 0 ? _g : new ConstantValue(10);", - " this.emissionOverDistance = (_h = parameters.emissionOverDistance) !== null && _h !== void 0 ? _h : new ConstantValue(0);", - " this.emissionBursts = (_j = parameters.emissionBursts) !== null && _j !== void 0 ? _j : [];", - " this.onlyUsedByOther = (_k = parameters.onlyUsedByOther) !== null && _k !== void 0 ? _k : false;", - " this.emitterShape = (_l = parameters.shape) !== null && _l !== void 0 ? _l : new SphereEmitter();", - " this.behaviors = (_m = parameters.behaviors) !== null && _m !== void 0 ? _m : new Array();", - " this.worldSpace = (_o = parameters.worldSpace) !== null && _o !== void 0 ? _o : false;", - " this.rendererEmitterSettings = (_p = parameters.rendererEmitterSettings) !== null && _p !== void 0 ? _p : {};", - " if (parameters.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard) {", - " const stretchedBillboardSettings = this.rendererEmitterSettings;", - " if (parameters.speedFactor !== undefined) {", - " stretchedBillboardSettings.speedFactor = parameters.speedFactor;", - " }", - " stretchedBillboardSettings.speedFactor = (_q = stretchedBillboardSettings.speedFactor) !== null && _q !== void 0 ? _q : 0;", - " stretchedBillboardSettings.lengthFactor = (_r = stretchedBillboardSettings.lengthFactor) !== null && _r !== void 0 ? _r : 0;", - " }", - " this.rendererSettings = {", - " instancingGeometry: (_s = parameters.instancingGeometry) !== null && _s !== void 0 ? _s : DEFAULT_GEOMETRY$1,", - " renderMode: (_t = parameters.renderMode) !== null && _t !== void 0 ? _t : gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard,", - " renderOrder: (_u = parameters.renderOrder) !== null && _u !== void 0 ? _u : 0,", - " material: parameters.material,", - " uTileCount: (_v = parameters.uTileCount) !== null && _v !== void 0 ? _v : 1,", - " vTileCount: (_w = parameters.vTileCount) !== null && _w !== void 0 ? _w : 1,", - " layers: (_x = parameters.layers) !== null && _x !== void 0 ? _x : new THREE.Layers(),", - " };", - " this.neededToUpdateRender = true;", - " this.particles = new Array();", - " this.startTileIndex = parameters.startTileIndex || new ConstantValue(0);", - " this.emitter = new ParticleEmitter(this);", - " this.paused = false;", - " this.particleNum = 0;", - " this.emissionState = {", - " burstIndex: 0,", - " burstWaveIndex: 0,", - " time: 0,", - " waitEmiting: 0,", - " travelDistance: 0,", - " };", - " this.emitEnded = false;", - " this.markForDestroy = false;", - " this.prewarmed = false;", - " }", - " pause() {", - " this.paused = true;", - " }", - " play() {", - " this.paused = false;", - " }", - " spawn(count, emissionState, matrix) {", - " tempQ$1.setFromRotationMatrix(matrix);", - " const translation = tempV$1;", - " const quaternion = tempQ$1;", - " const scale = tempV2$1;", - " matrix.decompose(translation, quaternion, scale);", - " for (let i = 0; i < count; i++) {", - " this.particleNum++;", - " while (this.particles.length < this.particleNum) {", - " if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) {", - " this.particles.push(new TrailParticle());", - " }", - " else {", - " this.particles.push(new SpriteParticle());", - " }", - " }", - " const particle = this.particles[this.particleNum - 1];", - " particle.speedModifier = 1;", - " this.startColor.genColor(particle.startColor, this.emissionState.time, {});", - " particle.color.copy(particle.startColor);", - " particle.startSpeed = this.startSpeed.genValue(emissionState.time / this.duration);", - " particle.life = this.startLife.genValue(emissionState.time / this.duration);", - " particle.age = 0;", - " particle.startSize = this.startSize.genValue(emissionState.time / this.duration);", - " particle.uvTile = Math.floor(this.startTileIndex.genValue() + 0.001);", - " particle.size = particle.startSize;", - " if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh ||", - " this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard ||", - " this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.VerticalBillBoard ||", - " this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.HorizontalBillBoard ||", - " this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard) {", - " const sprite = particle;", - " if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " if (!(sprite.rotation instanceof THREE.Quaternion)) {", - " sprite.rotation = new THREE.Quaternion();", - " }", - " if (this.startRotation.type === 'rotation') {", - " this.startRotation.genValue(sprite.rotation, emissionState.time / this.duration);", - " }", - " else {", - " sprite.rotation.setFromAxisAngle(UP, this.startRotation.genValue((emissionState.time / this.duration)));", - " }", - " }", - " else {", - " if (this.startRotation.type === 'rotation') {", - " sprite.rotation = 0;", - " }", - " else {", - " sprite.rotation = this.startRotation.genValue(emissionState.time / this.duration);", - " }", - " }", - " }", - " else if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) {", - " const trail = particle;", - " trail.length = this.rendererEmitterSettings.startLength.genValue(emissionState.time / this.duration);", - " }", - " this.emitterShape.initialize(particle);", - " if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail &&", - " this.rendererEmitterSettings.followLocalOrigin) {", - " const trail = particle;", - " trail.localPosition = new THREE.Vector3().copy(trail.position);", - " }", - " if (this.worldSpace) {", - " particle.position.applyMatrix4(matrix);", - " particle.startSize =", - " (particle.startSize * (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z))) / 3;", - " particle.size = particle.startSize;", - " particle.velocity.multiply(scale).applyMatrix3(this.normalMatrix);", - " if (particle.rotation && particle.rotation instanceof THREE.Quaternion) {", - " particle.rotation.multiplyQuaternions(tempQ$1, particle.rotation);", - " }", - " }", - " else {", - " if (this.onlyUsedByOther) {", - " particle.parentMatrix = matrix;", - " }", - " }", - " for (let j = 0; j < this.behaviors.length; j++) {", - " this.behaviors[j].initialize(particle);", - " }", - " }", - " }", - " endEmit() {", - " this.emitEnded = true;", - " if (this.autoDestroy) {", - " this.markForDestroy = true;", - " }", - " }", - " dispose() {", - " if (this._renderer)", - " this._renderer.deleteSystem(this);", - " this.emitter.dispose();", - " if (this.emitter.parent)", - " this.emitter.parent.remove(this.emitter);", - " }", - " restart() {", - " this.paused = false;", - " this.particleNum = 0;", - " this.emissionState.burstIndex = 0;", - " this.emissionState.burstWaveIndex = 0;", - " this.emissionState.time = 0;", - " this.emissionState.waitEmiting = 0;", - " this.behaviors.forEach((behavior) => {", - " behavior.reset();", - " });", - " this.emitEnded = false;", - " this.markForDestroy = false;", - " this.prewarmed = false;", - " }", - " update(delta) {", - " if (this.paused)", - " return;", - " let currentParent = this.emitter;", - " while (currentParent.parent) {", - " currentParent = currentParent.parent;", - " }", - " if (currentParent.type !== 'Scene') {", - " this.dispose();", - " return;", - " }", - " if (this.firstTimeUpdate) {", - " this.firstTimeUpdate = false;", - " this.emitter.updateWorldMatrix(true, false);", - " }", - " if (this.emitEnded && this.particleNum === 0) {", - " if (this.markForDestroy && this.emitter.parent)", - " this.dispose();", - " return;", - " }", - " if (this.looping && this.prewarm && !this.prewarmed) {", - " this.prewarmed = true;", - " for (let i = 0; i < this.duration * PREWARM_FPS$1; i++) {", - " this.update(1.0 / PREWARM_FPS$1);", - " }", - " }", - " if (delta > 0.1) {", - " delta = 0.1;", - " }", - " if (this.neededToUpdateRender) {", - " if (this._renderer)", - " this._renderer.updateSystem(this);", - " this.neededToUpdateRender = false;", - " }", - " if (!this.onlyUsedByOther) {", - " this.emit(delta, this.emissionState, this.emitter.matrixWorld);", - " }", - " this.emitterShape.update(this, delta);", - " for (let j = 0; j < this.behaviors.length; j++) {", - " for (let i = 0; i < this.particleNum; i++) {", - " if (!this.particles[i].died) {", - " this.behaviors[j].update(this.particles[i], delta);", - " }", - " }", - " this.behaviors[j].frameUpdate(delta);", - " }", - " for (let i = 0; i < this.particleNum; i++) {", - " if (this.rendererEmitterSettings.followLocalOrigin &&", - " this.particles[i].localPosition) {", - " this.particles[i].position.copy(this.particles[i].localPosition);", - " if (this.particles[i].parentMatrix) {", - " this.particles[i].position.applyMatrix4(this.particles[i].parentMatrix);", - " }", - " else {", - " this.particles[i].position.applyMatrix4(this.emitter.matrixWorld);", - " }", - " }", - " else {", - " this.particles[i].position.addScaledVector(this.particles[i].velocity, delta * this.particles[i].speedModifier);", - " }", - " this.particles[i].age += delta;", - " }", - " if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) {", - " for (let i = 0; i < this.particleNum; i++) {", - " const particle = this.particles[i];", - " particle.update();", - " }", - " }", - " for (let i = 0; i < this.particleNum; i++) {", - " const particle = this.particles[i];", - " if (particle.died && (!(particle instanceof TrailParticle) || particle.previous.length === 0)) {", - " this.particles[i] = this.particles[this.particleNum - 1];", - " this.particles[this.particleNum - 1] = particle;", - " this.particleNum--;", - " i--;", - " }", - " }", - " }", - " emit(delta, emissionState, emitterMatrix) {", - " if (emissionState.time > this.duration) {", - " if (this.looping) {", - " emissionState.time -= this.duration;", - " emissionState.burstIndex = 0;", - " this.behaviors.forEach((behavior) => {", - " behavior.reset();", - " });", - " }", - " else {", - " if (!this.emitEnded && !this.onlyUsedByOther) {", - " this.endEmit();", - " }", - " }", - " }", - " this.normalMatrix.getNormalMatrix(emitterMatrix);", - " const totalSpawn = Math.ceil(emissionState.waitEmiting);", - " this.spawn(totalSpawn, emissionState, emitterMatrix);", - " emissionState.waitEmiting -= totalSpawn;", - " while (emissionState.burstIndex < this.emissionBursts.length &&", - " this.emissionBursts[emissionState.burstIndex].time <= emissionState.time) {", - " if (Math.random() < this.emissionBursts[emissionState.burstIndex].probability) {", - " const count = this.emissionBursts[emissionState.burstIndex].count.genValue(this.time);", - " this.spawn(count, emissionState, emitterMatrix);", - " }", - " emissionState.burstIndex++;", - " }", - " if (!this.emitEnded) {", - " emissionState.waitEmiting += delta * this.emissionOverTime.genValue(emissionState.time / this.duration);", - " if (emissionState.previousWorldPos != undefined) {", - " this.temp.set(emitterMatrix.elements[12], emitterMatrix.elements[13], emitterMatrix.elements[14]);", - " emissionState.travelDistance += emissionState.previousWorldPos.distanceTo(this.temp);", - " const emitPerMeter = this.emissionOverDistance.genValue(emissionState.time / this.duration);", - " if (emissionState.travelDistance * emitPerMeter > 0) {", - " const count = Math.floor(emissionState.travelDistance * emitPerMeter);", - " emissionState.travelDistance -= count / emitPerMeter;", - " emissionState.waitEmiting += count;", - " }", - " }", - " }", - " if (emissionState.previousWorldPos === undefined)", - " emissionState.previousWorldPos = new THREE.Vector3();", - " emissionState.previousWorldPos.set(emitterMatrix.elements[12], emitterMatrix.elements[13], emitterMatrix.elements[14]);", - " emissionState.time += delta;", - " }", - " toJSON(meta, options = {}) {", - " const isRootObject = meta === undefined || typeof meta === 'string';", - " if (isRootObject) {", - " meta = {", - " geometries: {},", - " materials: {},", - " textures: {},", - " images: {},", - " shapes: {},", - " skeletons: {},", - " animations: {},", - " nodes: {},", - " };", - " }", - " meta.materials[this.rendererSettings.material.uuid] = this.rendererSettings.material.toJSON(meta);", - " if (options.useUrlForImage) {", - " if (this.texture.source !== undefined) {", - " const image = this.texture.source;", - " meta.images[image.uuid] = {", - " uuid: image.uuid,", - " url: this.texture.image.url,", - " };", - " }", - " }", - " let rendererSettingsJSON;", - " if (this.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) {", - " rendererSettingsJSON = {", - " startLength: this.rendererEmitterSettings.startLength.toJSON(),", - " followLocalOrigin: this.rendererEmitterSettings.followLocalOrigin,", - " };", - " }", - " else if (this.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " rendererSettingsJSON = {};", - " }", - " else if (this.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard) {", - " rendererSettingsJSON = {", - " speedFactor: this.rendererEmitterSettings.speedFactor,", - " lengthFactor: this.rendererEmitterSettings.lengthFactor,", - " };", - " }", - " else {", - " rendererSettingsJSON = {};", - " }", - " const geometry = this.rendererSettings.instancingGeometry;", - " if (meta.geometries && !meta.geometries[geometry.uuid]) {", - " meta.geometries[geometry.uuid] = geometry.toJSON();", - " }", - " return {", - " version: '2.0',", - " autoDestroy: this.autoDestroy,", - " looping: this.looping,", - " prewarm: this.prewarm,", - " duration: this.duration,", - " shape: this.emitterShape.toJSON(),", - " startLife: this.startLife.toJSON(),", - " startSpeed: this.startSpeed.toJSON(),", - " startRotation: this.startRotation.toJSON(),", - " startSize: this.startSize.toJSON(),", - " startColor: this.startColor.toJSON(),", - " emissionOverTime: this.emissionOverTime.toJSON(),", - " emissionOverDistance: this.emissionOverDistance.toJSON(),", - " emissionBursts: this.emissionBursts.map((burst) => ({", - " time: burst.time,", - " count: burst.count.toJSON(),", - " probability: burst.probability,", - " interval: burst.interval,", - " cycle: burst.cycle,", - " })),", - " onlyUsedByOther: this.onlyUsedByOther,", - " instancingGeometry: this.rendererSettings.instancingGeometry.uuid,", - " renderOrder: this.renderOrder,", - " renderMode: this.renderMode,", - " rendererEmitterSettings: rendererSettingsJSON,", - " material: this.rendererSettings.material.uuid,", - " layers: this.layers.mask,", - " startTileIndex: this.startTileIndex.toJSON(),", - " uTileCount: this.uTileCount,", - " vTileCount: this.vTileCount,", - " behaviors: this.behaviors.map((behavior) => behavior.toJSON()),", - " worldSpace: this.worldSpace,", - " };", - " }", - " static fromJSON(json, meta, dependencies) {", - " var _a, _b;", - " const shape = EmitterFromJSON(json.shape, meta);", - " let rendererEmitterSettings;", - " if (json.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) {", - " let trailSettings = json.rendererEmitterSettings;", - " rendererEmitterSettings = {", - " startLength: trailSettings.startLength != undefined", - " ? ValueGeneratorFromJSON(trailSettings.startLength)", - " : new ConstantValue(30),", - " followLocalOrigin: trailSettings.followLocalOrigin,", - " };", - " }", - " else if (json.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " rendererEmitterSettings = {};", - " }", - " else if (json.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard) {", - " rendererEmitterSettings = json.rendererEmitterSettings;", - " if (json.speedFactor != undefined) {", - " rendererEmitterSettings.speedFactor = json.speedFactor;", - " }", - " }", - " else {", - " rendererEmitterSettings = {};", - " }", - " const layers = new THREE.Layers();", - " if (json.layers) {", - " layers.mask = json.layers;", - " }", - " const ps = new ParticleSystem({", - " autoDestroy: json.autoDestroy,", - " looping: json.looping,", - " prewarm: json.prewarm,", - " duration: json.duration,", - " shape: shape,", - " startLife: ValueGeneratorFromJSON(json.startLife),", - " startSpeed: ValueGeneratorFromJSON(json.startSpeed),", - " startRotation: GeneratorFromJSON(json.startRotation),", - " startSize: ValueGeneratorFromJSON(json.startSize),", - " startColor: ColorGeneratorFromJSON(json.startColor),", - " emissionOverTime: ValueGeneratorFromJSON(json.emissionOverTime),", - " emissionOverDistance: ValueGeneratorFromJSON(json.emissionOverDistance),", - " emissionBursts: (_a = json.emissionBursts) === null || _a === void 0 ? void 0 : _a.map((burst) => ({", - " time: burst.time,", - " count: typeof burst.count === 'number'", - " ? new ConstantValue(burst.count)", - " : ValueGeneratorFromJSON(burst.count),", - " probability: burst.probability,", - " interval: burst.interval,", - " cycle: burst.cycle,", - " })),", - " onlyUsedByOther: json.onlyUsedByOther,", - " instancingGeometry: meta.geometries[json.instancingGeometry],", - " renderMode: json.renderMode,", - " rendererEmitterSettings: rendererEmitterSettings,", - " renderOrder: json.renderOrder,", - " layers: layers,", - " material: json.material", - " ? meta.materials[json.material]", - " : json.texture", - " ? new THREE.MeshBasicMaterial({", - " map: meta.textures[json.texture],", - " transparent: (_b = json.transparent) !== null && _b !== void 0 ? _b : true,", - " blending: json.blending,", - " side: THREE.DoubleSide,", - " })", - " : new THREE.MeshBasicMaterial({", - " color: 0xffffff,", - " transparent: true,", - " blending: THREE.AdditiveBlending,", - " side: THREE.DoubleSide,", - " }),", - " startTileIndex: typeof json.startTileIndex === 'number'", - " ? new ConstantValue(json.startTileIndex)", - " : ValueGeneratorFromJSON(json.startTileIndex),", - " uTileCount: json.uTileCount,", - " vTileCount: json.vTileCount,", - " behaviors: [],", - " worldSpace: json.worldSpace,", - " });", - " ps.behaviors = json.behaviors.map((behaviorJson) => {", - " const behavior = BehaviorFromJSON(behaviorJson, ps);", - " if (behavior.type === 'EmitSubParticleSystem') {", - " dependencies[behaviorJson.subParticleSystem] = behavior;", - " }", - " return behavior;", - " });", - " return ps;", - " }", - " addBehavior(behavior) {", - " this.behaviors.push(behavior);", - " }", - " getRendererSettings() {", - " return this.rendererSettings;", - " }", - " clone() {", - " const newEmissionBursts = [];", - " for (const emissionBurst of this.emissionBursts) {", - " const newEmissionBurst = {};", - " Object.assign(newEmissionBurst, emissionBurst);", - " newEmissionBursts.push(newEmissionBurst);", - " }", - " const newBehaviors = [];", - " for (const behavior of this.behaviors) {", - " newBehaviors.push(behavior.clone());", - " }", - " let rendererEmitterSettings;", - " if (this.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) {", - " rendererEmitterSettings = {", - " startLength: this.rendererEmitterSettings.startLength.clone(),", - " followLocalOrigin: this.rendererEmitterSettings.followLocalOrigin,", - " };", - " }", - " else {", - " rendererEmitterSettings = {};", - " }", - " const layers = new THREE.Layers();", - " layers.mask = this.layers.mask;", - " return new ParticleSystem({", - " autoDestroy: this.autoDestroy,", - " looping: this.looping,", - " duration: this.duration,", - " shape: this.emitterShape.clone(),", - " startLife: this.startLife.clone(),", - " startSpeed: this.startSpeed.clone(),", - " startRotation: this.startRotation.clone(),", - " startSize: this.startSize.clone(),", - " startColor: this.startColor.clone(),", - " emissionOverTime: this.emissionOverTime.clone(),", - " emissionOverDistance: this.emissionOverDistance.clone(),", - " emissionBursts: newEmissionBursts,", - " onlyUsedByOther: this.onlyUsedByOther,", - " instancingGeometry: this.rendererSettings.instancingGeometry,", - " renderMode: this.renderMode,", - " renderOrder: this.renderOrder,", - " rendererEmitterSettings: rendererEmitterSettings,", - " material: this.rendererSettings.material,", - " startTileIndex: this.startTileIndex,", - " uTileCount: this.uTileCount,", - " vTileCount: this.vTileCount,", - " behaviors: newBehaviors,", - " worldSpace: this.worldSpace,", - " layers: layers,", - " });", - " }", - "}", - "", - "var particle_frag = `", - "", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "", - "void main() {", - "", - " #include ", - " ", - " vec3 outgoingLight = vec3( 0.0 );", - " vec4 diffuseColor = vColor;", - " ", - " #include ", - " ", - " #ifdef USE_MAP", - " diffuseColor *= texture2D( map, vMapUv);", - " #endif", - " ", - " #include ", - "", - " outgoingLight = diffuseColor.rgb;", - " ", - " #ifdef USE_COLOR_AS_ALPHA", - " gl_FragColor = vec4( outgoingLight, diffuseColor.r );", - " #else", - " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", - " #endif", - " ", - " ", - " #include ", - "", - "}", - "`;", - "", - "var particle_physics_frag = `", - "#define STANDARD", - "#ifdef PHYSICAL", - "#define IOR", - "#define SPECULAR", - "#endif", - "uniform vec3 diffuse;", - "uniform vec3 emissive;", - "uniform float roughness;", - "uniform float metalness;", - "uniform float opacity;", - "#ifdef IOR", - "uniform float ior;", - "#endif", - "#ifdef SPECULAR", - "uniform float specularIntensity;", - "uniform vec3 specularColor;", - "#ifdef USE_SPECULARINTENSITYMAP", - "uniform sampler2D specularIntensityMap;", - "#endif", - "#ifdef USE_SPECULARCOLORMAP", - "uniform sampler2D specularColorMap;", - "#endif", - "#endif", - "#ifdef USE_CLEARCOAT", - "uniform float clearcoat;", - "uniform float clearcoatRoughness;", - "#endif", - "#ifdef USE_IRIDESCENCE", - "uniform float iridescence;", - "uniform float iridescenceIOR;", - "uniform float iridescenceThicknessMinimum;", - "uniform float iridescenceThicknessMaximum;", - "#endif", - "#ifdef USE_SHEEN", - "uniform vec3 sheenColor;", - "uniform float sheenRoughness;", - "#ifdef USE_SHEENCOLORMAP", - "uniform sampler2D sheenColorMap;", - "#endif", - "#ifdef USE_SHEENROUGHNESSMAP", - "uniform sampler2D sheenRoughnessMap;", - "#endif", - "#endif", - "", - "varying vec3 vViewPosition;", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "", - "void main() {", - " #include ", - " vec4 diffuseColor = vec4( diffuse, opacity );", - " ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );", - " vec3 totalEmissiveRadiance = emissive;", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - " // accumulation", - " #include ", - " #include ", - " #include ", - " #include ", - " // modulation", - " #include ", - " vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;", - " vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;", - " #include ", - " vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;", - " #ifdef USE_SHEEN", - " // Sheen energy compensation approximation calculation can be found at the end of", - " // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing", - " float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );", - " outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;", - " #endif", - " #ifdef USE_CLEARCOAT", - " float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );", - " vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );", - " outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;", - " #endif", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - " #include ", - "}`;", - "", - "var uv_vertex_tile = `", - "", - " #ifdef UV_TILE", - " float col = mod(uvTile, tileCount.x);", - " float row = (tileCount.y - floor(uvTile / tileCount.x) - 1.0);", - " ", - " mat3 tileTransform = mat3(", - " 1.0 / tileCount.x, 0.0, 0.0,", - " 0.0, 1.0 / tileCount.y, 0.0, ", - " col / tileCount.x, row / tileCount.y, 1.0);", - " #else", - " mat3 tileTransform = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);", - " #endif", - "", - "#if defined( USE_UV ) || defined( USE_ANISOTROPY )", - "", - "vUv = (tileTransform *vec3( uv, 1 )).xy;", - "", - "#endif", - "#ifdef USE_MAP", - "", - "vMapUv = ( tileTransform * (mapTransform * vec3( MAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_ALPHAMAP", - "", - "vAlphaMapUv = ( tileTransform * (alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_LIGHTMAP", - "", - "vLightMapUv = ( tileTransform * (lightMapTransform * vec3( LIGHTMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_AOMAP", - "", - "vAoMapUv = ( tileTransform * (aoMapTransform * vec3( AOMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_BUMPMAP", - "", - "vBumpMapUv = ( tileTransform * (bumpMapTransform * vec3( BUMPMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_NORMALMAP", - "", - "vNormalMapUv = ( tileTransform * (normalMapTransform * vec3( NORMALMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_DISPLACEMENTMAP", - "", - "vDisplacementMapUv = ( tileTransform * (displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_EMISSIVEMAP", - "", - "vEmissiveMapUv = ( tileTransform * (emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_METALNESSMAP", - "", - "vMetalnessMapUv = ( tileTransform * (metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_ROUGHNESSMAP", - "", - "vRoughnessMapUv = ( tileTransform * (roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_ANISOTROPYMAP", - "", - "vAnisotropyMapUv = ( tileTransform * (anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_CLEARCOATMAP", - "", - "vClearcoatMapUv = ( tileTransform * (clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_CLEARCOAT_NORMALMAP", - "", - "vClearcoatNormalMapUv = ( tileTransform * (clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_CLEARCOAT_ROUGHNESSMAP", - "", - "vClearcoatRoughnessMapUv = ( tileTransform * (clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_IRIDESCENCEMAP", - "", - "vIridescenceMapUv = ( tileTransform * (iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_IRIDESCENCE_THICKNESSMAP", - "", - "vIridescenceThicknessMapUv = ( tileTransform * (iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_SHEEN_COLORMAP", - "", - "vSheenColorMapUv = ( tileTransform * (sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_SHEEN_ROUGHNESSMAP", - "", - "vSheenRoughnessMapUv = ( tileTransform * (sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_SPECULARMAP", - "", - "vSpecularMapUv = ( tileTransform * (specularMapTransform * vec3( SPECULARMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_SPECULAR_COLORMAP", - "", - "vSpecularColorMapUv = ( tileTransform * (specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_SPECULAR_INTENSITYMAP", - "", - "vSpecularIntensityMapUv = ( tileTransform * (specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_TRANSMISSIONMAP", - "", - "vTransmissionMapUv = ( tileTransform * transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) )).xy;", - "", - "#endif", - "#ifdef USE_THICKNESSMAP", - "", - "vThicknessMapUv = ( tileTransform * thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) )).xy;", - "", - "#endif", - "`;", - "", - "var particle_vert = `", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "", - "attribute vec3 offset;", - "attribute float rotation;", - "attribute float size;", - "attribute float uvTile;", - "", - "#ifdef UV_TILE", - "uniform vec2 tileCount;", - "#endif", - "", - "void main() {", - "", - " ${uv_vertex_tile}", - "\t", - " vec2 alignedPosition = ( position.xy ) * size;", - " ", - " vec2 rotatedPosition;", - " rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;", - " rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;", - "#ifdef HORIZONTAL", - " vec4 mvPosition = modelMatrix * vec4( offset, 1.0 );", - " mvPosition.x += rotatedPosition.x;", - " mvPosition.z -= rotatedPosition.y;", - " mvPosition = viewMatrix * mvPosition;", - "#elif defined(VERTICAL)", - " vec4 mvPosition = modelMatrix * vec4( offset, 1.0 );", - " mvPosition.y += rotatedPosition.y;", - " mvPosition = viewMatrix * mvPosition;", - " mvPosition.x += rotatedPosition.x;", - "#else", - " vec4 mvPosition = modelViewMatrix * vec4( offset, 1.0 );", - " mvPosition.xy += rotatedPosition;", - "#endif", - "", - "\tvColor = color;", - "", - "\tgl_Position = projectionMatrix * mvPosition;", - "", - "\t#include ", - "\t#include ", - "", - "}", - "`;", - "", - "var local_particle_vert = `", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "", - "attribute vec3 offset;", - "attribute vec4 rotation;", - "attribute float size;", - "// attribute vec4 color;", - "attribute float uvTile;", - "", - "#ifdef UV_TILE", - "uniform vec2 tileCount;", - "#endif", - "", - "void main() {", - "", - " ${uv_vertex_tile}", - " ", - " float x2 = rotation.x + rotation.x, y2 = rotation.y + rotation.y, z2 = rotation.z + rotation.z;", - " float xx = rotation.x * x2, xy = rotation.x * y2, xz = rotation.x * z2;", - " float yy = rotation.y * y2, yz = rotation.y * z2, zz = rotation.z * z2;", - " float wx = rotation.w * x2, wy = rotation.w * y2, wz = rotation.w * z2;", - " float sx = size, sy = size, sz = size;", - " ", - " mat4 matrix = mat4(( 1.0 - ( yy + zz ) ) * sx, ( xy + wz ) * sx, ( xz - wy ) * sx, 0.0, // 1. column", - " ( xy - wz ) * sy, ( 1.0 - ( xx + zz ) ) * sy, ( yz + wx ) * sy, 0.0, // 2. column", - " ( xz + wy ) * sz, ( yz - wx ) * sz, ( 1.0 - ( xx + yy ) ) * sz, 0.0, // 3. column", - " offset.x, offset.y, offset.z, 1.0);", - " ", - " vec4 mvPosition = modelViewMatrix * (matrix * vec4( position, 1.0 ));", - "", - "\tvColor = color;", - "", - "\tgl_Position = projectionMatrix * mvPosition;", - "", - "\t#include ", - "\t#include ", - "", - "}", - "`;", - "", - "var local_particle_physics_vert = `", - "#define STANDARD", - "varying vec3 vViewPosition;", - "#ifdef USE_TRANSMISSION", - "\tvarying vec3 vWorldPosition;", - "#endif", - "#include ", - "#include ", - "", - "attribute vec3 offset;", - "attribute vec4 rotation;", - "attribute float size;", - "attribute float uvTile;", - "", - "#ifdef UV_TILE", - "uniform vec2 tileCount;", - "#endif", - "", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "", - "void main() {", - " ${uv_vertex_tile}", - "", - " float x2 = rotation.x + rotation.x, y2 = rotation.y + rotation.y, z2 = rotation.z + rotation.z;", - " float xx = rotation.x * x2, xy = rotation.x * y2, xz = rotation.x * z2;", - " float yy = rotation.y * y2, yz = rotation.y * z2, zz = rotation.z * z2;", - " float wx = rotation.w * x2, wy = rotation.w * y2, wz = rotation.w * z2;", - " float sx = size, sy = size, sz = size;", - "", - " mat4 particleMatrix = mat4(( 1.0 - ( yy + zz ) ) * sx, ( xy + wz ) * sx, ( xz - wy ) * sx, 0.0, // 1. column", - " ( xy - wz ) * sy, ( 1.0 - ( xx + zz ) ) * sy, ( yz + wx ) * sy, 0.0, // 2. column", - " ( xz + wy ) * sz, ( yz - wx ) * sz, ( 1.0 - ( xx + yy ) ) * sz, 0.0, // 3. column", - " offset.x, offset.y, offset.z, 1.0);", - "", - "\t#include ", - "\t#include ", - "\t#include ", - "\t#include ", - "\t#include ", - "\t#include ", - "", - "\t// replace defaultnormal_vertex", - "\tvec3 transformedNormal = objectNormal;", - " mat3 m = mat3( particleMatrix );", - " transformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );", - " transformedNormal = m * transformedNormal;", - " transformedNormal = normalMatrix * transformedNormal;", - " #ifdef FLIP_SIDED", - " transformedNormal = - transformedNormal;", - " #endif", - " #ifdef USE_TANGENT", - " vec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;", - " #ifdef FLIP_SIDED", - " transformedTangent = - transformedTangent;", - " #endif", - " #endif", - "", - "\t#include ", - "\t#include ", - "\t#include ", - "\t#include ", - "\t#include ", - "", - "\t// replace include ", - " vec4 mvPosition = vec4( transformed, 1.0 );", - " mvPosition = modelViewMatrix * (particleMatrix * mvPosition);", - "\tgl_Position = projectionMatrix * mvPosition;", - "", - "\t#include ", - "\t#include ", - "\t", - "\tvViewPosition = - mvPosition.xyz;", - "\t", - "\t#include ", - "\t#include ", - "\t#include ", - "#ifdef USE_TRANSMISSION", - "\tvWorldPosition = worldPosition.xyz;", - "#endif", - "}", - "`;", - "", - "var stretched_bb_particle_vert = `", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "", - "attribute vec3 offset;", - "attribute float rotation;", - "attribute float size;", - "attribute vec4 velocity;", - "attribute float uvTile;", - "", - "#ifdef UV_TILE", - "uniform vec2 tileCount;", - "#endif", - "", - "uniform float speedFactor;", - "", - "void main() {", - "", - " ${uv_vertex_tile}", - " ", - " float lengthFactor = velocity.w;", - "#ifdef USE_SKEW", - " vec4 mvPosition = modelViewMatrix * vec4( offset, 1.0 );", - " vec3 viewVelocity = normalMatrix * velocity.xyz;", - "", - " vec3 scaledPos = vec3(position.xy * size, position.z);", - " float vlength = length(viewVelocity);", - " vec3 projVelocity = dot(scaledPos, viewVelocity) * viewVelocity / vlength;", - " mvPosition.xyz += scaledPos + projVelocity * (speedFactor / size + lengthFactor / vlength);", - "#else", - " vec4 mvPosition = modelViewMatrix * vec4( offset, 1.0 );", - " vec3 viewVelocity = normalMatrix * velocity.xyz;", - " float vlength = length(viewVelocity); ", - " mvPosition.xyz += position.y * normalize(cross(mvPosition.xyz, viewVelocity)) * size; // switch the cross to match unity implementation", - " mvPosition.xyz -= (position.x + 0.5) * viewVelocity * (1.0 + lengthFactor / vlength) * size; // minus position.x to match unity implementation", - "#endif", - "\tvColor = color;", - "\tgl_Position = projectionMatrix * mvPosition;", - "\t#include ", - "\t#include ", - "}", - "`;", - "", - "function getMaterialUVChannelName(value) {", - " if (value === 0)", - " return 'uv';", - " return `uv${value}`;", - "}", - "", - "new THREE.Vector3(0, 0, 1);", - "class SpriteBatch extends VFXBatch {", - " constructor(settings) {", - " super(settings);", - " this.vector_ = new THREE.Vector3();", - " this.vector2_ = new THREE.Vector3();", - " this.vector3_ = new THREE.Vector3();", - " this.quaternion_ = new THREE.Quaternion();", - " this.quaternion2_ = new THREE.Quaternion();", - " this.quaternion3_ = new THREE.Quaternion();", - " this.rotationMat_ = new THREE.Matrix3();", - " this.rotationMat2_ = new THREE.Matrix3();", - " this.maxParticles = 1000;", - " this.setupBuffers();", - " this.rebuildMaterial();", - " }", - " buildExpandableBuffers() {", - " this.offsetBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles * 3), 3);", - " this.offsetBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('offset', this.offsetBuffer);", - " this.colorBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles * 4), 4);", - " this.colorBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('color', this.colorBuffer);", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " this.rotationBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles * 4), 4);", - " this.rotationBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('rotation', this.rotationBuffer);", - " }", - " else if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.HorizontalBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.VerticalBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard) {", - " this.rotationBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles), 1);", - " this.rotationBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('rotation', this.rotationBuffer);", - " }", - " this.sizeBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles), 1);", - " this.sizeBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('size', this.sizeBuffer);", - " this.uvTileBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles), 1);", - " this.uvTileBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('uvTile', this.uvTileBuffer);", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard) {", - " this.velocityBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles * 4), 4);", - " this.velocityBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('velocity', this.velocityBuffer);", - " }", - " }", - " setupBuffers() {", - " if (this.geometry)", - " this.geometry.dispose();", - " this.geometry = new THREE.InstancedBufferGeometry();", - " this.geometry.setIndex(this.settings.instancingGeometry.getIndex());", - " if (this.settings.instancingGeometry.hasAttribute('normal')) {", - " this.geometry.setAttribute('normal', this.settings.instancingGeometry.getAttribute('normal'));", - " }", - " this.geometry.setAttribute('position', this.settings.instancingGeometry.getAttribute('position'));", - " this.geometry.setAttribute('uv', this.settings.instancingGeometry.getAttribute('uv'));", - " this.buildExpandableBuffers();", - " }", - " expandBuffers(target) {", - " while (target >= this.maxParticles) {", - " this.maxParticles *= 2;", - " }", - " this.setupBuffers();", - " }", - " rebuildMaterial() {", - " this.layers.mask = this.settings.layers.mask;", - " let uniforms;", - " const defines = {};", - " if (this.settings.material.type === 'MeshStandardMaterial' ||", - " this.settings.material.type === 'MeshPhysicalMaterial') {", - " const mat = this.settings.material;", - " uniforms = THREE.UniformsUtils.merge([", - " THREE.UniformsLib.common,", - " THREE.UniformsLib.envmap,", - " THREE.UniformsLib.aomap,", - " THREE.UniformsLib.lightmap,", - " THREE.UniformsLib.emissivemap,", - " THREE.UniformsLib.bumpmap,", - " THREE.UniformsLib.normalmap,", - " THREE.UniformsLib.displacementmap,", - " THREE.UniformsLib.roughnessmap,", - " THREE.UniformsLib.metalnessmap,", - " THREE.UniformsLib.fog,", - " THREE.UniformsLib.lights,", - " {", - " emissive: { value: new THREE.Color(0x000000) },", - " roughness: { value: 1.0 },", - " metalness: { value: 0.0 },", - " envMapIntensity: { value: 1 },", - " },", - " ]);", - " uniforms['diffuse'].value = mat.color;", - " uniforms['opacity'].value = mat.opacity;", - " uniforms['emissive'].value = mat.emissive;", - " uniforms['roughness'].value = mat.roughness;", - " uniforms['metalness'].value = mat.metalness;", - " if (mat.envMap) {", - " uniforms['envMap'].value = mat.envMap;", - " uniforms['envMapIntensity'].value = mat.envMapIntensity;", - " }", - " if (mat.normalMap) {", - " uniforms['normalMap'].value = mat.normalMap;", - " uniforms['normalScale'].value = mat.normalScale;", - " }", - " if (mat.roughnessMap) {", - " uniforms['roughnessMap'].value = mat.roughnessMap;", - " }", - " if (mat.metalnessMap) {", - " uniforms['metalnessMap'].value = mat.metalnessMap;", - " }", - " if (mat.map) {", - " uniforms['map'] = new THREE.Uniform(mat.map);", - " }", - " }", - " else {", - " uniforms = {};", - " uniforms['map'] = new THREE.Uniform(this.settings.material.map);", - " }", - " if (this.settings.material.alphaTest) {", - " defines['USE_ALPHATEST'] = '';", - " uniforms['alphaTest'] = new THREE.Uniform(this.settings.material.alphaTest);", - " }", - " defines['USE_UV'] = '';", - " const uTileCount = this.settings.uTileCount;", - " const vTileCount = this.settings.vTileCount;", - " if (uTileCount > 1 || vTileCount > 1) {", - " defines['UV_TILE'] = '';", - " uniforms['tileCount'] = new THREE.Uniform(new THREE.Vector2(uTileCount, vTileCount));", - " }", - " if (this.settings.material.defines &&", - " this.settings.material.defines['USE_COLOR_AS_ALPHA'] !== undefined) {", - " defines['USE_COLOR_AS_ALPHA'] = '';", - " }", - " if (this.settings.material.normalMap) {", - " defines['USE_NORMALMAP'] = '';", - " defines['NORMALMAP_UV'] = getMaterialUVChannelName(this.settings.material.normalMap.channel);", - " uniforms['normalMapTransform'] = new THREE.Uniform(new THREE.Matrix3().copy(this.settings.material.normalMap.matrix));", - " }", - " if (this.settings.material.map) {", - " defines['USE_MAP'] = '';", - " defines['MAP_UV'] = getMaterialUVChannelName(this.settings.material.map.channel);", - " uniforms['mapTransform'] = new THREE.Uniform(new THREE.Matrix3().copy(this.settings.material.map.matrix));", - " }", - " defines['USE_COLOR_ALPHA'] = '';", - " let needLights = false;", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.VerticalBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.HorizontalBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " let vertexShader;", - " let fragmentShader;", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " if (this.settings.material.type === 'MeshStandardMaterial' ||", - " this.settings.material.type === 'MeshPhysicalMaterial') {", - " defines['USE_COLOR'] = '';", - " vertexShader = local_particle_physics_vert;", - " fragmentShader = particle_physics_frag;", - " needLights = true;", - " }", - " else {", - " vertexShader = local_particle_vert;", - " fragmentShader = particle_frag;", - " }", - " }", - " else {", - " vertexShader = particle_vert;", - " fragmentShader = particle_frag;", - " }", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.VerticalBillBoard) {", - " defines['VERTICAL'] = '';", - " }", - " else if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.HorizontalBillBoard) {", - " defines['HORIZONTAL'] = '';", - " }", - " this.material = new THREE.ShaderMaterial({", - " uniforms: uniforms,", - " defines: defines,", - " vertexShader: vertexShader,", - " fragmentShader: fragmentShader,", - " transparent: this.settings.material.transparent,", - " depthWrite: !this.settings.material.transparent,", - " blending: this.settings.material.blending,", - " side: this.settings.material.side,", - " alphaTest: this.settings.material.alphaTest,", - " lights: needLights,", - " });", - " }", - " else if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard) {", - " uniforms['speedFactor'] = new THREE.Uniform(1.0);", - " this.material = new THREE.ShaderMaterial({", - " uniforms: uniforms,", - " defines: defines,", - " vertexShader: stretched_bb_particle_vert,", - " fragmentShader: particle_frag,", - " transparent: this.settings.material.transparent,", - " depthWrite: !this.settings.material.transparent,", - " blending: this.settings.material.blending,", - " side: this.settings.material.side,", - " alphaTest: this.settings.material.alphaTest,", - " });", - " }", - " else {", - " throw new Error('render mode unavailable');", - " }", - " }", - " update() {", - " let index = 0;", - " let particleCount = 0;", - " this.systems.forEach((system) => {", - " particleCount += system.particleNum;", - " });", - " if (particleCount > this.maxParticles) {", - " this.expandBuffers(particleCount);", - " }", - " this.systems.forEach((system) => {", - " const particles = system.particles;", - " const particleNum = system.particleNum;", - " const rotation = this.quaternion2_;", - " const translation = this.vector2_;", - " const scale = this.vector3_;", - " system.emitter.matrixWorld.decompose(translation, rotation, scale);", - " this.rotationMat_.setFromMatrix4(system.emitter.matrixWorld);", - " for (let j = 0; j < particleNum; j++ , index++) {", - " const particle = particles[j];", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " let q;", - " if (system.worldSpace) {", - " q = particle.rotation;", - " }", - " else {", - " let parentQ;", - " if (particle.parentMatrix) {", - " parentQ = this.quaternion3_.setFromRotationMatrix(particle.parentMatrix);", - " }", - " else {", - " parentQ = rotation;", - " }", - " q = this.quaternion_;", - " q.copy(particle.rotation).multiply(parentQ);", - " }", - " this.rotationBuffer.setXYZW(index, q.x, q.y, q.z, q.w);", - " }", - " else if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.VerticalBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.HorizontalBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard) {", - " this.rotationBuffer.setX(index, particle.rotation);", - " }", - " let vec;", - " if (system.worldSpace) {", - " vec = particle.position;", - " }", - " else {", - " vec = this.vector_;", - " if (particle.parentMatrix) {", - " vec.copy(particle.position).applyMatrix4(particle.parentMatrix);", - " }", - " else {", - " vec.copy(particle.position).applyMatrix4(system.emitter.matrixWorld);", - " }", - " }", - " this.offsetBuffer.setXYZ(index, vec.x, vec.y, vec.z);", - " this.colorBuffer.setXYZW(index, particle.color.x, particle.color.y, particle.color.z, particle.color.w);", - " if (system.worldSpace) {", - " this.sizeBuffer.setX(index, particle.size);", - " }", - " else {", - " if (particle.parentMatrix) {", - " this.sizeBuffer.setX(index, particle.size);", - " }", - " else {", - " this.sizeBuffer.setX(index, (particle.size * (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z))) / 3);", - " }", - " }", - " this.uvTileBuffer.setX(index, particle.uvTile);", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard && this.velocityBuffer) {", - " let speedFactor = system.rendererEmitterSettings.speedFactor;", - " if (speedFactor === 0)", - " speedFactor = 0.001;", - " const lengthFactor = system.rendererEmitterSettings.lengthFactor;", - " let vec;", - " if (system.worldSpace) {", - " vec = particle.velocity;", - " }", - " else {", - " vec = this.vector_;", - " if (particle.parentMatrix) {", - " this.rotationMat2_.setFromMatrix4(particle.parentMatrix);", - " vec.copy(particle.velocity).applyMatrix3(this.rotationMat2_);", - " }", - " else {", - " vec.copy(particle.velocity).applyMatrix3(this.rotationMat_);", - " }", - " }", - " this.velocityBuffer.setXYZW(index, vec.x * speedFactor, vec.y * speedFactor, vec.z * speedFactor, lengthFactor);", - " }", - " }", - " });", - " this.geometry.instanceCount = index;", - " if (index > 0) {", - " this.offsetBuffer.updateRange.count = index * 3;", - " this.offsetBuffer.needsUpdate = true;", - " this.sizeBuffer.updateRange.count = index;", - " this.sizeBuffer.needsUpdate = true;", - " this.colorBuffer.updateRange.count = index * 4;", - " this.colorBuffer.needsUpdate = true;", - " this.uvTileBuffer.updateRange.count = index;", - " this.uvTileBuffer.needsUpdate = true;", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard && this.velocityBuffer) {", - " this.velocityBuffer.updateRange.count = index * 4;", - " this.velocityBuffer.needsUpdate = true;", - " }", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Mesh) {", - " this.rotationBuffer.updateRange.count = index * 4;", - " this.rotationBuffer.needsUpdate = true;", - " }", - " else if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.HorizontalBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.VerticalBillBoard ||", - " this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard) {", - " this.rotationBuffer.updateRange.count = index;", - " this.rotationBuffer.needsUpdate = true;", - " }", - " }", - " }", - " dispose() {", - " this.geometry.dispose();", - " }", - "}", - "", - "var trail_frag = `", - "", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "", - "uniform sampler2D alphaMap;", - "uniform float useAlphaMap;", - "uniform float visibility;", - "uniform float alphaTest;", - "uniform vec2 repeat;", - "", - "varying vec4 vColor;", - " ", - "void main() {", - " #include ", - " #include ", - "", - " vec4 c = vColor;", - " ", - " #ifdef USE_MAP", - " #ifdef USE_COLOR_AS_ALPHA", - " vec4 tex = texture2D( map, vUv * repeat );", - " c *= vec4(tex.rgb, tex.r);", - " #else", - " c *= texture2D( map, vUv * repeat );", - " #endif", - " #endif", - " if( useAlphaMap == 1. ) c.a *= texture2D( alphaMap, vUv * repeat ).a;", - " if( c.a < alphaTest ) discard;", - " gl_FragColor = c;", - "", - " #include ", - " #include ", - "}`;", - "", - "var trail_vert = `", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "#include ", - "", - "attribute vec3 previous;", - "attribute vec3 next;", - "attribute float side;", - "attribute float width;", - "", - "uniform vec2 resolution;", - "uniform float lineWidth;", - "uniform float sizeAttenuation;", - " ", - "vec2 fix(vec4 i, float aspect) {", - " vec2 res = i.xy / i.w;", - " res.x *= aspect;", - " return res;", - "}", - " ", - "void main() {", - "", - " ${uv_vertex_tile}", - " ", - " float aspect = resolution.x / resolution.y;", - "", - " vColor = color;", - "", - " mat4 m = projectionMatrix * modelViewMatrix;", - " vec4 finalPosition = m * vec4( position, 1.0 );", - " vec4 prevPos = m * vec4( previous, 1.0 );", - " vec4 nextPos = m * vec4( next, 1.0 );", - "", - " vec2 currentP = fix( finalPosition, aspect );", - " vec2 prevP = fix( prevPos, aspect );", - " vec2 nextP = fix( nextPos, aspect );", - "", - " float w = lineWidth * width;", - "", - " vec2 dir;", - " if( nextP == currentP ) dir = normalize( currentP - prevP );", - " else if( prevP == currentP ) dir = normalize( nextP - currentP );", - " else {", - " vec2 dir1 = normalize( currentP - prevP );", - " vec2 dir2 = normalize( nextP - currentP );", - " dir = normalize( dir1 + dir2 );", - "", - " vec2 perp = vec2( -dir1.y, dir1.x );", - " vec2 miter = vec2( -dir.y, dir.x );", - " //w = clamp( w / dot( miter, perp ), 0., 4., * lineWidth * width );", - "", - " }", - "", - " //vec2 normal = ( cross( vec3( dir, 0. ) vec3( 0., 0., 1. ) ) ).xy;", - " vec4 normal = vec4( -dir.y, dir.x, 0., 1. );", - " normal.xy *= .5 * w;", - " normal *= projectionMatrix;", - " if( sizeAttenuation == 0. ) {", - " normal.xy *= finalPosition.w;", - " normal.xy /= ( vec4( resolution, 0., 1. ) * projectionMatrix ).xy;", - " }", - "", - " finalPosition.xy += normal.xy * side;", - "", - " gl_Position = finalPosition;", - "", - "\t#include ", - "\t#include ", - "\t", - " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - " ", - "\t#include ", - "}`;", - "", - "new THREE.Vector3(0, 0, 1);", - "class TrailBatch extends VFXBatch {", - " constructor(settings) {", - " super(settings);", - " this.vector_ = new THREE.Vector3();", - " this.vector2_ = new THREE.Vector3();", - " this.vector3_ = new THREE.Vector3();", - " this.quaternion_ = new THREE.Quaternion();", - " this.maxParticles = 10000;", - " this.setupBuffers();", - " this.rebuildMaterial();", - " }", - " setupBuffers() {", - " if (this.geometry)", - " this.geometry.dispose();", - " this.geometry = new THREE.BufferGeometry();", - " this.indexBuffer = new THREE.BufferAttribute(new Uint32Array(this.maxParticles * 6), 1);", - " this.indexBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setIndex(this.indexBuffer);", - " this.positionBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 6), 3);", - " this.positionBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('position', this.positionBuffer);", - " this.previousBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 6), 3);", - " this.previousBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('previous', this.previousBuffer);", - " this.nextBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 6), 3);", - " this.nextBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('next', this.nextBuffer);", - " this.widthBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 2), 1);", - " this.widthBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('width', this.widthBuffer);", - " this.sideBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 2), 1);", - " this.sideBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('side', this.sideBuffer);", - " this.uvBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 4), 2);", - " this.uvBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('uv', this.uvBuffer);", - " this.colorBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 8), 4);", - " this.colorBuffer.setUsage(THREE.DynamicDrawUsage);", - " this.geometry.setAttribute('color', this.colorBuffer);", - " }", - " expandBuffers(target) {", - " while (target >= this.maxParticles) {", - " this.maxParticles *= 2;", - " }", - " this.setupBuffers();", - " }", - " rebuildMaterial() {", - " this.layers.mask = this.settings.layers.mask;", - " const uniforms = {", - " lineWidth: { value: 1 },", - " map: { value: null },", - " useMap: { value: 0 },", - " alphaMap: { value: null },", - " useAlphaMap: { value: 0 },", - " resolution: { value: new THREE.Vector2(1, 1) },", - " sizeAttenuation: { value: 1 },", - " visibility: { value: 1 },", - " alphaTest: { value: 0 },", - " repeat: { value: new THREE.Vector2(1, 1) },", - " };", - " const defines = {};", - " defines['USE_UV'] = '';", - " defines['USE_COLOR_ALPHA'] = '';", - " if (this.settings.material.map) {", - " defines['USE_MAP'] = '';", - " defines['MAP_UV'] = getMaterialUVChannelName(this.settings.material.map.channel);", - " uniforms['map'] = new THREE.Uniform(this.settings.material.map);", - " uniforms['mapTransform'] = new THREE.Uniform(new THREE.Matrix3().copy(this.settings.material.map.matrix));", - " }", - " if (this.settings.material.defines &&", - " this.settings.material.defines['USE_COLOR_AS_ALPHA'] !== undefined) {", - " defines['USE_COLOR_AS_ALPHA'] = '';", - " }", - " if (this.settings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) {", - " this.material = new THREE.ShaderMaterial({", - " uniforms: uniforms,", - " defines: defines,", - " vertexShader: trail_vert,", - " fragmentShader: trail_frag,", - " transparent: this.settings.material.transparent,", - " depthWrite: !this.settings.material.transparent,", - " side: this.settings.material.side,", - " blending: this.settings.material.blending || THREE.AdditiveBlending,", - " });", - " }", - " else {", - " throw new Error('render mode unavailable');", - " }", - " }", - " update() {", - " let index = 0;", - " let triangles = 0;", - " let particleCount = 0;", - " this.systems.forEach((system) => {", - " for (let j = 0; j < system.particleNum; j++) {", - " particleCount += system.particles[j].previous.length * 2;", - " }", - " });", - " if (particleCount > this.maxParticles) {", - " this.expandBuffers(particleCount);", - " }", - " this.systems.forEach((system) => {", - " const rotation = this.quaternion_;", - " const translation = this.vector2_;", - " const scale = this.vector3_;", - " system.emitter.matrixWorld.decompose(translation, rotation, scale);", - " const particles = system.particles;", - " const particleNum = system.particleNum;", - " const uTileCount = this.settings.uTileCount;", - " const vTileCount = this.settings.vTileCount;", - " const tileWidth = 1 / uTileCount;", - " const tileHeight = 1 / vTileCount;", - " for (let j = 0; j < particleNum; j++) {", - " const particle = particles[j];", - " const col = particle.uvTile % vTileCount;", - " const row = Math.floor(particle.uvTile / vTileCount + 0.001);", - " const iter = particle.previous.values();", - " let curIter = iter.next();", - " let previous = curIter.value;", - " let current = previous;", - " if (!curIter.done)", - " curIter = iter.next();", - " let next;", - " if (curIter.value !== undefined) {", - " next = curIter.value;", - " }", - " else {", - " next = current;", - " }", - " for (let i = 0; i < particle.previous.length; i++ , index += 2) {", - " this.positionBuffer.setXYZ(index, current.position.x, current.position.y, current.position.z);", - " this.positionBuffer.setXYZ(index + 1, current.position.x, current.position.y, current.position.z);", - " if (system.worldSpace) {", - " this.positionBuffer.setXYZ(index, current.position.x, current.position.y, current.position.z);", - " this.positionBuffer.setXYZ(index + 1, current.position.x, current.position.y, current.position.z);", - " }", - " else {", - " if (particle.parentMatrix) {", - " this.vector_.copy(current.position).applyMatrix4(particle.parentMatrix);", - " }", - " else {", - " this.vector_.copy(current.position).applyMatrix4(system.emitter.matrixWorld);", - " }", - " this.positionBuffer.setXYZ(index, this.vector_.x, this.vector_.y, this.vector_.z);", - " this.positionBuffer.setXYZ(index + 1, this.vector_.x, this.vector_.y, this.vector_.z);", - " }", - " if (system.worldSpace) {", - " this.previousBuffer.setXYZ(index, previous.position.x, previous.position.y, previous.position.z);", - " this.previousBuffer.setXYZ(index + 1, previous.position.x, previous.position.y, previous.position.z);", - " }", - " else {", - " if (particle.parentMatrix) {", - " this.vector_.copy(previous.position).applyMatrix4(particle.parentMatrix);", - " }", - " else {", - " this.vector_.copy(previous.position).applyMatrix4(system.emitter.matrixWorld);", - " }", - " this.previousBuffer.setXYZ(index, this.vector_.x, this.vector_.y, this.vector_.z);", - " this.previousBuffer.setXYZ(index + 1, this.vector_.x, this.vector_.y, this.vector_.z);", - " }", - " if (system.worldSpace) {", - " this.nextBuffer.setXYZ(index, next.position.x, next.position.y, next.position.z);", - " this.nextBuffer.setXYZ(index + 1, next.position.x, next.position.y, next.position.z);", - " }", - " else {", - " if (particle.parentMatrix) {", - " this.vector_.copy(next.position).applyMatrix4(particle.parentMatrix);", - " }", - " else {", - " this.vector_.copy(next.position).applyMatrix4(system.emitter.matrixWorld);", - " }", - " this.nextBuffer.setXYZ(index, this.vector_.x, this.vector_.y, this.vector_.z);", - " this.nextBuffer.setXYZ(index + 1, this.vector_.x, this.vector_.y, this.vector_.z);", - " }", - " this.sideBuffer.setX(index, -1);", - " this.sideBuffer.setX(index + 1, 1);", - " if (system.worldSpace) {", - " this.widthBuffer.setX(index, current.size);", - " this.widthBuffer.setX(index + 1, current.size);", - " }", - " else {", - " if (particle.parentMatrix) {", - " this.widthBuffer.setX(index, current.size);", - " this.widthBuffer.setX(index + 1, current.size);", - " }", - " else {", - " const objectScale = (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z)) / 3;", - " this.widthBuffer.setX(index, current.size * objectScale);", - " this.widthBuffer.setX(index + 1, current.size * objectScale);", - " }", - " }", - " this.uvBuffer.setXY(index, (i / particle.previous.length + col) * tileWidth, (vTileCount - row - 1) * tileHeight);", - " this.uvBuffer.setXY(index + 1, (i / particle.previous.length + col) * tileWidth, (vTileCount - row) * tileHeight);", - " this.colorBuffer.setXYZW(index, current.color.x, current.color.y, current.color.z, current.color.w);", - " this.colorBuffer.setXYZW(index + 1, current.color.x, current.color.y, current.color.z, current.color.w);", - " if (i + 1 < particle.previous.length) {", - " this.indexBuffer.setX(triangles * 3, index);", - " this.indexBuffer.setX(triangles * 3 + 1, index + 1);", - " this.indexBuffer.setX(triangles * 3 + 2, index + 2);", - " triangles++;", - " this.indexBuffer.setX(triangles * 3, index + 2);", - " this.indexBuffer.setX(triangles * 3 + 1, index + 1);", - " this.indexBuffer.setX(triangles * 3 + 2, index + 3);", - " triangles++;", - " }", - " previous = current;", - " current = next;", - " if (!curIter.done) {", - " curIter = iter.next();", - " if (curIter.value !== undefined) {", - " next = curIter.value;", - " }", - " }", - " }", - " }", - " });", - " this.positionBuffer.updateRange.count = index * 3;", - " this.positionBuffer.needsUpdate = true;", - " this.previousBuffer.updateRange.count = index * 3;", - " this.previousBuffer.needsUpdate = true;", - " this.nextBuffer.updateRange.count = index * 3;", - " this.nextBuffer.needsUpdate = true;", - " this.sideBuffer.updateRange.count = index;", - " this.sideBuffer.needsUpdate = true;", - " this.widthBuffer.updateRange.count = index;", - " this.widthBuffer.needsUpdate = true;", - " this.uvBuffer.updateRange.count = index * 2;", - " this.uvBuffer.needsUpdate = true;", - " this.colorBuffer.updateRange.count = index * 4;", - " this.colorBuffer.needsUpdate = true;", - " this.indexBuffer.updateRange.count = triangles * 3;", - " this.indexBuffer.needsUpdate = true;", - " this.geometry.setDrawRange(0, triangles * 3);", - " }", - " dispose() {", - " this.geometry.dispose();", - " }", - "}", - "", - "class BatchedRenderer extends THREE.Object3D {", - " constructor() {", - " super();", - " this.batches = [];", - " this.systemToBatchIndex = new Map();", - " this.type = 'BatchedRenderer';", - " }", - " static equals(a, b) {", - " return (a.material.side === b.material.side &&", - " a.material.blending === b.material.blending &&", - " a.material.transparent === b.material.transparent &&", - " a.material.type === b.material.type &&", - " a.material.alphaTest === b.material.alphaTest &&", - " a.material.map === b.material.map &&", - " a.renderMode === b.renderMode &&", - " a.uTileCount === b.uTileCount &&", - " a.vTileCount === b.vTileCount &&", - " a.instancingGeometry === b.instancingGeometry &&", - " a.renderOrder === b.renderOrder &&", - " a.layers.mask === b.layers.mask);", - " }", - " addSystem(system) {", - " system._renderer = this;", - " const settings = system.getRendererSettings();", - " for (let i = 0; i < this.batches.length; i++) {", - " if (BatchedRenderer.equals(this.batches[i].settings, settings)) {", - " this.batches[i].addSystem(system);", - " this.systemToBatchIndex.set(system, i);", - " return;", - " }", - " }", - " let batch;", - " switch (settings.renderMode) {", - " case gdjs.__particleEmmiter3DExtension.RenderMode.Trail:", - " batch = new TrailBatch(settings);", - " break;", - " case gdjs.__particleEmmiter3DExtension.RenderMode.Mesh:", - " case gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard:", - " case gdjs.__particleEmmiter3DExtension.RenderMode.VerticalBillBoard:", - " case gdjs.__particleEmmiter3DExtension.RenderMode.HorizontalBillBoard:", - " case gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard:", - " batch = new SpriteBatch(settings);", - " break;", - " }", - " batch.addSystem(system);", - " this.batches.push(batch);", - " this.systemToBatchIndex.set(system, this.batches.length - 1);", - " this.add(batch);", - " }", - " deleteSystem(system) {", - " const batchIndex = this.systemToBatchIndex.get(system);", - " if (batchIndex != undefined) {", - " this.batches[batchIndex].removeSystem(system);", - " this.systemToBatchIndex.delete(system);", - " }", - " }", - " updateSystem(system) {", - " this.deleteSystem(system);", - " this.addSystem(system);", - " }", - " update(delta) {", - " this.systemToBatchIndex.forEach((value, ps) => {", - " ps.update(delta);", - " });", - " for (let i = 0; i < this.batches.length; i++) {", - " this.batches[i].update();", - " }", - " }", - "}", - "", - "const BatchedParticleRenderer = BatchedRenderer;", - "", - "class QuarksLoader extends THREE.ObjectLoader {", - " constructor(manager) {", - " super(manager);", - " }", - " linkReference(object) {", - " const objectsMap = {};", - " object.traverse(function (child) {", - " objectsMap[child.uuid] = child;", - " });", - " object.traverse(function (child) {", - " if (child.type === 'ParticleEmitter') {", - " const system = child.system;", - " system.emitterShape;", - " for (let i = 0; i < system.behaviors.length; i++) {", - " if (system.behaviors[i] instanceof EmitSubParticleSystem) {", - " system.behaviors[i].subParticleSystem = objectsMap[system.behaviors[i].subParticleSystem];", - " }", - " }", - " }", - " });", - " }", - " parse(json, onLoad) {", - " const object = super.parse(json, onLoad);", - " this.linkReference(object);", - " return object;", - " }", - " parseObject(data, geometries, materials, textures, animations) {", - " let object;", - " function getGeometry(name) {", - " if (geometries[name] === undefined) {", - " console.warn('THREE.ObjectLoader: Undefined geometry', name);", - " }", - " return geometries[name];", - " }", - " function getMaterial(name) {", - " if (name === undefined)", - " return undefined;", - " if (Array.isArray(name)) {", - " const array = [];", - " for (let i = 0, l = name.length; i < l; i++) {", - " const uuid = name[i];", - " if (materials[uuid] === undefined) {", - " console.warn('THREE.ObjectLoader: Undefined material', uuid);", - " }", - " array.push(materials[uuid]);", - " }", - " return array;", - " }", - " if (materials[name] === undefined) {", - " console.warn('THREE.ObjectLoader: Undefined material', name);", - " }", - " return materials[name];", - " }", - " function getTexture(uuid) {", - " if (textures[uuid] === undefined) {", - " console.warn('THREE.ObjectLoader: Undefined texture', uuid);", - " }", - " return textures[uuid];", - " }", - " let geometry, material;", - " const meta = {", - " textures: textures,", - " geometries: geometries,", - " materials: materials,", - " };", - " const dependencies = {};", - " switch (data.type) {", - " case 'ParticleEmitter':", - " object = ParticleSystem.fromJSON(data.ps, meta, dependencies).emitter;", - " break;", - " case 'Scene':", - " object = new THREE.Scene();", - " if (data.background !== undefined) {", - " if (Number.isInteger(data.background)) {", - " object.background = new THREE.Color(data.background);", - " }", - " else {", - " object.background = getTexture(data.background);", - " }", - " }", - " if (data.environment !== undefined) {", - " object.environment = getTexture(data.environment);", - " }", - " if (data.fog !== undefined) {", - " if (data.fog.type === 'Fog') {", - " object.fog = new THREE.Fog(data.fog.color, data.fog.near, data.fog.far);", - " }", - " else if (data.fog.type === 'FogExp2') {", - " object.fog = new THREE.FogExp2(data.fog.color, data.fog.density);", - " }", - " }", - " if (data.backgroundBlurriness !== undefined)", - " object.backgroundBlurriness = data.backgroundBlurriness;", - " break;", - " case 'PerspectiveCamera':", - " object = new THREE.PerspectiveCamera(data.fov, data.aspect, data.near, data.far);", - " if (data.focus !== undefined)", - " object.focus = data.focus;", - " if (data.zoom !== undefined)", - " object.zoom = data.zoom;", - " if (data.filmGauge !== undefined)", - " object.filmGauge = data.filmGauge;", - " if (data.filmOffset !== undefined)", - " object.filmOffset = data.filmOffset;", - " if (data.view !== undefined)", - " object.view = Object.assign({}, data.view);", - " break;", - " case 'OrthographicCamera':", - " object = new THREE.OrthographicCamera(data.left, data.right, data.top, data.bottom, data.near, data.far);", - " if (data.zoom !== undefined)", - " object.zoom = data.zoom;", - " if (data.view !== undefined)", - " object.view = Object.assign({}, data.view);", - " break;", - " case 'AmbientLight':", - " object = new THREE.AmbientLight(data.color, data.intensity);", - " break;", - " case 'DirectionalLight':", - " object = new THREE.DirectionalLight(data.color, data.intensity);", - " break;", - " case 'PointLight':", - " object = new THREE.PointLight(data.color, data.intensity, data.distance, data.decay);", - " break;", - " case 'RectAreaLight':", - " object = new THREE.RectAreaLight(data.color, data.intensity, data.width, data.height);", - " break;", - " case 'SpotLight':", - " object = new THREE.SpotLight(data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay);", - " break;", - " case 'HemisphereLight':", - " object = new THREE.HemisphereLight(data.color, data.groundColor, data.intensity);", - " break;", - " case 'LightProbe':", - " object = new THREE.LightProbe().fromJSON(data);", - " break;", - " case 'SkinnedMesh':", - " geometry = getGeometry(data.geometry);", - " material = getMaterial(data.material);", - " object = new THREE.SkinnedMesh(geometry, material);", - " if (data.bindMode !== undefined)", - " object.bindMode = data.bindMode;", - " if (data.bindMatrix !== undefined)", - " object.bindMatrix.fromArray(data.bindMatrix);", - " if (data.skeleton !== undefined)", - " object.skeleton = data.skeleton;", - " break;", - " case 'Mesh':", - " geometry = getGeometry(data.geometry);", - " material = getMaterial(data.material);", - " object = new THREE.Mesh(geometry, material);", - " break;", - " case 'InstancedMesh': {", - " geometry = getGeometry(data.geometry);", - " material = getMaterial(data.material);", - " const count = data.count;", - " const instanceMatrix = data.instanceMatrix;", - " const instanceColor = data.instanceColor;", - " object = new THREE.InstancedMesh(geometry, material, count);", - " object.instanceMatrix = new THREE.InstancedBufferAttribute(new Float32Array(instanceMatrix.array), 16);", - " if (instanceColor !== undefined)", - " object.instanceColor = new THREE.InstancedBufferAttribute(new Float32Array(instanceColor.array), instanceColor.itemSize);", - " break;", - " }", - " case 'LOD':", - " object = new THREE.LOD();", - " break;", - " case 'Line':", - " object = new THREE.Line(getGeometry(data.geometry), getMaterial(data.material));", - " break;", - " case 'LineLoop':", - " object = new THREE.LineLoop(getGeometry(data.geometry), getMaterial(data.material));", - " break;", - " case 'LineSegments':", - " object = new THREE.LineSegments(getGeometry(data.geometry), getMaterial(data.material));", - " break;", - " case 'PointCloud':", - " case 'Points':", - " object = new THREE.Points(getGeometry(data.geometry), getMaterial(data.material));", - " break;", - " case 'Sprite':", - " object = new THREE.Sprite(getMaterial(data.material));", - " break;", - " case 'Group':", - " object = new THREE.Group();", - " break;", - " case 'Bone':", - " object = new THREE.Bone();", - " break;", - " default:", - " object = new THREE.Object3D();", - " }", - " object.uuid = data.uuid;", - " if (data.name !== undefined)", - " object.name = data.name;", - " if (data.matrix !== undefined) {", - " object.matrix.fromArray(data.matrix);", - " if (data.matrixAutoUpdate !== undefined)", - " object.matrixAutoUpdate = data.matrixAutoUpdate;", - " if (object.matrixAutoUpdate)", - " object.matrix.decompose(object.position, object.quaternion, object.scale);", - " }", - " else {", - " if (data.position !== undefined)", - " object.position.fromArray(data.position);", - " if (data.rotation !== undefined)", - " object.rotation.fromArray(data.rotation);", - " if (data.quaternion !== undefined)", - " object.quaternion.fromArray(data.quaternion);", - " if (data.scale !== undefined)", - " object.scale.fromArray(data.scale);", - " }", - " if (data.castShadow !== undefined)", - " object.castShadow = data.castShadow;", - " if (data.receiveShadow !== undefined)", - " object.receiveShadow = data.receiveShadow;", - " if (data.shadow) {", - " if (data.shadow.bias !== undefined)", - " object.shadow.bias = data.shadow.bias;", - " if (data.shadow.normalBias !== undefined)", - " object.normalBias = data.shadow.normalBias;", - " if (data.shadow.radius !== undefined)", - " object.radius = data.shadow.radius;", - " if (data.shadow.mapSize !== undefined)", - " object.mapSize.fromArray(data.shadow.mapSize);", - " if (data.shadow.camera !== undefined) {", - " object.camera = this.parseObject(data.shadow.camera);", - " }", - " }", - " if (data.visible !== undefined)", - " object.visible = data.visible;", - " if (data.frustumCulled !== undefined)", - " object.frustumCulled = data.frustumCulled;", - " if (data.renderOrder !== undefined)", - " object.renderOrder = data.renderOrder;", - " if (data.userData !== undefined)", - " object.userData = data.userData;", - " if (data.layers !== undefined)", - " object.layers.mask = data.layers;", - " if (data.children !== undefined) {", - " const children = data.children;", - " for (let i = 0; i < children.length; i++) {", - " object.add(this.parseObject(children[i], geometries, materials, textures, animations));", - " }", - " }", - " if (data.animations !== undefined) {", - " const objectAnimations = data.animations;", - " for (let i = 0; i < objectAnimations.length; i++) {", - " const uuid = objectAnimations[i];", - " object.animations.push(animations[uuid]);", - " }", - " }", - " if (data.type === 'LOD') {", - " if (data.autoUpdate !== undefined)", - " object.autoUpdate = data.autoUpdate;", - " const levels = data.levels;", - " for (let l = 0; l < levels.length; l++) {", - " const level = levels[l];", - " const child = object.getObjectByProperty('uuid', level.object);", - " if (child !== undefined) {", - " object.addLevel(child, level.distance);", - " }", - " }", - " }", - " return object;", - " }", - "}", - "", - "const Plugins = [];", - "function loadPlugin(plugin) {", - " const existing = Plugins.find((item) => item.id === plugin.id);", - " if (!existing) {", - " plugin.initialize();", - " for (const emitterShape of plugin.emitterShapes) {", - " if (!EmitterShapes[emitterShape.type]) {", - " EmitterShapes[emitterShape.type] = emitterShape;", - " }", - " }", - " for (const behavior of plugin.behaviors) {", - " if (!BehaviorTypes[behavior.type]) {", - " BehaviorTypes[behavior.type] = behavior;", - " }", - " }", - " }", - "}", - "function unloadPlugin(pluginId) {", - " const plugin = Plugins.find((item) => item.id === pluginId);", - " if (plugin) {", - " for (const emitterShape of plugin.emitterShapes) {", - " if (EmitterShapes[emitterShape.type]) {", - " delete EmitterShapes[emitterShape.type];", - " }", - " }", - " for (const behavior of plugin.behaviors) {", - " if (BehaviorTypes[behavior.type]) {", - " delete BehaviorTypes[behavior.type];", - " }", - " }", - " }", - "}", - "", - "gdjs.__particleEmmiter3DExtension.NodeValueType = void 0;", - "(function (NodeValueType) {", - " NodeValueType[NodeValueType[\"Number\"] = 0] = \"Number\";", - " NodeValueType[NodeValueType[\"Vec2\"] = 1] = \"Vec2\";", - " NodeValueType[NodeValueType[\"Vec3\"] = 2] = \"Vec3\";", - " NodeValueType[NodeValueType[\"Vec4\"] = 3] = \"Vec4\";", - " NodeValueType[NodeValueType[\"Boolean\"] = 4] = \"Boolean\";", - " NodeValueType[NodeValueType[\"AnyType\"] = 5] = \"AnyType\";", - " NodeValueType[NodeValueType[\"NullableAnyType\"] = 6] = \"NullableAnyType\";", - " NodeValueType[NodeValueType[\"EventStream\"] = 7] = \"EventStream\";", - "})(gdjs.__particleEmmiter3DExtension.NodeValueType || (gdjs.__particleEmmiter3DExtension.NodeValueType = {}));", - "const genDefaultForNodeValueType = (type) => {", - " switch (type) {", - " case gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean:", - " return false;", - " case gdjs.__particleEmmiter3DExtension.NodeValueType.Number:", - " return 0;", - " case gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2:", - " return new THREE.Vector2();", - " case gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3:", - " return new THREE.Vector3();", - " case gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4:", - " return new THREE.Vector4();", - " case gdjs.__particleEmmiter3DExtension.NodeValueType.AnyType:", - " return 0;", - " case gdjs.__particleEmmiter3DExtension.NodeValueType.NullableAnyType:", - " return undefined;", - " }", - "};", - "", - "class Node {", - " constructor(type, signatureIndex = -1, data = {}) {", - " this.inputs = [];", - " this.outputs = [];", - " this.signatureIndex = -1;", - " this.position = new THREE.Vector2();", - " this.outputValues = [];", - " this.id = '' + Math.round(Math.random() * 100000);", - " this.type = type;", - " this.signatureIndex = signatureIndex;", - " this.data = data;", - " const realIndex = signatureIndex === -1 ? 0 : signatureIndex;", - " for (let i = 0; i < type.nodeTypeSignatures[realIndex].inputTypes.length; i++) {", - " this.inputs.push(undefined);", - " }", - " for (let i = 0; i < type.nodeTypeSignatures[realIndex].outputTypes.length; i++) {", - " this.outputs.push([]);", - " this.outputValues.push(genDefaultForNodeValueType(type.nodeTypeSignatures[realIndex].outputTypes[i]));", - " }", - " }", - " get inputTypes() {", - " const signatureIndex = this.signatureIndex === -1 ? 0 : this.signatureIndex;", - " return this.type.nodeTypeSignatures[signatureIndex].inputTypes;", - " }", - " get outputTypes() {", - " const signatureIndex = this.signatureIndex === -1 ? 0 : this.signatureIndex;", - " return this.type.nodeTypeSignatures[signatureIndex].outputTypes;", - " }", - " func(context, inputs, outputs) {", - " const signatureIndex = this.signatureIndex === -1 ? 0 : this.signatureIndex;", - " this.type.nodeTypeSignatures[signatureIndex].func(context, this.data, inputs, outputs);", - " }", - "}", - "class Wire {", - " constructor(input, inputIndex, output, outputIndex) {", - " this.input = input;", - " this.inputIndex = inputIndex;", - " this.input.outputs[inputIndex].push(this);", - " this.output = output;", - " this.outputIndex = outputIndex;", - " this.output.inputs[outputIndex] = this;", - " }", - "}", - "", - "class BaseCompiler {", - " constructor() {", - " this.visited = new Set();", - " BaseCompiler.Instance = this;", - " }", - " buildExecutionOrder(graph, context) {", - " graph.nodesInOrder.length = 0;", - " this.visited.clear();", - " for (let i = 0; i < graph.outputNodes.length; i++) {", - " const node = graph.outputNodes[i];", - " if (node.inputs[0] !== undefined) {", - " this._traverse(node, graph, context);", - " }", - " }", - " graph.compiled = true;", - " }", - " _traverse(node, graph, context) {", - " this.visited.add(node.id);", - " for (let i = 0; i < node.inputs.length; i++) {", - " if (node.inputs[i] instanceof Wire) {", - " const inputNode = node.inputs[i].input;", - " if (!this.visited.has(inputNode.id)) {", - " this._traverse(inputNode, graph, context);", - " }", - " }", - " else if (node.inputs[i] !== undefined);", - " else;", - " }", - " graph.nodesInOrder.push(node);", - " }", - "}", - "", - "class Interpreter extends BaseCompiler {", - " constructor() {", - " super();", - " }", - " executeCompiledGraph(graph, context) {", - " const nodes = graph.nodesInOrder;", - " for (let i = 0; i < nodes.length; i++) {", - " const inputValues = [];", - " const node = nodes[i];", - " for (let j = 0; j < node.inputs.length; j++) {", - " if (node.inputs[j] instanceof Wire) {", - " inputValues.push(node.inputs[j].input.outputValues[node.inputs[j].inputIndex]);", - " }", - " else if (node.inputs[j] !== undefined) {", - " inputValues.push(node.inputs[j].getValue(context));", - " }", - " else {", - " inputValues.push(undefined);", - " }", - " }", - " node.func(context, inputValues, node.outputValues);", - " }", - " }", - " run(graph, context) {", - " if (!graph.compiled) {", - " this.buildExecutionOrder(graph, context);", - " }", - " this.executeCompiledGraph(graph, context);", - " }", - "}", - "", - "class NodeType {", - " constructor(name) {", - " this.nodeTypeSignatures = [];", - " this.name = name;", - " }", - " addSignature(inputTypes, outputTypes, func) {", - " this.nodeTypeSignatures.push({", - " inputTypes: inputTypes,", - " outputTypes: outputTypes,", - " func: func,", - " });", - " }", - "}", - "class GraphNodeType extends NodeType {", - " constructor(nodeGraph) {", - " const inputTypes = [];", - " for (let i = 0; i < nodeGraph.inputNodes.length; i++) {", - " if (nodeGraph.inputNodes[i].type.name === 'input') {", - " inputTypes.push(nodeGraph.inputNodes[i].data.type);", - " }", - " }", - " const outputTypes = [];", - " for (let i = 0; i < nodeGraph.outputNodes.length; i++) {", - " if (nodeGraph.outputNodes[i].type.name === 'output') {", - " outputTypes.push(nodeGraph.outputNodes[i].data.type);", - " }", - " }", - " super(nodeGraph.name);", - " this.addSignature(inputTypes, outputTypes, (context, data, inputs, outputs) => {", - " context.inputs = inputs;", - " context.outputs = outputs;", - " Interpreter.Instance.run(nodeGraph, context);", - " });", - " this.nodeGraph = nodeGraph;", - " }", - "}", - "", - "const NodeTypes = {};", - "const addNode = new NodeType('add');", - "addNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] + inputs[1];", - "});", - "addNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " outputs[0].addVectors(inputs[0], inputs[1]);", - "});", - "addNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " outputs[0].addVectors(inputs[0], inputs[1]);", - "});", - "addNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " outputs[0].addVectors(inputs[0], inputs[1]);", - "});", - "NodeTypes['add'] = addNode;", - "const subNode = new NodeType('sub');", - "subNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] - inputs[1];", - "});", - "subNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " outputs[0].subVectors(inputs[0], inputs[1]);", - "});", - "subNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " outputs[0].subVectors(inputs[0], inputs[1]);", - "});", - "subNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " outputs[0].subVectors(inputs[0], inputs[1]);", - "});", - "NodeTypes['sub'] = subNode;", - "const mulNode = new NodeType('mul');", - "mulNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] * inputs[1];", - "});", - "mulNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " outputs[0].copy(inputs[0]).multiplyScalar(inputs[1]);", - "});", - "mulNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " outputs[0].copy(inputs[0]).multiplyScalar(inputs[1]);", - "});", - "mulNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " outputs[0].copy(inputs[0]).multiplyScalar(inputs[1]);", - "});", - "NodeTypes['mul'] = mulNode;", - "const divNode = new NodeType('div');", - "divNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] / inputs[1];", - "});", - "divNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " outputs[0].copy(inputs[0]).divideScalar(inputs[1]);", - "});", - "divNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " outputs[0].copy(inputs[0]).divideScalar(inputs[1]);", - "});", - "divNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " outputs[0].copy(inputs[0]).divideScalar(inputs[1]);", - "});", - "NodeTypes['div'] = divNode;", - "const sinNode = new NodeType('sin');", - "sinNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = Math.sin(inputs[0]);", - "});", - "NodeTypes['sin'] = sinNode;", - "const cosNode = new NodeType('cos');", - "cosNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = Math.cos(inputs[0]);", - "});", - "NodeTypes['cos'] = cosNode;", - "const tanNode = new NodeType('tan');", - "tanNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = Math.tan(inputs[0]);", - "});", - "NodeTypes['tan'] = tanNode;", - "const absNode = new NodeType('abs');", - "absNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = Math.abs(inputs[0]);", - "});", - "NodeTypes['abs'] = absNode;", - "const minNode = new NodeType('min');", - "minNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = Math.min(inputs[0], inputs[1]);", - "});", - "NodeTypes['min'] = minNode;", - "const maxNode = new NodeType('max');", - "maxNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = Math.max(inputs[0], inputs[1]);", - "});", - "NodeTypes['max'] = maxNode;", - "const dot = new NodeType('dot');", - "dot.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].dot(inputs[1]);", - "});", - "dot.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].dot(inputs[1]);", - "});", - "dot.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].dot(inputs[1]);", - "});", - "NodeTypes['dot'] = dot;", - "const cross = new NodeType('cross');", - "cross.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " outputs[0].crossVectors(inputs[0], inputs[1]);", - "});", - "NodeTypes['cross'] = cross;", - "const length = new NodeType('length');", - "length.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].length();", - "});", - "length.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].length();", - "});", - "length.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].length();", - "});", - "NodeTypes['length'] = length;", - "const lengthSq = new NodeType('lengthSq');", - "lengthSq.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].lengthSq();", - "});", - "lengthSq.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].lengthSq();", - "});", - "lengthSq.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].lengthSq();", - "});", - "NodeTypes['lengthSq'] = lengthSq;", - "const normalize = new NodeType('normalize');", - "normalize.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " outputs[0].copy(inputs[0]).normalize();", - "});", - "normalize.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " outputs[0].copy(inputs[0]).normalize();", - "});", - "normalize.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " outputs[0].copy(inputs[0]).normalize();", - "});", - "NodeTypes['normalize'] = normalize;", - "const distance = new NodeType('distance');", - "distance.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].distanceTo(inputs[1]);", - "});", - "distance.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].distanceTo(inputs[1]);", - "});", - "NodeTypes['distance'] = distance;", - "const andNode = new NodeType('and');", - "andNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean, gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] && inputs[1];", - "});", - "NodeTypes['and'] = andNode;", - "const orNode = new NodeType('or');", - "orNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean, gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] || inputs[1];", - "});", - "NodeTypes['or'] = orNode;", - "const notNode = new NodeType('not');", - "notNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = !inputs[0];", - "});", - "NodeTypes['not'] = notNode;", - "const equalNode = new NodeType('equal');", - "equalNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] === inputs[1];", - "});", - "equalNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].equals(inputs[1]);", - "});", - "equalNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].equals(inputs[1]);", - "});", - "equalNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].equals(inputs[1]);", - "});", - "NodeTypes['equal'] = equalNode;", - "const lessThanNode = new NodeType('lessThan');", - "lessThanNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] < inputs[1];", - "});", - "NodeTypes['lessThan'] = lessThanNode;", - "const greaterThanNode = new NodeType('greaterThan');", - "greaterThanNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] > inputs[1];", - "});", - "NodeTypes['greaterThan'] = greaterThanNode;", - "const lessThanOrEqualNode = new NodeType('lessThanOrEqual');", - "lessThanOrEqualNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] <= inputs[1];", - "});", - "NodeTypes['lessThanOrEqual'] = lessThanOrEqualNode;", - "const greaterThanOrEqualNode = new NodeType('greaterThanOrEqual');", - "greaterThanOrEqualNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] >= inputs[1];", - "});", - "NodeTypes['greaterThanOrEqual'] = greaterThanOrEqualNode;", - "const ifNode = new NodeType('if');", - "ifNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean, gdjs.__particleEmmiter3DExtension.NodeValueType.AnyType, gdjs.__particleEmmiter3DExtension.NodeValueType.AnyType], [gdjs.__particleEmmiter3DExtension.NodeValueType.AnyType], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0] ? inputs[1] : inputs[2];", - "});", - "NodeTypes['if'] = ifNode;", - "const numberNode = new NodeType('number');", - "numberNode.addSignature([], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = data.value;", - "});", - "NodeTypes['number'] = numberNode;", - "const vec2Node = new NodeType('vec2');", - "vec2Node.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " outputs[0].x = inputs[0];", - " outputs[0].y = inputs[1];", - "});", - "NodeTypes['vec2'] = vec2Node;", - "const vec3Node = new NodeType('vec3');", - "vec3Node.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " outputs[0].x = inputs[0];", - " outputs[0].y = inputs[1];", - " outputs[0].z = inputs[2];", - "});", - "NodeTypes['vec3'] = vec3Node;", - "const vec4Node = new NodeType('vec4');", - "vec4Node.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " outputs[0].x = inputs[0];", - " outputs[0].y = inputs[1];", - " outputs[0].z = inputs[2];", - " outputs[0].w = inputs[3];", - "});", - "NodeTypes['vec4'] = vec4Node;", - "const splitVec2Node = new NodeType('splitVec2');", - "splitVec2Node.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].x;", - " outputs[1] = inputs[0].y;", - "});", - "NodeTypes['splitVec2'] = splitVec2Node;", - "const splitVec3Node = new NodeType('splitVec3');", - "splitVec3Node.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].x;", - " outputs[1] = inputs[0].y;", - " outputs[2] = inputs[0].z;", - "});", - "NodeTypes['splitVec3'] = splitVec3Node;", - "const splitVec4Node = new NodeType('splitVec4');", - "splitVec4Node.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0].x;", - " outputs[1] = inputs[0].y;", - " outputs[2] = inputs[0].z;", - " outputs[3] = inputs[0].w;", - "});", - "NodeTypes['splitVec4'] = splitVec4Node;", - "const boolNode = new NodeType('bool');", - "boolNode.addSignature([], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = data.value;", - "});", - "NodeTypes['bool'] = boolNode;", - "const particlePropertyNode = new NodeType('particleProperty');", - "particlePropertyNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.NullableAnyType], [gdjs.__particleEmmiter3DExtension.NodeValueType.NullableAnyType], (context, data, inputs, outputs) => {", - " if (inputs[0] !== undefined) {", - " if (typeof inputs[0] === 'object') {", - " context.particle[data.property].copy(inputs[0]);", - " }", - " else {", - " context.particle[data.property] = inputs[0];", - " }", - " }", - " if (context.particle[data.property] !== undefined) {", - " if (typeof outputs[0] === 'object') {", - " outputs[0].copy(context.particle[data.property]);", - " }", - " else {", - " outputs[0] = context.particle[data.property];", - " }", - " }", - "});", - "NodeTypes['particleProperty'] = particlePropertyNode;", - "const emitNode = new NodeType('emit');", - "emitNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.EventStream], [], (context, data, inputs, outputs) => {", - " const arr = inputs[0];", - " for (let i = 0; i < arr.length; i++) {", - " context.signal(i, arr[i]);", - " }", - "});", - "NodeTypes['emit'] = emitNode;", - "const graphPropertyNode = new NodeType('graphProperty');", - "graphPropertyNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.NullableAnyType], [gdjs.__particleEmmiter3DExtension.NodeValueType.NullableAnyType], (context, data, inputs, outputs) => {", - " if (inputs[0] !== undefined) {", - " if (typeof inputs[0] === 'object') {", - " context.graph[data.property].copy(inputs[0]);", - " }", - " else {", - " context.graph[data.property] = inputs[0];", - " }", - " }", - " if (context.graph[data.property] !== undefined) {", - " if (typeof outputs[0] === 'object') {", - " outputs[0].copy(context.graph[data.property]);", - " }", - " else {", - " outputs[0] = context.graph[data.property];", - " }", - " }", - "});", - "NodeTypes['graphProperty'] = graphPropertyNode;", - "const startEventNode = new NodeType('startEvent');", - "startEventNode.addSignature([], [gdjs.__particleEmmiter3DExtension.NodeValueType.EventStream], (context, data, inputs, outputs) => {", - " outputs[0] = [{ type: 'start' }];", - "});", - "NodeTypes['startEvent'] = startEventNode;", - "const repeaterNode = new NodeType('repeater');", - "repeaterNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.EventStream, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.EventStream], (context, data, inputs, outputs) => {", - " const arr = inputs[0];", - " const count = inputs[1];", - " const result = [];", - " for (let j = 0; j < arr.length; j++) {", - " for (let i = 0; i < count; i++) {", - " result.push(arr[j]);", - " }", - " }", - " outputs[0] = result;", - "});", - "NodeTypes['repeater'] = repeaterNode;", - "const timeNode = new NodeType('time');", - "timeNode.addSignature([], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = context.emissionState.time;", - "});", - "NodeTypes['time'] = timeNode;", - "const deltaNode = new NodeType('delta');", - "deltaNode.addSignature([], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = context.delta;", - "});", - "NodeTypes['delta'] = deltaNode;", - "const outputNode = new NodeType('output');", - "outputNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0];", - "});", - "outputNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0];", - "});", - "outputNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0];", - "});", - "outputNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0];", - "});", - "outputNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], [gdjs.__particleEmmiter3DExtension.NodeValueType.Boolean], (context, data, inputs, outputs) => {", - " outputs[0] = inputs[0];", - "});", - "NodeTypes['output'] = outputNode;", - "const lerpNode = new NodeType('lerp');", - "lerpNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] =", - " inputs[0] * (1 - inputs[2]) + inputs[1] * inputs[2];", - "});", - "lerpNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " outputs[0].lerpVectors(inputs[0], inputs[1], inputs[2]);", - "});", - "lerpNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " outputs[0].lerpVectors(inputs[0], inputs[1], inputs[2]);", - "});", - "lerpNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " outputs[0].lerpVectors(inputs[0], inputs[1], inputs[2]);", - "});", - "NodeTypes['lerp'] = lerpNode;", - "const normalD = (x) => {", - " return (1 / Math.sqrt(2 * Math.PI)) * Math.exp(x * x * -0.5);", - "};", - "const normalDistributionNode = new NodeType('normDistrib');", - "normalDistributionNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = normalD(inputs[0]);", - "});", - "NodeTypes['normDistrib'] = normalDistributionNode;", - "const normcdfNode = new NodeType('normcdf');", - "normcdfNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " let x = inputs[0];", - " const a1 = 0.254829592;", - " const a2 = -0.284496736;", - " const a3 = 1.421413741;", - " const a4 = -1.453152027;", - " const a5 = 1.061405429;", - " const p = 0.3275911;", - " let sign = 1;", - " if (x < 0)", - " sign = -1;", - " x = Math.abs(x) / Math.sqrt(2.0);", - " const t = 1.0 / (1.0 + p * x);", - " const y = 1.0 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-x * x);", - " outputs[0] = 0.5 * (1.0 + sign * y);", - "});", - "NodeTypes['normcdf'] = normcdfNode;", - "const normcdfInvNode = new NodeType('normcdfInv');", - "const rationalApproximation = (t) => {", - " const c = [2.515517, 0.802853, 0.010328];", - " const d = [1.432788, 0.189269, 0.001308];", - " return t - ((c[2] * t + c[1]) * t + c[0]) / (((d[2] * t + d[1]) * t + d[0]) * t + 1.0);", - "};", - "const normcdfInv = (p) => {", - " if (p < 0.5) {", - " return -rationalApproximation(Math.sqrt(-2.0 * Math.log(p)));", - " }", - " else {", - " return rationalApproximation(Math.sqrt(-2.0 * Math.log(1 - p)));", - " }", - "};", - "normcdfInvNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = normcdfInv(inputs[0]);", - "});", - "NodeTypes['normcdfInv'] = normcdfInvNode;", - "const clampNode = new NodeType('clamp');", - "clampNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = Math.max(Math.min(inputs[0], inputs[2]), inputs[1]);", - "});", - "NodeTypes['clamp'] = clampNode;", - "const smoothstepNode = new NodeType('smoothstep');", - "smoothstepNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " const x = Math.max(Math.min(inputs[0], inputs[2]), inputs[1]);", - " outputs[0] = x * x * (3 - 2 * x);", - "});", - "NodeTypes['smoothstep'] = smoothstepNode;", - "const randomNode = new NodeType('random');", - "randomNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Number, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [gdjs.__particleEmmiter3DExtension.NodeValueType.Number], (context, data, inputs, outputs) => {", - " outputs[0] = Math.random() * (inputs[1] - inputs[0]) + inputs[0];", - "});", - "randomNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " let random = Math.random();", - " outputs[0].lerpVectors(inputs[0], inputs[1], random);", - "});", - "randomNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " let random = Math.random();", - " outputs[0].lerpVectors(inputs[0], inputs[1], random);", - "});", - "randomNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " let random = Math.random();", - " outputs[0].lerpVectors(inputs[0], inputs[1], random);", - "});", - "NodeTypes['random'] = randomNode;", - "const vrandNode = new NodeType('vrand');", - "vrandNode.addSignature([], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec2], (context, data, inputs, outputs) => {", - " let x = normcdfInv(Math.random());", - " let y = normcdfInv(Math.random());", - " const mag = Math.sqrt(x * x + y * y);", - " outputs[0].set(x / mag, y / mag);", - "});", - "vrandNode.addSignature([], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3], (context, data, inputs, outputs) => {", - " let x = normcdfInv(Math.random());", - " let y = normcdfInv(Math.random());", - " let z = normcdfInv(Math.random());", - " const mag = Math.sqrt(x * x + y * y + z * z);", - " outputs[0].set(x / mag, y / mag, z / mag);", - "});", - "vrandNode.addSignature([], [gdjs.__particleEmmiter3DExtension.NodeValueType.Vec4], (context, data, inputs, outputs) => {", - " let x = normcdfInv(Math.random());", - " let y = normcdfInv(Math.random());", - " let z = normcdfInv(Math.random());", - " let w = normcdfInv(Math.random());", - " const mag = Math.sqrt(x * x + y * y + z * z + w * w);", - " outputs[0].set(x / mag, y / mag, z / mag, w / mag);", - "});", - "NodeTypes['vrand'] = vrandNode;", - "const bsdfNode = new NodeType('bsdf');", - "bsdfNode.addSignature([gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Vec3, gdjs.__particleEmmiter3DExtension.NodeValueType.Number], [], (context, data, inputs, outputs) => { });", - "NodeTypes['bsdf'] = bsdfNode;", - "const OutputNodeTypeNames = new Set(['output', 'particleProperty', 'graphProperty', 'emit']);", - "", - "class NodeGraph {", - " constructor(name) {", - " this.inputNodes = [];", - " this.outputNodes = [];", - " this.allNodes = new Map();", - " this.wires = [];", - " this.compiled = false;", - " this.nodesInOrder = [];", - " this.version = '1.0';", - " this.uuid = THREE.MathUtils.generateUUID();", - " this.name = name;", - " this.revision = 0;", - " }", - " addWire(wire) {", - " this.wires.push(wire);", - " this.revision++;", - " }", - " addNode(node) {", - " this.allNodes.set(node.id, node);", - " if (node.type === NodeTypes['input']) {", - " this.inputNodes.push(node);", - " }", - " else if (OutputNodeTypeNames.has(node.type.name)) {", - " this.outputNodes.push(node);", - " }", - " this.revision++;", - " }", - " getNode(id) {", - " return this.allNodes.get(id);", - " }", - " deleteNode(node) {", - " this.allNodes.delete(node.id);", - " this.revision++;", - " }", - " deleteWire(wire) {", - " let index = wire.input.outputs[wire.inputIndex].indexOf(wire);", - " if (index !== -1) {", - " wire.input.outputs[wire.inputIndex].splice(index, 1);", - " }", - " wire.output.inputs[wire.outputIndex] = undefined;", - " index = this.wires.indexOf(wire);", - " if (index != -1) {", - " this.wires[index] = this.wires[this.wires.length - 1];", - " this.wires.pop();", - " }", - " this.revision++;", - " }", - " toJSON() {", - " throw new Error('not implemented');", - " }", - " clone() {", - " throw new Error('not implemented');", - " }", - "}", - "", - "new THREE.Vector3(0, 0, 1);", - "const tempQ = new THREE.Quaternion();", - "const tempV = new THREE.Vector3();", - "const tempV2 = new THREE.Vector3();", - "const PREWARM_FPS = 60;", - "const DEFAULT_GEOMETRY = new THREE.PlaneGeometry(1, 1, 1, 1);", - "class NodeVFX {", - " set time(time) {", - " this.emissionState.time = time;", - " }", - " get time() {", - " return this.emissionState.time;", - " }", - " get layers() {", - " return this.rendererSettings.layers;", - " }", - " get texture() {", - " return this.rendererSettings.material.map;", - " }", - " set texture(texture) {", - " this.rendererSettings.material.map = texture;", - " this.neededToUpdateRender = true;", - " }", - " get material() {", - " return this.rendererSettings.material;", - " }", - " set material(material) {", - " this.rendererSettings.material = material;", - " this.neededToUpdateRender = true;", - " }", - " get instancingGeometry() {", - " return this.rendererSettings.instancingGeometry;", - " }", - " set instancingGeometry(geometry) {", - " this.restart();", - " this.particles.length = 0;", - " this.rendererSettings.instancingGeometry = geometry;", - " this.neededToUpdateRender = true;", - " }", - " get renderMode() {", - " return this.rendererSettings.renderMode;", - " }", - " set renderMode(renderMode) {", - " if ((this.rendererSettings.renderMode != gdjs.__particleEmmiter3DExtension.RenderMode.Trail && renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) ||", - " (this.rendererSettings.renderMode == gdjs.__particleEmmiter3DExtension.RenderMode.Trail && renderMode !== gdjs.__particleEmmiter3DExtension.RenderMode.Trail)) {", - " this.restart();", - " this.particles.length = 0;", - " }", - " if (this.rendererSettings.renderMode !== renderMode) {", - " switch (renderMode) {", - " case gdjs.__particleEmmiter3DExtension.RenderMode.Trail:", - " this.rendererEmitterSettings = {", - " startLength: 30,", - " followLocalOrigin: false,", - " };", - " break;", - " case gdjs.__particleEmmiter3DExtension.RenderMode.Mesh:", - " this.rendererEmitterSettings = {", - " geometry: new THREE.PlaneGeometry(1, 1),", - " };", - " break;", - " case gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard:", - " case gdjs.__particleEmmiter3DExtension.RenderMode.VerticalBillBoard:", - " case gdjs.__particleEmmiter3DExtension.RenderMode.HorizontalBillBoard:", - " case gdjs.__particleEmmiter3DExtension.RenderMode.StretchedBillBoard:", - " this.rendererEmitterSettings = {};", - " break;", - " }", - " }", - " this.rendererSettings.renderMode = renderMode;", - " this.neededToUpdateRender = true;", - " }", - " get renderOrder() {", - " return this.rendererSettings.renderOrder;", - " }", - " set renderOrder(renderOrder) {", - " this.rendererSettings.renderOrder = renderOrder;", - " this.neededToUpdateRender = true;", - " }", - " get blending() {", - " return this.rendererSettings.material.blending;", - " }", - " set blending(blending) {", - " this.rendererSettings.material.blending = blending;", - " this.neededToUpdateRender = true;", - " }", - " constructor(parameters) {", - " var _a, _b, _c, _d, _e, _f, _g;", - " this.temp = new THREE.Vector3();", - " this.travelDistance = 0;", - " this.normalMatrix = new THREE.Matrix3();", - " this.speedFactor = 0;", - " this.autoDestroy = parameters.autoDestroy === undefined ? false : parameters.autoDestroy;", - " this.duration = (_a = parameters.duration) !== null && _a !== void 0 ? _a : 1;", - " this.looping = parameters.looping === undefined ? true : parameters.looping;", - " this.prewarm = parameters.prewarm === undefined ? false : parameters.prewarm;", - " this.worldSpace = (_b = parameters.worldSpace) !== null && _b !== void 0 ? _b : false;", - " this.rendererEmitterSettings = (_c = parameters.rendererEmitterSettings) !== null && _c !== void 0 ? _c : {};", - " this.emissionGraph = parameters.emissionGraph;", - " this.updateGraph = parameters.updateGraph;", - " this.interpreter = new Interpreter();", - " this.rendererSettings = {", - " instancingGeometry: (_d = parameters.instancingGeometry) !== null && _d !== void 0 ? _d : DEFAULT_GEOMETRY,", - " renderMode: (_e = parameters.renderMode) !== null && _e !== void 0 ? _e : gdjs.__particleEmmiter3DExtension.RenderMode.BillBoard,", - " renderOrder: (_f = parameters.renderOrder) !== null && _f !== void 0 ? _f : 0,", - " material: parameters.material,", - " layers: (_g = parameters.layers) !== null && _g !== void 0 ? _g : new THREE.Layers(),", - " uTileCount: 1,", - " vTileCount: 1,", - " };", - " this.neededToUpdateRender = true;", - " this.particles = new Array();", - " this.emitter = new ParticleEmitter(this);", - " this.paused = false;", - " this.particleNum = 0;", - " this.emissionState = {", - " time: 0,", - " };", - " this.emitEnded = false;", - " this.markForDestroy = false;", - " this.prewarmed = false;", - " }", - " pause() {", - " this.paused = true;", - " }", - " play() {", - " this.paused = false;", - " }", - " spawn(emissionState, matrix) {", - " tempQ.setFromRotationMatrix(matrix);", - " const translation = tempV;", - " const quaternion = tempQ;", - " const scale = tempV2;", - " matrix.decompose(translation, quaternion, scale);", - " this.particleNum++;", - " while (this.particles.length < this.particleNum) {", - " this.particles.push(new NodeParticle());", - " }", - " const particle = this.particles[this.particleNum - 1];", - " particle.reset();", - " this.interpreter.run(this.updateGraph, { particle: particle, emissionState: this.emissionState });", - " if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail &&", - " this.rendererEmitterSettings.followLocalOrigin) {", - " const trail = particle;", - " trail.localPosition = new THREE.Vector3().copy(trail.position);", - " }", - " if (this.worldSpace) {", - " particle.position.applyMatrix4(matrix);", - " particle.size *= (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z)) / 3;", - " particle.velocity.multiply(scale).applyMatrix3(this.normalMatrix);", - " if (particle.rotation && particle.rotation instanceof THREE.Quaternion) {", - " particle.rotation.multiplyQuaternions(tempQ, particle.rotation);", - " }", - " }", - " }", - " endEmit() {", - " this.emitEnded = true;", - " if (this.autoDestroy) {", - " this.markForDestroy = true;", - " }", - " }", - " dispose() {", - " if (this._renderer)", - " this._renderer.deleteSystem(this);", - " this.emitter.dispose();", - " if (this.emitter.parent)", - " this.emitter.parent.remove(this.emitter);", - " }", - " restart() {", - " this.paused = false;", - " this.particleNum = 0;", - " this.emissionState.time = 0;", - " this.emitEnded = false;", - " this.markForDestroy = false;", - " this.prewarmed = false;", - " }", - " update(delta) {", - " if (this.paused)", - " return;", - " let currentParent = this.emitter;", - " while (currentParent.parent) {", - " currentParent = currentParent.parent;", - " }", - " if (currentParent.type !== 'Scene') {", - " this.dispose();", - " return;", - " }", - " if (this.emitEnded && this.particleNum === 0) {", - " if (this.markForDestroy && this.emitter.parent)", - " this.dispose();", - " return;", - " }", - " if (this.looping && this.prewarm && !this.prewarmed) {", - " this.prewarmed = true;", - " for (let i = 0; i < this.duration * PREWARM_FPS; i++) {", - " this.update(1.0 / PREWARM_FPS);", - " }", - " }", - " if (delta > 0.1) {", - " delta = 0.1;", - " }", - " if (this.neededToUpdateRender) {", - " if (this._renderer)", - " this._renderer.updateSystem(this);", - " this.neededToUpdateRender = false;", - " }", - " this.emit(delta, this.emissionState, this.emitter.matrixWorld);", - " const context = { particle: undefined, emissionState: this.emissionState, delta };", - " for (let i = 0; i < this.particleNum; i++) {", - " context.particle = this.particles[i];", - " this.interpreter.run(this.updateGraph, context);", - " }", - " for (let i = 0; i < this.particleNum; i++) {", - " if (this.rendererEmitterSettings.followLocalOrigin &&", - " this.particles[i].localPosition) {", - " this.particles[i].position.copy(this.particles[i].localPosition);", - " if (this.particles[i].parentMatrix) {", - " this.particles[i].position.applyMatrix4(this.particles[i].parentMatrix);", - " }", - " else {", - " this.particles[i].position.applyMatrix4(this.emitter.matrixWorld);", - " }", - " }", - " else {", - " this.particles[i].position.addScaledVector(this.particles[i].velocity, delta);", - " }", - " this.particles[i].age += delta;", - " }", - " if (this.rendererSettings.renderMode === gdjs.__particleEmmiter3DExtension.RenderMode.Trail) {", - " for (let i = 0; i < this.particleNum; i++) {", - " const particle = this.particles[i];", - " particle.update();", - " }", - " }", - " for (let i = 0; i < this.particleNum; i++) {", - " const particle = this.particles[i];", - " if (particle.died && (!(particle instanceof TrailParticle) || particle.previous.length === 0)) {", - " this.particles[i] = this.particles[this.particleNum - 1];", - " this.particles[this.particleNum - 1] = particle;", - " this.particleNum--;", - " i--;", - " }", - " }", - " }", - " emit(delta, emissionState, emitterMatrix) {", - " if (emissionState.time > this.duration) {", - " if (this.looping) {", - " emissionState.time -= this.duration;", - " }", - " else {", - " if (!this.emitEnded) {", - " this.endEmit();", - " }", - " }", - " }", - " this.normalMatrix.getNormalMatrix(emitterMatrix);", - " const context = {", - " signal: () => {", - " this.spawn(emissionState, emitterMatrix);", - " },", - " emissionState,", - " delta,", - " };", - " if (!this.emitEnded) {", - " this.interpreter.run(this.emissionGraph, context);", - " }", - " if (this.previousWorldPos === undefined)", - " this.previousWorldPos = new THREE.Vector3();", - " this.emitter.getWorldPosition(this.previousWorldPos);", - " emissionState.time += delta;", - " }", - " toJSON(meta, options = {}) {", - " return {};", - " }", - " getRendererSettings() {", - " return this.rendererSettings;", - " }", - " clone() {", - " return this;", - " }", - "}", - "", - "gdjs.__particleEmmiter3DExtension.ApplyCollision = ApplyCollision;", - "gdjs.__particleEmmiter3DExtension.ApplyForce = ApplyForce;", - "gdjs.__particleEmmiter3DExtension.ApplySequences = ApplySequences;", - "gdjs.__particleEmmiter3DExtension.AxisAngleGenerator = AxisAngleGenerator;", - "gdjs.__particleEmmiter3DExtension.BatchedParticleRenderer = BatchedParticleRenderer;", - "gdjs.__particleEmmiter3DExtension.BatchedRenderer = BatchedRenderer;", - "gdjs.__particleEmmiter3DExtension.BehaviorFromJSON = BehaviorFromJSON;", - "gdjs.__particleEmmiter3DExtension.BehaviorTypes = BehaviorTypes;", - "gdjs.__particleEmmiter3DExtension.Bezier = Bezier;", - "gdjs.__particleEmmiter3DExtension.ChangeEmitDirection = ChangeEmitDirection;", - "gdjs.__particleEmmiter3DExtension.ColorGeneratorFromJSON = ColorGeneratorFromJSON;", - "gdjs.__particleEmmiter3DExtension.ColorOverLife = ColorOverLife;", - "gdjs.__particleEmmiter3DExtension.ColorRange = ColorRange;", - "gdjs.__particleEmmiter3DExtension.ConeEmitter = ConeEmitter;", - "gdjs.__particleEmmiter3DExtension.ConstantColor = ConstantColor;", - "gdjs.__particleEmmiter3DExtension.ConstantValue = ConstantValue;", - "gdjs.__particleEmmiter3DExtension.DonutEmitter = DonutEmitter;", - "gdjs.__particleEmmiter3DExtension.EmitSubParticleSystem = EmitSubParticleSystem;", - "gdjs.__particleEmmiter3DExtension.EmitterFromJSON = EmitterFromJSON;", - "gdjs.__particleEmmiter3DExtension.EmitterShapes = EmitterShapes;", - "gdjs.__particleEmmiter3DExtension.EulerGenerator = EulerGenerator;", - "gdjs.__particleEmmiter3DExtension.ForceOverLife = ForceOverLife;", - "gdjs.__particleEmmiter3DExtension.FrameOverLife = FrameOverLife;", - "gdjs.__particleEmmiter3DExtension.GeneratorFromJSON = GeneratorFromJSON;", - "gdjs.__particleEmmiter3DExtension.Gradient = Gradient;", - "gdjs.__particleEmmiter3DExtension.GraphNodeType = GraphNodeType;", - "gdjs.__particleEmmiter3DExtension.GravityForce = GravityForce;", - "gdjs.__particleEmmiter3DExtension.GridEmitter = GridEmitter;", - "gdjs.__particleEmmiter3DExtension.Interpreter = Interpreter;", - "gdjs.__particleEmmiter3DExtension.IntervalValue = IntervalValue;", - "gdjs.__particleEmmiter3DExtension.MeshSurfaceEmitter = MeshSurfaceEmitter;", - "gdjs.__particleEmmiter3DExtension.Node = Node;", - "gdjs.__particleEmmiter3DExtension.NodeGraph = NodeGraph;", - "gdjs.__particleEmmiter3DExtension.NodeType = NodeType;", - "gdjs.__particleEmmiter3DExtension.NodeTypes = NodeTypes;", - "gdjs.__particleEmmiter3DExtension.Noise = Noise;", - "gdjs.__particleEmmiter3DExtension.OrbitOverLife = OrbitOverLife;", - "gdjs.__particleEmmiter3DExtension.ParticleEmitter = ParticleEmitter;", - "gdjs.__particleEmmiter3DExtension.ParticleSystem = ParticleSystem;", - "gdjs.__particleEmmiter3DExtension.PiecewiseBezier = PiecewiseBezier;", - "gdjs.__particleEmmiter3DExtension.PiecewiseFunction = PiecewiseFunction;", - "gdjs.__particleEmmiter3DExtension.Plugins = Plugins;", - "gdjs.__particleEmmiter3DExtension.PointEmitter = PointEmitter;", - "gdjs.__particleEmmiter3DExtension.QuarksLoader = QuarksLoader;", - "gdjs.__particleEmmiter3DExtension.RandomColor = RandomColor;", - "gdjs.__particleEmmiter3DExtension.RandomColorBetweenGradient = RandomColorBetweenGradient;", - "gdjs.__particleEmmiter3DExtension.RandomQuatGenerator = RandomQuatGenerator;", - "gdjs.__particleEmmiter3DExtension.RecordState = RecordState;", - "gdjs.__particleEmmiter3DExtension.Rotation3DOverLife = Rotation3DOverLife;", - "gdjs.__particleEmmiter3DExtension.RotationGeneratorFromJSON = RotationGeneratorFromJSON;", - "gdjs.__particleEmmiter3DExtension.RotationOverLife = RotationOverLife;", - "gdjs.__particleEmmiter3DExtension.SequencerFromJSON = SequencerFromJSON;", - "gdjs.__particleEmmiter3DExtension.SizeOverLife = SizeOverLife;", - "gdjs.__particleEmmiter3DExtension.SpeedOverLife = SpeedOverLife;", - "gdjs.__particleEmmiter3DExtension.SphereEmitter = SphereEmitter;", - "gdjs.__particleEmmiter3DExtension.SpriteBatch = SpriteBatch;", - "gdjs.__particleEmmiter3DExtension.SpriteParticle = SpriteParticle;", - "gdjs.__particleEmmiter3DExtension.TextureSequencer = TextureSequencer;", - "gdjs.__particleEmmiter3DExtension.TrailBatch = TrailBatch;", - "gdjs.__particleEmmiter3DExtension.TrailParticle = TrailParticle;", - "gdjs.__particleEmmiter3DExtension.TurbulenceField = TurbulenceField;", - "gdjs.__particleEmmiter3DExtension.VFXBatch = VFXBatch;", - "gdjs.__particleEmmiter3DExtension.ValueGeneratorFromJSON = ValueGeneratorFromJSON;", - "gdjs.__particleEmmiter3DExtension.WidthOverLength = WidthOverLength;", - "gdjs.__particleEmmiter3DExtension.Wire = Wire;", - "gdjs.__particleEmmiter3DExtension.genDefaultForNodeValueType = genDefaultForNodeValueType;", - "gdjs.__particleEmmiter3DExtension.getPhysicsResolver = getPhysicsResolver;", - "gdjs.__particleEmmiter3DExtension.loadPlugin = loadPlugin;", - "gdjs.__particleEmmiter3DExtension.setPhysicsResolver = setPhysicsResolver;", - "gdjs.__particleEmmiter3DExtension.unloadPlugin = unloadPlugin;", - "" - ], - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true - } - ] - } - ], - "parameters": [], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "onScenePreEvents", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "\r", - "// See doStepPostEvents\r", - "runtimeScene.__particleEmmiter3DExtension = runtimeScene.__particleEmmiter3DExtension || {};\r", - "runtimeScene.__particleEmmiter3DExtension.emittersStepped = 0;" - ], - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [], - "objectGroups": [] - } - ], - "eventsBasedBehaviors": [], - "eventsBasedObjects": [ - { - "defaultName": "ParticleEmitter", - "description": "Display a large number of particles to create visual effects.", - "fullName": "3D particle emitter", - "is3D": true, - "name": "ParticleEmitter3D", - "eventsFunctions": [ - { - "fullName": "", - "functionType": "Action", - "name": "onCreated", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::DefineHelperClasses" - }, - "parameters": [ - "", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const BatchedRenderer = gdjs.__particleEmmiter3DExtension.BatchedRenderer;", - "const ParticleSystem = gdjs.__particleEmmiter3DExtension.ParticleSystem;", - "const TextureLoader = gdjs.__particleEmmiter3DExtension.TextureLoader;", - "const IntervalValue = gdjs.__particleEmmiter3DExtension.IntervalValue;", - "const ConstantValue = gdjs.__particleEmmiter3DExtension.ConstantValue;", - "const ConstantColor = gdjs.__particleEmmiter3DExtension.ConstantColor;", - "const ColorOverLife = gdjs.__particleEmmiter3DExtension.ColorOverLife;", - "const SizeOverLife = gdjs.__particleEmmiter3DExtension.SizeOverLife;", - "const ApplyForce = gdjs.__particleEmmiter3DExtension.ApplyForce;", - "const Gradient = gdjs.__particleEmmiter3DExtension.Gradient;", - "const PiecewiseBezier = gdjs.__particleEmmiter3DExtension.PiecewiseBezier;", - "const Bezier = gdjs.__particleEmmiter3DExtension.Bezier;", - "const PointEmitter = gdjs.__particleEmmiter3DExtension.PointEmitter;", - "const ConeEmitter = gdjs.__particleEmmiter3DExtension.ConeEmitter;", - "const RenderMode = gdjs.__particleEmmiter3DExtension.RenderMode;", - "", - "const ParticleEmitterAdapter = gdjs.__particleEmmiter3DExtension.ParticleEmitterAdapter;", - "", - "/** @type {gdjs.CustomRuntimeObject} */", - "const object = objects[0];", - "", - "// Here runtimeScene is the gdjs.CustomRuntimeObjectInstanceContainer inside the custom object.", - "const gameScene = object.getRuntimeScene();", - "", - "/** @type {SpriteObjectDataType} */", - "const particleSpriteData = object._instanceContainer._objects.get(\"Particle\");", - "const resourceName = particleSpriteData.animations[0].directions[0].sprites[0].image;", - "const texture = object", - " .getInstanceContainer()", - " .getGame()", - " .getImageManager().getThreeTexture(resourceName);", - "", - "// Set the blending here because changes are not applied after the emitter creation.", - "const blendingString = object._getBlending();", - "const blending =", - " blendingString === \"Additive\" ? THREE.AdditiveBlending :", - " blendingString === \"Normal\" ? THREE.NormalBlending :", - " blendingString === \"Subtractive\" ? THREE.SubtractiveBlending :", - " blendingString === \"Multiply\" ? THREE.MultiplyBlending :", - " blendingString === \"None\" ? THREE.NoBlending :", - " THREE.AdditiveBlending;", - "", - "", - "// Build a configuration with the right kind of objects.", - "// These values are not important as they are overrided by the object properties values.", - "const muzzle = {", - " duration: 10,", - " looping: false,", - " startLife: new IntervalValue(1, 2),", - " startSpeed: new IntervalValue(100, 200),", - " startSize: new IntervalValue(20, 50),", - " startColor: new ConstantColor(new THREE.Vector4(1, 1, 1, 1)),", - " worldSpace: true,", - "", - " maxParticle: 5,", - " emissionOverTime: new ConstantValue(50),", - " emissionBursts: [{", - " time: 0,", - " count: new ConstantValue(1),", - " cycle: 1,", - " interval: 0.01,", - " probability: 1,", - " }],", - "", - " shape: new PointEmitter(),", - " material: new THREE.MeshBasicMaterial({", - " map: texture,", - " blending: blending,", - " transparent: true,", - " side: THREE.DoubleSide", - " }),", - " startTileIndex: 0,", - " uTileCount: 1,", - " vTileCount: 1,", - " renderOrder: 2,", - " renderMode: RenderMode.BillBoard", - "};", - "const particleSystem = new ParticleSystem(muzzle);", - "", - "const colorOverLife = new ColorOverLife(", - " new Gradient(", - " [", - " [new THREE.Vector3(1, 0, 0), 0],", - " [new THREE.Vector3(1, 0, 0), 1],", - " ],", - " [", - " [1, 0],", - " [1, 1],", - " ]", - " ));", - "particleSystem.addBehavior(colorOverLife);", - "const sizeOverLife = new SizeOverLife(new PiecewiseBezier([[new Bezier(1, 2 / 3, 1 / 3, 0), 0]]));", - "particleSystem.addBehavior(sizeOverLife);", - "const applyForce = new ApplyForce(new THREE.Vector3(0, 0, -1), new ConstantValue(0));", - "particleSystem.addBehavior(applyForce);", - "", - "particleSystem.emitter.rotation.order = 'ZYX';", - "particleSystem.emitter.name = object.getName() + object.getNameId();", - "", - "object.__particleEmitterAdapter = new ParticleEmitterAdapter(particleSystem, colorOverLife, sizeOverLife, applyForce);", - "object.__particleSystem = particleSystem;", - "", - "// This is a hack that may break in future releases.", - "// Replace the group that would hold children objects by the emmiter.", - "const layer = gameScene.getLayer(object.getLayer());", - "layer.getRenderer().remove3DRendererObject(object.getRenderer()._threeGroup);", - "object.getRenderer()._threeGroup = particleSystem.emitter;", - "layer.getRenderer().add3DRendererObject(particleSystem.emitter);", - "", - "// See doStepPostEvents", - "gameScene.__particleEmmiter3DExtension = gameScene.__particleEmmiter3DExtension || {};", - "gameScene.__particleEmmiter3DExtension.emittersCount = gameScene.__particleEmmiter3DExtension.emittersCount || 0;", - "gameScene.__particleEmmiter3DExtension.emittersCount++;", - "", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::UpdateFromProperties" - }, - "parameters": [ - "Object", - "" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "onDestroy", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "/** @type {gdjs.CustomRuntimeObject} */", - "const object = objects[0];", - "// Here runtimeScene is the gdjs.CustomRuntimeObjectInstanceContainer inside the custom object.", - "const gameScene = object.getRuntimeScene();", - "", - "object.__particleSystem.dispose();", - "", - "// See doStepPostEvents", - "gameScene.__particleEmmiter3DExtension.emittersCount--;" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "onHotReloading", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::UpdateFromProperties" - }, - "parameters": [ - "Object", - "" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "Update from properties.", - "fullName": "Update from properties", - "functionType": "Action", - "name": "UpdateFromProperties", - "private": true, - "sentence": "Update from properties of _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetZ" - }, - "parameters": [ - "Object", - "=", - "Object.Z()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetRotationX" - }, - "parameters": [ - "Object", - "=", - "Object.PropertyRotationX()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetRotationY" - }, - "parameters": [ - "Object", - "=", - "Object.PropertyRotationY()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartColor" - }, - "parameters": [ - "Object", - "=", - "Object.StartColor()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetEndColor" - }, - "parameters": [ - "Object", - "=", - "Object.EndColor()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.StartOpacity()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetEndOpacity" - }, - "parameters": [ - "Object", - "=", - "Object.EndOpacity()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetFlow" - }, - "parameters": [ - "Object", - "=", - "Object.Flow()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartSizeMin" - }, - "parameters": [ - "Object", - "=", - "Object.StartSizeMin()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartSizeMax" - }, - "parameters": [ - "Object", - "=", - "Object.StartSizeMax()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetEndScale" - }, - "parameters": [ - "Object", - "=", - "Object.EndScale()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartSpeedMin" - }, - "parameters": [ - "Object", - "=", - "Object.StartSpeedMin()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartSpeedMax" - }, - "parameters": [ - "Object", - "=", - "Object.StartSpeedMax()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetLifespanMin" - }, - "parameters": [ - "Object", - "=", - "Object.LifespanMin()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetLifespanMax" - }, - "parameters": [ - "Object", - "=", - "Object.LifespanMax()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetDuration" - }, - "parameters": [ - "Object", - "=", - "Object.Duration()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetSpayConeAngle" - }, - "parameters": [ - "Object", - "=", - "Object.SpayConeAngle()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetGravity" - }, - "parameters": [ - "Object", - "=", - "Object.Gravity()", - "" - ] - }, - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetGravityTop" - }, - "parameters": [ - "Object", - "=", - "Object.GravityTop()", - "" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "ParticleEmitter3D::ParticleEmitter3D::PropertyAreParticlesRelative" - }, - "parameters": [ - "Object" - ] - } - ], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetAreParticlesRelative" - }, - "parameters": [ - "Object", - "no", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::PropertyAreParticlesRelative" - }, - "parameters": [ - "Object" - ] - } - ], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetAreParticlesRelative" - }, - "parameters": [ - "Object", - "yes", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "TODO: Blending can't be changed." - }, - { - "disabled": true, - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetBlending" - }, - "parameters": [ - "Object", - "=", - "Object.Blending()", - "" - ] - } - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "Action", - "name": "doStepPostEvents", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::HasEnded" - }, - "parameters": [ - "Object", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::Delete" - }, - "parameters": [ - "Object", - "" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "ParticleEmitter3D::ParticleEmitter3D::HasEnded" - }, - "parameters": [ - "Object", - "" - ] - } - ], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::RegisterInLayer" - }, - "parameters": [ - "Object", - "" - ] - } - ], - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];", - "// Here runtimeScene is the gdjs.CustomRuntimeObjectInstanceContainer inside the custom object.", - "const gameScene = object.getRuntimeScene();", - "const layer = gameScene.getLayer(object.getLayer());", - "", - "const emitter = object.__particleSystem.emitter;", - "const objectRotationZ = -object.getAngle() * Math.PI / 180;", - "if (emitter.position.x !== object.getX()", - " || emitter.position.y !== -object.getY()", - " || emitter.position.z !== object._getZ()", - " || emitter.rotation.z !== objectRotationZ) {", - " emitter.position.x = object.getX();", - " emitter.position.y = -object.getY();", - " emitter.position.z = object._getZ();", - " emitter.rotation.z = objectRotationZ;", - " emitter.updateMatrixWorld(true);", - "}", - "", - "// Update batch system after having moved every emitter.", - "// See onScenePreEvents", - "gameScene.__particleEmmiter3DExtension.emittersStepped++;", - "if (gameScene.__particleEmmiter3DExtension.emittersStepped === gameScene.__particleEmmiter3DExtension.emittersCount) {", - " gameScene.__particleEmmiter3DExtension.layerNames = gameScene.__particleEmmiter3DExtension.layerNames || [];", - " const layerNames = gameScene.__particleEmmiter3DExtension.layerNames;", - " gameScene.getAllLayerNames(layerNames);", - " for (const layerName of layerNames) {", - " const layer = gameScene.getLayer(layerName);", - " if (layer.__particleEmmiter3DExtension) {", - " layer.__particleEmmiter3DExtension.batchSystem.update(object.getElapsedTime() / 1000);", - " }", - " }", - "}" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "Register in layer", - "functionType": "Action", - "name": "RegisterInLayer", - "private": true, - "sentence": "Register _PARAM0_ in layer", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "/** @type {gdjs.CustomRuntimeObject} */", - "const object = objects[0];", - "", - "// TODO Handle layer changes?", - "if (object.__emitterLayerName === undefined) {", - " // Here runtimeScene is the gdjs.CustomRuntimeObjectInstanceContainer inside the custom object.", - " const gameScene = object.getRuntimeScene();", - "", - " const layer = gameScene.getLayer(object.getLayer());", - " layer.__particleEmmiter3DExtension = layer.__particleEmmiter3DExtension || {};", - " if (!layer.__particleEmmiter3DExtension.batchSystem) {", - " const batchSystem = new gdjs.__particleEmmiter3DExtension.BatchedRenderer();", - " const threeScene = layer.getRenderer().getThreeScene();", - " if (threeScene) {", - " threeScene.add(batchSystem);", - " }", - " layer.__particleEmmiter3DExtension.batchSystem = batchSystem;", - " }", - " layer.__particleEmmiter3DExtension.batchSystem.addSystem(object.__particleSystem);", - " object.__emitterLayerName = layer.getName();", - "}" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "Delete itself", - "fullName": "Delete itself", - "functionType": "Action", - "name": "Delete", - "private": true, - "sentence": "Delete _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];", - "", - "object.deleteFromScene(object.getParent());", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "Check that emission has ended and no particle is alive anymore.", - "fullName": "Emission has ended", - "functionType": "Condition", - "name": "HasEnded", - "sentence": "Emission from _PARAM0_ has ended", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "\r", - "eventsFunctionContext.returnValue =\r", - " object._getShouldAutodestruct()\r", - " && object.__particleSystem.emitEnded\r", - " && object.__particleSystem.particleNum === 0;\r", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "Restart particule emission from the beginning.", - "fullName": "Restart", - "functionType": "Action", - "name": "Restart", - "sentence": "Restart particule emission from _PARAM0_", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "/** @type {gdjs.CustomRuntimeObject} */\r", - "const object = objects[0];\r", - "\r", - "object.__particleSystem.restart();\r", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the Z position of the emitter.", - "fullName": "Z (elevation)", - "functionType": "ExpressionAndCondition", - "group": "Position", - "name": "Z", - "sentence": "the Z position", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.PropertyZ()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "Z", - "name": "SetZ", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyZ" - }, - "parameters": [ - "Object", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the rotation on X axis of the emitter.", - "fullName": "Rotation on X axis", - "functionType": "ExpressionAndCondition", - "group": "Angle", - "name": "RotationX", - "sentence": "the rotation on X axis", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.PropertyRotationX()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "RotationX", - "name": "SetRotationX", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyRotationX" - }, - "parameters": [ - "Object", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "\r", - "object.__particleSystem.emitter.rotation.x = eventsFunctionContext.getArgument(\"Value\") * Math.PI / 180;" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the rotation on Y axis of the emitter.", - "fullName": "Rotation on Y axis", - "functionType": "ExpressionAndCondition", - "group": "Angle", - "name": "RotationY", - "sentence": "the rotation on Y axis", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.PropertyRotationY()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "RotationY", - "name": "SetRotationY", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyRotationY" - }, - "parameters": [ - "Object", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "\r", - "object.__particleSystem.emitter.rotation.y = (90 + eventsFunctionContext.getArgument(\"Value\")) * Math.PI / 180;" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the start color of the object.", - "fullName": "Start color", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter color configuration", - "name": "StartColor", - "sentence": "the start color", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnString" - }, - "parameters": [ - "Object.PropertyStartColor()" - ] - } - ] - } - ], - "expressionType": { - "type": "color" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "StartColor", - "name": "SetStartColor", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartColor" - }, - "parameters": [ - "Object", - "=", - "GetArgumentAsString(\"Value\")" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "const startColor = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setStartColor(startColor);" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the end color of the object.", - "fullName": "End color", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter color configuration", - "name": "EndColor", - "sentence": "the end color", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnString" - }, - "parameters": [ - "Object.PropertyEndColor()" - ] - } - ] - } + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "if (gdjs.__particleEmmiter3DExtension) {", + " return;", + "}", + "", + "class ParticleEmitter3DRenderer extends gdjs.CustomRuntimeObject3DRenderer {", + " constructor(", + " object,", + " instanceContainer,", + " parent", + " ) {", + " super(object, instanceContainer, parent);", + " }", + "", + " _updateThreeGroup() {", + " const threeObject3D = this.get3DRendererObject();", + "", + " threeObject3D.rotation.set(", + " gdjs.toRad(this._object.getRotationX()),", + " gdjs.toRad(this._object.getRotationY()),", + " -gdjs.toRad(this._object.angle)", + " );", + "", + " threeObject3D.position.set(", + " this._object.getX(),", + " -this._object.getY(),", + " this._object.getZ()", + " );", + "", + " threeObject3D.scale.set(", + " this._object.isFlippedX() ? -1 : 1,", + " this._object.isFlippedY() ? -1 : 1,", + " this._object.isFlippedZ() ? -1 : 1", + " );", + "", + " threeObject3D.visible = !this._object.hidden;", + "", + " this._isContainerDirty = true;", + " }", + "}", + "", + "/**", + " * @param {string} colorString", + " * @param {THREE.Vector4} threeColor", + " */", + "const setThreeColor = (colorString, threeColor = new THREE.Vector4()) => {", + " const integerColor = gdjs.rgbOrHexToRGBColor(colorString);", + " threeColor.x = integerColor[0] / 255;", + " threeColor.y = integerColor[1] / 255;", + " threeColor.z = integerColor[2] / 255;", + "};", + "", + "/**", + " * @param {string} integerOpacity", + " * @param {THREE.Vector4} threeColor", + " */", + "const setThreeOpacity = (integerOpacity, threeColor = new THREE.Vector4()) => {", + " threeColor.w = integerOpacity / 255;", + "};", + "", + "class ParticleEmitterAdapter {", + " /**", + " * @param particleSystem {ParticleSystem}", + " * @param colorOverLife {ColorOverLife}", + " * @param sizeOverLife {SizeOverLife}", + " * @param applyForce {ApplyForce}", + " */", + " constructor(particleSystem, colorOverLife, sizeOverLife, applyForce) {", + " this.particleSystem = particleSystem;", + " this.colorOverLife = colorOverLife;", + " this.sizeOverLife = sizeOverLife;", + " this.applyForce = applyForce;", + " }", + "", + " /**", + " * @param startColor {string}", + " */", + " setStartColor(startColor) {", + " setThreeColor(startColor, this.colorOverLife.color.color.keys[0][0]);", + " }", + "", + " /**", + " * @param endColor {string}", + " */", + " setEndColor(endColor) {", + " setThreeColor(endColor, this.colorOverLife.color.color.keys[1][0]);", + " }", + "", + " /**", + " * @param startOpacity {number}", + " */", + " setStartOpacity(startOpacity) {", + " this.colorOverLife.color.alpha.keys[0][0] = startOpacity / 255;", + " }", + "", + " /**", + " * @param endOpacity {number}", + " */", + " setEndOpacity(endOpacity) {", + " this.colorOverLife.color.alpha.keys[1][0] = endOpacity / 255;", + " }", + "", + " /**", + " * @param flow {number}", + " */", + " setFlow(flow) {", + " this.particleSystem.emissionOverTime.value = flow;", + " }", + "", + " /**", + " * @param startMinSize {number}", + " */", + " setStartMinSize(startMinSize) {", + " this.particleSystem.startSize.a = startMinSize;", + " }", + "", + " /**", + " * @param startMaxSize {number}", + " */", + " setStartMaxSize(startMaxSize) {", + " this.particleSystem.startSize.b = startMaxSize;", + " }", + "", + " /**", + " * @param endScale {number}", + " */", + " setEndScale(endScale) {", + " /** @type Bezier */", + " const bezier = this.sizeOverLife.size.functions[0][0];", + " bezier.p[0] = 1;", + " bezier.p[1] = gdjs.evtTools.common.lerp(1, endScale, 1 / 3);", + " bezier.p[2] = gdjs.evtTools.common.lerp(1, endScale, 2 / 3);", + " bezier.p[3] = endScale;", + " }", + "", + " /**", + " * @param startSpeedMin {number}", + " */", + " setStartSpeedMin(startSpeedMin) {", + " this.particleSystem.startSpeed.a = startSpeedMin;", + " }", + "", + " /**", + " * @param startSpeedMax {number}", + " */", + " setStartSpeedMax(startSpeedMax) {", + " this.particleSystem.startSpeed.b = startSpeedMax;", + " }", + "", + " /**", + " * @param lifespanMin {number}", + " */", + " setLifespanMin(lifespanMin) {", + " this.particleSystem.startLife.a = lifespanMin;", + " }", + "", + " /**", + " * @param lifespanMax {number}", + " */", + " setLifespanMax(lifespanMax) {", + " this.particleSystem.startLife.b = lifespanMax;", + " }", + "", + " /**", + " * @param duration {number}", + " */", + " setDuration(duration) {", + " this.particleSystem.duration = duration || Number.POSITIVE_INFINITY;", + " }", + "", + " /**", + " * @param areParticlesRelative {boolean}", + " */", + " setParticlesRelative(areParticlesRelative) {", + " this.particleSystem.worldSpace = !areParticlesRelative;", + " }", + "", + " /**", + " * @param sprayConeAngle {number}", + " */", + " setSprayConeAngle(sprayConeAngle) {", + " if (0 < sprayConeAngle && sprayConeAngle <= 180) {", + " if (!this.particleSystem.emitterShape.angle) {", + " this.particleSystem.emitterShape = new ConeEmitter({ radius: 0.1, angle: Math.PI / 8 });", + " }", + " this.particleSystem.emitterShape.angle = sprayConeAngle * Math.PI / 180;", + " }", + " else {", + " if (this.particleSystem.emitterShape.angle) {", + " this.particleSystem.emitterShape = new PointEmitter();", + " }", + " }", + " }", + "", + " /**", + " * @param blending {string}", + " */", + " setBlending(blendingString) {", + " const blending =", + " blendingString === \"Additive\" ? THREE.AdditiveBlending :", + " blendingString === \"Normal\" ? THREE.NormalBlending :", + " blendingString === \"Subtractive\" ? THREE.SubtractiveBlending :", + " blendingString === \"Multiply\" ? THREE.MultiplyBlending :", + " blendingString === \"None\" ? THREE.NoBlending :", + " THREE.AdditiveBlending;", + " // TODO This doesn't work.", + " this.particleSystem.blending = blending;", + " }", + "", + " /**", + " * @param gravity {number}", + " */", + " setGravity(gravity) {", + " this.applyForce.magnitude.value = gravity;", + " }", + "", + " /**", + " * @param gravityTop {string}", + " */", + " setGravityTop(gravityTop) {", + " // TODO Make gravity absolute even when \"relative\" is enabled. ", + " switch (gravityTop) {", + " case \"Z+\":", + " this.applyForce.direction.set(0, 0, -1);", + " break;", + "", + " case \"Y-\":", + " this.applyForce.direction.set(0, 1, 0);", + " break;", + " }", + " }", + "}", + "", + "", + "", + "/**", + " * three.quarks v0.11.2 build Mon Jan 22 2024", + " * https://github.com/Alchemist0823/three.quarks#readme", + " * Copyright 2024 Alchemist0823 , MIT", + " */", + "", + "class ParticleEmitter extends THREE.Object3D {", + " constructor(system) {", + " super();", + " this.type = 'ParticleEmitter';", + " this.system = system;", + " }", + " clone() {", + " const system = this.system.clone();", + " system.emitter.copy(this, true);", + " return system.emitter;", + " }", + " dispose() { }", + " extractFromCache(cache) {", + " const values = [];", + " for (const key in cache) {", + " const data = cache[key];", + " delete data.metadata;", + " values.push(data);", + " }", + " return values;", + " }", + " toJSON(meta, options = {}) {", + " const isRootObject = meta === undefined || typeof meta === 'string';", + " const output = {};", + " if (isRootObject) {", + " meta = {", + " geometries: {},", + " materials: {},", + " textures: {},", + " images: {},", + " shapes: {},", + " skeletons: {},", + " animations: {},", + " nodes: {},", + " };", + " output.metadata = {", + " version: 4.5,", + " type: 'Object',", + " generator: 'Object3D.toJSON',", + " };", + " }", + " const object = {};", + " object.uuid = this.uuid;", + " object.type = this.type;", + " if (this.name !== '')", + " object.name = this.name;", + " if (this.castShadow === true)", + " object.castShadow = true;", + " if (this.receiveShadow === true)", + " object.receiveShadow = true;", + " if (this.visible === false)", + " object.visible = false;", + " if (this.frustumCulled === false)", + " object.frustumCulled = false;", + " if (this.renderOrder !== 0)", + " object.renderOrder = this.renderOrder;", + " if (JSON.stringify(this.userData) !== '{}')", + " object.userData = this.userData;", + " object.layers = this.layers.mask;", + " object.matrix = this.matrix.toArray();", + " if (this.matrixAutoUpdate === false)", + " object.matrixAutoUpdate = false;", + " if (this.system !== null)", + " object.ps = this.system.toJSON(meta, options);", + " if (this.children.length > 0) {", + " object.children = [];", + " for (let i = 0; i < this.children.length; i++) {", + " if (this.children[i].type !== 'ParticleSystemPreview') {", + " object.children.push(this.children[i].toJSON(meta).object);", + " }", + " }", + " }", + " if (isRootObject) {", + " const geometries = this.extractFromCache(meta.geometries);", + " const materials = this.extractFromCache(meta.materials);", + " const textures = this.extractFromCache(meta.textures);", + " const images = this.extractFromCache(meta.images);", + " if (geometries.length > 0)", + " output.geometries = geometries;", + " if (materials.length > 0)", + " output.materials = materials;", + " if (textures.length > 0)", + " output.textures = textures;", + " if (images.length > 0)", + " output.images = images;", + " }", + " output.object = object;", + " return output;", + " }", + "}", + "", + "class LinkedListNode {", + " constructor(data) {", + " this.data = data;", + " this.next = null;", + " this.prev = null;", + " }", + " hasPrev() {", + " return this.prev !== null;", + " }", + " hasNext() {", + " return this.next !== null;", + " }", + "}", + "class LinkedList {", + " constructor() {", + " this.length = 0;", + " this.head = this.tail = null;", + " }", + " isEmpty() {", + " return this.head === null;", + " }", + " clear() {", + " this.length = 0;", + " this.head = this.tail = null;", + " }", + " front() {", + " if (this.head === null)", + " return null;", + " return this.head.data;", + " }", + " back() {", + " if (this.tail === null)", + " return null;", + " return this.tail.data;", + " }", + " dequeue() {", + " if (this.head) {", + " const value = this.head.data;", + " this.head = this.head.next;", + " if (!this.head) {", + " this.tail = null;", + " }", + " else {", + " this.head.prev = null;", + " }", + " this.length--;", + " return value;", + " }", + " return undefined;", + " }", + " pop() {", + " if (this.tail) {", + " const value = this.tail.data;", + " this.tail = this.tail.prev;", + " if (!this.tail) {", + " this.head = null;", + " }", + " else {", + " this.tail.next = null;", + " }", + " this.length--;", + " return value;", + " }", + " return undefined;", + " }", + " queue(data) {", + " const node = new LinkedListNode(data);", + " if (!this.tail) {", + " this.tail = node;", + " }", + " if (this.head) {", + " this.head.prev = node;", + " node.next = this.head;", + " }", + " this.head = node;", + " this.length++;", + " }", + " push(data) {", + " const node = new LinkedListNode(data);", + " if (!this.head) {", + " this.head = node;", + " }", + " if (this.tail) {", + " this.tail.next = node;", + " node.prev = this.tail;", + " }", + " this.tail = node;", + " this.length++;", + " }", + " insertBefore(node, data) {", + " const newNode = new LinkedListNode(data);", + " newNode.next = node;", + " newNode.prev = node.prev;", + " if (newNode.prev !== null) {", + " newNode.prev.next = newNode;", + " }", + " newNode.next.prev = newNode;", + " if (node == this.head) {", + " this.head = newNode;", + " }", + " this.length++;", + " }", + " remove(data) {", + " if (this.head === null || this.tail === null) {", + " return;", + " }", + " let tempNode = this.head;", + " if (data === this.head.data) {", + " this.head = this.head.next;", + " }", + " if (data === this.tail.data) {", + " this.tail = this.tail.prev;", + " }", + " while (tempNode.next !== null && tempNode.data !== data) {", + " tempNode = tempNode.next;", + " }", + " if (tempNode.data === data) {", + " if (tempNode.prev !== null)", + " tempNode.prev.next = tempNode.next;", + " if (tempNode.next !== null)", + " tempNode.next.prev = tempNode.prev;", + " this.length--;", + " }", + " }", + " *values() {", + " let current = this.head;", + " while (current !== null) {", + " yield current.data;", + " current = current.next;", + " }", + " }", + "}", + "", + "class NodeParticle {", + " constructor() {", + " this.position = new THREE.Vector3();", + " this.velocity = new THREE.Vector3();", + " this.age = 0;", + " this.life = 1;", + " this.size = 1;", + " this.rotation = 0;", + " this.color = new THREE.Vector4(1, 1, 1, 1);", + " this.uvTile = 0;", + " }", + " get died() {", + " return this.age >= this.life;", + " }", + " reset() {", + " this.position.set(0, 0, 0);", + " this.velocity.set(0, 0, 0);", + " this.age = 0;", + " this.life = 1;", + " this.size = 1;", + " this.rotation = 0;", + " this.color.set(1, 1, 1, 1);", + " this.uvTile = 0;", + " }", + "}", + "class SpriteParticle {", + " constructor() {", + " this.startSpeed = 0;", + " this.startColor = new THREE.Vector4();", + " this.startSize = 1;", + " this.position = new THREE.Vector3();", + " this.velocity = new THREE.Vector3();", + " this.age = 0;", + " this.life = 1;", + " this.size = 1;", + " this.speedModifier = 1;", + " this.rotation = 0;", + " this.color = new THREE.Vector4();", + " this.uvTile = 0;", + " }", + " get died() {", + " return this.age >= this.life;", + " }", + "}", + "class RecordState {", + " constructor(position, size, color) {", + " this.position = position;", + " this.size = size;", + " this.color = color;", + " }", + "}", + "class TrailParticle {", + " constructor() {", + " this.startSpeed = 0;", + " this.startColor = new THREE.Vector4();", + " this.startSize = 1;", + " this.position = new THREE.Vector3();", + " this.velocity = new THREE.Vector3();", + " this.age = 0;", + " this.life = 1;", + " this.size = 1;", + " this.length = 100;", + " this.speedModifier = 1;", + " this.color = new THREE.Vector4();", + " this.previous = new LinkedList();", + " this.uvTile = 0;", + " }", + " update() {", + " if (this.age <= this.life) {", + " this.previous.push(new RecordState(this.position.clone(), this.size, this.color.clone()));", + " }", + " else {", + " if (this.previous.length > 0) {", + " this.previous.dequeue();", + " }", + " }", + " while (this.previous.length > this.length) {", + " this.previous.dequeue();", + " }", + " }", + " get died() {", + " return this.age >= this.life;", + " }", + " reset() {", + " this.previous.clear();", + " }", + "}", + "", + "class Bezier {", + " constructor(p1, p2, p3, p4) {", + " this.p = [p1, p2, p3, p4];", + " }", + " genValue(t) {", + " const t2 = t * t;", + " const t3 = t * t * t;", + " const mt = 1 - t;", + " const mt2 = mt * mt;", + " const mt3 = mt2 * mt;", + " return this.p[0] * mt3 + this.p[1] * mt2 * t * 3 + this.p[2] * mt * t2 * 3 + this.p[3] * t3;", + " }", + " derivativeCoefficients(points) {", + " const dpoints = [];", + " for (let p = points, c = p.length - 1; c > 0; c--) {", + " const list = [];", + " for (let j = 0; j < c; j++) {", + " const dpt = c * (p[j + 1] - p[j]);", + " list.push(dpt);", + " }", + " dpoints.push(list);", + " p = list;", + " }", + " return dpoints;", + " }", + " getSlope(t) {", + " const p = this.derivativeCoefficients(this.p)[0];", + " const mt = 1 - t;", + " const a = mt * mt;", + " const b = mt * t * 2;", + " const c = t * t;", + " return a * p[0] + b * p[1] + c * p[2];", + " }", + " controlCurve(d0, d1) {", + " this.p[1] = d0 / 3 + this.p[0];", + " this.p[2] = this.p[3] - d1 / 3;", + " }", + " hull(t) {", + " let p = this.p;", + " let _p = [], pt, idx = 0, i = 0, l = 0;", + " const q = [];", + " q[idx++] = p[0];", + " q[idx++] = p[1];", + " q[idx++] = p[2];", + " q[idx++] = p[3];", + " while (p.length > 1) {", + " _p = [];", + " for (i = 0, l = p.length - 1; i < l; i++) {", + " pt = t * p[i] + (1 - t) * p[i + 1];", + " q[idx++] = pt;", + " _p.push(pt);", + " }", + " p = _p;", + " }", + " return q;", + " }", + " split(t) {", + " const q = this.hull(t);", + " const result = {", + " left: new Bezier(q[0], q[4], q[7], q[9]),", + " right: new Bezier(q[9], q[8], q[6], q[3]),", + " span: q", + " };", + " return result;", + " }", + " clone() {", + " return new Bezier(this.p[0], this.p[1], this.p[2], this.p[3]);", + " }", + " toJSON() {", + " return {", + " p0: this.p[0],", + " p1: this.p[1],", + " p2: this.p[2],", + " p3: this.p[3],", + " };", + " }", + " static fromJSON(json) {", + " return new Bezier(json.p0, json.p1, json.p2, json.p3);", + " }", + "}", + "", + "const ColorToJSON = (color) => {", + " return { r: color.x, g: color.y, b: color.z, a: color.w };", + "};", + "const JSONToColor = (json) => {", + " return new THREE.Vector4(json.r, json.g, json.b, json.a);", + "};", + "const JSONToValue = (json, type) => {", + " switch (type) {", + " case 'Vector3':", + " return new THREE.Vector3(json.x, json.y, json.z);", + " case 'Vector4':", + " return new THREE.Vector4(json.x, json.y, json.z, json.w);", + " case 'Color':", + " return new THREE.Vector3(json.r, json.g, json.b);", + " case 'Number':", + " return json;", + " default:", + " return json;", + " }", + "};", + "const ValueToJSON = (value, type) => {", + " switch (type) {", + " case 'Vector3':", + " return { x: value.x, y: value.y, z: value.z };", + " case 'Vector4':", + " return { x: value.x, y: value.y, z: value.z, w: value.w };", + " case 'Color':", + " return { r: value.x, g: value.y, b: value.z };", + " case 'Number':", + " return value;", + " default:", + " return value;", + " }", + "};", + "", + "class RandomColor {", + " constructor(a, b) {", + " this.a = a;", + " this.b = b;", + " this.type = \"value\";", + " }", + " genColor(color) {", + " const rand = Math.random();", + " return color.copy(this.a).lerp(this.b, rand);", + " }", + " toJSON() {", + " return {", + " type: \"RandomColor\",", + " a: ColorToJSON(this.a),", + " b: ColorToJSON(this.b),", + " };", + " }", + " static fromJSON(json) {", + " return new RandomColor(JSONToColor(json.a), JSONToColor(json.b));", + " }", + " clone() {", + " return new RandomColor(this.a.clone(), this.b.clone());", + " }", + "}", + "", + "class ColorRange {", + " constructor(a, b) {", + " this.a = a;", + " this.b = b;", + " this.type = 'value';", + " }", + " genColor(color, t) {", + " return color.copy(this.a).lerp(this.b, Math.random());", + " }", + " toJSON() {", + " return {", + " type: 'ColorRange',", + " a: ColorToJSON(this.a),", + " b: ColorToJSON(this.b),", + " };", + " }", + " static fromJSON(json) {", + " return new ColorRange(JSONToColor(json.a), JSONToColor(json.b));", + " }", + " clone() {", + " return new ColorRange(this.a.clone(), this.b.clone());", + " }", + "}", + "", + "class ContinuousLinearFunction {", + " constructor(keys, subType) {", + " this.subType = subType;", + " this.type = 'function';", + " this.keys = keys;", + " }", + " findKey(t) {", + " let mid = 0;", + " let left = 0, right = this.keys.length - 1;", + " while (left + 1 < right) {", + " mid = Math.floor((left + right) / 2);", + " if (t < this.getStartX(mid))", + " right = mid - 1;", + " else if (t > this.getEndX(mid))", + " left = mid + 1;", + " else", + " return mid;", + " }", + " for (let i = left; i <= right; i++) {", + " if (t >= this.getStartX(i) && t <= this.getEndX(i))", + " return i;", + " }", + " return -1;", + " }", + " getStartX(index) {", + " return this.keys[index][1];", + " }", + " getEndX(index) {", + " if (index + 1 < this.keys.length)", + " return this.keys[index + 1][1];", + " return 1;", + " }", + " genValue(value, t) {", + " const index = this.findKey(t);", + " if (this.subType === 'Number') {", + " if (index === -1) {", + " return this.keys[0][0];", + " }", + " else if (index + 1 >= this.keys.length) {", + " return this.keys[this.keys.length - 1][0];", + " }", + " return ((this.keys[index + 1][0] - this.keys[index][0]) *", + " ((t - this.getStartX(index)) / (this.getEndX(index) - this.getStartX(index))) +", + " this.keys[index][0]);", + " }", + " else {", + " if (index === -1) {", + " return value.copy(this.keys[0][0]);", + " }", + " if (index + 1 >= this.keys.length) {", + " return value.copy(this.keys[this.keys.length - 1][0]);", + " }", + " return value", + " .copy(this.keys[index][0])", + " .lerp(this.keys[index + 1][0], (t - this.getStartX(index)) / (this.getEndX(index) - this.getStartX(index)));", + " }", + " }", + " toJSON() {", + " this.keys[0][0].constructor.name;", + " return {", + " type: 'CLinearFunction',", + " subType: this.subType,", + " keys: this.keys.map(([color, pos]) => ({ value: ValueToJSON(color, this.subType), pos: pos })),", + " };", + " }", + " static fromJSON(json) {", + " return new ContinuousLinearFunction(json.keys.map((pair) => [JSONToValue(pair.value, json.subType), pair.pos]), json.subType);", + " }", + " clone() {", + " if (this.subType === 'Number') {", + " return new ContinuousLinearFunction(this.keys.map(([value, pos]) => [value, pos]), this.subType);", + " }", + " else {", + " return new ContinuousLinearFunction(this.keys.map(([value, pos]) => [value.clone(), pos]), this.subType);", + " }", + " }", + "}", + "", + "const tempVec3 = new THREE.Vector3();", + "class Gradient {", + " constructor(color = [", + " [new THREE.Vector3(0, 0, 0), 0],", + " [new THREE.Vector3(1, 1, 1), 0],", + " ], alpha = [", + " [1, 0],", + " [1, 1],", + " ]) {", + " this.type = 'function';", + " this.color = new ContinuousLinearFunction(color, 'Color');", + " this.alpha = new ContinuousLinearFunction(alpha, 'Number');", + " }", + " genColor(color, t) {", + " this.color.genValue(tempVec3, t);", + " return color.set(tempVec3.x, tempVec3.y, tempVec3.z, this.alpha.genValue(1, t));", + " }", + " toJSON() {", + " return {", + " type: 'Gradient',", + " color: this.color.toJSON(),", + " alpha: this.alpha.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " if (json.functions) {", + " const keys = json.functions.map((func) => [ColorRange.fromJSON(func.function).a, func.start]);", + " if (json.functions.length > 0) {", + " keys.push([ColorRange.fromJSON(json.functions[json.functions.length - 1].function).b, 1]);", + " }", + " return new Gradient(keys.map((key) => [new THREE.Vector3(key[0].x, key[0].y, key[0].z), key[1]]), keys.map((key) => [key[0].w, key[1]]));", + " }", + " else {", + " const gradient = new Gradient();", + " gradient.alpha = ContinuousLinearFunction.fromJSON(json.alpha);", + " gradient.color = ContinuousLinearFunction.fromJSON(json.color);", + " return gradient;", + " }", + " }", + " clone() {", + " const gradient = new Gradient();", + " gradient.alpha = this.alpha.clone();", + " gradient.color = this.color.clone();", + " return gradient;", + " }", + "}", + "", + "const tempColor = new THREE.Vector4();", + "class RandomColorBetweenGradient {", + " constructor(gradient1, gradient2) {", + " this.type = 'memorizedFunction';", + " this.gradient1 = gradient1;", + " this.gradient2 = gradient2;", + " }", + " startGen(memory) {", + " memory.rand = Math.random();", + " }", + " genColor(color, t, memory) {", + " this.gradient1.genColor(color, t);", + " this.gradient2.genColor(tempColor, t);", + " if (memory && memory.rand) {", + " color.lerp(tempColor, memory.rand);", + " }", + " else {", + " color.lerp(tempColor, Math.random());", + " }", + " return color;", + " }", + " toJSON() {", + " return {", + " type: 'RandomColorBetweenGradient',", + " gradient1: this.gradient1.toJSON(),", + " gradient2: this.gradient2.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new RandomColorBetweenGradient(Gradient.fromJSON(json.gradient1), Gradient.fromJSON(json.gradient2));", + " }", + " clone() {", + " return new RandomColorBetweenGradient(this.gradient1.clone(), this.gradient2.clone());", + " }", + "}", + "", + "class ConstantColor {", + " constructor(color) {", + " this.color = color;", + " this.type = 'value';", + " }", + " genColor(color) {", + " return color.copy(this.color);", + " }", + " toJSON() {", + " return {", + " type: 'ConstantColor',", + " color: ColorToJSON(this.color),", + " };", + " }", + " static fromJSON(json) {", + " return new ConstantColor(JSONToColor(json.color));", + " }", + " clone() {", + " return new ConstantColor(this.color.clone());", + " }", + "}", + "function ColorGeneratorFromJSON(json) {", + " switch (json.type) {", + " case 'ConstantColor':", + " return ConstantColor.fromJSON(json);", + " case 'ColorRange':", + " return ColorRange.fromJSON(json);", + " case 'RandomColor':", + " return RandomColor.fromJSON(json);", + " case 'Gradient':", + " return Gradient.fromJSON(json);", + " case 'RandomColorBetweenGradient':", + " return RandomColorBetweenGradient.fromJSON(json);", + " default:", + " return new ConstantColor(new THREE.Vector4(1, 1, 1, 1));", + " }", + "}", + "", + "class ConstantValue {", + " constructor(value) {", + " this.value = value;", + " this.type = 'value';", + " }", + " genValue() {", + " return this.value;", + " }", + " toJSON() {", + " return {", + " type: \"ConstantValue\",", + " value: this.value", + " };", + " }", + " static fromJSON(json) {", + " return new ConstantValue(json.value);", + " }", + " clone() {", + " return new ConstantValue(this.value);", + " }", + "}", + "", + "class IntervalValue {", + " constructor(a, b) {", + " this.a = a;", + " this.b = b;", + " this.type = 'value';", + " }", + " genValue() {", + " return THREE.MathUtils.lerp(this.a, this.b, Math.random());", + " }", + " toJSON() {", + " return {", + " type: 'IntervalValue',", + " a: this.a,", + " b: this.b,", + " };", + " }", + " static fromJSON(json) {", + " return new IntervalValue(json.a, json.b);", + " }", + " clone() {", + " return new IntervalValue(this.a, this.b);", + " }", + "}", + "", + "class PiecewiseFunction {", + " constructor() {", + " this.functions = new Array();", + " }", + " findFunction(t) {", + " let mid = 0;", + " let left = 0, right = this.functions.length - 1;", + " while (left + 1 < right) {", + " mid = Math.floor((left + right) / 2);", + " if (t < this.getStartX(mid))", + " right = mid - 1;", + " else if (t > this.getEndX(mid))", + " left = mid + 1;", + " else", + " return mid;", + " }", + " for (let i = left; i <= right; i++) {", + " if (t >= this.functions[i][1] && t <= this.getEndX(i))", + " return i;", + " }", + " return -1;", + " }", + " getStartX(index) {", + " return this.functions[index][1];", + " }", + " setStartX(index, x) {", + " if (index > 0)", + " this.functions[index][1] = x;", + " }", + " getEndX(index) {", + " if (index + 1 < this.functions.length)", + " return this.functions[index + 1][1];", + " return 1;", + " }", + " setEndX(index, x) {", + " if (index + 1 < this.functions.length)", + " this.functions[index + 1][1] = x;", + " }", + " insertFunction(t, func) {", + " const index = this.findFunction(t);", + " this.functions.splice(index + 1, 0, [func, t]);", + " }", + " removeFunction(index) {", + " return this.functions.splice(index, 1)[0][0];", + " }", + " getFunction(index) {", + " return this.functions[index][0];", + " }", + " setFunction(index, func) {", + " this.functions[index][0] = func;", + " }", + " get numOfFunctions() {", + " return this.functions.length;", + " }", + "}", + "", + "class PiecewiseBezier extends PiecewiseFunction {", + " constructor(curves = [[new Bezier(0, 1.0 / 3, 1.0 / 3 * 2, 1), 0]]) {", + " super();", + " this.type = \"function\";", + " this.functions = curves;", + " }", + " genValue(t = 0) {", + " const index = this.findFunction(t);", + " if (index === -1) {", + " return 0;", + " }", + " return this.functions[index][0].genValue((t - this.getStartX(index)) / (this.getEndX(index) - this.getStartX(index)));", + " }", + " toSVG(length, segments) {", + " if (segments < 1)", + " return \"\";", + " let result = [\"M\", 0, this.functions[0][0].p[0]].join(\" \");", + " for (let i = 1.0 / segments; i <= 1; i += 1.0 / segments) {", + " result = [result, \"L\", i * length, this.genValue(i)].join(\" \");", + " }", + " return result;", + " }", + " toJSON() {", + " return {", + " type: \"PiecewiseBezier\",", + " functions: this.functions.map(([bezier, start]) => ({ function: bezier.toJSON(), start: start })),", + " };", + " }", + " static fromJSON(json) {", + " return new PiecewiseBezier(json.functions.map((piecewiseFunction) => ([Bezier.fromJSON(piecewiseFunction.function), piecewiseFunction.start])));", + " }", + " clone() {", + " return new PiecewiseBezier(this.functions.map(([bezier, start]) => ([bezier.clone(), start])));", + " }", + "}", + "", + "function ValueGeneratorFromJSON(json) {", + " switch (json.type) {", + " case 'ConstantValue':", + " return ConstantValue.fromJSON(json);", + " case 'IntervalValue':", + " return IntervalValue.fromJSON(json);", + " case 'PiecewiseBezier':", + " return PiecewiseBezier.fromJSON(json);", + " default:", + " return new ConstantValue(0);", + " }", + "}", + "", + "class RandomQuatGenerator {", + " constructor() {", + " this.type = \"rotation\";", + " }", + " genValue(quat, t) {", + " let x, y, z, u, v, w;", + " do {", + " x = Math.random() * 2 - 1;", + " y = Math.random() * 2 - 1;", + " z = x * x + y * y;", + " } while (z > 1);", + " do {", + " u = Math.random() * 2 - 1;", + " v = Math.random() * 2 - 1;", + " w = u * u + v * v;", + " } while (w > 1);", + " const s = Math.sqrt((1 - z) / w);", + " quat.set(x, y, s * u, s * v);", + " return quat;", + " }", + " toJSON() {", + " return {", + " type: \"RandomQuat\"", + " };", + " }", + " static fromJSON(json) {", + " return new RandomQuatGenerator();", + " }", + " clone() {", + " return new RandomQuatGenerator();", + " }", + "}", + "", + "class AxisAngleGenerator {", + " constructor(axis, angle) {", + " this.axis = axis;", + " this.angle = angle;", + " this.type = 'rotation';", + " }", + " genValue(quat, t) {", + " return quat.setFromAxisAngle(this.axis, this.angle.genValue(t));", + " }", + " toJSON() {", + " return {", + " type: 'AxisAngle',", + " axis: { x: this.axis.x, y: this.axis.y, z: this.axis.z },", + " angle: this.angle.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new AxisAngleGenerator(new THREE.Vector3(json.axis.x, json.axis.y, json.axis.z), ValueGeneratorFromJSON(json.angle));", + " }", + " clone() {", + " return new AxisAngleGenerator(this.axis.clone(), this.angle.clone());", + " }", + "}", + "", + "class EulerGenerator {", + " constructor(angleX, angleY, angleZ, eulerOrder) {", + " this.angleX = angleX;", + " this.angleY = angleY;", + " this.angleZ = angleZ;", + " this.type = 'rotation';", + " this.eular = new THREE.Euler(0, 0, 0, eulerOrder);", + " }", + " genValue(quat, t) {", + " this.eular.set(this.angleX.genValue(t), this.angleY.genValue(t), this.angleZ.genValue(t));", + " return quat.setFromEuler(this.eular);", + " }", + " toJSON() {", + " return {", + " type: 'Euler',", + " angleX: this.angleX.toJSON(),", + " angleY: this.angleY.toJSON(),", + " angleZ: this.angleZ.toJSON(),", + " eulerOrder: this.eular.order,", + " };", + " }", + " static fromJSON(json) {", + " return new EulerGenerator(ValueGeneratorFromJSON(json.angleX), ValueGeneratorFromJSON(json.angleY), ValueGeneratorFromJSON(json.angleZ), json.eulerOrder);", + " }", + " clone() {", + " return new EulerGenerator(this.angleX, this.angleY, this.angleZ, this.eular.order);", + " }", + "}", + "", + "function RotationGeneratorFromJSON(json) {", + " switch (json.type) {", + " case 'AxisAngle':", + " return AxisAngleGenerator.fromJSON(json);", + " case 'Euler':", + " return EulerGenerator.fromJSON(json);", + " case 'RandomQuat':", + " return RandomQuatGenerator.fromJSON(json);", + " default:", + " return new RandomQuatGenerator();", + " }", + "}", + "", + "function GeneratorFromJSON(json) {", + " switch (json.type) {", + " case 'ConstantValue':", + " case 'IntervalValue':", + " case 'PiecewiseBezier':", + " return ValueGeneratorFromJSON(json);", + " case 'AxisAngle':", + " case 'RandomQuat':", + " case 'Euler':", + " return RotationGeneratorFromJSON(json);", + " default:", + " return new ConstantValue(0);", + " }", + "}", + "", + "class ColorOverLife {", + " constructor(color) {", + " this.color = color;", + " this.type = 'ColorOverLife';", + " }", + " initialize(particle) {", + " if (this.color.type === 'memorizedFunction') {", + " particle.colorOverLifeMemory = {};", + " this.color.startGen(particle.colorOverLifeMemory);", + " }", + " }", + " update(particle, delta) {", + " if (this.color.type === 'memorizedFunction') {", + " this.color.genColor(particle.color, particle.age / particle.life, particle.colorOverLifeMemory);", + " }", + " else {", + " this.color.genColor(particle.color, particle.age / particle.life);", + " }", + " particle.color.x *= particle.startColor.x;", + " particle.color.y *= particle.startColor.y;", + " particle.color.z *= particle.startColor.z;", + " particle.color.w *= particle.startColor.w;", + " }", + " frameUpdate(delta) { }", + " toJSON() {", + " return {", + " type: this.type,", + " color: this.color.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new ColorOverLife(ColorGeneratorFromJSON(json.color));", + " }", + " clone() {", + " return new ColorOverLife(this.color.clone());", + " }", + " reset() { }", + "}", + "", + "class RotationOverLife {", + " constructor(angularVelocity) {", + " this.angularVelocity = angularVelocity;", + " this.type = 'RotationOverLife';", + " this.dynamic = !(angularVelocity instanceof ConstantValue || angularVelocity instanceof IntervalValue);", + " }", + " initialize(particle) {", + " this.dynamic = !(this.angularVelocity instanceof ConstantValue || this.angularVelocity instanceof IntervalValue);", + " if (!this.dynamic && typeof particle.rotation === 'number') {", + " particle.angularVelocity = this.angularVelocity.genValue();", + " }", + " }", + " update(particle, delta) {", + " if (!this.dynamic) {", + " if (typeof particle.rotation === 'number') {", + " particle.rotation += delta * particle.angularVelocity;", + " }", + " }", + " else {", + " if (typeof particle.rotation === 'number') {", + " particle.rotation +=", + " delta * this.angularVelocity.genValue(particle.age / particle.life);", + " }", + " }", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " angularVelocity: this.angularVelocity.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new RotationOverLife(ValueGeneratorFromJSON(json.angularVelocity));", + " }", + " frameUpdate(delta) { }", + " clone() {", + " return new RotationOverLife(this.angularVelocity.clone());", + " }", + " reset() { }", + "}", + "", + "const IdentityQuaternion = new THREE.Quaternion();", + "class Rotation3DOverLife {", + " constructor(angularVelocity) {", + " this.angularVelocity = angularVelocity;", + " this.type = 'Rotation3DOverLife';", + " this.tempQuat = new THREE.Quaternion();", + " this.dynamic = !(angularVelocity instanceof RandomQuatGenerator);", + " }", + " initialize(particle) {", + " this.dynamic = !(this.angularVelocity instanceof RandomQuatGenerator);", + " if (particle.rotation instanceof THREE.Quaternion) {", + " particle.angularVelocity = new THREE.Quaternion();", + " this.angularVelocity.genValue(particle.angularVelocity);", + " }", + " }", + " update(particle, delta) {", + " if (particle.rotation instanceof THREE.Quaternion) {", + " if (!this.dynamic) {", + " this.tempQuat.slerpQuaternions(IdentityQuaternion, particle.angularVelocity, delta);", + " particle.rotation.multiply(this.tempQuat);", + " }", + " else {", + " this.angularVelocity.genValue(this.tempQuat, particle.age / particle.life);", + " this.tempQuat.slerpQuaternions(IdentityQuaternion, this.tempQuat, delta);", + " particle.rotation.multiply(this.tempQuat);", + " }", + " }", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " angularVelocity: this.angularVelocity.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new Rotation3DOverLife(RotationGeneratorFromJSON(json.angularVelocity));", + " }", + " frameUpdate(delta) { }", + " clone() {", + " return new Rotation3DOverLife(this.angularVelocity.clone());", + " }", + " reset() { }", + "}", + "", + "class ForceOverLife {", + " initialize(particle) { }", + " constructor(x, y, z) {", + " this.x = x;", + " this.y = y;", + " this.z = z;", + " this.type = 'ForceOverLife';", + " this._temp = new THREE.Vector3();", + " }", + " update(particle, delta) {", + " this._temp.set(this.x.genValue(particle.age / particle.life), this.y.genValue(particle.age / particle.life), this.z.genValue(particle.age / particle.life));", + " particle.velocity.addScaledVector(this._temp, delta);", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " x: this.x.toJSON(),", + " y: this.y.toJSON(),", + " z: this.z.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new ForceOverLife(ValueGeneratorFromJSON(json.x), ValueGeneratorFromJSON(json.y), ValueGeneratorFromJSON(json.z));", + " }", + " frameUpdate(delta) { }", + " clone() {", + " return new ForceOverLife(this.x.clone(), this.y.clone(), this.z.clone());", + " }", + " reset() { }", + "}", + "", + "class SizeOverLife {", + " initialize(particle) {", + " }", + " constructor(size) {", + " this.size = size;", + " this.type = 'SizeOverLife';", + " }", + " update(particle) {", + " particle.size = particle.startSize * this.size.genValue(particle.age / particle.life);", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " size: this.size.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new SizeOverLife(ValueGeneratorFromJSON(json.size));", + " }", + " frameUpdate(delta) {", + " }", + " clone() {", + " return new SizeOverLife(this.size.clone());", + " }", + " reset() {", + " }", + "}", + "", + "class SpeedOverLife {", + " initialize(particle) {", + " }", + " constructor(speed) {", + " this.speed = speed;", + " this.type = 'SpeedOverLife';", + " }", + " update(particle) {", + " particle.speedModifier = this.speed.genValue(particle.age / particle.life);", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " speed: this.speed.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new SpeedOverLife(ValueGeneratorFromJSON(json.speed));", + " }", + " frameUpdate(delta) {", + " }", + " clone() {", + " return new SpeedOverLife(this.speed.clone());", + " }", + " reset() {", + " }", + "}", + "", + "class FrameOverLife {", + " constructor(frame) {", + " this.frame = frame;", + " this.type = 'FrameOverLife';", + " }", + " initialize(particle) {", + " if (!(this.frame instanceof PiecewiseBezier)) {", + " particle.uvTile = Math.floor(this.frame.genValue(0) + 0.001);", + " }", + " }", + " update(particle, delta) {", + " if (this.frame instanceof PiecewiseBezier) {", + " particle.uvTile = Math.floor(this.frame.genValue(particle.age / particle.life) + 0.001);", + " }", + " }", + " frameUpdate(delta) { }", + " toJSON() {", + " return {", + " type: this.type,", + " frame: this.frame.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new FrameOverLife(ValueGeneratorFromJSON(json.frame));", + " }", + " clone() {", + " return new FrameOverLife(this.frame.clone());", + " }", + " reset() { }", + "}", + "", + "new THREE.Vector3(0, 0, 1);", + "class OrbitOverLife {", + " constructor(orbitSpeed, axis = new THREE.Vector3(0, 1, 0)) {", + " this.orbitSpeed = orbitSpeed;", + " this.axis = axis;", + " this.type = 'OrbitOverLife';", + " this.temp = new THREE.Vector3();", + " this.rotation = new THREE.Quaternion();", + " this.line = new THREE.Line3();", + " }", + " initialize(particle) {", + " }", + " update(particle, delta) {", + " this.line.set(new THREE.Vector3(0, 0, 0), this.axis);", + " this.line.closestPointToPoint(particle.position, false, this.temp);", + " this.rotation.setFromAxisAngle(this.axis, this.orbitSpeed.genValue(particle.age / particle.life) * delta);", + " particle.position.sub(this.temp);", + " particle.position.applyQuaternion(this.rotation);", + " particle.position.add(this.temp);", + " }", + " frameUpdate(delta) {", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " orbitSpeed: this.orbitSpeed.toJSON(),", + " axis: [this.axis.x, this.axis.y, this.axis.z],", + " };", + " }", + " static fromJSON(json) {", + " return new OrbitOverLife(ValueGeneratorFromJSON(json.orbitSpeed), json.axis ? new THREE.Vector3(json.axis[0], json.axis[1], json.axis[2]) : undefined);", + " }", + " clone() {", + " return new OrbitOverLife(this.orbitSpeed.clone());", + " }", + " reset() {", + " }", + "}", + "", + "class WidthOverLength {", + " initialize(particle) {", + " }", + " constructor(width) {", + " this.width = width;", + " this.type = 'WidthOverLength';", + " }", + " update(particle) {", + " if (particle instanceof TrailParticle) {", + " const iter = particle.previous.values();", + " for (let i = 0; i < particle.previous.length; i++) {", + " const cur = iter.next();", + " cur.value.size = this.width.genValue((particle.previous.length - i) / particle.length);", + " }", + " }", + " }", + " frameUpdate(delta) {", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " width: this.width.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new WidthOverLength(ValueGeneratorFromJSON(json.width));", + " }", + " clone() {", + " return new WidthOverLength(this.width.clone());", + " }", + " reset() {", + " }", + "}", + "", + "class ApplyForce {", + " constructor(direction, magnitude) {", + " this.direction = direction;", + " this.magnitude = magnitude;", + " this.type = 'ApplyForce';", + " this.magnitudeValue = this.magnitude.genValue();", + " }", + " initialize(particle) {", + " }", + " update(particle, delta) {", + " particle.velocity.addScaledVector(this.direction, this.magnitudeValue * delta);", + " }", + " frameUpdate(delta) {", + " this.magnitudeValue = this.magnitude.genValue();", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " direction: [this.direction.x, this.direction.y, this.direction.z],", + " magnitude: this.magnitude.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " var _a;", + " return new ApplyForce(new THREE.Vector3(json.direction[0], json.direction[1], json.direction[2]), ValueGeneratorFromJSON((_a = json.magnitude) !== null && _a !== void 0 ? _a : json.force));", + " }", + " clone() {", + " return new ApplyForce(this.direction.clone(), this.magnitude.clone());", + " }", + " reset() {", + " }", + "}", + "", + "class GravityForce {", + " constructor(center, magnitude) {", + " this.center = center;", + " this.magnitude = magnitude;", + " this.type = 'GravityForce';", + " this.temp = new THREE.Vector3();", + " }", + " initialize(particle) {", + " }", + " update(particle, delta) {", + " this.temp.copy(this.center).sub(particle.position).normalize();", + " particle.velocity.addScaledVector(this.temp, this.magnitude / particle.position.distanceToSquared(this.center) * delta);", + " }", + " frameUpdate(delta) {", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " center: [this.center.x, this.center.y, this.center.z],", + " magnitude: this.magnitude,", + " };", + " }", + " static fromJSON(json) {", + " return new GravityForce(new THREE.Vector3(json.center[0], json.center[1], json.center[2]), json.magnitude);", + " }", + " clone() {", + " return new GravityForce(this.center.clone(), this.magnitude);", + " }", + " reset() {", + " }", + "}", + "", + "new THREE.Vector3(0, 0, 1);", + "class ChangeEmitDirection {", + " constructor(angle) {", + " this.angle = angle;", + " this.type = 'ChangeEmitDirection';", + " this._temp = new THREE.Vector3();", + " this._q = new THREE.Quaternion();", + " }", + " initialize(particle) {", + " const len = particle.velocity.length();", + " if (len == 0)", + " return;", + " particle.velocity.normalize();", + " if (particle.velocity.x === 0 && particle.velocity.y === 0) {", + " this._temp.set(0, particle.velocity.z, 0);", + " }", + " else {", + " this._temp.set(-particle.velocity.y, particle.velocity.x, 0);", + " }", + " this._q.setFromAxisAngle(this._temp.normalize(), this.angle.genValue());", + " this._temp.copy(particle.velocity);", + " particle.velocity.applyQuaternion(this._q);", + " this._q.setFromAxisAngle(this._temp, Math.random() * Math.PI * 2);", + " particle.velocity.applyQuaternion(this._q);", + " particle.velocity.setLength(len);", + " }", + " update(particle, delta) {", + " }", + " frameUpdate(delta) {", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " angle: this.angle.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new ChangeEmitDirection(ValueGeneratorFromJSON(json.angle));", + " }", + " clone() {", + " return new ChangeEmitDirection(this.angle);", + " }", + " reset() {", + " }", + "}", + "", + "const VECTOR_ONE = new THREE.Vector3(1, 1, 1);", + "const VECTOR_Z = new THREE.Vector3(0, 0, 1);", + "let SubParticleEmitMode = void 0;", + "(function (SubParticleEmitMode) {", + " SubParticleEmitMode[SubParticleEmitMode[\"Death\"] = 0] = \"Death\";", + " SubParticleEmitMode[SubParticleEmitMode[\"Birth\"] = 1] = \"Birth\";", + " SubParticleEmitMode[SubParticleEmitMode[\"Frame\"] = 2] = \"Frame\";", + "})(SubParticleEmitMode || (SubParticleEmitMode = {}));", + "class EmitSubParticleSystem {", + " constructor(particleSystem, useVelocityAsBasis, subParticleSystem, mode = SubParticleEmitMode.Frame, emitProbability = 1) {", + " this.particleSystem = particleSystem;", + " this.useVelocityAsBasis = useVelocityAsBasis;", + " this.subParticleSystem = subParticleSystem;", + " this.mode = mode;", + " this.emitProbability = emitProbability;", + " this.type = 'EmitSubParticleSystem';", + " this.q_ = new THREE.Quaternion();", + " this.v_ = new THREE.Vector3();", + " this.v2_ = new THREE.Vector3();", + " this.subEmissions = new Array();", + " if (this.subParticleSystem && this.subParticleSystem.system) {", + " this.subParticleSystem.system.onlyUsedByOther = true;", + " }", + " }", + " initialize(particle) {", + " }", + " update(particle, delta) {", + " if (this.mode === SubParticleEmitMode.Frame) {", + " this.emit(particle, delta);", + " }", + " else if (this.mode === SubParticleEmitMode.Birth && particle.age === 0) {", + " this.emit(particle, delta);", + " }", + " else if (this.mode === SubParticleEmitMode.Death && particle.age + delta >= particle.life) {", + " this.emit(particle, delta);", + " }", + " }", + " emit(particle, delta) {", + " if (!this.subParticleSystem)", + " return;", + " if (Math.random() > this.emitProbability) {", + " return;", + " }", + " const m = new THREE.Matrix4();", + " this.setMatrixFromParticle(m, particle);", + " this.subEmissions.push({", + " burstIndex: 0,", + " burstWaveIndex: 0,", + " time: 0,", + " waitEmiting: 0,", + " matrix: m,", + " travelDistance: 0,", + " particle: particle,", + " });", + " }", + " frameUpdate(delta) {", + " if (!this.subParticleSystem)", + " return;", + " for (let i = 0; i < this.subEmissions.length; i++) {", + " if (this.subEmissions[i].time >= this.subParticleSystem.system.duration) {", + " this.subEmissions[i] = this.subEmissions[this.subEmissions.length - 1];", + " this.subEmissions.length = this.subEmissions.length - 1;", + " i--;", + " }", + " else {", + " let subEmissionState = this.subEmissions[i];", + " if (subEmissionState.particle && subEmissionState.particle.age < subEmissionState.particle.life) {", + " this.setMatrixFromParticle(subEmissionState.matrix, subEmissionState.particle);", + " }", + " else {", + " subEmissionState.particle = undefined;", + " }", + " this.subParticleSystem.system.emit(delta, subEmissionState, subEmissionState.matrix);", + " }", + " }", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " subParticleSystem: this.subParticleSystem ? this.subParticleSystem.uuid : '',", + " useVelocityAsBasis: this.useVelocityAsBasis,", + " mode: this.mode,", + " emitProbability: this.emitProbability,", + " };", + " }", + " static fromJSON(json, particleSystem) {", + " return new EmitSubParticleSystem(particleSystem, json.useVelocityAsBasis, json.subParticleSystem, json.mode, json.emitProbability);", + " }", + " clone() {", + " return new EmitSubParticleSystem(this.particleSystem, this.useVelocityAsBasis, this.subParticleSystem, this.mode, this.emitProbability);", + " }", + " reset() { }", + " setMatrixFromParticle(m, particle) {", + " let rotation;", + " if (particle.rotation === undefined || this.useVelocityAsBasis) {", + " if (particle.velocity.x === 0 &&", + " particle.velocity.y === 0 &&", + " (particle.velocity.z === 1 || particle.velocity.z === 0)) {", + " m.set(1, 0, 0, particle.position.x, 0, 1, 0, particle.position.y, 0, 0, 1, particle.position.z, 0, 0, 0, 1);", + " }", + " else {", + " this.v_.copy(VECTOR_Z).cross(particle.velocity);", + " this.v2_.copy(particle.velocity).cross(this.v_);", + " const len = this.v_.length();", + " const len2 = this.v2_.length();", + " m.set(this.v_.x / len, this.v2_.x / len2, particle.velocity.x, particle.position.x, this.v_.y / len, this.v2_.y / len2, particle.velocity.y, particle.position.y, this.v_.z / len, this.v2_.z / len2, particle.velocity.z, particle.position.z, 0, 0, 0, 1);", + " }", + " }", + " else {", + " if (particle.rotation instanceof THREE.Quaternion) {", + " rotation = particle.rotation;", + " }", + " else {", + " this.q_.setFromAxisAngle(VECTOR_Z, particle.rotation);", + " rotation = this.q_;", + " }", + " m.compose(particle.position, rotation, VECTOR_ONE);", + " }", + " if (!this.particleSystem.worldSpace) {", + " m.multiplyMatrices(this.particleSystem.emitter.matrixWorld, m);", + " }", + " }", + "}", + "", + "const F2 = 0.5 * (Math.sqrt(3.0) - 1.0);", + "const G2 = (3.0 - Math.sqrt(3.0)) / 6.0;", + "const F3 = 1.0 / 3.0;", + "const G3 = 1.0 / 6.0;", + "const F4 = (Math.sqrt(5.0) - 1.0) / 4.0;", + "const G4 = (5.0 - Math.sqrt(5.0)) / 20.0;", + "const grad3 = new Float32Array([1, 1, 0,", + " -1, 1, 0,", + " 1, -1, 0,", + " -1, -1, 0,", + " 1, 0, 1,", + " -1, 0, 1,", + " 1, 0, -1,", + " -1, 0, -1,", + " 0, 1, 1,", + " 0, -1, 1,", + " 0, 1, -1,", + " 0, -1, -1]);", + "const grad4 = new Float32Array([0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1,", + " 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1,", + " 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1,", + " -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1,", + " 1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1,", + " -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1,", + " 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0,", + " -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0]);", + "class SimplexNoise {", + " constructor(randomOrSeed = Math.random) {", + " const random = typeof randomOrSeed == 'function' ? randomOrSeed : alea(randomOrSeed);", + " this.p = buildPermutationTable(random);", + " this.perm = new Uint8Array(512);", + " this.permMod12 = new Uint8Array(512);", + " for (let i = 0; i < 512; i++) {", + " this.perm[i] = this.p[i & 255];", + " this.permMod12[i] = this.perm[i] % 12;", + " }", + " }", + " noise2D(x, y) {", + " const permMod12 = this.permMod12;", + " const perm = this.perm;", + " let n0 = 0;", + " let n1 = 0;", + " let n2 = 0;", + " const s = (x + y) * F2;", + " const i = Math.floor(x + s);", + " const j = Math.floor(y + s);", + " const t = (i + j) * G2;", + " const X0 = i - t;", + " const Y0 = j - t;", + " const x0 = x - X0;", + " const y0 = y - Y0;", + " let i1, j1;", + " if (x0 > y0) {", + " i1 = 1;", + " j1 = 0;", + " }", + " else {", + " i1 = 0;", + " j1 = 1;", + " }", + " const x1 = x0 - i1 + G2;", + " const y1 = y0 - j1 + G2;", + " const x2 = x0 - 1.0 + 2.0 * G2;", + " const y2 = y0 - 1.0 + 2.0 * G2;", + " const ii = i & 255;", + " const jj = j & 255;", + " let t0 = 0.5 - x0 * x0 - y0 * y0;", + " if (t0 >= 0) {", + " const gi0 = permMod12[ii + perm[jj]] * 3;", + " t0 *= t0;", + " n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0);", + " }", + " let t1 = 0.5 - x1 * x1 - y1 * y1;", + " if (t1 >= 0) {", + " const gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3;", + " t1 *= t1;", + " n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1);", + " }", + " let t2 = 0.5 - x2 * x2 - y2 * y2;", + " if (t2 >= 0) {", + " const gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3;", + " t2 *= t2;", + " n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2);", + " }", + " return 70.0 * (n0 + n1 + n2);", + " }", + " noise3D(x, y, z) {", + " const permMod12 = this.permMod12;", + " const perm = this.perm;", + " let n0, n1, n2, n3;", + " const s = (x + y + z) * F3;", + " const i = Math.floor(x + s);", + " const j = Math.floor(y + s);", + " const k = Math.floor(z + s);", + " const t = (i + j + k) * G3;", + " const X0 = i - t;", + " const Y0 = j - t;", + " const Z0 = k - t;", + " const x0 = x - X0;", + " const y0 = y - Y0;", + " const z0 = z - Z0;", + " let i1, j1, k1;", + " let i2, j2, k2;", + " if (x0 >= y0) {", + " if (y0 >= z0) {", + " i1 = 1;", + " j1 = 0;", + " k1 = 0;", + " i2 = 1;", + " j2 = 1;", + " k2 = 0;", + " }", + " else if (x0 >= z0) {", + " i1 = 1;", + " j1 = 0;", + " k1 = 0;", + " i2 = 1;", + " j2 = 0;", + " k2 = 1;", + " }", + " else {", + " i1 = 0;", + " j1 = 0;", + " k1 = 1;", + " i2 = 1;", + " j2 = 0;", + " k2 = 1;", + " }", + " }", + " else {", + " if (y0 < z0) {", + " i1 = 0;", + " j1 = 0;", + " k1 = 1;", + " i2 = 0;", + " j2 = 1;", + " k2 = 1;", + " }", + " else if (x0 < z0) {", + " i1 = 0;", + " j1 = 1;", + " k1 = 0;", + " i2 = 0;", + " j2 = 1;", + " k2 = 1;", + " }", + " else {", + " i1 = 0;", + " j1 = 1;", + " k1 = 0;", + " i2 = 1;", + " j2 = 1;", + " k2 = 0;", + " }", + " }", + " const x1 = x0 - i1 + G3;", + " const y1 = y0 - j1 + G3;", + " const z1 = z0 - k1 + G3;", + " const x2 = x0 - i2 + 2.0 * G3;", + " const y2 = y0 - j2 + 2.0 * G3;", + " const z2 = z0 - k2 + 2.0 * G3;", + " const x3 = x0 - 1.0 + 3.0 * G3;", + " const y3 = y0 - 1.0 + 3.0 * G3;", + " const z3 = z0 - 1.0 + 3.0 * G3;", + " const ii = i & 255;", + " const jj = j & 255;", + " const kk = k & 255;", + " let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;", + " if (t0 < 0)", + " n0 = 0.0;", + " else {", + " const gi0 = permMod12[ii + perm[jj + perm[kk]]] * 3;", + " t0 *= t0;", + " n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0 + grad3[gi0 + 2] * z0);", + " }", + " let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;", + " if (t1 < 0)", + " n1 = 0.0;", + " else {", + " const gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;", + " t1 *= t1;", + " n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1 + grad3[gi1 + 2] * z1);", + " }", + " let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;", + " if (t2 < 0)", + " n2 = 0.0;", + " else {", + " const gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;", + " t2 *= t2;", + " n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2 + grad3[gi2 + 2] * z2);", + " }", + " let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;", + " if (t3 < 0)", + " n3 = 0.0;", + " else {", + " const gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;", + " t3 *= t3;", + " n3 = t3 * t3 * (grad3[gi3] * x3 + grad3[gi3 + 1] * y3 + grad3[gi3 + 2] * z3);", + " }", + " return 32.0 * (n0 + n1 + n2 + n3);", + " }", + " noise4D(x, y, z, w) {", + " const perm = this.perm;", + " let n0, n1, n2, n3, n4;", + " const s = (x + y + z + w) * F4;", + " const i = Math.floor(x + s);", + " const j = Math.floor(y + s);", + " const k = Math.floor(z + s);", + " const l = Math.floor(w + s);", + " const t = (i + j + k + l) * G4;", + " const X0 = i - t;", + " const Y0 = j - t;", + " const Z0 = k - t;", + " const W0 = l - t;", + " const x0 = x - X0;", + " const y0 = y - Y0;", + " const z0 = z - Z0;", + " const w0 = w - W0;", + " let rankx = 0;", + " let ranky = 0;", + " let rankz = 0;", + " let rankw = 0;", + " if (x0 > y0)", + " rankx++;", + " else", + " ranky++;", + " if (x0 > z0)", + " rankx++;", + " else", + " rankz++;", + " if (x0 > w0)", + " rankx++;", + " else", + " rankw++;", + " if (y0 > z0)", + " ranky++;", + " else", + " rankz++;", + " if (y0 > w0)", + " ranky++;", + " else", + " rankw++;", + " if (z0 > w0)", + " rankz++;", + " else", + " rankw++;", + " const i1 = rankx >= 3 ? 1 : 0;", + " const j1 = ranky >= 3 ? 1 : 0;", + " const k1 = rankz >= 3 ? 1 : 0;", + " const l1 = rankw >= 3 ? 1 : 0;", + " const i2 = rankx >= 2 ? 1 : 0;", + " const j2 = ranky >= 2 ? 1 : 0;", + " const k2 = rankz >= 2 ? 1 : 0;", + " const l2 = rankw >= 2 ? 1 : 0;", + " const i3 = rankx >= 1 ? 1 : 0;", + " const j3 = ranky >= 1 ? 1 : 0;", + " const k3 = rankz >= 1 ? 1 : 0;", + " const l3 = rankw >= 1 ? 1 : 0;", + " const x1 = x0 - i1 + G4;", + " const y1 = y0 - j1 + G4;", + " const z1 = z0 - k1 + G4;", + " const w1 = w0 - l1 + G4;", + " const x2 = x0 - i2 + 2.0 * G4;", + " const y2 = y0 - j2 + 2.0 * G4;", + " const z2 = z0 - k2 + 2.0 * G4;", + " const w2 = w0 - l2 + 2.0 * G4;", + " const x3 = x0 - i3 + 3.0 * G4;", + " const y3 = y0 - j3 + 3.0 * G4;", + " const z3 = z0 - k3 + 3.0 * G4;", + " const w3 = w0 - l3 + 3.0 * G4;", + " const x4 = x0 - 1.0 + 4.0 * G4;", + " const y4 = y0 - 1.0 + 4.0 * G4;", + " const z4 = z0 - 1.0 + 4.0 * G4;", + " const w4 = w0 - 1.0 + 4.0 * G4;", + " const ii = i & 255;", + " const jj = j & 255;", + " const kk = k & 255;", + " const ll = l & 255;", + " let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;", + " if (t0 < 0)", + " n0 = 0.0;", + " else {", + " const gi0 = (perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32) * 4;", + " t0 *= t0;", + " n0 = t0 * t0 * (grad4[gi0] * x0 + grad4[gi0 + 1] * y0 + grad4[gi0 + 2] * z0 + grad4[gi0 + 3] * w0);", + " }", + " let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;", + " if (t1 < 0)", + " n1 = 0.0;", + " else {", + " const gi1 = (perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32) * 4;", + " t1 *= t1;", + " n1 = t1 * t1 * (grad4[gi1] * x1 + grad4[gi1 + 1] * y1 + grad4[gi1 + 2] * z1 + grad4[gi1 + 3] * w1);", + " }", + " let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;", + " if (t2 < 0)", + " n2 = 0.0;", + " else {", + " const gi2 = (perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32) * 4;", + " t2 *= t2;", + " n2 = t2 * t2 * (grad4[gi2] * x2 + grad4[gi2 + 1] * y2 + grad4[gi2 + 2] * z2 + grad4[gi2 + 3] * w2);", + " }", + " let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;", + " if (t3 < 0)", + " n3 = 0.0;", + " else {", + " const gi3 = (perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32) * 4;", + " t3 *= t3;", + " n3 = t3 * t3 * (grad4[gi3] * x3 + grad4[gi3 + 1] * y3 + grad4[gi3 + 2] * z3 + grad4[gi3 + 3] * w3);", + " }", + " let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;", + " if (t4 < 0)", + " n4 = 0.0;", + " else {", + " const gi4 = (perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32) * 4;", + " t4 *= t4;", + " n4 = t4 * t4 * (grad4[gi4] * x4 + grad4[gi4 + 1] * y4 + grad4[gi4 + 2] * z4 + grad4[gi4 + 3] * w4);", + " }", + " return 27.0 * (n0 + n1 + n2 + n3 + n4);", + " }", + "}", + "function buildPermutationTable(random) {", + " const p = new Uint8Array(256);", + " for (let i = 0; i < 256; i++) {", + " p[i] = i;", + " }", + " for (let i = 0; i < 255; i++) {", + " const r = i + ~~(random() * (256 - i));", + " const aux = p[i];", + " p[i] = p[r];", + " p[r] = aux;", + " }", + " return p;", + "}", + "function alea(seed) {", + " let s0 = 0;", + " let s1 = 0;", + " let s2 = 0;", + " let c = 1;", + " const mash = masher();", + " s0 = mash(' ');", + " s1 = mash(' ');", + " s2 = mash(' ');", + " s0 -= mash(seed);", + " if (s0 < 0) {", + " s0 += 1;", + " }", + " s1 -= mash(seed);", + " if (s1 < 0) {", + " s1 += 1;", + " }", + " s2 -= mash(seed);", + " if (s2 < 0) {", + " s2 += 1;", + " }", + " return function () {", + " const t = 2091639 * s0 + c * 2.3283064365386963e-10;", + " s0 = s1;", + " s1 = s2;", + " return s2 = t - (c = t | 0);", + " };", + "}", + "function masher() {", + " let n = 0xefc8249d;", + " return function (data) {", + " data = data.toString();", + " for (let i = 0; i < data.length; i++) {", + " n += data.charCodeAt(i);", + " let h = 0.02519603282416938 * n;", + " n = h >>> 0;", + " h -= n;", + " h *= n;", + " n = h >>> 0;", + " h -= n;", + " n += h * 0x100000000;", + " }", + " return (n >>> 0) * 2.3283064365386963e-10;", + " };", + "}", + "", + "class TurbulenceField {", + " constructor(scale, octaves, velocityMultiplier, timeScale) {", + " this.scale = scale;", + " this.octaves = octaves;", + " this.velocityMultiplier = velocityMultiplier;", + " this.timeScale = timeScale;", + " this.type = 'TurbulenceField';", + " this.generator = new SimplexNoise();", + " this.timeOffset = new THREE.Vector3();", + " this.temp = new THREE.Vector3();", + " this.temp2 = new THREE.Vector3();", + " this.timeOffset.x = Math.random() / this.scale.x * this.timeScale.x;", + " this.timeOffset.y = Math.random() / this.scale.y * this.timeScale.y;", + " this.timeOffset.z = Math.random() / this.scale.z * this.timeScale.z;", + " }", + " initialize(particle) {", + " }", + " update(particle, delta) {", + " const x = particle.position.x / this.scale.x;", + " const y = particle.position.y / this.scale.y;", + " const z = particle.position.z / this.scale.z;", + " this.temp.set(0, 0, 0);", + " let lvl = 1;", + " for (let i = 0; i < this.octaves; i++) {", + " this.temp2.set(this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.x * lvl) / lvl, this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.y * lvl) / lvl, this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.z * lvl) / lvl);", + " this.temp.add(this.temp2);", + " lvl *= 2;", + " }", + " this.temp.multiply(this.velocityMultiplier);", + " particle.velocity.addScaledVector(this.temp, delta);", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " scale: [this.scale.x, this.scale.y, this.scale.z],", + " octaves: this.octaves,", + " velocityMultiplier: [this.velocityMultiplier.x, this.velocityMultiplier.y, this.velocityMultiplier.z],", + " timeScale: [this.timeScale.x, this.timeScale.y, this.timeScale.z],", + " };", + " }", + " frameUpdate(delta) {", + " this.timeOffset.x += delta * this.timeScale.x;", + " this.timeOffset.y += delta * this.timeScale.y;", + " this.timeOffset.z += delta * this.timeScale.z;", + " }", + " static fromJSON(json) {", + " return new TurbulenceField(new THREE.Vector3(json.scale[0], json.scale[1], json.scale[2]), json.octaves, new THREE.Vector3(json.velocityMultiplier[0], json.velocityMultiplier[1], json.velocityMultiplier[2]), new THREE.Vector3(json.timeScale[0], json.timeScale[1], json.timeScale[2]));", + " }", + " clone() {", + " return new TurbulenceField(this.scale.clone(), this.octaves, this.velocityMultiplier.clone(), this.timeScale.clone());", + " }", + " reset() {", + " }", + "}", + "", + "function randomInt(a, b) {", + " return Math.floor(Math.random() * (b - a)) + a;", + "}", + "", + "const generators = [];", + "const tempV$2 = new THREE.Vector3();", + "const tempQ$2 = new THREE.Quaternion();", + "class Noise {", + " constructor(frequency, power, positionAmount = new ConstantValue(1), rotationAmount = new ConstantValue(0)) {", + " this.frequency = frequency;", + " this.power = power;", + " this.positionAmount = positionAmount;", + " this.rotationAmount = rotationAmount;", + " this.type = 'Noise';", + " this.duration = 0;", + " if (generators.length === 0) {", + " for (let i = 0; i < 100; i++) {", + " generators.push(new SimplexNoise());", + " }", + " }", + " }", + " initialize(particle) {", + " particle.lastPosNoise = new THREE.Vector3();", + " if (typeof particle.rotation === 'number') {", + " particle.lastRotNoise = 0;", + " }", + " else {", + " particle.lastRotNoise = new THREE.Quaternion();", + " }", + " particle.generatorIndex = [randomInt(0, 100), randomInt(0, 100), randomInt(0, 100), randomInt(0, 100)];", + " }", + " update(particle, _) {", + " let frequency = this.frequency.genValue(particle.age / particle.life);", + " let power = this.power.genValue(particle.age / particle.life);", + " let positionAmount = this.positionAmount.genValue(particle.age / particle.life);", + " let rotationAmount = this.rotationAmount.genValue(particle.age / particle.life);", + " if (positionAmount > 0 && particle.lastPosNoise !== undefined) {", + " particle.position.sub(particle.lastPosNoise);", + " tempV$2.set(generators[particle.generatorIndex[0]].noise2D(0, particle.age * frequency) *", + " power *", + " positionAmount, generators[particle.generatorIndex[1]].noise2D(0, particle.age * frequency) *", + " power *", + " positionAmount, generators[particle.generatorIndex[2]].noise2D(0, particle.age * frequency) *", + " power *", + " positionAmount);", + " particle.position.add(tempV$2);", + " particle.lastPosNoise.copy(tempV$2);", + " }", + " if (rotationAmount > 0 && particle.lastRotNoise !== undefined) {", + " if (typeof particle.rotation === 'number') {", + " particle.rotation -= particle.lastRotNoise;", + " particle.rotation +=", + " generators[particle.generatorIndex[3]].noise2D(0, particle.age * frequency) *", + " Math.PI *", + " power *", + " rotationAmount;", + " }", + " else {", + " particle.lastRotNoise.invert();", + " particle.rotation.multiply(particle.lastRotNoise);", + " tempQ$2", + " .set(generators[particle.generatorIndex[0]].noise2D(0, particle.age * frequency) *", + " power *", + " rotationAmount, generators[particle.generatorIndex[1]].noise2D(0, particle.age * frequency) *", + " power *", + " rotationAmount, generators[particle.generatorIndex[2]].noise2D(0, particle.age * frequency) *", + " power *", + " rotationAmount, generators[particle.generatorIndex[3]].noise2D(0, particle.age * frequency) *", + " power *", + " rotationAmount)", + " .normalize();", + " particle.rotation.multiply(tempQ$2);", + " particle.lastRotNoise.copy(tempQ$2);", + " }", + " }", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " frequency: this.frequency.toJSON(),", + " power: this.power.toJSON(),", + " positionAmount: this.positionAmount.toJSON(),", + " rotationAmount: this.rotationAmount.toJSON(),", + " };", + " }", + " frameUpdate(delta) {", + " this.duration += delta;", + " }", + " static fromJSON(json) {", + " return new Noise(ValueGeneratorFromJSON(json.frequency), ValueGeneratorFromJSON(json.power), ValueGeneratorFromJSON(json.positionAmount), ValueGeneratorFromJSON(json.rotationAmount));", + " }", + " clone() {", + " return new Noise(this.frequency.clone(), this.power.clone(), this.positionAmount.clone(), this.rotationAmount.clone());", + " }", + " reset() { }", + "}", + "", + "class TextureSequencer {", + " constructor(scaleX = 0, scaleY = 0, position = new THREE.Vector3()) {", + " this.scaleX = scaleX;", + " this.scaleY = scaleY;", + " this.position = position;", + " this.locations = [];", + " }", + " transform(position, index) {", + " position.x = this.locations[index % this.locations.length].x * this.scaleX + this.position.x;", + " position.y = this.locations[index % this.locations.length].y * this.scaleY + this.position.y;", + " position.z = this.position.z;", + " }", + " static fromJSON(json) {", + " const textureSequencer = new TextureSequencer(json.scaleX, json.scaleY, new THREE.Vector3(json.position[0], json.position[1], json.position[2]));", + " textureSequencer.locations = json.locations.map((loc) => new THREE.Vector2(loc.x, loc.y));", + " return textureSequencer;", + " }", + " clone() {", + " const textureSequencer = new TextureSequencer(this.scaleX, this.scaleY, this.position.clone());", + " textureSequencer.locations = this.locations.map(loc => loc.clone());", + " return textureSequencer;", + " }", + " toJSON() {", + " return {", + " scaleX: this.scaleX,", + " scaleY: this.scaleY,", + " position: this.position,", + " locations: this.locations.map(loc => ({", + " x: loc.x,", + " y: loc.y,", + " }))", + " };", + " }", + " fromImage(img, threshold) {", + " const canvas = document.createElement(\"canvas\");", + " canvas.width = img.width;", + " canvas.height = img.height;", + " const ctx = canvas.getContext(\"2d\");", + " if (!ctx) {", + " return;", + " }", + " ctx.drawImage(img, 0, 0);", + " const data = ctx.getImageData(0, 0, canvas.width, canvas.height, { colorSpace: \"srgb\" });", + " canvas.remove();", + " this.locations.length = 0;", + " for (let i = 0; i < data.height; i++) {", + " for (let j = 0; j < data.width; j++) {", + " if (data.data[(i * data.width + j) * 4 + 3] > threshold) {", + " this.locations.push(new THREE.Vector2(j, data.height - i));", + " }", + " }", + " }", + " }", + "}", + "", + "function SequencerFromJSON(json) {", + " switch (json.type) {", + " case 'TextureSequencer':", + " return TextureSequencer.fromJSON(json);", + " default:", + " return new TextureSequencer();", + " }", + "}", + "", + "class ApplySequences {", + " constructor(delayBetweenParticles) {", + " this.type = 'ApplySequences';", + " this.sequencers = [];", + " this.time = 0;", + " this.index = 0;", + " this.pCount = 0;", + " this.tempV = new THREE.Vector3();", + " this.delay = delayBetweenParticles;", + " }", + " initialize(particle) {", + " particle.id = this.pCount;", + " particle.dst = new THREE.Vector3();", + " particle.begin = new THREE.Vector3();", + " particle.inMotion = false;", + " this.pCount++;", + " }", + " reset() {", + " this.time = 0;", + " this.index = 0;", + " this.pCount = 0;", + " }", + " update(particle, delta) {", + " const sequencer = this.sequencers[this.index];", + " const delay = particle.id * this.delay;", + " if (this.time >= sequencer[0].a + delay && this.time <= sequencer[0].b + delay) {", + " if (!particle.inMotion) {", + " particle.inMotion = true;", + " particle.begin.copy(particle.position);", + " sequencer[1].transform(particle.dst, particle.id);", + " }", + " particle.position.lerpVectors(particle.begin, particle.dst, ApplySequences.BEZIER.genValue((this.time - sequencer[0].a - delay) / (sequencer[0].b - sequencer[0].a)));", + " }", + " else if (this.time > sequencer[0].b + delay) {", + " particle.inMotion = false;", + " }", + " }", + " frameUpdate(delta) {", + " while (this.index + 1 < this.sequencers.length && this.time >= this.sequencers[this.index + 1][0].a) {", + " this.index++;", + " }", + " this.time += delta;", + " }", + " appendSequencer(range, sequencer) {", + " this.sequencers.push([range, sequencer]);", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " delay: this.delay,", + " sequencers: this.sequencers.map(([range, sequencer]) => ({", + " range: range.toJSON(),", + " sequencer: sequencer.toJSON(),", + " })),", + " };", + " }", + " static fromJSON(json) {", + " const seq = new ApplySequences(json.delay);", + " json.sequencers.forEach((sequencerJson) => {", + " seq.sequencers.push([ValueGeneratorFromJSON(sequencerJson.range), SequencerFromJSON(sequencerJson.sequencer)]);", + " });", + " return seq;", + " }", + " clone() {", + " const applySequences = new ApplySequences(this.delay);", + " applySequences.sequencers = this.sequencers.map(seq => [seq[0].clone(), seq[1].clone()]);", + " return applySequences;", + " }", + "}", + "ApplySequences.BEZIER = new Bezier(0, 0, 1, 1);", + "", + "let physicsResolver;", + "function setPhysicsResolver(resolver) {", + " physicsResolver = resolver;", + "}", + "function getPhysicsResolver() {", + " return physicsResolver;", + "}", + "class ApplyCollision {", + " constructor(resolver, bounce) {", + " this.resolver = resolver;", + " this.bounce = bounce;", + " this.type = 'ApplyCollision';", + " this.tempV = new THREE.Vector3();", + " }", + " initialize(particle) {", + " }", + " update(particle, delta) {", + " if (this.resolver.resolve(particle.position, this.tempV)) {", + " particle.velocity.reflect(this.tempV).multiplyScalar(this.bounce);", + " }", + " }", + " frameUpdate(delta) {", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " bounce: this.bounce,", + " };", + " }", + " static fromJSON(json) {", + " return new ApplyCollision(getPhysicsResolver(), json.bounce);", + " }", + " clone() {", + " return new ApplyCollision(this.resolver, this.bounce);", + " }", + " reset() {", + " }", + "}", + "", + "class ColorBySpeed {", + " constructor(color, speedRange) {", + " this.color = color;", + " this.speedRange = speedRange;", + " this.type = 'ColorBySpeed';", + " }", + " initialize(particle) {", + " if (this.color.type === 'memorizedFunction') {", + " particle.colorOverLifeMemory = {};", + " this.color.startGen(particle.colorOverLifeMemory);", + " }", + " }", + " update(particle, delta) {", + " const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);", + " if (this.color.type === 'memorizedFunction') {", + " this.color.genColor(particle.color, t, particle.colorOverLifeMemory);", + " }", + " else {", + " this.color.genColor(particle.color, t);", + " }", + " particle.color.x *= particle.startColor.x;", + " particle.color.y *= particle.startColor.y;", + " particle.color.z *= particle.startColor.z;", + " particle.color.w *= particle.startColor.w;", + " }", + " frameUpdate(delta) { }", + " toJSON() {", + " return {", + " type: this.type,", + " color: this.color.toJSON(),", + " speedRange: this.speedRange.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new ColorBySpeed(ColorGeneratorFromJSON(json.color), IntervalValue.fromJSON(json.speedRange));", + " }", + " clone() {", + " return new ColorBySpeed(this.color.clone(), this.speedRange.clone());", + " }", + " reset() { }", + "}", + "", + "class SizeBySpeed {", + " initialize(particle) { }", + " constructor(size, speedRange) {", + " this.size = size;", + " this.speedRange = speedRange;", + " this.type = 'SizeBySpeed';", + " }", + " update(particle) {", + " const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);", + " particle.size = particle.startSize * this.size.genValue(t);", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " size: this.size.toJSON(),", + " speedRange: this.speedRange.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new SizeBySpeed(ValueGeneratorFromJSON(json.size), IntervalValue.fromJSON(json.speedRange));", + " }", + " frameUpdate(delta) { }", + " clone() {", + " return new SizeBySpeed(this.size.clone(), this.speedRange.clone());", + " }", + " reset() { }", + "}", + "", + "class RotationBySpeed {", + " constructor(angularVelocity, speedRange) {", + " this.angularVelocity = angularVelocity;", + " this.speedRange = speedRange;", + " this.type = 'RotationBySpeed';", + " this.tempQuat = new THREE.Quaternion();", + " }", + " initialize(particle) { }", + " update(particle, delta) {", + " const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);", + " particle.rotation += delta * this.angularVelocity.genValue(t);", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " angularVelocity: this.angularVelocity.toJSON(),", + " speedRange: this.speedRange.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new RotationBySpeed(ValueGeneratorFromJSON(json.angularVelocity), IntervalValue.fromJSON(json.speedRange));", + " }", + " frameUpdate(delta) { }", + " clone() {", + " return new RotationBySpeed(this.angularVelocity.clone(), this.speedRange.clone());", + " }", + " reset() { }", + "}", + "", + "class LimitSpeedOverLife {", + " initialize(particle) { }", + " constructor(speed, dampen) {", + " this.speed = speed;", + " this.dampen = dampen;", + " this.type = 'LimitSpeedOverLife';", + " }", + " update(particle, delta) {", + " let speed = particle.velocity.length();", + " let limit = this.speed.genValue(particle.age / particle.life);", + " if (speed > limit) {", + " const percent = (speed - limit) / speed;", + " particle.velocity.multiplyScalar(1 - percent * this.dampen * delta * 20);", + " }", + " }", + " toJSON() {", + " return {", + " type: this.type,", + " speed: this.speed.toJSON(),", + " dampen: this.dampen,", + " };", + " }", + " static fromJSON(json) {", + " return new LimitSpeedOverLife(ValueGeneratorFromJSON(json.speed), json.dampen);", + " }", + " frameUpdate(delta) { }", + " clone() {", + " return new LimitSpeedOverLife(this.speed.clone(), this.dampen);", + " }", + " reset() { }", + "}", + "", + "const BehaviorTypes = {", + " ApplyForce: {", + " type: 'ApplyForce',", + " constructor: ApplyForce,", + " params: [", + " ['direction', 'vec3'],", + " ['magnitude', 'value'],", + " ],", + " loadJSON: ApplyForce.fromJSON,", + " },", + " Noise: {", + " type: 'Noise',", + " constructor: Noise,", + " params: [", + " ['frequency', 'value'],", + " ['power', 'value'],", + " ['positionAmount', 'value'],", + " ['rotationAmount', 'value'],", + " ],", + " loadJSON: Noise.fromJSON,", + " },", + " TurbulenceField: {", + " type: 'TurbulenceField',", + " constructor: TurbulenceField,", + " params: [", + " ['scale', 'vec3'],", + " ['octaves', 'number'],", + " ['velocityMultiplier', 'vec3'],", + " ['timeScale', 'vec3'],", + " ],", + " loadJSON: TurbulenceField.fromJSON,", + " },", + " GravityForce: {", + " type: 'GravityForce',", + " constructor: GravityForce,", + " params: [", + " ['center', 'vec3'],", + " ['magnitude', 'number'],", + " ],", + " loadJSON: GravityForce.fromJSON,", + " },", + " ColorOverLife: {", + " type: 'ColorOverLife',", + " constructor: ColorOverLife,", + " params: [['color', 'colorFunc']],", + " loadJSON: ColorOverLife.fromJSON,", + " },", + " RotationOverLife: {", + " type: 'RotationOverLife',", + " constructor: RotationOverLife,", + " params: [['angularVelocity', 'valueFunc']],", + " loadJSON: RotationOverLife.fromJSON,", + " },", + " Rotation3DOverLife: {", + " type: 'Rotation3DOverLife',", + " constructor: Rotation3DOverLife,", + " params: [['angularVelocity', 'rotationFunc']],", + " loadJSON: Rotation3DOverLife.fromJSON,", + " },", + " SizeOverLife: {", + " type: 'SizeOverLife',", + " constructor: SizeOverLife,", + " params: [['size', 'valueFunc']],", + " loadJSON: SizeOverLife.fromJSON,", + " },", + " ColorBySpeed: {", + " type: 'ColorBySpeed',", + " constructor: ColorBySpeed,", + " params: [", + " ['color', 'colorFunc'],", + " ['speedRange', 'range'],", + " ],", + " loadJSON: ColorBySpeed.fromJSON,", + " },", + " RotationBySpeed: {", + " type: 'RotationBySpeed',", + " constructor: RotationBySpeed,", + " params: [", + " ['angularVelocity', 'valueFunc'],", + " ['speedRange', 'range'],", + " ],", + " loadJSON: RotationBySpeed.fromJSON,", + " },", + " SizeBySpeed: {", + " type: 'SizeBySpeed',", + " constructor: SizeBySpeed,", + " params: [", + " ['size', 'valueFunc'],", + " ['speedRange', 'range'],", + " ],", + " loadJSON: SizeBySpeed.fromJSON,", + " },", + " SpeedOverLife: {", + " type: 'SpeedOverLife',", + " constructor: SpeedOverLife,", + " params: [['speed', 'valueFunc']],", + " loadJSON: SpeedOverLife.fromJSON,", + " },", + " FrameOverLife: {", + " type: 'FrameOverLife',", + " constructor: FrameOverLife,", + " params: [['frame', 'valueFunc']],", + " loadJSON: FrameOverLife.fromJSON,", + " },", + " ForceOverLife: {", + " type: 'ForceOverLife',", + " constructor: ForceOverLife,", + " params: [", + " ['x', 'valueFunc'],", + " ['y', 'valueFunc'],", + " ['z', 'valueFunc'],", + " ],", + " loadJSON: ForceOverLife.fromJSON,", + " },", + " OrbitOverLife: {", + " type: 'OrbitOverLife',", + " constructor: OrbitOverLife,", + " params: [", + " ['orbitSpeed', 'valueFunc'],", + " ['axis', 'vec3'],", + " ],", + " loadJSON: OrbitOverLife.fromJSON,", + " },", + " WidthOverLength: {", + " type: 'WidthOverLength',", + " constructor: WidthOverLength,", + " params: [['width', 'valueFunc']],", + " loadJSON: WidthOverLength.fromJSON,", + " },", + " ChangeEmitDirection: {", + " type: 'ChangeEmitDirection',", + " constructor: ChangeEmitDirection,", + " params: [['angle', 'value']],", + " loadJSON: ChangeEmitDirection.fromJSON,", + " },", + " EmitSubParticleSystem: {", + " type: 'EmitSubParticleSystem',", + " constructor: EmitSubParticleSystem,", + " params: [", + " ['particleSystem', 'self'],", + " ['useVelocityAsBasis', 'boolean'],", + " ['subParticleSystem', 'particleSystem'],", + " ['mode', 'number'],", + " ['emitProbability', 'number'],", + " ],", + " loadJSON: EmitSubParticleSystem.fromJSON,", + " },", + " LimitSpeedOverLife: {", + " type: 'LimitSpeedOverLife',", + " constructor: LimitSpeedOverLife,", + " params: [", + " ['speed', 'valueFunc'],", + " ['dampen', 'number'],", + " ],", + " loadJSON: LimitSpeedOverLife.fromJSON,", + " },", + "};", + "function BehaviorFromJSON(json, particleSystem) {", + " return BehaviorTypes[json.type].loadJSON(json, particleSystem);", + "}", + "", + "let EmitterMode = void 0;", + "(function (EmitterMode) {", + " EmitterMode[EmitterMode[\"Random\"] = 0] = \"Random\";", + " EmitterMode[EmitterMode[\"Loop\"] = 1] = \"Loop\";", + " EmitterMode[EmitterMode[\"PingPong\"] = 2] = \"PingPong\";", + " EmitterMode[EmitterMode[\"Burst\"] = 3] = \"Burst\";", + "})(EmitterMode || (EmitterMode = {}));", + "function getValueFromEmitterMode(mode, currentValue, spread) {", + " let u;", + " if (EmitterMode.Random === mode) {", + " currentValue = Math.random();", + " }", + " if (spread > 0) {", + " u = Math.floor(currentValue / spread) * spread;", + " }", + " else {", + " u = currentValue;", + " }", + " switch (mode) {", + " case EmitterMode.Loop:", + " u = u % 1;", + " break;", + " case EmitterMode.PingPong:", + " u = Math.abs((u % 2) - 1);", + " break;", + " }", + " return u;", + "}", + "", + "class ConeEmitter {", + " constructor(parameters = {}) {", + " var _a, _b, _c, _d, _e, _f, _g;", + " this.type = 'cone';", + " this.currentValue = 0;", + " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", + " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", + " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", + " this.angle = (_d = parameters.angle) !== null && _d !== void 0 ? _d : Math.PI / 6;", + " this.mode = (_e = parameters.mode) !== null && _e !== void 0 ? _e : EmitterMode.Random;", + " this.spread = (_f = parameters.spread) !== null && _f !== void 0 ? _f : 0;", + " this.speed = (_g = parameters.speed) !== null && _g !== void 0 ? _g : new ConstantValue(1);", + " }", + " update(system, delta) {", + " if (EmitterMode.Random != this.mode) {", + " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", + " }", + " }", + " initialize(p) {", + " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", + " const rand = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", + " const theta = u * this.arc;", + " const r = Math.sqrt(rand);", + " const sinTheta = Math.sin(theta);", + " const cosTheta = Math.cos(theta);", + " p.position.x = r * cosTheta;", + " p.position.y = r * sinTheta;", + " p.position.z = 0;", + " const angle = this.angle * r;", + " p.velocity.set(0, 0, Math.cos(angle)).addScaledVector(p.position, Math.sin(angle)).multiplyScalar(p.startSpeed);", + " p.position.multiplyScalar(this.radius);", + " }", + " toJSON() {", + " return {", + " type: 'cone',", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " angle: this.angle,", + " mode: this.mode,", + " spread: this.spread,", + " speed: this.speed.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new ConeEmitter({", + " radius: json.radius,", + " arc: json.arc,", + " thickness: json.thickness,", + " angle: json.angle,", + " mode: json.mode,", + " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", + " spread: json.spread,", + " });", + " }", + " clone() {", + " return new ConeEmitter({", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " angle: this.angle,", + " mode: this.mode,", + " speed: this.speed.clone(),", + " spread: this.spread,", + " });", + " }", + "}", + "", + "class CircleEmitter {", + " constructor(parameters = {}) {", + " var _a, _b, _c, _d, _e, _f;", + " this.type = 'circle';", + " this.currentValue = 0;", + " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", + " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", + " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", + " this.mode = (_d = parameters.mode) !== null && _d !== void 0 ? _d : EmitterMode.Random;", + " this.spread = (_e = parameters.spread) !== null && _e !== void 0 ? _e : 0;", + " this.speed = (_f = parameters.speed) !== null && _f !== void 0 ? _f : new ConstantValue(1);", + " }", + " update(system, delta) {", + " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", + " }", + " initialize(p) {", + " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", + " const r = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", + " const theta = u * this.arc;", + " p.position.x = Math.cos(theta);", + " p.position.y = Math.sin(theta);", + " p.position.z = 0;", + " p.velocity.copy(p.position).multiplyScalar(p.startSpeed);", + " p.position.multiplyScalar(this.radius * r);", + " }", + " toJSON() {", + " return {", + " type: 'circle',", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " mode: this.mode,", + " spread: this.spread,", + " speed: this.speed.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new CircleEmitter({", + " radius: json.radius,", + " arc: json.arc,", + " thickness: json.thickness,", + " mode: json.mode,", + " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", + " spread: json.spread,", + " });", + " }", + " clone() {", + " return new CircleEmitter({", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " mode: this.mode,", + " speed: this.speed.clone(),", + " spread: this.spread,", + " });", + " }", + "}", + "", + "class DonutEmitter {", + " constructor(parameters = {}) {", + " var _a, _b, _c, _d, _e, _f, _g;", + " this.type = 'donut';", + " this.currentValue = 0;", + " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", + " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", + " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", + " this.donutRadius = (_d = parameters.donutRadius) !== null && _d !== void 0 ? _d : this.radius * 0.2;", + " this.mode = (_e = parameters.mode) !== null && _e !== void 0 ? _e : EmitterMode.Random;", + " this.spread = (_f = parameters.spread) !== null && _f !== void 0 ? _f : 0;", + " this.speed = (_g = parameters.speed) !== null && _g !== void 0 ? _g : new ConstantValue(1);", + " }", + " update(system, delta) {", + " if (EmitterMode.Random != this.mode) {", + " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", + " }", + " }", + " initialize(p) {", + " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", + " const v = Math.random();", + " const rand = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", + " const theta = u * this.arc;", + " const phi = v * Math.PI * 2;", + " const sinTheta = Math.sin(theta);", + " const cosTheta = Math.cos(theta);", + " p.position.x = this.radius * cosTheta;", + " p.position.y = this.radius * sinTheta;", + " p.position.z = 0;", + " p.velocity.z = this.donutRadius * rand * Math.sin(phi);", + " p.velocity.x = this.donutRadius * rand * Math.cos(phi) * cosTheta;", + " p.velocity.y = this.donutRadius * rand * Math.cos(phi) * sinTheta;", + " p.position.add(p.velocity);", + " p.velocity.normalize().multiplyScalar(p.startSpeed);", + " }", + " toJSON() {", + " return {", + " type: 'donut',", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " donutRadius: this.donutRadius,", + " mode: this.mode,", + " spread: this.spread,", + " speed: this.speed.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new DonutEmitter({", + " radius: json.radius,", + " arc: json.arc,", + " thickness: json.thickness,", + " donutRadius: json.donutRadius,", + " mode: json.mode,", + " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", + " spread: json.spread,", + " });", + " }", + " clone() {", + " return new DonutEmitter({", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " donutRadius: this.donutRadius,", + " mode: this.mode,", + " speed: this.speed.clone(),", + " spread: this.spread,", + " });", + " }", + "}", + "", + "class PointEmitter {", + " constructor() {", + " this.type = 'point';", + " }", + " update(system, delta) { }", + " initialize(p) {", + " const u = Math.random();", + " const v = Math.random();", + " const theta = u * Math.PI * 2;", + " const phi = Math.acos(2.0 * v - 1.0);", + " const r = Math.cbrt(Math.random());", + " const sinTheta = Math.sin(theta);", + " const cosTheta = Math.cos(theta);", + " const sinPhi = Math.sin(phi);", + " const cosPhi = Math.cos(phi);", + " p.velocity.x = r * sinPhi * cosTheta;", + " p.velocity.y = r * sinPhi * sinTheta;", + " p.velocity.z = r * cosPhi;", + " p.velocity.multiplyScalar(p.startSpeed);", + " p.position.setScalar(0);", + " }", + " toJSON() {", + " return {", + " type: 'point',", + " };", + " }", + " static fromJSON(json) {", + " return new PointEmitter();", + " }", + " clone() {", + " return new PointEmitter();", + " }", + "}", + "", + "class SphereEmitter {", + " constructor(parameters = {}) {", + " var _a, _b, _c, _d, _e, _f;", + " this.type = 'sphere';", + " this.currentValue = 0;", + " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", + " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", + " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", + " this.mode = (_d = parameters.mode) !== null && _d !== void 0 ? _d : EmitterMode.Random;", + " this.spread = (_e = parameters.spread) !== null && _e !== void 0 ? _e : 0;", + " this.speed = (_f = parameters.speed) !== null && _f !== void 0 ? _f : new ConstantValue(1);", + " }", + " update(system, delta) {", + " if (EmitterMode.Random != this.mode) {", + " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", + " }", + " }", + " initialize(p) {", + " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", + " const v = Math.random();", + " const rand = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", + " const theta = u * this.arc;", + " const phi = Math.acos(2.0 * v - 1.0);", + " const sinTheta = Math.sin(theta);", + " const cosTheta = Math.cos(theta);", + " const sinPhi = Math.sin(phi);", + " const cosPhi = Math.cos(phi);", + " p.position.x = sinPhi * cosTheta;", + " p.position.y = sinPhi * sinTheta;", + " p.position.z = cosPhi;", + " p.velocity.copy(p.position).multiplyScalar(p.startSpeed);", + " p.position.multiplyScalar(this.radius * rand);", + " }", + " toJSON() {", + " return {", + " type: 'sphere',", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " mode: this.mode,", + " spread: this.spread,", + " speed: this.speed.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new SphereEmitter({", + " radius: json.radius,", + " arc: json.arc,", + " thickness: json.thickness,", + " mode: json.mode,", + " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", + " spread: json.spread,", + " });", + " }", + " clone() {", + " return new SphereEmitter({", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " mode: this.mode,", + " speed: this.speed.clone(),", + " spread: this.spread,", + " });", + " }", + "}", + "", + "class HemisphereEmitter {", + " constructor(parameters = {}) {", + " var _a, _b, _c, _d, _e, _f;", + " this.type = 'sphere';", + " this.currentValue = 0;", + " this.radius = (_a = parameters.radius) !== null && _a !== void 0 ? _a : 10;", + " this.arc = (_b = parameters.arc) !== null && _b !== void 0 ? _b : 2.0 * Math.PI;", + " this.thickness = (_c = parameters.thickness) !== null && _c !== void 0 ? _c : 1;", + " this.mode = (_d = parameters.mode) !== null && _d !== void 0 ? _d : EmitterMode.Random;", + " this.spread = (_e = parameters.spread) !== null && _e !== void 0 ? _e : 0;", + " this.speed = (_f = parameters.speed) !== null && _f !== void 0 ? _f : new ConstantValue(1);", + " }", + " update(system, delta) {", + " if (EmitterMode.Random != this.mode) {", + " this.currentValue += this.speed.genValue(system.emissionState.time / system.duration) * delta;", + " }", + " }", + " initialize(p) {", + " const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread);", + " const v = Math.random();", + " const rand = THREE.MathUtils.lerp(1 - this.thickness, 1, Math.random());", + " const theta = u * this.arc;", + " const phi = Math.acos(v);", + " const sinTheta = Math.sin(theta);", + " const cosTheta = Math.cos(theta);", + " const sinPhi = Math.sin(phi);", + " const cosPhi = Math.cos(phi);", + " p.position.x = sinPhi * cosTheta;", + " p.position.y = sinPhi * sinTheta;", + " p.position.z = cosPhi;", + " p.velocity.copy(p.position).multiplyScalar(p.startSpeed);", + " p.position.multiplyScalar(this.radius * rand);", + " }", + " toJSON() {", + " return {", + " type: 'hemisphere',", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " mode: this.mode,", + " spread: this.spread,", + " speed: this.speed.toJSON(),", + " };", + " }", + " static fromJSON(json) {", + " return new HemisphereEmitter({", + " radius: json.radius,", + " arc: json.arc,", + " thickness: json.thickness,", + " mode: json.mode,", + " speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,", + " spread: json.spread,", + " });", + " }", + " clone() {", + " return new HemisphereEmitter({", + " radius: this.radius,", + " arc: this.arc,", + " thickness: this.thickness,", + " mode: this.mode,", + " speed: this.speed.clone(),", + " spread: this.spread,", + " });", + " }", + "}", + "", + "class GridEmitter {", + " constructor(parameters = {}) {", + " var _a, _b, _c, _d;", + " this.type = 'grid';", + " this.width = (_a = parameters.width) !== null && _a !== void 0 ? _a : 1;", + " this.height = (_b = parameters.height) !== null && _b !== void 0 ? _b : 1;", + " this.column = (_c = parameters.column) !== null && _c !== void 0 ? _c : 10;", + " this.row = (_d = parameters.row) !== null && _d !== void 0 ? _d : 10;", + " }", + " initialize(p) {", + " const r = Math.floor(Math.random() * this.row);", + " const c = Math.floor(Math.random() * this.column);", + " p.position.x = (c * this.width) / this.column - this.width / 2;", + " p.position.y = (r * this.height) / this.row - this.height / 2;", + " p.position.z = 0;", + " p.velocity.set(0, 0, p.startSpeed);", + " }", + " toJSON() {", + " return {", + " type: 'grid',", + " width: this.width,", + " height: this.height,", + " column: this.column,", + " row: this.row,", + " };", + " }", + " static fromJSON(json) {", + " return new GridEmitter(json);", + " }", + " clone() {", + " return new GridEmitter({", + " width: this.width,", + " height: this.height,", + " column: this.column,", + " row: this.row,", + " });", + " }", + " update(system, delta) { }", + "}", + "", + "class MeshSurfaceEmitter {", + " get geometry() {", + " return this._geometry;", + " }", + " set geometry(geometry) {", + " this._geometry = geometry;", + " if (geometry === undefined) {", + " return;", + " }", + " if (typeof geometry === 'string') {", + " return;", + " }", + " const tri = new THREE.Triangle();", + " this._triangleIndexToArea.length = 0;", + " let area = 0;", + " if (!geometry.getIndex()) {", + " return;", + " }", + " const array = geometry.getIndex().array;", + " const triCount = array.length / 3;", + " this._triangleIndexToArea.push(0);", + " for (let i = 0; i < triCount; i++) {", + " tri.setFromAttributeAndIndices(geometry.getAttribute('position'), array[i * 3], array[i * 3 + 1], array[i * 3 + 2]);", + " area += tri.getArea();", + " this._triangleIndexToArea.push(area);", + " }", + " geometry.userData.triangleIndexToArea = this._triangleIndexToArea;", + " }", + " constructor(geometry) {", + " this.type = 'mesh_surface';", + " this._triangleIndexToArea = [];", + " this._tempA = new THREE.Vector3();", + " this._tempB = new THREE.Vector3();", + " this._tempC = new THREE.Vector3();", + " if (!geometry) {", + " return;", + " }", + " this.geometry = geometry;", + " }", + " initialize(p) {", + " const geometry = this._geometry;", + " if (!geometry || geometry.getIndex() === null) {", + " p.position.set(0, 0, 0);", + " p.velocity.set(0, 0, 1).multiplyScalar(p.startSpeed);", + " return;", + " }", + " const triCount = this._triangleIndexToArea.length - 1;", + " let left = 0, right = triCount;", + " const target = Math.random() * this._triangleIndexToArea[triCount];", + " while (left + 1 < right) {", + " const mid = Math.floor((left + right) / 2);", + " if (target < this._triangleIndexToArea[mid]) {", + " right = mid;", + " }", + " else {", + " left = mid;", + " }", + " }", + " let u1 = Math.random();", + " let u2 = Math.random();", + " if (u1 + u2 > 1) {", + " u1 = 1 - u1;", + " u2 = 1 - u2;", + " }", + " const index1 = geometry.getIndex().array[left * 3];", + " const index2 = geometry.getIndex().array[left * 3 + 1];", + " const index3 = geometry.getIndex().array[left * 3 + 2];", + " const positionBuffer = geometry.getAttribute('position');", + " this._tempA.fromBufferAttribute(positionBuffer, index1);", + " this._tempB.fromBufferAttribute(positionBuffer, index2);", + " this._tempC.fromBufferAttribute(positionBuffer, index3);", + " this._tempB.sub(this._tempA);", + " this._tempC.sub(this._tempA);", + " this._tempA.addScaledVector(this._tempB, u1).addScaledVector(this._tempC, u2);", + " p.position.copy(this._tempA);", + " this._tempA.copy(this._tempB).cross(this._tempC).normalize();", + " p.velocity.copy(this._tempA).normalize().multiplyScalar(p.startSpeed);", + " }", + " toJSON() {", + " return {", + " type: 'mesh_surface',", + " mesh: this._geometry ? this._geometry.uuid : '',", + " };", + " }", + " static fromJSON(json, meta) {", + " return new MeshSurfaceEmitter(meta.geometries[json.geometry]);", + " }", + " clone() {", + " return new MeshSurfaceEmitter(this._geometry);", + " }", + " update(system, delta) { }", + "}", + "", + "const EmitterShapes = {", + " circle: {", + " type: 'circle',", + " params: [", + " ['radius', 'number'],", + " ['arc', 'radian'],", + " ['thickness', 'number'],", + " ['mode', 'emitterMode'],", + " ['spread', 'number'],", + " ['speed', 'valueFunc'],", + " ],", + " constructor: CircleEmitter,", + " loadJSON: CircleEmitter.fromJSON,", + " },", + " cone: {", + " type: 'cone',", + " params: [", + " ['radius', 'number'],", + " ['arc', 'radian'],", + " ['thickness', 'number'],", + " ['angle', 'radian'],", + " ['mode', 'emitterMode'],", + " ['spread', 'number'],", + " ['speed', 'valueFunc'],", + " ],", + " constructor: ConeEmitter,", + " loadJSON: ConeEmitter.fromJSON,", + " },", + " donut: {", + " type: 'donut',", + " params: [", + " ['radius', 'number'],", + " ['arc', 'radian'],", + " ['thickness', 'number'],", + " ['donutRadius', 'number'],", + " ['mode', 'emitterMode'],", + " ['spread', 'number'],", + " ['speed', 'valueFunc'],", + " ],", + " constructor: DonutEmitter,", + " loadJSON: DonutEmitter.fromJSON,", + " },", + " point: { type: 'point', params: [], constructor: PointEmitter, loadJSON: PointEmitter.fromJSON },", + " sphere: {", + " type: 'sphere',", + " params: [", + " ['radius', 'number'],", + " ['arc', 'radian'],", + " ['thickness', 'number'],", + " ['angle', 'radian'],", + " ['mode', 'emitterMode'],", + " ['spread', 'number'],", + " ['speed', 'valueFunc'],", + " ],", + " constructor: SphereEmitter,", + " loadJSON: SphereEmitter.fromJSON,", + " },", + " hemisphere: {", + " type: 'hemisphere',", + " params: [", + " ['radius', 'number'],", + " ['arc', 'radian'],", + " ['thickness', 'number'],", + " ['angle', 'radian'],", + " ['mode', 'emitterMode'],", + " ['spread', 'number'],", + " ['speed', 'valueFunc'],", + " ],", + " constructor: HemisphereEmitter,", + " loadJSON: HemisphereEmitter.fromJSON,", + " },", + " grid: {", + " type: 'grid',", + " params: [", + " ['width', 'number'],", + " ['height', 'number'],", + " ['rows', 'number'],", + " ['column', 'number'],", + " ],", + " constructor: GridEmitter,", + " loadJSON: GridEmitter.fromJSON,", + " },", + " mesh_surface: {", + " type: 'mesh_surface',", + " params: [['geometry', 'geometry']],", + " constructor: MeshSurfaceEmitter,", + " loadJSON: MeshSurfaceEmitter.fromJSON,", + " },", + "};", + "function EmitterFromJSON(json, meta) {", + " return EmitterShapes[json.type].loadJSON(json, meta);", + "}", + "", + "let RenderMode = void 0;", + "(function (RenderMode) {", + " RenderMode[RenderMode[\"BillBoard\"] = 0] = \"BillBoard\";", + " RenderMode[RenderMode[\"StretchedBillBoard\"] = 1] = \"StretchedBillBoard\";", + " RenderMode[RenderMode[\"Mesh\"] = 2] = \"Mesh\";", + " RenderMode[RenderMode[\"Trail\"] = 3] = \"Trail\";", + " RenderMode[RenderMode[\"HorizontalBillBoard\"] = 4] = \"HorizontalBillBoard\";", + " RenderMode[RenderMode[\"VerticalBillBoard\"] = 5] = \"VerticalBillBoard\";", + "})(RenderMode || (RenderMode = {}));", + "class VFXBatch extends THREE.Mesh {", + " constructor(settings) {", + " super();", + " this.type = 'VFXBatch';", + " this.maxParticles = 1000;", + " this.systems = new Set();", + " const layers = new THREE.Layers();", + " layers.mask = settings.layers.mask;", + " const newMat = settings.material.clone();", + " newMat.defines = {};", + " Object.assign(newMat.defines, settings.material.defines);", + " this.settings = {", + " instancingGeometry: settings.instancingGeometry,", + " renderMode: settings.renderMode,", + " renderOrder: settings.renderOrder,", + " material: newMat,", + " uTileCount: settings.uTileCount,", + " vTileCount: settings.vTileCount,", + " layers: layers,", + " };", + " this.frustumCulled = false;", + " this.renderOrder = this.settings.renderOrder;", + " }", + " addSystem(system) {", + " this.systems.add(system);", + " }", + " removeSystem(system) {", + " this.systems.delete(system);", + " }", + "}", + "", + "const UP = new THREE.Vector3(0, 0, 1);", + "const tempQ$1 = new THREE.Quaternion();", + "const tempV$1 = new THREE.Vector3();", + "const tempV2$1 = new THREE.Vector3();", + "new THREE.Vector3();", + "const PREWARM_FPS$1 = 60;", + "const DEFAULT_GEOMETRY$1 = new THREE.PlaneGeometry(1, 1, 1, 1);", + "class ParticleSystem {", + " set time(time) {", + " this.emissionState.time = time;", + " }", + " get time() {", + " return this.emissionState.time;", + " }", + " get layers() {", + " return this.rendererSettings.layers;", + " }", + " get texture() {", + " return this.rendererSettings.material.map;", + " }", + " set texture(texture) {", + " this.rendererSettings.material.map = texture;", + " this.neededToUpdateRender = true;", + " }", + " get material() {", + " return this.rendererSettings.material;", + " }", + " set material(material) {", + " this.rendererSettings.material = material;", + " this.neededToUpdateRender = true;", + " }", + " get uTileCount() {", + " return this.rendererSettings.uTileCount;", + " }", + " set uTileCount(u) {", + " this.rendererSettings.uTileCount = u;", + " this.neededToUpdateRender = true;", + " }", + " get vTileCount() {", + " return this.rendererSettings.vTileCount;", + " }", + " set vTileCount(v) {", + " this.rendererSettings.vTileCount = v;", + " this.neededToUpdateRender = true;", + " }", + " get instancingGeometry() {", + " return this.rendererSettings.instancingGeometry;", + " }", + " set instancingGeometry(geometry) {", + " this.restart();", + " this.particles.length = 0;", + " this.rendererSettings.instancingGeometry = geometry;", + " this.neededToUpdateRender = true;", + " }", + " get renderMode() {", + " return this.rendererSettings.renderMode;", + " }", + " set renderMode(renderMode) {", + " if ((this.rendererSettings.renderMode != RenderMode.Trail && renderMode === RenderMode.Trail) ||", + " (this.rendererSettings.renderMode == RenderMode.Trail && renderMode !== RenderMode.Trail)) {", + " this.restart();", + " this.particles.length = 0;", + " }", + " if (this.rendererSettings.renderMode !== renderMode) {", + " switch (renderMode) {", + " case RenderMode.Trail:", + " this.rendererEmitterSettings = {", + " startLength: new ConstantValue(30),", + " followLocalOrigin: false,", + " };", + " break;", + " case RenderMode.Mesh:", + " this.rendererEmitterSettings = {", + " geometry: new THREE.PlaneGeometry(1, 1),", + " };", + " this.startRotation = new AxisAngleGenerator(new THREE.Vector3(0, 1, 0), new ConstantValue(0));", + " break;", + " case RenderMode.StretchedBillBoard:", + " this.rendererEmitterSettings = { speedFactor: 0, lengthFactor: 2 };", + " if (this.rendererSettings.renderMode === RenderMode.Mesh) {", + " this.startRotation = new ConstantValue(0);", + " }", + " break;", + " case RenderMode.BillBoard:", + " case RenderMode.VerticalBillBoard:", + " case RenderMode.HorizontalBillBoard:", + " this.rendererEmitterSettings = {};", + " if (this.rendererSettings.renderMode === RenderMode.Mesh) {", + " this.startRotation = new ConstantValue(0);", + " }", + " break;", + " }", + " }", + " this.rendererSettings.renderMode = renderMode;", + " this.neededToUpdateRender = true;", + " }", + " get renderOrder() {", + " return this.rendererSettings.renderOrder;", + " }", + " set renderOrder(renderOrder) {", + " this.rendererSettings.renderOrder = renderOrder;", + " this.neededToUpdateRender = true;", + " }", + " get blending() {", + " return this.rendererSettings.material.blending;", + " }", + " set blending(blending) {", + " this.rendererSettings.material.blending = blending;", + " this.neededToUpdateRender = true;", + " }", + " constructor(parameters) {", + " var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;", + " this.temp = new THREE.Vector3();", + " this.travelDistance = 0;", + " this.normalMatrix = new THREE.Matrix3();", + " this.firstTimeUpdate = true;", + " this.autoDestroy = parameters.autoDestroy === undefined ? false : parameters.autoDestroy;", + " this.duration = (_a = parameters.duration) !== null && _a !== void 0 ? _a : 1;", + " this.looping = parameters.looping === undefined ? true : parameters.looping;", + " this.prewarm = parameters.prewarm === undefined ? false : parameters.prewarm;", + " this.startLife = (_b = parameters.startLife) !== null && _b !== void 0 ? _b : new ConstantValue(5);", + " this.startSpeed = (_c = parameters.startSpeed) !== null && _c !== void 0 ? _c : new ConstantValue(0);", + " this.startRotation = (_d = parameters.startRotation) !== null && _d !== void 0 ? _d : new ConstantValue(0);", + " this.startSize = (_e = parameters.startSize) !== null && _e !== void 0 ? _e : new ConstantValue(1);", + " this.startColor = (_f = parameters.startColor) !== null && _f !== void 0 ? _f : new ConstantColor(new THREE.Vector4(1, 1, 1, 1));", + " this.emissionOverTime = (_g = parameters.emissionOverTime) !== null && _g !== void 0 ? _g : new ConstantValue(10);", + " this.emissionOverDistance = (_h = parameters.emissionOverDistance) !== null && _h !== void 0 ? _h : new ConstantValue(0);", + " this.emissionBursts = (_j = parameters.emissionBursts) !== null && _j !== void 0 ? _j : [];", + " this.onlyUsedByOther = (_k = parameters.onlyUsedByOther) !== null && _k !== void 0 ? _k : false;", + " this.emitterShape = (_l = parameters.shape) !== null && _l !== void 0 ? _l : new SphereEmitter();", + " this.behaviors = (_m = parameters.behaviors) !== null && _m !== void 0 ? _m : new Array();", + " this.worldSpace = (_o = parameters.worldSpace) !== null && _o !== void 0 ? _o : false;", + " this.rendererEmitterSettings = (_p = parameters.rendererEmitterSettings) !== null && _p !== void 0 ? _p : {};", + " if (parameters.renderMode === RenderMode.StretchedBillBoard) {", + " const stretchedBillboardSettings = this.rendererEmitterSettings;", + " if (parameters.speedFactor !== undefined) {", + " stretchedBillboardSettings.speedFactor = parameters.speedFactor;", + " }", + " stretchedBillboardSettings.speedFactor = (_q = stretchedBillboardSettings.speedFactor) !== null && _q !== void 0 ? _q : 0;", + " stretchedBillboardSettings.lengthFactor = (_r = stretchedBillboardSettings.lengthFactor) !== null && _r !== void 0 ? _r : 0;", + " }", + " this.rendererSettings = {", + " instancingGeometry: (_s = parameters.instancingGeometry) !== null && _s !== void 0 ? _s : DEFAULT_GEOMETRY$1,", + " renderMode: (_t = parameters.renderMode) !== null && _t !== void 0 ? _t : RenderMode.BillBoard,", + " renderOrder: (_u = parameters.renderOrder) !== null && _u !== void 0 ? _u : 0,", + " material: parameters.material,", + " uTileCount: (_v = parameters.uTileCount) !== null && _v !== void 0 ? _v : 1,", + " vTileCount: (_w = parameters.vTileCount) !== null && _w !== void 0 ? _w : 1,", + " layers: (_x = parameters.layers) !== null && _x !== void 0 ? _x : new THREE.Layers(),", + " };", + " this.neededToUpdateRender = true;", + " this.particles = new Array();", + " this.startTileIndex = parameters.startTileIndex || new ConstantValue(0);", + " this.emitter = new ParticleEmitter(this);", + " this.paused = false;", + " this.particleNum = 0;", + " this.emissionState = {", + " burstIndex: 0,", + " burstWaveIndex: 0,", + " time: 0,", + " waitEmiting: 0,", + " travelDistance: 0,", + " };", + " this.emitEnded = false;", + " this.markForDestroy = false;", + " this.prewarmed = false;", + " }", + " pause() {", + " this.paused = true;", + " }", + " play() {", + " this.paused = false;", + " }", + " spawn(count, emissionState, matrix) {", + " tempQ$1.setFromRotationMatrix(matrix);", + " const translation = tempV$1;", + " const quaternion = tempQ$1;", + " const scale = tempV2$1;", + " matrix.decompose(translation, quaternion, scale);", + " for (let i = 0; i < count; i++) {", + " this.particleNum++;", + " while (this.particles.length < this.particleNum) {", + " if (this.rendererSettings.renderMode === RenderMode.Trail) {", + " this.particles.push(new TrailParticle());", + " }", + " else {", + " this.particles.push(new SpriteParticle());", + " }", + " }", + " const particle = this.particles[this.particleNum - 1];", + " particle.speedModifier = 1;", + " this.startColor.genColor(particle.startColor, this.emissionState.time, {});", + " particle.color.copy(particle.startColor);", + " particle.startSpeed = this.startSpeed.genValue(emissionState.time / this.duration);", + " particle.life = this.startLife.genValue(emissionState.time / this.duration);", + " particle.age = 0;", + " particle.startSize = this.startSize.genValue(emissionState.time / this.duration);", + " particle.uvTile = Math.floor(this.startTileIndex.genValue() + 0.001);", + " particle.size = particle.startSize;", + " if (this.rendererSettings.renderMode === RenderMode.Mesh ||", + " this.rendererSettings.renderMode === RenderMode.BillBoard ||", + " this.rendererSettings.renderMode === RenderMode.VerticalBillBoard ||", + " this.rendererSettings.renderMode === RenderMode.HorizontalBillBoard ||", + " this.rendererSettings.renderMode === RenderMode.StretchedBillBoard) {", + " const sprite = particle;", + " if (this.rendererSettings.renderMode === RenderMode.Mesh) {", + " if (!(sprite.rotation instanceof THREE.Quaternion)) {", + " sprite.rotation = new THREE.Quaternion();", + " }", + " if (this.startRotation.type === 'rotation') {", + " this.startRotation.genValue(sprite.rotation, emissionState.time / this.duration);", + " }", + " else {", + " sprite.rotation.setFromAxisAngle(UP, this.startRotation.genValue((emissionState.time / this.duration)));", + " }", + " }", + " else {", + " if (this.startRotation.type === 'rotation') {", + " sprite.rotation = 0;", + " }", + " else {", + " sprite.rotation = this.startRotation.genValue(emissionState.time / this.duration);", + " }", + " }", + " }", + " else if (this.rendererSettings.renderMode === RenderMode.Trail) {", + " const trail = particle;", + " trail.length = this.rendererEmitterSettings.startLength.genValue(emissionState.time / this.duration);", + " }", + " this.emitterShape.initialize(particle);", + " if (this.rendererSettings.renderMode === RenderMode.Trail &&", + " this.rendererEmitterSettings.followLocalOrigin) {", + " const trail = particle;", + " trail.localPosition = new THREE.Vector3().copy(trail.position);", + " }", + " if (this.worldSpace) {", + " particle.position.applyMatrix4(matrix);", + " particle.startSize =", + " (particle.startSize * (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z))) / 3;", + " particle.size = particle.startSize;", + " particle.velocity.multiply(scale).applyMatrix3(this.normalMatrix);", + " if (particle.rotation && particle.rotation instanceof THREE.Quaternion) {", + " particle.rotation.multiplyQuaternions(tempQ$1, particle.rotation);", + " }", + " }", + " else {", + " if (this.onlyUsedByOther) {", + " particle.parentMatrix = matrix;", + " }", + " }", + " for (let j = 0; j < this.behaviors.length; j++) {", + " this.behaviors[j].initialize(particle);", + " }", + " }", + " }", + " endEmit() {", + " this.emitEnded = true;", + " if (this.autoDestroy) {", + " this.markForDestroy = true;", + " }", + " }", + " dispose() {", + " if (this._renderer)", + " this._renderer.deleteSystem(this);", + " this.emitter.dispose();", + " if (this.emitter.parent)", + " this.emitter.parent.remove(this.emitter);", + " }", + " restart() {", + " this.paused = false;", + " this.particleNum = 0;", + " this.emissionState.burstIndex = 0;", + " this.emissionState.burstWaveIndex = 0;", + " this.emissionState.time = 0;", + " this.emissionState.waitEmiting = 0;", + " this.behaviors.forEach((behavior) => {", + " behavior.reset();", + " });", + " this.emitEnded = false;", + " this.markForDestroy = false;", + " this.prewarmed = false;", + " }", + " update(delta) {", + " if (this.paused)", + " return;", + " let currentParent = this.emitter;", + " while (currentParent.parent) {", + " currentParent = currentParent.parent;", + " }", + " if (currentParent.type !== 'Scene') {", + " this.dispose();", + " return;", + " }", + " if (this.firstTimeUpdate) {", + " this.firstTimeUpdate = false;", + " this.emitter.updateWorldMatrix(true, false);", + " }", + " if (this.emitEnded && this.particleNum === 0) {", + " if (this.markForDestroy && this.emitter.parent)", + " this.dispose();", + " return;", + " }", + " if (this.looping && this.prewarm && !this.prewarmed) {", + " this.prewarmed = true;", + " for (let i = 0; i < this.duration * PREWARM_FPS$1; i++) {", + " this.update(1.0 / PREWARM_FPS$1);", + " }", + " }", + " if (delta > 0.1) {", + " delta = 0.1;", + " }", + " if (this.neededToUpdateRender) {", + " if (this._renderer)", + " this._renderer.updateSystem(this);", + " this.neededToUpdateRender = false;", + " }", + " if (!this.onlyUsedByOther) {", + " this.emit(delta, this.emissionState, this.emitter.matrixWorld);", + " }", + " this.emitterShape.update(this, delta);", + " for (let j = 0; j < this.behaviors.length; j++) {", + " for (let i = 0; i < this.particleNum; i++) {", + " if (!this.particles[i].died) {", + " this.behaviors[j].update(this.particles[i], delta);", + " }", + " }", + " this.behaviors[j].frameUpdate(delta);", + " }", + " for (let i = 0; i < this.particleNum; i++) {", + " if (this.rendererEmitterSettings.followLocalOrigin &&", + " this.particles[i].localPosition) {", + " this.particles[i].position.copy(this.particles[i].localPosition);", + " if (this.particles[i].parentMatrix) {", + " this.particles[i].position.applyMatrix4(this.particles[i].parentMatrix);", + " }", + " else {", + " this.particles[i].position.applyMatrix4(this.emitter.matrixWorld);", + " }", + " }", + " else {", + " this.particles[i].position.addScaledVector(this.particles[i].velocity, delta * this.particles[i].speedModifier);", + " }", + " this.particles[i].age += delta;", + " }", + " if (this.rendererSettings.renderMode === RenderMode.Trail) {", + " for (let i = 0; i < this.particleNum; i++) {", + " const particle = this.particles[i];", + " particle.update();", + " }", + " }", + " for (let i = 0; i < this.particleNum; i++) {", + " const particle = this.particles[i];", + " if (particle.died && (!(particle instanceof TrailParticle) || particle.previous.length === 0)) {", + " this.particles[i] = this.particles[this.particleNum - 1];", + " this.particles[this.particleNum - 1] = particle;", + " this.particleNum--;", + " i--;", + " }", + " }", + " }", + " emit(delta, emissionState, emitterMatrix) {", + " if (emissionState.time > this.duration) {", + " if (this.looping) {", + " emissionState.time -= this.duration;", + " emissionState.burstIndex = 0;", + " this.behaviors.forEach((behavior) => {", + " behavior.reset();", + " });", + " }", + " else {", + " if (!this.emitEnded && !this.onlyUsedByOther) {", + " this.endEmit();", + " }", + " }", + " }", + " this.normalMatrix.getNormalMatrix(emitterMatrix);", + " const totalSpawn = Math.ceil(emissionState.waitEmiting);", + " this.spawn(totalSpawn, emissionState, emitterMatrix);", + " emissionState.waitEmiting -= totalSpawn;", + " while (emissionState.burstIndex < this.emissionBursts.length &&", + " this.emissionBursts[emissionState.burstIndex].time <= emissionState.time) {", + " if (Math.random() < this.emissionBursts[emissionState.burstIndex].probability) {", + " const count = this.emissionBursts[emissionState.burstIndex].count.genValue(this.time);", + " this.spawn(count, emissionState, emitterMatrix);", + " }", + " emissionState.burstIndex++;", + " }", + " if (!this.emitEnded) {", + " emissionState.waitEmiting += delta * this.emissionOverTime.genValue(emissionState.time / this.duration);", + " if (emissionState.previousWorldPos != undefined) {", + " this.temp.set(emitterMatrix.elements[12], emitterMatrix.elements[13], emitterMatrix.elements[14]);", + " emissionState.travelDistance += emissionState.previousWorldPos.distanceTo(this.temp);", + " const emitPerMeter = this.emissionOverDistance.genValue(emissionState.time / this.duration);", + " if (emissionState.travelDistance * emitPerMeter > 0) {", + " const count = Math.floor(emissionState.travelDistance * emitPerMeter);", + " emissionState.travelDistance -= count / emitPerMeter;", + " emissionState.waitEmiting += count;", + " }", + " }", + " }", + " if (emissionState.previousWorldPos === undefined)", + " emissionState.previousWorldPos = new THREE.Vector3();", + " emissionState.previousWorldPos.set(emitterMatrix.elements[12], emitterMatrix.elements[13], emitterMatrix.elements[14]);", + " emissionState.time += delta;", + " }", + " toJSON(meta, options = {}) {", + " const isRootObject = meta === undefined || typeof meta === 'string';", + " if (isRootObject) {", + " meta = {", + " geometries: {},", + " materials: {},", + " textures: {},", + " images: {},", + " shapes: {},", + " skeletons: {},", + " animations: {},", + " nodes: {},", + " };", + " }", + " meta.materials[this.rendererSettings.material.uuid] = this.rendererSettings.material.toJSON(meta);", + " if (options.useUrlForImage) {", + " if (this.texture.source !== undefined) {", + " const image = this.texture.source;", + " meta.images[image.uuid] = {", + " uuid: image.uuid,", + " url: this.texture.image.url,", + " };", + " }", + " }", + " let rendererSettingsJSON;", + " if (this.renderMode === RenderMode.Trail) {", + " rendererSettingsJSON = {", + " startLength: this.rendererEmitterSettings.startLength.toJSON(),", + " followLocalOrigin: this.rendererEmitterSettings.followLocalOrigin,", + " };", + " }", + " else if (this.renderMode === RenderMode.Mesh) {", + " rendererSettingsJSON = {};", + " }", + " else if (this.renderMode === RenderMode.StretchedBillBoard) {", + " rendererSettingsJSON = {", + " speedFactor: this.rendererEmitterSettings.speedFactor,", + " lengthFactor: this.rendererEmitterSettings.lengthFactor,", + " };", + " }", + " else {", + " rendererSettingsJSON = {};", + " }", + " const geometry = this.rendererSettings.instancingGeometry;", + " if (meta.geometries && !meta.geometries[geometry.uuid]) {", + " meta.geometries[geometry.uuid] = geometry.toJSON();", + " }", + " return {", + " version: '2.0',", + " autoDestroy: this.autoDestroy,", + " looping: this.looping,", + " prewarm: this.prewarm,", + " duration: this.duration,", + " shape: this.emitterShape.toJSON(),", + " startLife: this.startLife.toJSON(),", + " startSpeed: this.startSpeed.toJSON(),", + " startRotation: this.startRotation.toJSON(),", + " startSize: this.startSize.toJSON(),", + " startColor: this.startColor.toJSON(),", + " emissionOverTime: this.emissionOverTime.toJSON(),", + " emissionOverDistance: this.emissionOverDistance.toJSON(),", + " emissionBursts: this.emissionBursts.map((burst) => ({", + " time: burst.time,", + " count: burst.count.toJSON(),", + " probability: burst.probability,", + " interval: burst.interval,", + " cycle: burst.cycle,", + " })),", + " onlyUsedByOther: this.onlyUsedByOther,", + " instancingGeometry: this.rendererSettings.instancingGeometry.uuid,", + " renderOrder: this.renderOrder,", + " renderMode: this.renderMode,", + " rendererEmitterSettings: rendererSettingsJSON,", + " material: this.rendererSettings.material.uuid,", + " layers: this.layers.mask,", + " startTileIndex: this.startTileIndex.toJSON(),", + " uTileCount: this.uTileCount,", + " vTileCount: this.vTileCount,", + " behaviors: this.behaviors.map((behavior) => behavior.toJSON()),", + " worldSpace: this.worldSpace,", + " };", + " }", + " static fromJSON(json, meta, dependencies) {", + " var _a, _b;", + " const shape = EmitterFromJSON(json.shape, meta);", + " let rendererEmitterSettings;", + " if (json.renderMode === RenderMode.Trail) {", + " let trailSettings = json.rendererEmitterSettings;", + " rendererEmitterSettings = {", + " startLength: trailSettings.startLength != undefined", + " ? ValueGeneratorFromJSON(trailSettings.startLength)", + " : new ConstantValue(30),", + " followLocalOrigin: trailSettings.followLocalOrigin,", + " };", + " }", + " else if (json.renderMode === RenderMode.Mesh) {", + " rendererEmitterSettings = {};", + " }", + " else if (json.renderMode === RenderMode.StretchedBillBoard) {", + " rendererEmitterSettings = json.rendererEmitterSettings;", + " if (json.speedFactor != undefined) {", + " rendererEmitterSettings.speedFactor = json.speedFactor;", + " }", + " }", + " else {", + " rendererEmitterSettings = {};", + " }", + " const layers = new THREE.Layers();", + " if (json.layers) {", + " layers.mask = json.layers;", + " }", + " const ps = new ParticleSystem({", + " autoDestroy: json.autoDestroy,", + " looping: json.looping,", + " prewarm: json.prewarm,", + " duration: json.duration,", + " shape: shape,", + " startLife: ValueGeneratorFromJSON(json.startLife),", + " startSpeed: ValueGeneratorFromJSON(json.startSpeed),", + " startRotation: GeneratorFromJSON(json.startRotation),", + " startSize: ValueGeneratorFromJSON(json.startSize),", + " startColor: ColorGeneratorFromJSON(json.startColor),", + " emissionOverTime: ValueGeneratorFromJSON(json.emissionOverTime),", + " emissionOverDistance: ValueGeneratorFromJSON(json.emissionOverDistance),", + " emissionBursts: (_a = json.emissionBursts) === null || _a === void 0 ? void 0 : _a.map((burst) => ({", + " time: burst.time,", + " count: typeof burst.count === 'number'", + " ? new ConstantValue(burst.count)", + " : ValueGeneratorFromJSON(burst.count),", + " probability: burst.probability,", + " interval: burst.interval,", + " cycle: burst.cycle,", + " })),", + " onlyUsedByOther: json.onlyUsedByOther,", + " instancingGeometry: meta.geometries[json.instancingGeometry],", + " renderMode: json.renderMode,", + " rendererEmitterSettings: rendererEmitterSettings,", + " renderOrder: json.renderOrder,", + " layers: layers,", + " material: json.material", + " ? meta.materials[json.material]", + " : json.texture", + " ? new THREE.MeshBasicMaterial({", + " map: meta.textures[json.texture],", + " transparent: (_b = json.transparent) !== null && _b !== void 0 ? _b : true,", + " blending: json.blending,", + " side: THREE.DoubleSide,", + " })", + " : new THREE.MeshBasicMaterial({", + " color: 0xffffff,", + " transparent: true,", + " blending: THREE.AdditiveBlending,", + " side: THREE.DoubleSide,", + " }),", + " startTileIndex: typeof json.startTileIndex === 'number'", + " ? new ConstantValue(json.startTileIndex)", + " : ValueGeneratorFromJSON(json.startTileIndex),", + " uTileCount: json.uTileCount,", + " vTileCount: json.vTileCount,", + " behaviors: [],", + " worldSpace: json.worldSpace,", + " });", + " ps.behaviors = json.behaviors.map((behaviorJson) => {", + " const behavior = BehaviorFromJSON(behaviorJson, ps);", + " if (behavior.type === 'EmitSubParticleSystem') {", + " dependencies[behaviorJson.subParticleSystem] = behavior;", + " }", + " return behavior;", + " });", + " return ps;", + " }", + " addBehavior(behavior) {", + " this.behaviors.push(behavior);", + " }", + " getRendererSettings() {", + " return this.rendererSettings;", + " }", + " clone() {", + " const newEmissionBursts = [];", + " for (const emissionBurst of this.emissionBursts) {", + " const newEmissionBurst = {};", + " Object.assign(newEmissionBurst, emissionBurst);", + " newEmissionBursts.push(newEmissionBurst);", + " }", + " const newBehaviors = [];", + " for (const behavior of this.behaviors) {", + " newBehaviors.push(behavior.clone());", + " }", + " let rendererEmitterSettings;", + " if (this.renderMode === RenderMode.Trail) {", + " rendererEmitterSettings = {", + " startLength: this.rendererEmitterSettings.startLength.clone(),", + " followLocalOrigin: this.rendererEmitterSettings.followLocalOrigin,", + " };", + " }", + " else {", + " rendererEmitterSettings = {};", + " }", + " const layers = new THREE.Layers();", + " layers.mask = this.layers.mask;", + " return new ParticleSystem({", + " autoDestroy: this.autoDestroy,", + " looping: this.looping,", + " duration: this.duration,", + " shape: this.emitterShape.clone(),", + " startLife: this.startLife.clone(),", + " startSpeed: this.startSpeed.clone(),", + " startRotation: this.startRotation.clone(),", + " startSize: this.startSize.clone(),", + " startColor: this.startColor.clone(),", + " emissionOverTime: this.emissionOverTime.clone(),", + " emissionOverDistance: this.emissionOverDistance.clone(),", + " emissionBursts: newEmissionBursts,", + " onlyUsedByOther: this.onlyUsedByOther,", + " instancingGeometry: this.rendererSettings.instancingGeometry,", + " renderMode: this.renderMode,", + " renderOrder: this.renderOrder,", + " rendererEmitterSettings: rendererEmitterSettings,", + " material: this.rendererSettings.material,", + " startTileIndex: this.startTileIndex,", + " uTileCount: this.uTileCount,", + " vTileCount: this.vTileCount,", + " behaviors: newBehaviors,", + " worldSpace: this.worldSpace,", + " layers: layers,", + " });", + " }", + "}", + "", + "var particle_frag = `", + "", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "", + "void main() {", + "", + " #include ", + " ", + " vec3 outgoingLight = vec3( 0.0 );", + " vec4 diffuseColor = vColor;", + " ", + " #include ", + " ", + " #ifdef USE_MAP", + " diffuseColor *= texture2D( map, vMapUv);", + " #endif", + " ", + " #include ", + "", + " outgoingLight = diffuseColor.rgb;", + " ", + " #ifdef USE_COLOR_AS_ALPHA", + " gl_FragColor = vec4( outgoingLight, diffuseColor.r );", + " #else", + " gl_FragColor = vec4( outgoingLight, diffuseColor.a );", + " #endif", + " ", + " ", + " #include ", + "", + "}", + "`;", + "", + "var particle_physics_frag = `", + "#define STANDARD", + "#ifdef PHYSICAL", + "#define IOR", + "#define SPECULAR", + "#endif", + "uniform vec3 diffuse;", + "uniform vec3 emissive;", + "uniform float roughness;", + "uniform float metalness;", + "uniform float opacity;", + "#ifdef IOR", + "uniform float ior;", + "#endif", + "#ifdef SPECULAR", + "uniform float specularIntensity;", + "uniform vec3 specularColor;", + "#ifdef USE_SPECULARINTENSITYMAP", + "uniform sampler2D specularIntensityMap;", + "#endif", + "#ifdef USE_SPECULARCOLORMAP", + "uniform sampler2D specularColorMap;", + "#endif", + "#endif", + "#ifdef USE_CLEARCOAT", + "uniform float clearcoat;", + "uniform float clearcoatRoughness;", + "#endif", + "#ifdef USE_IRIDESCENCE", + "uniform float iridescence;", + "uniform float iridescenceIOR;", + "uniform float iridescenceThicknessMinimum;", + "uniform float iridescenceThicknessMaximum;", + "#endif", + "#ifdef USE_SHEEN", + "uniform vec3 sheenColor;", + "uniform float sheenRoughness;", + "#ifdef USE_SHEENCOLORMAP", + "uniform sampler2D sheenColorMap;", + "#endif", + "#ifdef USE_SHEENROUGHNESSMAP", + "uniform sampler2D sheenRoughnessMap;", + "#endif", + "#endif", + "", + "varying vec3 vViewPosition;", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "", + "void main() {", + " #include ", + " vec4 diffuseColor = vec4( diffuse, opacity );", + " ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );", + " vec3 totalEmissiveRadiance = emissive;", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + " // accumulation", + " #include ", + " #include ", + " #include ", + " #include ", + " // modulation", + " #include ", + " vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;", + " vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;", + " #include ", + " vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;", + " #ifdef USE_SHEEN", + " // Sheen energy compensation approximation calculation can be found at the end of", + " // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing", + " float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );", + " outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;", + " #endif", + " #ifdef USE_CLEARCOAT", + " float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );", + " vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );", + " outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;", + " #endif", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + " #include ", + "}`;", + "", + "var uv_vertex_tile = `", + "", + " #ifdef UV_TILE", + " float col = mod(uvTile, tileCount.x);", + " float row = (tileCount.y - floor(uvTile / tileCount.x) - 1.0);", + " ", + " mat3 tileTransform = mat3(", + " 1.0 / tileCount.x, 0.0, 0.0,", + " 0.0, 1.0 / tileCount.y, 0.0, ", + " col / tileCount.x, row / tileCount.y, 1.0);", + " #else", + " mat3 tileTransform = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);", + " #endif", + "", + "#if defined( USE_UV ) || defined( USE_ANISOTROPY )", + "", + "vUv = (tileTransform *vec3( uv, 1 )).xy;", + "", + "#endif", + "#ifdef USE_MAP", + "", + "vMapUv = ( tileTransform * (mapTransform * vec3( MAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_ALPHAMAP", + "", + "vAlphaMapUv = ( tileTransform * (alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_LIGHTMAP", + "", + "vLightMapUv = ( tileTransform * (lightMapTransform * vec3( LIGHTMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_AOMAP", + "", + "vAoMapUv = ( tileTransform * (aoMapTransform * vec3( AOMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_BUMPMAP", + "", + "vBumpMapUv = ( tileTransform * (bumpMapTransform * vec3( BUMPMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_NORMALMAP", + "", + "vNormalMapUv = ( tileTransform * (normalMapTransform * vec3( NORMALMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_DISPLACEMENTMAP", + "", + "vDisplacementMapUv = ( tileTransform * (displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_EMISSIVEMAP", + "", + "vEmissiveMapUv = ( tileTransform * (emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_METALNESSMAP", + "", + "vMetalnessMapUv = ( tileTransform * (metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_ROUGHNESSMAP", + "", + "vRoughnessMapUv = ( tileTransform * (roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_ANISOTROPYMAP", + "", + "vAnisotropyMapUv = ( tileTransform * (anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_CLEARCOATMAP", + "", + "vClearcoatMapUv = ( tileTransform * (clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_CLEARCOAT_NORMALMAP", + "", + "vClearcoatNormalMapUv = ( tileTransform * (clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_CLEARCOAT_ROUGHNESSMAP", + "", + "vClearcoatRoughnessMapUv = ( tileTransform * (clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_IRIDESCENCEMAP", + "", + "vIridescenceMapUv = ( tileTransform * (iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_IRIDESCENCE_THICKNESSMAP", + "", + "vIridescenceThicknessMapUv = ( tileTransform * (iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_SHEEN_COLORMAP", + "", + "vSheenColorMapUv = ( tileTransform * (sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_SHEEN_ROUGHNESSMAP", + "", + "vSheenRoughnessMapUv = ( tileTransform * (sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_SPECULARMAP", + "", + "vSpecularMapUv = ( tileTransform * (specularMapTransform * vec3( SPECULARMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_SPECULAR_COLORMAP", + "", + "vSpecularColorMapUv = ( tileTransform * (specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_SPECULAR_INTENSITYMAP", + "", + "vSpecularIntensityMapUv = ( tileTransform * (specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_TRANSMISSIONMAP", + "", + "vTransmissionMapUv = ( tileTransform * transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) )).xy;", + "", + "#endif", + "#ifdef USE_THICKNESSMAP", + "", + "vThicknessMapUv = ( tileTransform * thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) )).xy;", + "", + "#endif", + "`;", + "", + "var particle_vert = `", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "", + "attribute vec3 offset;", + "attribute float rotation;", + "attribute float size;", + "attribute float uvTile;", + "", + "#ifdef UV_TILE", + "uniform vec2 tileCount;", + "#endif", + "", + "void main() {", + "", + " ${uv_vertex_tile}", + "\t", + " vec2 alignedPosition = ( position.xy ) * size;", + " ", + " vec2 rotatedPosition;", + " rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;", + " rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;", + "#ifdef HORIZONTAL", + " vec4 mvPosition = modelMatrix * vec4( offset, 1.0 );", + " mvPosition.x += rotatedPosition.x;", + " mvPosition.z -= rotatedPosition.y;", + " mvPosition = viewMatrix * mvPosition;", + "#elif defined(VERTICAL)", + " vec4 mvPosition = modelMatrix * vec4( offset, 1.0 );", + " mvPosition.y += rotatedPosition.y;", + " mvPosition = viewMatrix * mvPosition;", + " mvPosition.x += rotatedPosition.x;", + "#else", + " vec4 mvPosition = modelViewMatrix * vec4( offset, 1.0 );", + " mvPosition.xy += rotatedPosition;", + "#endif", + "", + "\tvColor = color;", + "", + "\tgl_Position = projectionMatrix * mvPosition;", + "", + "\t#include ", + "\t#include ", + "", + "}", + "`;", + "", + "var local_particle_vert = `", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "", + "attribute vec3 offset;", + "attribute vec4 rotation;", + "attribute float size;", + "// attribute vec4 color;", + "attribute float uvTile;", + "", + "#ifdef UV_TILE", + "uniform vec2 tileCount;", + "#endif", + "", + "void main() {", + "", + " ${uv_vertex_tile}", + " ", + " float x2 = rotation.x + rotation.x, y2 = rotation.y + rotation.y, z2 = rotation.z + rotation.z;", + " float xx = rotation.x * x2, xy = rotation.x * y2, xz = rotation.x * z2;", + " float yy = rotation.y * y2, yz = rotation.y * z2, zz = rotation.z * z2;", + " float wx = rotation.w * x2, wy = rotation.w * y2, wz = rotation.w * z2;", + " float sx = size, sy = size, sz = size;", + " ", + " mat4 matrix = mat4(( 1.0 - ( yy + zz ) ) * sx, ( xy + wz ) * sx, ( xz - wy ) * sx, 0.0, // 1. column", + " ( xy - wz ) * sy, ( 1.0 - ( xx + zz ) ) * sy, ( yz + wx ) * sy, 0.0, // 2. column", + " ( xz + wy ) * sz, ( yz - wx ) * sz, ( 1.0 - ( xx + yy ) ) * sz, 0.0, // 3. column", + " offset.x, offset.y, offset.z, 1.0);", + " ", + " vec4 mvPosition = modelViewMatrix * (matrix * vec4( position, 1.0 ));", + "", + "\tvColor = color;", + "", + "\tgl_Position = projectionMatrix * mvPosition;", + "", + "\t#include ", + "\t#include ", + "", + "}", + "`;", + "", + "var local_particle_physics_vert = `", + "#define STANDARD", + "varying vec3 vViewPosition;", + "#ifdef USE_TRANSMISSION", + "\tvarying vec3 vWorldPosition;", + "#endif", + "#include ", + "#include ", + "", + "attribute vec3 offset;", + "attribute vec4 rotation;", + "attribute float size;", + "attribute float uvTile;", + "", + "#ifdef UV_TILE", + "uniform vec2 tileCount;", + "#endif", + "", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "", + "void main() {", + " ${uv_vertex_tile}", + "", + " float x2 = rotation.x + rotation.x, y2 = rotation.y + rotation.y, z2 = rotation.z + rotation.z;", + " float xx = rotation.x * x2, xy = rotation.x * y2, xz = rotation.x * z2;", + " float yy = rotation.y * y2, yz = rotation.y * z2, zz = rotation.z * z2;", + " float wx = rotation.w * x2, wy = rotation.w * y2, wz = rotation.w * z2;", + " float sx = size, sy = size, sz = size;", + "", + " mat4 particleMatrix = mat4(( 1.0 - ( yy + zz ) ) * sx, ( xy + wz ) * sx, ( xz - wy ) * sx, 0.0, // 1. column", + " ( xy - wz ) * sy, ( 1.0 - ( xx + zz ) ) * sy, ( yz + wx ) * sy, 0.0, // 2. column", + " ( xz + wy ) * sz, ( yz - wx ) * sz, ( 1.0 - ( xx + yy ) ) * sz, 0.0, // 3. column", + " offset.x, offset.y, offset.z, 1.0);", + "", + "\t#include ", + "\t#include ", + "\t#include ", + "\t#include ", + "\t#include ", + "\t#include ", + "", + "\t// replace defaultnormal_vertex", + "\tvec3 transformedNormal = objectNormal;", + " mat3 m = mat3( particleMatrix );", + " transformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );", + " transformedNormal = m * transformedNormal;", + " transformedNormal = normalMatrix * transformedNormal;", + " #ifdef FLIP_SIDED", + " transformedNormal = - transformedNormal;", + " #endif", + " #ifdef USE_TANGENT", + " vec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;", + " #ifdef FLIP_SIDED", + " transformedTangent = - transformedTangent;", + " #endif", + " #endif", + "", + "\t#include ", + "\t#include ", + "\t#include ", + "\t#include ", + "\t#include ", + "", + "\t// replace include ", + " vec4 mvPosition = vec4( transformed, 1.0 );", + " mvPosition = modelViewMatrix * (particleMatrix * mvPosition);", + "\tgl_Position = projectionMatrix * mvPosition;", + "", + "\t#include ", + "\t#include ", + "\t", + "\tvViewPosition = - mvPosition.xyz;", + "\t", + "\t#include ", + "\t#include ", + "\t#include ", + "#ifdef USE_TRANSMISSION", + "\tvWorldPosition = worldPosition.xyz;", + "#endif", + "}", + "`;", + "", + "var stretched_bb_particle_vert = `", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "", + "attribute vec3 offset;", + "attribute float rotation;", + "attribute float size;", + "attribute vec4 velocity;", + "attribute float uvTile;", + "", + "#ifdef UV_TILE", + "uniform vec2 tileCount;", + "#endif", + "", + "uniform float speedFactor;", + "", + "void main() {", + "", + " ${uv_vertex_tile}", + " ", + " float lengthFactor = velocity.w;", + "#ifdef USE_SKEW", + " vec4 mvPosition = modelViewMatrix * vec4( offset, 1.0 );", + " vec3 viewVelocity = normalMatrix * velocity.xyz;", + "", + " vec3 scaledPos = vec3(position.xy * size, position.z);", + " float vlength = length(viewVelocity);", + " vec3 projVelocity = dot(scaledPos, viewVelocity) * viewVelocity / vlength;", + " mvPosition.xyz += scaledPos + projVelocity * (speedFactor / size + lengthFactor / vlength);", + "#else", + " vec4 mvPosition = modelViewMatrix * vec4( offset, 1.0 );", + " vec3 viewVelocity = normalMatrix * velocity.xyz;", + " float vlength = length(viewVelocity); ", + " mvPosition.xyz += position.y * normalize(cross(mvPosition.xyz, viewVelocity)) * size; // switch the cross to match unity implementation", + " mvPosition.xyz -= (position.x + 0.5) * viewVelocity * (1.0 + lengthFactor / vlength) * size; // minus position.x to match unity implementation", + "#endif", + "\tvColor = color;", + "\tgl_Position = projectionMatrix * mvPosition;", + "\t#include ", + "\t#include ", + "}", + "`;", + "", + "function getMaterialUVChannelName(value) {", + " if (value === 0)", + " return 'uv';", + " return `uv${value}`;", + "}", + "", + "new THREE.Vector3(0, 0, 1);", + "class SpriteBatch extends VFXBatch {", + " constructor(settings) {", + " super(settings);", + " this.vector_ = new THREE.Vector3();", + " this.vector2_ = new THREE.Vector3();", + " this.vector3_ = new THREE.Vector3();", + " this.quaternion_ = new THREE.Quaternion();", + " this.quaternion2_ = new THREE.Quaternion();", + " this.quaternion3_ = new THREE.Quaternion();", + " this.rotationMat_ = new THREE.Matrix3();", + " this.rotationMat2_ = new THREE.Matrix3();", + " this.maxParticles = 1000;", + " this.setupBuffers();", + " this.rebuildMaterial();", + " }", + " buildExpandableBuffers() {", + " this.offsetBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles * 3), 3);", + " this.offsetBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('offset', this.offsetBuffer);", + " this.colorBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles * 4), 4);", + " this.colorBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('color', this.colorBuffer);", + " if (this.settings.renderMode === RenderMode.Mesh) {", + " this.rotationBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles * 4), 4);", + " this.rotationBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('rotation', this.rotationBuffer);", + " }", + " else if (this.settings.renderMode === RenderMode.BillBoard ||", + " this.settings.renderMode === RenderMode.HorizontalBillBoard ||", + " this.settings.renderMode === RenderMode.VerticalBillBoard ||", + " this.settings.renderMode === RenderMode.StretchedBillBoard) {", + " this.rotationBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles), 1);", + " this.rotationBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('rotation', this.rotationBuffer);", + " }", + " this.sizeBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles), 1);", + " this.sizeBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('size', this.sizeBuffer);", + " this.uvTileBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles), 1);", + " this.uvTileBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('uvTile', this.uvTileBuffer);", + " if (this.settings.renderMode === RenderMode.StretchedBillBoard) {", + " this.velocityBuffer = new THREE.InstancedBufferAttribute(new Float32Array(this.maxParticles * 4), 4);", + " this.velocityBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('velocity', this.velocityBuffer);", + " }", + " }", + " setupBuffers() {", + " if (this.geometry)", + " this.geometry.dispose();", + " this.geometry = new THREE.InstancedBufferGeometry();", + " this.geometry.setIndex(this.settings.instancingGeometry.getIndex());", + " if (this.settings.instancingGeometry.hasAttribute('normal')) {", + " this.geometry.setAttribute('normal', this.settings.instancingGeometry.getAttribute('normal'));", + " }", + " this.geometry.setAttribute('position', this.settings.instancingGeometry.getAttribute('position'));", + " this.geometry.setAttribute('uv', this.settings.instancingGeometry.getAttribute('uv'));", + " this.buildExpandableBuffers();", + " }", + " expandBuffers(target) {", + " while (target >= this.maxParticles) {", + " this.maxParticles *= 2;", + " }", + " this.setupBuffers();", + " }", + " rebuildMaterial() {", + " this.layers.mask = this.settings.layers.mask;", + " let uniforms;", + " const defines = {};", + " if (this.settings.material.type === 'MeshStandardMaterial' ||", + " this.settings.material.type === 'MeshPhysicalMaterial') {", + " const mat = this.settings.material;", + " uniforms = THREE.UniformsUtils.merge([", + " THREE.UniformsLib.common,", + " THREE.UniformsLib.envmap,", + " THREE.UniformsLib.aomap,", + " THREE.UniformsLib.lightmap,", + " THREE.UniformsLib.emissivemap,", + " THREE.UniformsLib.bumpmap,", + " THREE.UniformsLib.normalmap,", + " THREE.UniformsLib.displacementmap,", + " THREE.UniformsLib.roughnessmap,", + " THREE.UniformsLib.metalnessmap,", + " THREE.UniformsLib.fog,", + " THREE.UniformsLib.lights,", + " {", + " emissive: { value: new THREE.Color(0x000000) },", + " roughness: { value: 1.0 },", + " metalness: { value: 0.0 },", + " envMapIntensity: { value: 1 },", + " },", + " ]);", + " uniforms['diffuse'].value = mat.color;", + " uniforms['opacity'].value = mat.opacity;", + " uniforms['emissive'].value = mat.emissive;", + " uniforms['roughness'].value = mat.roughness;", + " uniforms['metalness'].value = mat.metalness;", + " if (mat.envMap) {", + " uniforms['envMap'].value = mat.envMap;", + " uniforms['envMapIntensity'].value = mat.envMapIntensity;", + " }", + " if (mat.normalMap) {", + " uniforms['normalMap'].value = mat.normalMap;", + " uniforms['normalScale'].value = mat.normalScale;", + " }", + " if (mat.roughnessMap) {", + " uniforms['roughnessMap'].value = mat.roughnessMap;", + " }", + " if (mat.metalnessMap) {", + " uniforms['metalnessMap'].value = mat.metalnessMap;", + " }", + " if (mat.map) {", + " uniforms['map'] = new THREE.Uniform(mat.map);", + " }", + " }", + " else {", + " uniforms = {};", + " uniforms['map'] = new THREE.Uniform(this.settings.material.map);", + " }", + " if (this.settings.material.alphaTest) {", + " defines['USE_ALPHATEST'] = '';", + " uniforms['alphaTest'] = new THREE.Uniform(this.settings.material.alphaTest);", + " }", + " defines['USE_UV'] = '';", + " const uTileCount = this.settings.uTileCount;", + " const vTileCount = this.settings.vTileCount;", + " if (uTileCount > 1 || vTileCount > 1) {", + " defines['UV_TILE'] = '';", + " uniforms['tileCount'] = new THREE.Uniform(new THREE.Vector2(uTileCount, vTileCount));", + " }", + " if (this.settings.material.defines &&", + " this.settings.material.defines['USE_COLOR_AS_ALPHA'] !== undefined) {", + " defines['USE_COLOR_AS_ALPHA'] = '';", + " }", + " if (this.settings.material.normalMap) {", + " defines['USE_NORMALMAP'] = '';", + " defines['NORMALMAP_UV'] = getMaterialUVChannelName(this.settings.material.normalMap.channel);", + " uniforms['normalMapTransform'] = new THREE.Uniform(new THREE.Matrix3().copy(this.settings.material.normalMap.matrix));", + " }", + " if (this.settings.material.map) {", + " defines['USE_MAP'] = '';", + " defines['MAP_UV'] = getMaterialUVChannelName(this.settings.material.map.channel);", + " uniforms['mapTransform'] = new THREE.Uniform(new THREE.Matrix3().copy(this.settings.material.map.matrix));", + " }", + " defines['USE_COLOR_ALPHA'] = '';", + " let needLights = false;", + " if (this.settings.renderMode === RenderMode.BillBoard ||", + " this.settings.renderMode === RenderMode.VerticalBillBoard ||", + " this.settings.renderMode === RenderMode.HorizontalBillBoard ||", + " this.settings.renderMode === RenderMode.Mesh) {", + " let vertexShader;", + " let fragmentShader;", + " if (this.settings.renderMode === RenderMode.Mesh) {", + " if (this.settings.material.type === 'MeshStandardMaterial' ||", + " this.settings.material.type === 'MeshPhysicalMaterial') {", + " defines['USE_COLOR'] = '';", + " vertexShader = local_particle_physics_vert;", + " fragmentShader = particle_physics_frag;", + " needLights = true;", + " }", + " else {", + " vertexShader = local_particle_vert;", + " fragmentShader = particle_frag;", + " }", + " }", + " else {", + " vertexShader = particle_vert;", + " fragmentShader = particle_frag;", + " }", + " if (this.settings.renderMode === RenderMode.VerticalBillBoard) {", + " defines['VERTICAL'] = '';", + " }", + " else if (this.settings.renderMode === RenderMode.HorizontalBillBoard) {", + " defines['HORIZONTAL'] = '';", + " }", + " this.material = new THREE.ShaderMaterial({", + " uniforms: uniforms,", + " defines: defines,", + " vertexShader: vertexShader,", + " fragmentShader: fragmentShader,", + " transparent: this.settings.material.transparent,", + " depthWrite: !this.settings.material.transparent,", + " blending: this.settings.material.blending,", + " side: this.settings.material.side,", + " alphaTest: this.settings.material.alphaTest,", + " lights: needLights,", + " });", + " }", + " else if (this.settings.renderMode === RenderMode.StretchedBillBoard) {", + " uniforms['speedFactor'] = new THREE.Uniform(1.0);", + " this.material = new THREE.ShaderMaterial({", + " uniforms: uniforms,", + " defines: defines,", + " vertexShader: stretched_bb_particle_vert,", + " fragmentShader: particle_frag,", + " transparent: this.settings.material.transparent,", + " depthWrite: !this.settings.material.transparent,", + " blending: this.settings.material.blending,", + " side: this.settings.material.side,", + " alphaTest: this.settings.material.alphaTest,", + " });", + " }", + " else {", + " throw new Error('render mode unavailable');", + " }", + " }", + " update() {", + " let index = 0;", + " let particleCount = 0;", + " this.systems.forEach((system) => {", + " particleCount += system.particleNum;", + " });", + " if (particleCount > this.maxParticles) {", + " this.expandBuffers(particleCount);", + " }", + " this.systems.forEach((system) => {", + " const particles = system.particles;", + " const particleNum = system.particleNum;", + " const rotation = this.quaternion2_;", + " const translation = this.vector2_;", + " const scale = this.vector3_;", + " system.emitter.matrixWorld.decompose(translation, rotation, scale);", + " this.rotationMat_.setFromMatrix4(system.emitter.matrixWorld);", + " for (let j = 0; j < particleNum; j++ , index++) {", + " const particle = particles[j];", + " if (this.settings.renderMode === RenderMode.Mesh) {", + " let q;", + " if (system.worldSpace) {", + " q = particle.rotation;", + " }", + " else {", + " let parentQ;", + " if (particle.parentMatrix) {", + " parentQ = this.quaternion3_.setFromRotationMatrix(particle.parentMatrix);", + " }", + " else {", + " parentQ = rotation;", + " }", + " q = this.quaternion_;", + " q.copy(particle.rotation).multiply(parentQ);", + " }", + " this.rotationBuffer.setXYZW(index, q.x, q.y, q.z, q.w);", + " }", + " else if (this.settings.renderMode === RenderMode.StretchedBillBoard ||", + " this.settings.renderMode === RenderMode.VerticalBillBoard ||", + " this.settings.renderMode === RenderMode.HorizontalBillBoard ||", + " this.settings.renderMode === RenderMode.BillBoard) {", + " this.rotationBuffer.setX(index, particle.rotation);", + " }", + " let vec;", + " if (system.worldSpace) {", + " vec = particle.position;", + " }", + " else {", + " vec = this.vector_;", + " if (particle.parentMatrix) {", + " vec.copy(particle.position).applyMatrix4(particle.parentMatrix);", + " }", + " else {", + " vec.copy(particle.position).applyMatrix4(system.emitter.matrixWorld);", + " }", + " }", + " this.offsetBuffer.setXYZ(index, vec.x, vec.y, vec.z);", + " this.colorBuffer.setXYZW(index, particle.color.x, particle.color.y, particle.color.z, particle.color.w);", + " if (system.worldSpace) {", + " this.sizeBuffer.setX(index, particle.size);", + " }", + " else {", + " if (particle.parentMatrix) {", + " this.sizeBuffer.setX(index, particle.size);", + " }", + " else {", + " this.sizeBuffer.setX(index, (particle.size * (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z))) / 3);", + " }", + " }", + " this.uvTileBuffer.setX(index, particle.uvTile);", + " if (this.settings.renderMode === RenderMode.StretchedBillBoard && this.velocityBuffer) {", + " let speedFactor = system.rendererEmitterSettings.speedFactor;", + " if (speedFactor === 0)", + " speedFactor = 0.001;", + " const lengthFactor = system.rendererEmitterSettings.lengthFactor;", + " let vec;", + " if (system.worldSpace) {", + " vec = particle.velocity;", + " }", + " else {", + " vec = this.vector_;", + " if (particle.parentMatrix) {", + " this.rotationMat2_.setFromMatrix4(particle.parentMatrix);", + " vec.copy(particle.velocity).applyMatrix3(this.rotationMat2_);", + " }", + " else {", + " vec.copy(particle.velocity).applyMatrix3(this.rotationMat_);", + " }", + " }", + " this.velocityBuffer.setXYZW(index, vec.x * speedFactor, vec.y * speedFactor, vec.z * speedFactor, lengthFactor);", + " }", + " }", + " });", + " this.geometry.instanceCount = index;", + " if (index > 0) {", + " this.offsetBuffer.updateRange.count = index * 3;", + " this.offsetBuffer.needsUpdate = true;", + " this.sizeBuffer.updateRange.count = index;", + " this.sizeBuffer.needsUpdate = true;", + " this.colorBuffer.updateRange.count = index * 4;", + " this.colorBuffer.needsUpdate = true;", + " this.uvTileBuffer.updateRange.count = index;", + " this.uvTileBuffer.needsUpdate = true;", + " if (this.settings.renderMode === RenderMode.StretchedBillBoard && this.velocityBuffer) {", + " this.velocityBuffer.updateRange.count = index * 4;", + " this.velocityBuffer.needsUpdate = true;", + " }", + " if (this.settings.renderMode === RenderMode.Mesh) {", + " this.rotationBuffer.updateRange.count = index * 4;", + " this.rotationBuffer.needsUpdate = true;", + " }", + " else if (this.settings.renderMode === RenderMode.StretchedBillBoard ||", + " this.settings.renderMode === RenderMode.HorizontalBillBoard ||", + " this.settings.renderMode === RenderMode.VerticalBillBoard ||", + " this.settings.renderMode === RenderMode.BillBoard) {", + " this.rotationBuffer.updateRange.count = index;", + " this.rotationBuffer.needsUpdate = true;", + " }", + " }", + " }", + " dispose() {", + " this.geometry.dispose();", + " }", + "}", + "", + "var trail_frag = `", + "", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "", + "uniform sampler2D alphaMap;", + "uniform float useAlphaMap;", + "uniform float visibility;", + "uniform float alphaTest;", + "uniform vec2 repeat;", + "", + "varying vec4 vColor;", + " ", + "void main() {", + " #include ", + " #include ", + "", + " vec4 c = vColor;", + " ", + " #ifdef USE_MAP", + " #ifdef USE_COLOR_AS_ALPHA", + " vec4 tex = texture2D( map, vUv * repeat );", + " c *= vec4(tex.rgb, tex.r);", + " #else", + " c *= texture2D( map, vUv * repeat );", + " #endif", + " #endif", + " if( useAlphaMap == 1. ) c.a *= texture2D( alphaMap, vUv * repeat ).a;", + " if( c.a < alphaTest ) discard;", + " gl_FragColor = c;", + "", + " #include ", + " #include ", + "}`;", + "", + "var trail_vert = `", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "#include ", + "", + "attribute vec3 previous;", + "attribute vec3 next;", + "attribute float side;", + "attribute float width;", + "", + "uniform vec2 resolution;", + "uniform float lineWidth;", + "uniform float sizeAttenuation;", + " ", + "vec2 fix(vec4 i, float aspect) {", + " vec2 res = i.xy / i.w;", + " res.x *= aspect;", + " return res;", + "}", + " ", + "void main() {", + "", + " ${uv_vertex_tile}", + " ", + " float aspect = resolution.x / resolution.y;", + "", + " vColor = color;", + "", + " mat4 m = projectionMatrix * modelViewMatrix;", + " vec4 finalPosition = m * vec4( position, 1.0 );", + " vec4 prevPos = m * vec4( previous, 1.0 );", + " vec4 nextPos = m * vec4( next, 1.0 );", + "", + " vec2 currentP = fix( finalPosition, aspect );", + " vec2 prevP = fix( prevPos, aspect );", + " vec2 nextP = fix( nextPos, aspect );", + "", + " float w = lineWidth * width;", + "", + " vec2 dir;", + " if( nextP == currentP ) dir = normalize( currentP - prevP );", + " else if( prevP == currentP ) dir = normalize( nextP - currentP );", + " else {", + " vec2 dir1 = normalize( currentP - prevP );", + " vec2 dir2 = normalize( nextP - currentP );", + " dir = normalize( dir1 + dir2 );", + "", + " vec2 perp = vec2( -dir1.y, dir1.x );", + " vec2 miter = vec2( -dir.y, dir.x );", + " //w = clamp( w / dot( miter, perp ), 0., 4., * lineWidth * width );", + "", + " }", + "", + " //vec2 normal = ( cross( vec3( dir, 0. ) vec3( 0., 0., 1. ) ) ).xy;", + " vec4 normal = vec4( -dir.y, dir.x, 0., 1. );", + " normal.xy *= .5 * w;", + " normal *= projectionMatrix;", + " if( sizeAttenuation == 0. ) {", + " normal.xy *= finalPosition.w;", + " normal.xy /= ( vec4( resolution, 0., 1. ) * projectionMatrix ).xy;", + " }", + "", + " finalPosition.xy += normal.xy * side;", + "", + " gl_Position = finalPosition;", + "", + "\t#include ", + "\t#include ", + "\t", + " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", + " ", + "\t#include ", + "}`;", + "", + "new THREE.Vector3(0, 0, 1);", + "class TrailBatch extends VFXBatch {", + " constructor(settings) {", + " super(settings);", + " this.vector_ = new THREE.Vector3();", + " this.vector2_ = new THREE.Vector3();", + " this.vector3_ = new THREE.Vector3();", + " this.quaternion_ = new THREE.Quaternion();", + " this.maxParticles = 10000;", + " this.setupBuffers();", + " this.rebuildMaterial();", + " }", + " setupBuffers() {", + " if (this.geometry)", + " this.geometry.dispose();", + " this.geometry = new THREE.BufferGeometry();", + " this.indexBuffer = new THREE.BufferAttribute(new Uint32Array(this.maxParticles * 6), 1);", + " this.indexBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setIndex(this.indexBuffer);", + " this.positionBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 6), 3);", + " this.positionBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('position', this.positionBuffer);", + " this.previousBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 6), 3);", + " this.previousBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('previous', this.previousBuffer);", + " this.nextBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 6), 3);", + " this.nextBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('next', this.nextBuffer);", + " this.widthBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 2), 1);", + " this.widthBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('width', this.widthBuffer);", + " this.sideBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 2), 1);", + " this.sideBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('side', this.sideBuffer);", + " this.uvBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 4), 2);", + " this.uvBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('uv', this.uvBuffer);", + " this.colorBuffer = new THREE.BufferAttribute(new Float32Array(this.maxParticles * 8), 4);", + " this.colorBuffer.setUsage(THREE.DynamicDrawUsage);", + " this.geometry.setAttribute('color', this.colorBuffer);", + " }", + " expandBuffers(target) {", + " while (target >= this.maxParticles) {", + " this.maxParticles *= 2;", + " }", + " this.setupBuffers();", + " }", + " rebuildMaterial() {", + " this.layers.mask = this.settings.layers.mask;", + " const uniforms = {", + " lineWidth: { value: 1 },", + " map: { value: null },", + " useMap: { value: 0 },", + " alphaMap: { value: null },", + " useAlphaMap: { value: 0 },", + " resolution: { value: new THREE.Vector2(1, 1) },", + " sizeAttenuation: { value: 1 },", + " visibility: { value: 1 },", + " alphaTest: { value: 0 },", + " repeat: { value: new THREE.Vector2(1, 1) },", + " };", + " const defines = {};", + " defines['USE_UV'] = '';", + " defines['USE_COLOR_ALPHA'] = '';", + " if (this.settings.material.map) {", + " defines['USE_MAP'] = '';", + " defines['MAP_UV'] = getMaterialUVChannelName(this.settings.material.map.channel);", + " uniforms['map'] = new THREE.Uniform(this.settings.material.map);", + " uniforms['mapTransform'] = new THREE.Uniform(new THREE.Matrix3().copy(this.settings.material.map.matrix));", + " }", + " if (this.settings.material.defines &&", + " this.settings.material.defines['USE_COLOR_AS_ALPHA'] !== undefined) {", + " defines['USE_COLOR_AS_ALPHA'] = '';", + " }", + " if (this.settings.renderMode === RenderMode.Trail) {", + " this.material = new THREE.ShaderMaterial({", + " uniforms: uniforms,", + " defines: defines,", + " vertexShader: trail_vert,", + " fragmentShader: trail_frag,", + " transparent: this.settings.material.transparent,", + " depthWrite: !this.settings.material.transparent,", + " side: this.settings.material.side,", + " blending: this.settings.material.blending || THREE.AdditiveBlending,", + " });", + " }", + " else {", + " throw new Error('render mode unavailable');", + " }", + " }", + " update() {", + " let index = 0;", + " let triangles = 0;", + " let particleCount = 0;", + " this.systems.forEach((system) => {", + " for (let j = 0; j < system.particleNum; j++) {", + " particleCount += system.particles[j].previous.length * 2;", + " }", + " });", + " if (particleCount > this.maxParticles) {", + " this.expandBuffers(particleCount);", + " }", + " this.systems.forEach((system) => {", + " const rotation = this.quaternion_;", + " const translation = this.vector2_;", + " const scale = this.vector3_;", + " system.emitter.matrixWorld.decompose(translation, rotation, scale);", + " const particles = system.particles;", + " const particleNum = system.particleNum;", + " const uTileCount = this.settings.uTileCount;", + " const vTileCount = this.settings.vTileCount;", + " const tileWidth = 1 / uTileCount;", + " const tileHeight = 1 / vTileCount;", + " for (let j = 0; j < particleNum; j++) {", + " const particle = particles[j];", + " const col = particle.uvTile % vTileCount;", + " const row = Math.floor(particle.uvTile / vTileCount + 0.001);", + " const iter = particle.previous.values();", + " let curIter = iter.next();", + " let previous = curIter.value;", + " let current = previous;", + " if (!curIter.done)", + " curIter = iter.next();", + " let next;", + " if (curIter.value !== undefined) {", + " next = curIter.value;", + " }", + " else {", + " next = current;", + " }", + " for (let i = 0; i < particle.previous.length; i++ , index += 2) {", + " this.positionBuffer.setXYZ(index, current.position.x, current.position.y, current.position.z);", + " this.positionBuffer.setXYZ(index + 1, current.position.x, current.position.y, current.position.z);", + " if (system.worldSpace) {", + " this.positionBuffer.setXYZ(index, current.position.x, current.position.y, current.position.z);", + " this.positionBuffer.setXYZ(index + 1, current.position.x, current.position.y, current.position.z);", + " }", + " else {", + " if (particle.parentMatrix) {", + " this.vector_.copy(current.position).applyMatrix4(particle.parentMatrix);", + " }", + " else {", + " this.vector_.copy(current.position).applyMatrix4(system.emitter.matrixWorld);", + " }", + " this.positionBuffer.setXYZ(index, this.vector_.x, this.vector_.y, this.vector_.z);", + " this.positionBuffer.setXYZ(index + 1, this.vector_.x, this.vector_.y, this.vector_.z);", + " }", + " if (system.worldSpace) {", + " this.previousBuffer.setXYZ(index, previous.position.x, previous.position.y, previous.position.z);", + " this.previousBuffer.setXYZ(index + 1, previous.position.x, previous.position.y, previous.position.z);", + " }", + " else {", + " if (particle.parentMatrix) {", + " this.vector_.copy(previous.position).applyMatrix4(particle.parentMatrix);", + " }", + " else {", + " this.vector_.copy(previous.position).applyMatrix4(system.emitter.matrixWorld);", + " }", + " this.previousBuffer.setXYZ(index, this.vector_.x, this.vector_.y, this.vector_.z);", + " this.previousBuffer.setXYZ(index + 1, this.vector_.x, this.vector_.y, this.vector_.z);", + " }", + " if (system.worldSpace) {", + " this.nextBuffer.setXYZ(index, next.position.x, next.position.y, next.position.z);", + " this.nextBuffer.setXYZ(index + 1, next.position.x, next.position.y, next.position.z);", + " }", + " else {", + " if (particle.parentMatrix) {", + " this.vector_.copy(next.position).applyMatrix4(particle.parentMatrix);", + " }", + " else {", + " this.vector_.copy(next.position).applyMatrix4(system.emitter.matrixWorld);", + " }", + " this.nextBuffer.setXYZ(index, this.vector_.x, this.vector_.y, this.vector_.z);", + " this.nextBuffer.setXYZ(index + 1, this.vector_.x, this.vector_.y, this.vector_.z);", + " }", + " this.sideBuffer.setX(index, -1);", + " this.sideBuffer.setX(index + 1, 1);", + " if (system.worldSpace) {", + " this.widthBuffer.setX(index, current.size);", + " this.widthBuffer.setX(index + 1, current.size);", + " }", + " else {", + " if (particle.parentMatrix) {", + " this.widthBuffer.setX(index, current.size);", + " this.widthBuffer.setX(index + 1, current.size);", + " }", + " else {", + " const objectScale = (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z)) / 3;", + " this.widthBuffer.setX(index, current.size * objectScale);", + " this.widthBuffer.setX(index + 1, current.size * objectScale);", + " }", + " }", + " this.uvBuffer.setXY(index, (i / particle.previous.length + col) * tileWidth, (vTileCount - row - 1) * tileHeight);", + " this.uvBuffer.setXY(index + 1, (i / particle.previous.length + col) * tileWidth, (vTileCount - row) * tileHeight);", + " this.colorBuffer.setXYZW(index, current.color.x, current.color.y, current.color.z, current.color.w);", + " this.colorBuffer.setXYZW(index + 1, current.color.x, current.color.y, current.color.z, current.color.w);", + " if (i + 1 < particle.previous.length) {", + " this.indexBuffer.setX(triangles * 3, index);", + " this.indexBuffer.setX(triangles * 3 + 1, index + 1);", + " this.indexBuffer.setX(triangles * 3 + 2, index + 2);", + " triangles++;", + " this.indexBuffer.setX(triangles * 3, index + 2);", + " this.indexBuffer.setX(triangles * 3 + 1, index + 1);", + " this.indexBuffer.setX(triangles * 3 + 2, index + 3);", + " triangles++;", + " }", + " previous = current;", + " current = next;", + " if (!curIter.done) {", + " curIter = iter.next();", + " if (curIter.value !== undefined) {", + " next = curIter.value;", + " }", + " }", + " }", + " }", + " });", + " this.positionBuffer.updateRange.count = index * 3;", + " this.positionBuffer.needsUpdate = true;", + " this.previousBuffer.updateRange.count = index * 3;", + " this.previousBuffer.needsUpdate = true;", + " this.nextBuffer.updateRange.count = index * 3;", + " this.nextBuffer.needsUpdate = true;", + " this.sideBuffer.updateRange.count = index;", + " this.sideBuffer.needsUpdate = true;", + " this.widthBuffer.updateRange.count = index;", + " this.widthBuffer.needsUpdate = true;", + " this.uvBuffer.updateRange.count = index * 2;", + " this.uvBuffer.needsUpdate = true;", + " this.colorBuffer.updateRange.count = index * 4;", + " this.colorBuffer.needsUpdate = true;", + " this.indexBuffer.updateRange.count = triangles * 3;", + " this.indexBuffer.needsUpdate = true;", + " this.geometry.setDrawRange(0, triangles * 3);", + " }", + " dispose() {", + " this.geometry.dispose();", + " }", + "}", + "", + "class BatchedRenderer extends THREE.Object3D {", + " constructor() {", + " super();", + " this.batches = [];", + " this.systemToBatchIndex = new Map();", + " this.type = 'BatchedRenderer';", + " }", + " static equals(a, b) {", + " return (a.material.side === b.material.side &&", + " a.material.blending === b.material.blending &&", + " a.material.transparent === b.material.transparent &&", + " a.material.type === b.material.type &&", + " a.material.alphaTest === b.material.alphaTest &&", + " a.material.map === b.material.map &&", + " a.renderMode === b.renderMode &&", + " a.uTileCount === b.uTileCount &&", + " a.vTileCount === b.vTileCount &&", + " a.instancingGeometry === b.instancingGeometry &&", + " a.renderOrder === b.renderOrder &&", + " a.layers.mask === b.layers.mask);", + " }", + " addSystem(system) {", + " system._renderer = this;", + " const settings = system.getRendererSettings();", + " for (let i = 0; i < this.batches.length; i++) {", + " if (BatchedRenderer.equals(this.batches[i].settings, settings)) {", + " this.batches[i].addSystem(system);", + " this.systemToBatchIndex.set(system, i);", + " return;", + " }", + " }", + " let batch;", + " switch (settings.renderMode) {", + " case RenderMode.Trail:", + " batch = new TrailBatch(settings);", + " break;", + " case RenderMode.Mesh:", + " case RenderMode.BillBoard:", + " case RenderMode.VerticalBillBoard:", + " case RenderMode.HorizontalBillBoard:", + " case RenderMode.StretchedBillBoard:", + " batch = new SpriteBatch(settings);", + " break;", + " }", + " batch.addSystem(system);", + " this.batches.push(batch);", + " this.systemToBatchIndex.set(system, this.batches.length - 1);", + " this.add(batch);", + " }", + " deleteSystem(system) {", + " const batchIndex = this.systemToBatchIndex.get(system);", + " if (batchIndex != undefined) {", + " this.batches[batchIndex].removeSystem(system);", + " this.systemToBatchIndex.delete(system);", + " }", + " }", + " updateSystem(system) {", + " this.deleteSystem(system);", + " this.addSystem(system);", + " }", + " update(delta) {", + " this.systemToBatchIndex.forEach((value, ps) => {", + " ps.update(delta);", + " });", + " for (let i = 0; i < this.batches.length; i++) {", + " this.batches[i].update();", + " }", + " }", + "}", + "", + "const BatchedParticleRenderer = BatchedRenderer;", + "", + "class QuarksLoader extends THREE.ObjectLoader {", + " constructor(manager) {", + " super(manager);", + " }", + " linkReference(object) {", + " const objectsMap = {};", + " object.traverse(function (child) {", + " objectsMap[child.uuid] = child;", + " });", + " object.traverse(function (child) {", + " if (child.type === 'ParticleEmitter') {", + " const system = child.system;", + " system.emitterShape;", + " for (let i = 0; i < system.behaviors.length; i++) {", + " if (system.behaviors[i] instanceof EmitSubParticleSystem) {", + " system.behaviors[i].subParticleSystem = objectsMap[system.behaviors[i].subParticleSystem];", + " }", + " }", + " }", + " });", + " }", + " parse(json, onLoad) {", + " const object = super.parse(json, onLoad);", + " this.linkReference(object);", + " return object;", + " }", + " parseObject(data, geometries, materials, textures, animations) {", + " let object;", + " function getGeometry(name) {", + " if (geometries[name] === undefined) {", + " console.warn('THREE.ObjectLoader: Undefined geometry', name);", + " }", + " return geometries[name];", + " }", + " function getMaterial(name) {", + " if (name === undefined)", + " return undefined;", + " if (Array.isArray(name)) {", + " const array = [];", + " for (let i = 0, l = name.length; i < l; i++) {", + " const uuid = name[i];", + " if (materials[uuid] === undefined) {", + " console.warn('THREE.ObjectLoader: Undefined material', uuid);", + " }", + " array.push(materials[uuid]);", + " }", + " return array;", + " }", + " if (materials[name] === undefined) {", + " console.warn('THREE.ObjectLoader: Undefined material', name);", + " }", + " return materials[name];", + " }", + " function getTexture(uuid) {", + " if (textures[uuid] === undefined) {", + " console.warn('THREE.ObjectLoader: Undefined texture', uuid);", + " }", + " return textures[uuid];", + " }", + " let geometry, material;", + " const meta = {", + " textures: textures,", + " geometries: geometries,", + " materials: materials,", + " };", + " const dependencies = {};", + " switch (data.type) {", + " case 'ParticleEmitter':", + " object = ParticleSystem.fromJSON(data.ps, meta, dependencies).emitter;", + " break;", + " case 'Scene':", + " object = new THREE.Scene();", + " if (data.background !== undefined) {", + " if (Number.isInteger(data.background)) {", + " object.background = new THREE.Color(data.background);", + " }", + " else {", + " object.background = getTexture(data.background);", + " }", + " }", + " if (data.environment !== undefined) {", + " object.environment = getTexture(data.environment);", + " }", + " if (data.fog !== undefined) {", + " if (data.fog.type === 'Fog') {", + " object.fog = new THREE.Fog(data.fog.color, data.fog.near, data.fog.far);", + " }", + " else if (data.fog.type === 'FogExp2') {", + " object.fog = new THREE.FogExp2(data.fog.color, data.fog.density);", + " }", + " }", + " if (data.backgroundBlurriness !== undefined)", + " object.backgroundBlurriness = data.backgroundBlurriness;", + " break;", + " case 'PerspectiveCamera':", + " object = new THREE.PerspectiveCamera(data.fov, data.aspect, data.near, data.far);", + " if (data.focus !== undefined)", + " object.focus = data.focus;", + " if (data.zoom !== undefined)", + " object.zoom = data.zoom;", + " if (data.filmGauge !== undefined)", + " object.filmGauge = data.filmGauge;", + " if (data.filmOffset !== undefined)", + " object.filmOffset = data.filmOffset;", + " if (data.view !== undefined)", + " object.view = Object.assign({}, data.view);", + " break;", + " case 'OrthographicCamera':", + " object = new THREE.OrthographicCamera(data.left, data.right, data.top, data.bottom, data.near, data.far);", + " if (data.zoom !== undefined)", + " object.zoom = data.zoom;", + " if (data.view !== undefined)", + " object.view = Object.assign({}, data.view);", + " break;", + " case 'AmbientLight':", + " object = new THREE.AmbientLight(data.color, data.intensity);", + " break;", + " case 'DirectionalLight':", + " object = new THREE.DirectionalLight(data.color, data.intensity);", + " break;", + " case 'PointLight':", + " object = new THREE.PointLight(data.color, data.intensity, data.distance, data.decay);", + " break;", + " case 'RectAreaLight':", + " object = new THREE.RectAreaLight(data.color, data.intensity, data.width, data.height);", + " break;", + " case 'SpotLight':", + " object = new THREE.SpotLight(data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay);", + " break;", + " case 'HemisphereLight':", + " object = new THREE.HemisphereLight(data.color, data.groundColor, data.intensity);", + " break;", + " case 'LightProbe':", + " object = new THREE.LightProbe().fromJSON(data);", + " break;", + " case 'SkinnedMesh':", + " geometry = getGeometry(data.geometry);", + " material = getMaterial(data.material);", + " object = new THREE.SkinnedMesh(geometry, material);", + " if (data.bindMode !== undefined)", + " object.bindMode = data.bindMode;", + " if (data.bindMatrix !== undefined)", + " object.bindMatrix.fromArray(data.bindMatrix);", + " if (data.skeleton !== undefined)", + " object.skeleton = data.skeleton;", + " break;", + " case 'Mesh':", + " geometry = getGeometry(data.geometry);", + " material = getMaterial(data.material);", + " object = new THREE.Mesh(geometry, material);", + " break;", + " case 'InstancedMesh': {", + " geometry = getGeometry(data.geometry);", + " material = getMaterial(data.material);", + " const count = data.count;", + " const instanceMatrix = data.instanceMatrix;", + " const instanceColor = data.instanceColor;", + " object = new THREE.InstancedMesh(geometry, material, count);", + " object.instanceMatrix = new THREE.InstancedBufferAttribute(new Float32Array(instanceMatrix.array), 16);", + " if (instanceColor !== undefined)", + " object.instanceColor = new THREE.InstancedBufferAttribute(new Float32Array(instanceColor.array), instanceColor.itemSize);", + " break;", + " }", + " case 'LOD':", + " object = new THREE.LOD();", + " break;", + " case 'Line':", + " object = new THREE.Line(getGeometry(data.geometry), getMaterial(data.material));", + " break;", + " case 'LineLoop':", + " object = new THREE.LineLoop(getGeometry(data.geometry), getMaterial(data.material));", + " break;", + " case 'LineSegments':", + " object = new THREE.LineSegments(getGeometry(data.geometry), getMaterial(data.material));", + " break;", + " case 'PointCloud':", + " case 'Points':", + " object = new THREE.Points(getGeometry(data.geometry), getMaterial(data.material));", + " break;", + " case 'Sprite':", + " object = new THREE.Sprite(getMaterial(data.material));", + " break;", + " case 'Group':", + " object = new THREE.Group();", + " break;", + " case 'Bone':", + " object = new THREE.Bone();", + " break;", + " default:", + " object = new THREE.Object3D();", + " }", + " object.uuid = data.uuid;", + " if (data.name !== undefined)", + " object.name = data.name;", + " if (data.matrix !== undefined) {", + " object.matrix.fromArray(data.matrix);", + " if (data.matrixAutoUpdate !== undefined)", + " object.matrixAutoUpdate = data.matrixAutoUpdate;", + " if (object.matrixAutoUpdate)", + " object.matrix.decompose(object.position, object.quaternion, object.scale);", + " }", + " else {", + " if (data.position !== undefined)", + " object.position.fromArray(data.position);", + " if (data.rotation !== undefined)", + " object.rotation.fromArray(data.rotation);", + " if (data.quaternion !== undefined)", + " object.quaternion.fromArray(data.quaternion);", + " if (data.scale !== undefined)", + " object.scale.fromArray(data.scale);", + " }", + " if (data.castShadow !== undefined)", + " object.castShadow = data.castShadow;", + " if (data.receiveShadow !== undefined)", + " object.receiveShadow = data.receiveShadow;", + " if (data.shadow) {", + " if (data.shadow.bias !== undefined)", + " object.shadow.bias = data.shadow.bias;", + " if (data.shadow.normalBias !== undefined)", + " object.normalBias = data.shadow.normalBias;", + " if (data.shadow.radius !== undefined)", + " object.radius = data.shadow.radius;", + " if (data.shadow.mapSize !== undefined)", + " object.mapSize.fromArray(data.shadow.mapSize);", + " if (data.shadow.camera !== undefined) {", + " object.camera = this.parseObject(data.shadow.camera);", + " }", + " }", + " if (data.visible !== undefined)", + " object.visible = data.visible;", + " if (data.frustumCulled !== undefined)", + " object.frustumCulled = data.frustumCulled;", + " if (data.renderOrder !== undefined)", + " object.renderOrder = data.renderOrder;", + " if (data.userData !== undefined)", + " object.userData = data.userData;", + " if (data.layers !== undefined)", + " object.layers.mask = data.layers;", + " if (data.children !== undefined) {", + " const children = data.children;", + " for (let i = 0; i < children.length; i++) {", + " object.add(this.parseObject(children[i], geometries, materials, textures, animations));", + " }", + " }", + " if (data.animations !== undefined) {", + " const objectAnimations = data.animations;", + " for (let i = 0; i < objectAnimations.length; i++) {", + " const uuid = objectAnimations[i];", + " object.animations.push(animations[uuid]);", + " }", + " }", + " if (data.type === 'LOD') {", + " if (data.autoUpdate !== undefined)", + " object.autoUpdate = data.autoUpdate;", + " const levels = data.levels;", + " for (let l = 0; l < levels.length; l++) {", + " const level = levels[l];", + " const child = object.getObjectByProperty('uuid', level.object);", + " if (child !== undefined) {", + " object.addLevel(child, level.distance);", + " }", + " }", + " }", + " return object;", + " }", + "}", + "", + "const Plugins = [];", + "function loadPlugin(plugin) {", + " const existing = Plugins.find((item) => item.id === plugin.id);", + " if (!existing) {", + " plugin.initialize();", + " for (const emitterShape of plugin.emitterShapes) {", + " if (!EmitterShapes[emitterShape.type]) {", + " EmitterShapes[emitterShape.type] = emitterShape;", + " }", + " }", + " for (const behavior of plugin.behaviors) {", + " if (!BehaviorTypes[behavior.type]) {", + " BehaviorTypes[behavior.type] = behavior;", + " }", + " }", + " }", + "}", + "function unloadPlugin(pluginId) {", + " const plugin = Plugins.find((item) => item.id === pluginId);", + " if (plugin) {", + " for (const emitterShape of plugin.emitterShapes) {", + " if (EmitterShapes[emitterShape.type]) {", + " delete EmitterShapes[emitterShape.type];", + " }", + " }", + " for (const behavior of plugin.behaviors) {", + " if (BehaviorTypes[behavior.type]) {", + " delete BehaviorTypes[behavior.type];", + " }", + " }", + " }", + "}", + "", + "let NodeValueType = void 0;", + "(function (NodeValueType) {", + " NodeValueType[NodeValueType[\"Number\"] = 0] = \"Number\";", + " NodeValueType[NodeValueType[\"Vec2\"] = 1] = \"Vec2\";", + " NodeValueType[NodeValueType[\"Vec3\"] = 2] = \"Vec3\";", + " NodeValueType[NodeValueType[\"Vec4\"] = 3] = \"Vec4\";", + " NodeValueType[NodeValueType[\"Boolean\"] = 4] = \"Boolean\";", + " NodeValueType[NodeValueType[\"AnyType\"] = 5] = \"AnyType\";", + " NodeValueType[NodeValueType[\"NullableAnyType\"] = 6] = \"NullableAnyType\";", + " NodeValueType[NodeValueType[\"EventStream\"] = 7] = \"EventStream\";", + "})(NodeValueType || (NodeValueType = {}));", + "const genDefaultForNodeValueType = (type) => {", + " switch (type) {", + " case NodeValueType.Boolean:", + " return false;", + " case NodeValueType.Number:", + " return 0;", + " case NodeValueType.Vec2:", + " return new THREE.Vector2();", + " case NodeValueType.Vec3:", + " return new THREE.Vector3();", + " case NodeValueType.Vec4:", + " return new THREE.Vector4();", + " case NodeValueType.AnyType:", + " return 0;", + " case NodeValueType.NullableAnyType:", + " return undefined;", + " }", + "};", + "", + "class Node {", + " constructor(type, signatureIndex = -1, data = {}) {", + " this.inputs = [];", + " this.outputs = [];", + " this.signatureIndex = -1;", + " this.position = new THREE.Vector2();", + " this.outputValues = [];", + " this.id = '' + Math.round(Math.random() * 100000);", + " this.type = type;", + " this.signatureIndex = signatureIndex;", + " this.data = data;", + " const realIndex = signatureIndex === -1 ? 0 : signatureIndex;", + " for (let i = 0; i < type.nodeTypeSignatures[realIndex].inputTypes.length; i++) {", + " this.inputs.push(undefined);", + " }", + " for (let i = 0; i < type.nodeTypeSignatures[realIndex].outputTypes.length; i++) {", + " this.outputs.push([]);", + " this.outputValues.push(genDefaultForNodeValueType(type.nodeTypeSignatures[realIndex].outputTypes[i]));", + " }", + " }", + " get inputTypes() {", + " const signatureIndex = this.signatureIndex === -1 ? 0 : this.signatureIndex;", + " return this.type.nodeTypeSignatures[signatureIndex].inputTypes;", + " }", + " get outputTypes() {", + " const signatureIndex = this.signatureIndex === -1 ? 0 : this.signatureIndex;", + " return this.type.nodeTypeSignatures[signatureIndex].outputTypes;", + " }", + " func(context, inputs, outputs) {", + " const signatureIndex = this.signatureIndex === -1 ? 0 : this.signatureIndex;", + " this.type.nodeTypeSignatures[signatureIndex].func(context, this.data, inputs, outputs);", + " }", + "}", + "class Wire {", + " constructor(input, inputIndex, output, outputIndex) {", + " this.input = input;", + " this.inputIndex = inputIndex;", + " this.input.outputs[inputIndex].push(this);", + " this.output = output;", + " this.outputIndex = outputIndex;", + " this.output.inputs[outputIndex] = this;", + " }", + "}", + "", + "class BaseCompiler {", + " constructor() {", + " this.visited = new Set();", + " BaseCompiler.Instance = this;", + " }", + " buildExecutionOrder(graph, context) {", + " graph.nodesInOrder.length = 0;", + " this.visited.clear();", + " for (let i = 0; i < graph.outputNodes.length; i++) {", + " const node = graph.outputNodes[i];", + " if (node.inputs[0] !== undefined) {", + " this._traverse(node, graph, context);", + " }", + " }", + " graph.compiled = true;", + " }", + " _traverse(node, graph, context) {", + " this.visited.add(node.id);", + " for (let i = 0; i < node.inputs.length; i++) {", + " if (node.inputs[i] instanceof Wire) {", + " const inputNode = node.inputs[i].input;", + " if (!this.visited.has(inputNode.id)) {", + " this._traverse(inputNode, graph, context);", + " }", + " }", + " else if (node.inputs[i] !== undefined);", + " else;", + " }", + " graph.nodesInOrder.push(node);", + " }", + "}", + "", + "class Interpreter extends BaseCompiler {", + " constructor() {", + " super();", + " }", + " executeCompiledGraph(graph, context) {", + " const nodes = graph.nodesInOrder;", + " for (let i = 0; i < nodes.length; i++) {", + " const inputValues = [];", + " const node = nodes[i];", + " for (let j = 0; j < node.inputs.length; j++) {", + " if (node.inputs[j] instanceof Wire) {", + " inputValues.push(node.inputs[j].input.outputValues[node.inputs[j].inputIndex]);", + " }", + " else if (node.inputs[j] !== undefined) {", + " inputValues.push(node.inputs[j].getValue(context));", + " }", + " else {", + " inputValues.push(undefined);", + " }", + " }", + " node.func(context, inputValues, node.outputValues);", + " }", + " }", + " run(graph, context) {", + " if (!graph.compiled) {", + " this.buildExecutionOrder(graph, context);", + " }", + " this.executeCompiledGraph(graph, context);", + " }", + "}", + "", + "class NodeType {", + " constructor(name) {", + " this.nodeTypeSignatures = [];", + " this.name = name;", + " }", + " addSignature(inputTypes, outputTypes, func) {", + " this.nodeTypeSignatures.push({", + " inputTypes: inputTypes,", + " outputTypes: outputTypes,", + " func: func,", + " });", + " }", + "}", + "class GraphNodeType extends NodeType {", + " constructor(nodeGraph) {", + " const inputTypes = [];", + " for (let i = 0; i < nodeGraph.inputNodes.length; i++) {", + " if (nodeGraph.inputNodes[i].type.name === 'input') {", + " inputTypes.push(nodeGraph.inputNodes[i].data.type);", + " }", + " }", + " const outputTypes = [];", + " for (let i = 0; i < nodeGraph.outputNodes.length; i++) {", + " if (nodeGraph.outputNodes[i].type.name === 'output') {", + " outputTypes.push(nodeGraph.outputNodes[i].data.type);", + " }", + " }", + " super(nodeGraph.name);", + " this.addSignature(inputTypes, outputTypes, (context, data, inputs, outputs) => {", + " context.inputs = inputs;", + " context.outputs = outputs;", + " Interpreter.Instance.run(nodeGraph, context);", + " });", + " this.nodeGraph = nodeGraph;", + " }", + "}", + "", + "const NodeTypes = {};", + "const addNode = new NodeType('add');", + "addNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] + inputs[1];", + "});", + "addNode.addSignature([NodeValueType.Vec2, NodeValueType.Vec2], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " outputs[0].addVectors(inputs[0], inputs[1]);", + "});", + "addNode.addSignature([NodeValueType.Vec3, NodeValueType.Vec3], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " outputs[0].addVectors(inputs[0], inputs[1]);", + "});", + "addNode.addSignature([NodeValueType.Vec4, NodeValueType.Vec4], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " outputs[0].addVectors(inputs[0], inputs[1]);", + "});", + "NodeTypes['add'] = addNode;", + "const subNode = new NodeType('sub');", + "subNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] - inputs[1];", + "});", + "subNode.addSignature([NodeValueType.Vec2, NodeValueType.Vec2], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " outputs[0].subVectors(inputs[0], inputs[1]);", + "});", + "subNode.addSignature([NodeValueType.Vec3, NodeValueType.Vec3], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " outputs[0].subVectors(inputs[0], inputs[1]);", + "});", + "subNode.addSignature([NodeValueType.Vec4, NodeValueType.Vec4], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " outputs[0].subVectors(inputs[0], inputs[1]);", + "});", + "NodeTypes['sub'] = subNode;", + "const mulNode = new NodeType('mul');", + "mulNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] * inputs[1];", + "});", + "mulNode.addSignature([NodeValueType.Vec2, NodeValueType.Number], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " outputs[0].copy(inputs[0]).multiplyScalar(inputs[1]);", + "});", + "mulNode.addSignature([NodeValueType.Vec3, NodeValueType.Number], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " outputs[0].copy(inputs[0]).multiplyScalar(inputs[1]);", + "});", + "mulNode.addSignature([NodeValueType.Vec4, NodeValueType.Number], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " outputs[0].copy(inputs[0]).multiplyScalar(inputs[1]);", + "});", + "NodeTypes['mul'] = mulNode;", + "const divNode = new NodeType('div');", + "divNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] / inputs[1];", + "});", + "divNode.addSignature([NodeValueType.Vec2, NodeValueType.Number], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " outputs[0].copy(inputs[0]).divideScalar(inputs[1]);", + "});", + "divNode.addSignature([NodeValueType.Vec3, NodeValueType.Number], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " outputs[0].copy(inputs[0]).divideScalar(inputs[1]);", + "});", + "divNode.addSignature([NodeValueType.Vec4, NodeValueType.Number], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " outputs[0].copy(inputs[0]).divideScalar(inputs[1]);", + "});", + "NodeTypes['div'] = divNode;", + "const sinNode = new NodeType('sin');", + "sinNode.addSignature([NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = Math.sin(inputs[0]);", + "});", + "NodeTypes['sin'] = sinNode;", + "const cosNode = new NodeType('cos');", + "cosNode.addSignature([NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = Math.cos(inputs[0]);", + "});", + "NodeTypes['cos'] = cosNode;", + "const tanNode = new NodeType('tan');", + "tanNode.addSignature([NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = Math.tan(inputs[0]);", + "});", + "NodeTypes['tan'] = tanNode;", + "const absNode = new NodeType('abs');", + "absNode.addSignature([NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = Math.abs(inputs[0]);", + "});", + "NodeTypes['abs'] = absNode;", + "const minNode = new NodeType('min');", + "minNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = Math.min(inputs[0], inputs[1]);", + "});", + "NodeTypes['min'] = minNode;", + "const maxNode = new NodeType('max');", + "maxNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = Math.max(inputs[0], inputs[1]);", + "});", + "NodeTypes['max'] = maxNode;", + "const dot = new NodeType('dot');", + "dot.addSignature([NodeValueType.Vec2, NodeValueType.Vec2], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].dot(inputs[1]);", + "});", + "dot.addSignature([NodeValueType.Vec3, NodeValueType.Vec3], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].dot(inputs[1]);", + "});", + "dot.addSignature([NodeValueType.Vec4, NodeValueType.Vec4], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].dot(inputs[1]);", + "});", + "NodeTypes['dot'] = dot;", + "const cross = new NodeType('cross');", + "cross.addSignature([NodeValueType.Vec3, NodeValueType.Vec3], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " outputs[0].crossVectors(inputs[0], inputs[1]);", + "});", + "NodeTypes['cross'] = cross;", + "const length = new NodeType('length');", + "length.addSignature([NodeValueType.Vec2], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].length();", + "});", + "length.addSignature([NodeValueType.Vec3], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].length();", + "});", + "length.addSignature([NodeValueType.Vec4], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].length();", + "});", + "NodeTypes['length'] = length;", + "const lengthSq = new NodeType('lengthSq');", + "lengthSq.addSignature([NodeValueType.Vec2], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].lengthSq();", + "});", + "lengthSq.addSignature([NodeValueType.Vec3], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].lengthSq();", + "});", + "lengthSq.addSignature([NodeValueType.Vec4], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].lengthSq();", + "});", + "NodeTypes['lengthSq'] = lengthSq;", + "const normalize = new NodeType('normalize');", + "normalize.addSignature([NodeValueType.Vec2], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " outputs[0].copy(inputs[0]).normalize();", + "});", + "normalize.addSignature([NodeValueType.Vec3], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " outputs[0].copy(inputs[0]).normalize();", + "});", + "normalize.addSignature([NodeValueType.Vec4], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " outputs[0].copy(inputs[0]).normalize();", + "});", + "NodeTypes['normalize'] = normalize;", + "const distance = new NodeType('distance');", + "distance.addSignature([NodeValueType.Vec2, NodeValueType.Vec2], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].distanceTo(inputs[1]);", + "});", + "distance.addSignature([NodeValueType.Vec3, NodeValueType.Vec3], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].distanceTo(inputs[1]);", + "});", + "NodeTypes['distance'] = distance;", + "const andNode = new NodeType('and');", + "andNode.addSignature([NodeValueType.Boolean, NodeValueType.Boolean], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] && inputs[1];", + "});", + "NodeTypes['and'] = andNode;", + "const orNode = new NodeType('or');", + "orNode.addSignature([NodeValueType.Boolean, NodeValueType.Boolean], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] || inputs[1];", + "});", + "NodeTypes['or'] = orNode;", + "const notNode = new NodeType('not');", + "notNode.addSignature([NodeValueType.Boolean], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = !inputs[0];", + "});", + "NodeTypes['not'] = notNode;", + "const equalNode = new NodeType('equal');", + "equalNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] === inputs[1];", + "});", + "equalNode.addSignature([NodeValueType.Vec2, NodeValueType.Vec2], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].equals(inputs[1]);", + "});", + "equalNode.addSignature([NodeValueType.Vec3, NodeValueType.Vec3], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].equals(inputs[1]);", + "});", + "equalNode.addSignature([NodeValueType.Vec4, NodeValueType.Vec4], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].equals(inputs[1]);", + "});", + "NodeTypes['equal'] = equalNode;", + "const lessThanNode = new NodeType('lessThan');", + "lessThanNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] < inputs[1];", + "});", + "NodeTypes['lessThan'] = lessThanNode;", + "const greaterThanNode = new NodeType('greaterThan');", + "greaterThanNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] > inputs[1];", + "});", + "NodeTypes['greaterThan'] = greaterThanNode;", + "const lessThanOrEqualNode = new NodeType('lessThanOrEqual');", + "lessThanOrEqualNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] <= inputs[1];", + "});", + "NodeTypes['lessThanOrEqual'] = lessThanOrEqualNode;", + "const greaterThanOrEqualNode = new NodeType('greaterThanOrEqual');", + "greaterThanOrEqualNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] >= inputs[1];", + "});", + "NodeTypes['greaterThanOrEqual'] = greaterThanOrEqualNode;", + "const ifNode = new NodeType('if');", + "ifNode.addSignature([NodeValueType.Boolean, NodeValueType.AnyType, NodeValueType.AnyType], [NodeValueType.AnyType], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0] ? inputs[1] : inputs[2];", + "});", + "NodeTypes['if'] = ifNode;", + "const numberNode = new NodeType('number');", + "numberNode.addSignature([], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = data.value;", + "});", + "NodeTypes['number'] = numberNode;", + "const vec2Node = new NodeType('vec2');", + "vec2Node.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " outputs[0].x = inputs[0];", + " outputs[0].y = inputs[1];", + "});", + "NodeTypes['vec2'] = vec2Node;", + "const vec3Node = new NodeType('vec3');", + "vec3Node.addSignature([NodeValueType.Number, NodeValueType.Number, NodeValueType.Number], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " outputs[0].x = inputs[0];", + " outputs[0].y = inputs[1];", + " outputs[0].z = inputs[2];", + "});", + "NodeTypes['vec3'] = vec3Node;", + "const vec4Node = new NodeType('vec4');", + "vec4Node.addSignature([NodeValueType.Number, NodeValueType.Number, NodeValueType.Number, NodeValueType.Number], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " outputs[0].x = inputs[0];", + " outputs[0].y = inputs[1];", + " outputs[0].z = inputs[2];", + " outputs[0].w = inputs[3];", + "});", + "NodeTypes['vec4'] = vec4Node;", + "const splitVec2Node = new NodeType('splitVec2');", + "splitVec2Node.addSignature([NodeValueType.Vec2], [NodeValueType.Number, NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].x;", + " outputs[1] = inputs[0].y;", + "});", + "NodeTypes['splitVec2'] = splitVec2Node;", + "const splitVec3Node = new NodeType('splitVec3');", + "splitVec3Node.addSignature([NodeValueType.Vec3], [NodeValueType.Number, NodeValueType.Number, NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].x;", + " outputs[1] = inputs[0].y;", + " outputs[2] = inputs[0].z;", + "});", + "NodeTypes['splitVec3'] = splitVec3Node;", + "const splitVec4Node = new NodeType('splitVec4');", + "splitVec4Node.addSignature([NodeValueType.Vec4], [NodeValueType.Number, NodeValueType.Number, NodeValueType.Number, NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0].x;", + " outputs[1] = inputs[0].y;", + " outputs[2] = inputs[0].z;", + " outputs[3] = inputs[0].w;", + "});", + "NodeTypes['splitVec4'] = splitVec4Node;", + "const boolNode = new NodeType('bool');", + "boolNode.addSignature([], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = data.value;", + "});", + "NodeTypes['bool'] = boolNode;", + "const particlePropertyNode = new NodeType('particleProperty');", + "particlePropertyNode.addSignature([NodeValueType.NullableAnyType], [NodeValueType.NullableAnyType], (context, data, inputs, outputs) => {", + " if (inputs[0] !== undefined) {", + " if (typeof inputs[0] === 'object') {", + " context.particle[data.property].copy(inputs[0]);", + " }", + " else {", + " context.particle[data.property] = inputs[0];", + " }", + " }", + " if (context.particle[data.property] !== undefined) {", + " if (typeof outputs[0] === 'object') {", + " outputs[0].copy(context.particle[data.property]);", + " }", + " else {", + " outputs[0] = context.particle[data.property];", + " }", + " }", + "});", + "NodeTypes['particleProperty'] = particlePropertyNode;", + "const emitNode = new NodeType('emit');", + "emitNode.addSignature([NodeValueType.EventStream], [], (context, data, inputs, outputs) => {", + " const arr = inputs[0];", + " for (let i = 0; i < arr.length; i++) {", + " context.signal(i, arr[i]);", + " }", + "});", + "NodeTypes['emit'] = emitNode;", + "const graphPropertyNode = new NodeType('graphProperty');", + "graphPropertyNode.addSignature([NodeValueType.NullableAnyType], [NodeValueType.NullableAnyType], (context, data, inputs, outputs) => {", + " if (inputs[0] !== undefined) {", + " if (typeof inputs[0] === 'object') {", + " context.graph[data.property].copy(inputs[0]);", + " }", + " else {", + " context.graph[data.property] = inputs[0];", + " }", + " }", + " if (context.graph[data.property] !== undefined) {", + " if (typeof outputs[0] === 'object') {", + " outputs[0].copy(context.graph[data.property]);", + " }", + " else {", + " outputs[0] = context.graph[data.property];", + " }", + " }", + "});", + "NodeTypes['graphProperty'] = graphPropertyNode;", + "const startEventNode = new NodeType('startEvent');", + "startEventNode.addSignature([], [NodeValueType.EventStream], (context, data, inputs, outputs) => {", + " outputs[0] = [{ type: 'start' }];", + "});", + "NodeTypes['startEvent'] = startEventNode;", + "const repeaterNode = new NodeType('repeater');", + "repeaterNode.addSignature([NodeValueType.EventStream, NodeValueType.Number], [NodeValueType.EventStream], (context, data, inputs, outputs) => {", + " const arr = inputs[0];", + " const count = inputs[1];", + " const result = [];", + " for (let j = 0; j < arr.length; j++) {", + " for (let i = 0; i < count; i++) {", + " result.push(arr[j]);", + " }", + " }", + " outputs[0] = result;", + "});", + "NodeTypes['repeater'] = repeaterNode;", + "const timeNode = new NodeType('time');", + "timeNode.addSignature([], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = context.emissionState.time;", + "});", + "NodeTypes['time'] = timeNode;", + "const deltaNode = new NodeType('delta');", + "deltaNode.addSignature([], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = context.delta;", + "});", + "NodeTypes['delta'] = deltaNode;", + "const outputNode = new NodeType('output');", + "outputNode.addSignature([NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0];", + "});", + "outputNode.addSignature([NodeValueType.Vec2], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0];", + "});", + "outputNode.addSignature([NodeValueType.Vec3], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0];", + "});", + "outputNode.addSignature([NodeValueType.Vec4], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0];", + "});", + "outputNode.addSignature([NodeValueType.Boolean], [NodeValueType.Boolean], (context, data, inputs, outputs) => {", + " outputs[0] = inputs[0];", + "});", + "NodeTypes['output'] = outputNode;", + "const lerpNode = new NodeType('lerp');", + "lerpNode.addSignature([NodeValueType.Number, NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] =", + " inputs[0] * (1 - inputs[2]) + inputs[1] * inputs[2];", + "});", + "lerpNode.addSignature([NodeValueType.Vec2, NodeValueType.Vec2, NodeValueType.Number], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " outputs[0].lerpVectors(inputs[0], inputs[1], inputs[2]);", + "});", + "lerpNode.addSignature([NodeValueType.Vec3, NodeValueType.Vec3, NodeValueType.Number], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " outputs[0].lerpVectors(inputs[0], inputs[1], inputs[2]);", + "});", + "lerpNode.addSignature([NodeValueType.Vec4, NodeValueType.Vec4, NodeValueType.Number], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " outputs[0].lerpVectors(inputs[0], inputs[1], inputs[2]);", + "});", + "NodeTypes['lerp'] = lerpNode;", + "const normalD = (x) => {", + " return (1 / Math.sqrt(2 * Math.PI)) * Math.exp(x * x * -0.5);", + "};", + "const normalDistributionNode = new NodeType('normDistrib');", + "normalDistributionNode.addSignature([NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = normalD(inputs[0]);", + "});", + "NodeTypes['normDistrib'] = normalDistributionNode;", + "const normcdfNode = new NodeType('normcdf');", + "normcdfNode.addSignature([NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " let x = inputs[0];", + " const a1 = 0.254829592;", + " const a2 = -0.284496736;", + " const a3 = 1.421413741;", + " const a4 = -1.453152027;", + " const a5 = 1.061405429;", + " const p = 0.3275911;", + " let sign = 1;", + " if (x < 0)", + " sign = -1;", + " x = Math.abs(x) / Math.sqrt(2.0);", + " const t = 1.0 / (1.0 + p * x);", + " const y = 1.0 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-x * x);", + " outputs[0] = 0.5 * (1.0 + sign * y);", + "});", + "NodeTypes['normcdf'] = normcdfNode;", + "const normcdfInvNode = new NodeType('normcdfInv');", + "const rationalApproximation = (t) => {", + " const c = [2.515517, 0.802853, 0.010328];", + " const d = [1.432788, 0.189269, 0.001308];", + " return t - ((c[2] * t + c[1]) * t + c[0]) / (((d[2] * t + d[1]) * t + d[0]) * t + 1.0);", + "};", + "const normcdfInv = (p) => {", + " if (p < 0.5) {", + " return -rationalApproximation(Math.sqrt(-2.0 * Math.log(p)));", + " }", + " else {", + " return rationalApproximation(Math.sqrt(-2.0 * Math.log(1 - p)));", + " }", + "};", + "normcdfInvNode.addSignature([NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = normcdfInv(inputs[0]);", + "});", + "NodeTypes['normcdfInv'] = normcdfInvNode;", + "const clampNode = new NodeType('clamp');", + "clampNode.addSignature([NodeValueType.Number, NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = Math.max(Math.min(inputs[0], inputs[2]), inputs[1]);", + "});", + "NodeTypes['clamp'] = clampNode;", + "const smoothstepNode = new NodeType('smoothstep');", + "smoothstepNode.addSignature([NodeValueType.Number, NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " const x = Math.max(Math.min(inputs[0], inputs[2]), inputs[1]);", + " outputs[0] = x * x * (3 - 2 * x);", + "});", + "NodeTypes['smoothstep'] = smoothstepNode;", + "const randomNode = new NodeType('random');", + "randomNode.addSignature([NodeValueType.Number, NodeValueType.Number], [NodeValueType.Number], (context, data, inputs, outputs) => {", + " outputs[0] = Math.random() * (inputs[1] - inputs[0]) + inputs[0];", + "});", + "randomNode.addSignature([NodeValueType.Vec2, NodeValueType.Vec2], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " let random = Math.random();", + " outputs[0].lerpVectors(inputs[0], inputs[1], random);", + "});", + "randomNode.addSignature([NodeValueType.Vec3, NodeValueType.Vec3], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " let random = Math.random();", + " outputs[0].lerpVectors(inputs[0], inputs[1], random);", + "});", + "randomNode.addSignature([NodeValueType.Vec4, NodeValueType.Vec4], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " let random = Math.random();", + " outputs[0].lerpVectors(inputs[0], inputs[1], random);", + "});", + "NodeTypes['random'] = randomNode;", + "const vrandNode = new NodeType('vrand');", + "vrandNode.addSignature([], [NodeValueType.Vec2], (context, data, inputs, outputs) => {", + " let x = normcdfInv(Math.random());", + " let y = normcdfInv(Math.random());", + " const mag = Math.sqrt(x * x + y * y);", + " outputs[0].set(x / mag, y / mag);", + "});", + "vrandNode.addSignature([], [NodeValueType.Vec3], (context, data, inputs, outputs) => {", + " let x = normcdfInv(Math.random());", + " let y = normcdfInv(Math.random());", + " let z = normcdfInv(Math.random());", + " const mag = Math.sqrt(x * x + y * y + z * z);", + " outputs[0].set(x / mag, y / mag, z / mag);", + "});", + "vrandNode.addSignature([], [NodeValueType.Vec4], (context, data, inputs, outputs) => {", + " let x = normcdfInv(Math.random());", + " let y = normcdfInv(Math.random());", + " let z = normcdfInv(Math.random());", + " let w = normcdfInv(Math.random());", + " const mag = Math.sqrt(x * x + y * y + z * z + w * w);", + " outputs[0].set(x / mag, y / mag, z / mag, w / mag);", + "});", + "NodeTypes['vrand'] = vrandNode;", + "const bsdfNode = new NodeType('bsdf');", + "bsdfNode.addSignature([NodeValueType.Vec3, NodeValueType.Vec3, NodeValueType.Vec3, NodeValueType.Number], [], (context, data, inputs, outputs) => { });", + "NodeTypes['bsdf'] = bsdfNode;", + "const OutputNodeTypeNames = new Set(['output', 'particleProperty', 'graphProperty', 'emit']);", + "", + "class NodeGraph {", + " constructor(name) {", + " this.inputNodes = [];", + " this.outputNodes = [];", + " this.allNodes = new Map();", + " this.wires = [];", + " this.compiled = false;", + " this.nodesInOrder = [];", + " this.version = '1.0';", + " this.uuid = THREE.MathUtils.generateUUID();", + " this.name = name;", + " this.revision = 0;", + " }", + " addWire(wire) {", + " this.wires.push(wire);", + " this.revision++;", + " }", + " addNode(node) {", + " this.allNodes.set(node.id, node);", + " if (node.type === NodeTypes['input']) {", + " this.inputNodes.push(node);", + " }", + " else if (OutputNodeTypeNames.has(node.type.name)) {", + " this.outputNodes.push(node);", + " }", + " this.revision++;", + " }", + " getNode(id) {", + " return this.allNodes.get(id);", + " }", + " deleteNode(node) {", + " this.allNodes.delete(node.id);", + " this.revision++;", + " }", + " deleteWire(wire) {", + " let index = wire.input.outputs[wire.inputIndex].indexOf(wire);", + " if (index !== -1) {", + " wire.input.outputs[wire.inputIndex].splice(index, 1);", + " }", + " wire.output.inputs[wire.outputIndex] = undefined;", + " index = this.wires.indexOf(wire);", + " if (index != -1) {", + " this.wires[index] = this.wires[this.wires.length - 1];", + " this.wires.pop();", + " }", + " this.revision++;", + " }", + " toJSON() {", + " throw new Error('not implemented');", + " }", + " clone() {", + " throw new Error('not implemented');", + " }", + "}", + "", + "new THREE.Vector3(0, 0, 1);", + "const tempQ = new THREE.Quaternion();", + "const tempV = new THREE.Vector3();", + "const tempV2 = new THREE.Vector3();", + "const PREWARM_FPS = 60;", + "const DEFAULT_GEOMETRY = new THREE.PlaneGeometry(1, 1, 1, 1);", + "class NodeVFX {", + " set time(time) {", + " this.emissionState.time = time;", + " }", + " get time() {", + " return this.emissionState.time;", + " }", + " get layers() {", + " return this.rendererSettings.layers;", + " }", + " get texture() {", + " return this.rendererSettings.material.map;", + " }", + " set texture(texture) {", + " this.rendererSettings.material.map = texture;", + " this.neededToUpdateRender = true;", + " }", + " get material() {", + " return this.rendererSettings.material;", + " }", + " set material(material) {", + " this.rendererSettings.material = material;", + " this.neededToUpdateRender = true;", + " }", + " get instancingGeometry() {", + " return this.rendererSettings.instancingGeometry;", + " }", + " set instancingGeometry(geometry) {", + " this.restart();", + " this.particles.length = 0;", + " this.rendererSettings.instancingGeometry = geometry;", + " this.neededToUpdateRender = true;", + " }", + " get renderMode() {", + " return this.rendererSettings.renderMode;", + " }", + " set renderMode(renderMode) {", + " if ((this.rendererSettings.renderMode != RenderMode.Trail && renderMode === RenderMode.Trail) ||", + " (this.rendererSettings.renderMode == RenderMode.Trail && renderMode !== RenderMode.Trail)) {", + " this.restart();", + " this.particles.length = 0;", + " }", + " if (this.rendererSettings.renderMode !== renderMode) {", + " switch (renderMode) {", + " case RenderMode.Trail:", + " this.rendererEmitterSettings = {", + " startLength: 30,", + " followLocalOrigin: false,", + " };", + " break;", + " case RenderMode.Mesh:", + " this.rendererEmitterSettings = {", + " geometry: new THREE.PlaneGeometry(1, 1),", + " };", + " break;", + " case RenderMode.BillBoard:", + " case RenderMode.VerticalBillBoard:", + " case RenderMode.HorizontalBillBoard:", + " case RenderMode.StretchedBillBoard:", + " this.rendererEmitterSettings = {};", + " break;", + " }", + " }", + " this.rendererSettings.renderMode = renderMode;", + " this.neededToUpdateRender = true;", + " }", + " get renderOrder() {", + " return this.rendererSettings.renderOrder;", + " }", + " set renderOrder(renderOrder) {", + " this.rendererSettings.renderOrder = renderOrder;", + " this.neededToUpdateRender = true;", + " }", + " get blending() {", + " return this.rendererSettings.material.blending;", + " }", + " set blending(blending) {", + " this.rendererSettings.material.blending = blending;", + " this.neededToUpdateRender = true;", + " }", + " constructor(parameters) {", + " var _a, _b, _c, _d, _e, _f, _g;", + " this.temp = new THREE.Vector3();", + " this.travelDistance = 0;", + " this.normalMatrix = new THREE.Matrix3();", + " this.speedFactor = 0;", + " this.autoDestroy = parameters.autoDestroy === undefined ? false : parameters.autoDestroy;", + " this.duration = (_a = parameters.duration) !== null && _a !== void 0 ? _a : 1;", + " this.looping = parameters.looping === undefined ? true : parameters.looping;", + " this.prewarm = parameters.prewarm === undefined ? false : parameters.prewarm;", + " this.worldSpace = (_b = parameters.worldSpace) !== null && _b !== void 0 ? _b : false;", + " this.rendererEmitterSettings = (_c = parameters.rendererEmitterSettings) !== null && _c !== void 0 ? _c : {};", + " this.emissionGraph = parameters.emissionGraph;", + " this.updateGraph = parameters.updateGraph;", + " this.interpreter = new Interpreter();", + " this.rendererSettings = {", + " instancingGeometry: (_d = parameters.instancingGeometry) !== null && _d !== void 0 ? _d : DEFAULT_GEOMETRY,", + " renderMode: (_e = parameters.renderMode) !== null && _e !== void 0 ? _e : RenderMode.BillBoard,", + " renderOrder: (_f = parameters.renderOrder) !== null && _f !== void 0 ? _f : 0,", + " material: parameters.material,", + " layers: (_g = parameters.layers) !== null && _g !== void 0 ? _g : new THREE.Layers(),", + " uTileCount: 1,", + " vTileCount: 1,", + " };", + " this.neededToUpdateRender = true;", + " this.particles = new Array();", + " this.emitter = new ParticleEmitter(this);", + " this.paused = false;", + " this.particleNum = 0;", + " this.emissionState = {", + " time: 0,", + " };", + " this.emitEnded = false;", + " this.markForDestroy = false;", + " this.prewarmed = false;", + " }", + " pause() {", + " this.paused = true;", + " }", + " play() {", + " this.paused = false;", + " }", + " spawn(emissionState, matrix) {", + " tempQ.setFromRotationMatrix(matrix);", + " const translation = tempV;", + " const quaternion = tempQ;", + " const scale = tempV2;", + " matrix.decompose(translation, quaternion, scale);", + " this.particleNum++;", + " while (this.particles.length < this.particleNum) {", + " this.particles.push(new NodeParticle());", + " }", + " const particle = this.particles[this.particleNum - 1];", + " particle.reset();", + " this.interpreter.run(this.updateGraph, { particle: particle, emissionState: this.emissionState });", + " if (this.rendererSettings.renderMode === RenderMode.Trail &&", + " this.rendererEmitterSettings.followLocalOrigin) {", + " const trail = particle;", + " trail.localPosition = new THREE.Vector3().copy(trail.position);", + " }", + " if (this.worldSpace) {", + " particle.position.applyMatrix4(matrix);", + " particle.size *= (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z)) / 3;", + " particle.velocity.multiply(scale).applyMatrix3(this.normalMatrix);", + " if (particle.rotation && particle.rotation instanceof THREE.Quaternion) {", + " particle.rotation.multiplyQuaternions(tempQ, particle.rotation);", + " }", + " }", + " }", + " endEmit() {", + " this.emitEnded = true;", + " if (this.autoDestroy) {", + " this.markForDestroy = true;", + " }", + " }", + " dispose() {", + " if (this._renderer)", + " this._renderer.deleteSystem(this);", + " this.emitter.dispose();", + " if (this.emitter.parent)", + " this.emitter.parent.remove(this.emitter);", + " }", + " restart() {", + " this.paused = false;", + " this.particleNum = 0;", + " this.emissionState.time = 0;", + " this.emitEnded = false;", + " this.markForDestroy = false;", + " this.prewarmed = false;", + " }", + " update(delta) {", + " if (this.paused)", + " return;", + " let currentParent = this.emitter;", + " while (currentParent.parent) {", + " currentParent = currentParent.parent;", + " }", + " if (currentParent.type !== 'Scene') {", + " this.dispose();", + " return;", + " }", + " if (this.emitEnded && this.particleNum === 0) {", + " if (this.markForDestroy && this.emitter.parent)", + " this.dispose();", + " return;", + " }", + " if (this.looping && this.prewarm && !this.prewarmed) {", + " this.prewarmed = true;", + " for (let i = 0; i < this.duration * PREWARM_FPS; i++) {", + " this.update(1.0 / PREWARM_FPS);", + " }", + " }", + " if (delta > 0.1) {", + " delta = 0.1;", + " }", + " if (this.neededToUpdateRender) {", + " if (this._renderer)", + " this._renderer.updateSystem(this);", + " this.neededToUpdateRender = false;", + " }", + " this.emit(delta, this.emissionState, this.emitter.matrixWorld);", + " const context = { particle: undefined, emissionState: this.emissionState, delta };", + " for (let i = 0; i < this.particleNum; i++) {", + " context.particle = this.particles[i];", + " this.interpreter.run(this.updateGraph, context);", + " }", + " for (let i = 0; i < this.particleNum; i++) {", + " if (this.rendererEmitterSettings.followLocalOrigin &&", + " this.particles[i].localPosition) {", + " this.particles[i].position.copy(this.particles[i].localPosition);", + " if (this.particles[i].parentMatrix) {", + " this.particles[i].position.applyMatrix4(this.particles[i].parentMatrix);", + " }", + " else {", + " this.particles[i].position.applyMatrix4(this.emitter.matrixWorld);", + " }", + " }", + " else {", + " this.particles[i].position.addScaledVector(this.particles[i].velocity, delta);", + " }", + " this.particles[i].age += delta;", + " }", + " if (this.rendererSettings.renderMode === RenderMode.Trail) {", + " for (let i = 0; i < this.particleNum; i++) {", + " const particle = this.particles[i];", + " particle.update();", + " }", + " }", + " for (let i = 0; i < this.particleNum; i++) {", + " const particle = this.particles[i];", + " if (particle.died && (!(particle instanceof TrailParticle) || particle.previous.length === 0)) {", + " this.particles[i] = this.particles[this.particleNum - 1];", + " this.particles[this.particleNum - 1] = particle;", + " this.particleNum--;", + " i--;", + " }", + " }", + " }", + " emit(delta, emissionState, emitterMatrix) {", + " if (emissionState.time > this.duration) {", + " if (this.looping) {", + " emissionState.time -= this.duration;", + " }", + " else {", + " if (!this.emitEnded) {", + " this.endEmit();", + " }", + " }", + " }", + " this.normalMatrix.getNormalMatrix(emitterMatrix);", + " const context = {", + " signal: () => {", + " this.spawn(emissionState, emitterMatrix);", + " },", + " emissionState,", + " delta,", + " };", + " if (!this.emitEnded) {", + " this.interpreter.run(this.emissionGraph, context);", + " }", + " if (this.previousWorldPos === undefined)", + " this.previousWorldPos = new THREE.Vector3();", + " this.emitter.getWorldPosition(this.previousWorldPos);", + " emissionState.time += delta;", + " }", + " toJSON(meta, options = {}) {", + " return {};", + " }", + " getRendererSettings() {", + " return this.rendererSettings;", + " }", + " clone() {", + " return this;", + " }", + "}", + "", + "gdjs.__particleEmmiter3DExtension = {", + " ParticleEmitter3DRenderer,", + " ParticleEmitterAdapter,", + "", + " ApplyCollision,", + " ApplyForce,", + " ApplySequences,", + " AxisAngleGenerator,", + " BatchedParticleRenderer,", + " BatchedRenderer,", + " BehaviorFromJSON,", + " BehaviorTypes,", + " Bezier,", + " ChangeEmitDirection,", + " ColorGeneratorFromJSON,", + " ColorOverLife,", + " ColorRange,", + " ConeEmitter,", + " ConstantColor,", + " ConstantValue,", + " DonutEmitter,", + " EmitSubParticleSystem,", + " EmitterFromJSON,", + " EmitterMode,", + " EmitterShapes,", + " EulerGenerator,", + " ForceOverLife,", + " FrameOverLife,", + " GeneratorFromJSON,", + " Gradient,", + " GraphNodeType,", + " GravityForce,", + " GridEmitter,", + " Interpreter,", + " IntervalValue,", + " MeshSurfaceEmitter,", + " Node,", + " NodeGraph,", + " NodeType,", + " NodeTypes,", + " NodeValueType,", + " Noise,", + " OrbitOverLife,", + " ParticleEmitter,", + " ParticleSystem,", + " PiecewiseBezier,", + " PiecewiseFunction,", + " Plugins,", + " PointEmitter,", + " QuarksLoader,", + " RandomColor,", + " RandomColorBetweenGradient,", + " RandomQuatGenerator,", + " RecordState,", + " RenderMode,", + " Rotation3DOverLife,", + " RotationGeneratorFromJSON,", + " RotationOverLife,", + " SequencerFromJSON,", + " SizeOverLife,", + " SpeedOverLife,", + " SphereEmitter,", + " SpriteBatch,", + " SpriteParticle,", + " SubParticleEmitMode,", + " TextureSequencer,", + " TrailBatch,", + " TrailParticle,", + " TurbulenceField,", + " VFXBatch,", + " ValueGeneratorFromJSON,", + " WidthOverLength,", + " Wire,", + " genDefaultForNodeValueType,", + " getPhysicsResolver,", + " loadPlugin,", + " setPhysicsResolver,", + " unloadPlugin,", + "}" ], - "expressionType": { - "type": "color" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onScenePreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "\r", + "// See doStepPostEvents\r", + "runtimeScene.__particleEmmiter3DExtension = runtimeScene.__particleEmmiter3DExtension || {};\r", + "runtimeScene.__particleEmmiter3DExtension.emittersStepped = 0;" ], - "objectGroups": [] - }, + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [], + "eventsBasedObjects": [ + { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "ParticleEmitter", + "description": "Display a large number of particles to create visual effects.", + "fullName": "3D particle emitter", + "is3D": true, + "name": "ParticleEmitter3D", + "eventsFunctions": [ { "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "EndColor", - "name": "SetEndColor", + "functionType": "Action", + "name": "onCreated", "sentence": "", "events": [ { @@ -12679,12 +11003,11 @@ "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyEndColor" + "value": "ParticleEmitter3D::DefineHelperClasses" }, "parameters": [ - "Object", - "=", - "GetArgumentAsString(\"Value\")" + "", + "" ] } ] @@ -12692,134 +11015,162 @@ { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ - "const object = objects[0];\r", - "const endColor = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setEndColor(endColor);" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the start opacity of the object.", - "fullName": "Start opacity", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter color configuration", - "name": "StartOpacity", - "sentence": "the start opacity", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.PropertyStartOpacity()" - ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "StartOpacity", - "name": "SetStartOpacity", - "sentence": "", - "events": [ + "const BatchedRenderer = gdjs.__particleEmmiter3DExtension.BatchedRenderer;", + "const ParticleSystem = gdjs.__particleEmmiter3DExtension.ParticleSystem;", + "const TextureLoader = gdjs.__particleEmmiter3DExtension.TextureLoader;", + "const IntervalValue = gdjs.__particleEmmiter3DExtension.IntervalValue;", + "const ConstantValue = gdjs.__particleEmmiter3DExtension.ConstantValue;", + "const ConstantColor = gdjs.__particleEmmiter3DExtension.ConstantColor;", + "const ColorOverLife = gdjs.__particleEmmiter3DExtension.ColorOverLife;", + "const SizeOverLife = gdjs.__particleEmmiter3DExtension.SizeOverLife;", + "const ApplyForce = gdjs.__particleEmmiter3DExtension.ApplyForce;", + "const Gradient = gdjs.__particleEmmiter3DExtension.Gradient;", + "const PiecewiseBezier = gdjs.__particleEmmiter3DExtension.PiecewiseBezier;", + "const Bezier = gdjs.__particleEmmiter3DExtension.Bezier;", + "const PointEmitter = gdjs.__particleEmmiter3DExtension.PointEmitter;", + "const ConeEmitter = gdjs.__particleEmmiter3DExtension.ConeEmitter;", + "const RenderMode = gdjs.__particleEmmiter3DExtension.RenderMode;", + "", + "const { ParticleEmitterAdapter, ParticleEmitter3DRenderer } = gdjs.__particleEmmiter3DExtension;", + "", + "/** @type {gdjs.CustomRuntimeObject} */", + "const object = objects[0];", + "", + "// Here runtimeScene is the gdjs.CustomRuntimeObjectInstanceContainer inside the custom object.", + "const gameScene = object.getRuntimeScene();", + "", + "/** @type {SpriteObjectDataType} */", + "const particleSpriteData = object._instanceContainer._objects.get(\"Particle\");", + "const resourceName = particleSpriteData.animations[0].directions[0].sprites[0].image;", + "const texture = object", + " .getInstanceContainer()", + " .getGame()", + " .getImageManager().getThreeTexture(resourceName);", + "", + "// Set the blending here because changes are not applied after the emitter creation.", + "const blendingString = object._getBlending();", + "const blending =", + " blendingString === \"Additive\" ? THREE.AdditiveBlending :", + " blendingString === \"Normal\" ? THREE.NormalBlending :", + " blendingString === \"Subtractive\" ? THREE.SubtractiveBlending :", + " blendingString === \"Multiply\" ? THREE.MultiplyBlending :", + " blendingString === \"None\" ? THREE.NoBlending :", + " THREE.AdditiveBlending;", + "", + "", + "// Build a configuration with the right kind of objects.", + "// These values are not important as they are overrided by the object properties values.", + "const muzzle = {", + " duration: 10,", + " looping: false,", + " startLife: new IntervalValue(1, 2),", + " startSpeed: new IntervalValue(100, 200),", + " startSize: new IntervalValue(20, 50),", + " startColor: new ConstantColor(new THREE.Vector4(1, 1, 1, 1)),", + " worldSpace: true,", + "", + " maxParticle: 5,", + " emissionOverTime: new ConstantValue(50),", + " emissionBursts: [{", + " time: 0,", + " count: new ConstantValue(1),", + " cycle: 1,", + " interval: 0.01,", + " probability: 1,", + " }],", + "", + " shape: new PointEmitter(),", + " material: new THREE.MeshBasicMaterial({", + " map: texture,", + " blending: blending,", + " transparent: true,", + " side: THREE.DoubleSide", + " }),", + " startTileIndex: 0,", + " uTileCount: 1,", + " vTileCount: 1,", + " renderOrder: 2,", + " renderMode: RenderMode.BillBoard", + "};", + "const particleSystem = new ParticleSystem(muzzle);", + "", + "const colorOverLife = new ColorOverLife(", + " new Gradient(", + " [", + " [new THREE.Vector3(1, 0, 0), 0],", + " [new THREE.Vector3(1, 0, 0), 1],", + " ],", + " [", + " [1, 0],", + " [1, 1],", + " ]", + " ));", + "particleSystem.addBehavior(colorOverLife);", + "const sizeOverLife = new SizeOverLife(new PiecewiseBezier([[new Bezier(1, 2 / 3, 1 / 3, 0), 0]]));", + "particleSystem.addBehavior(sizeOverLife);", + "const applyForce = new ApplyForce(new THREE.Vector3(0, 0, -1), new ConstantValue(0));", + "particleSystem.addBehavior(applyForce);", + "", + "particleSystem.emitter.name = object.getName() + object.getNameId();", + "", + "object.__particleEmitterAdapter = new ParticleEmitterAdapter(particleSystem, colorOverLife, sizeOverLife, applyForce);", + "object.__particleSystem = particleSystem;", + "", + "// This is a hack that may break in future releases.", + "// Replace the group that would hold children objects by the emmiter.", + "const layer = gameScene.getLayer(object.getLayer());", + "const group = object.getRenderer()._threeGroup;", + "layer.getRenderer().remove3DRendererObject(group);", + "particleSystem.emitter.position.copy(group.position);", + "particleSystem.emitter.rotation.order = 'ZYX';", + "particleSystem.emitter.rotation.copy(group.rotation);", + "", + "const particleEmitter3DRenderer = new ParticleEmitter3DRenderer(object, object._instanceContainer, object.getInstanceContainer());", + "object._renderer = particleEmitter3DRenderer;", + "particleEmitter3DRenderer._threeGroup = particleSystem.emitter;", + "layer.getRenderer().add3DRendererObject(particleSystem.emitter);", + "", + "particleSystem.emitter.updateMatrixWorld(true);", + "", + "", + "// See doStepPostEvents", + "gameScene.__particleEmmiter3DExtension = gameScene.__particleEmmiter3DExtension || {};", + "gameScene.__particleEmmiter3DExtension.emittersCount = gameScene.__particleEmmiter3DExtension.emittersCount || 0;", + "gameScene.__particleEmmiter3DExtension.emittersCount++;", + "", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [], "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartOpacity" + "value": "ParticleEmitter3D::ParticleEmitter3D::UpdateFromProperties" }, "parameters": [ "Object", - "=", - "GetArgumentAsNumber(\"Value\")" + "" ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "const startOpacity = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setStartOpacity(startOpacity);" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the end opacity of the object.", - "fullName": "End opacity", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter color configuration", - "name": "EndOpacity", - "sentence": "the end opacity", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { "type": { - "value": "SetReturnNumber" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetRotationCenter" }, "parameters": [ - "Object.PropertyEndOpacity()" + "Object", + "0", + "0", + "0" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -12832,38 +11183,39 @@ }, { "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "EndOpacity", - "name": "SetEndOpacity", + "functionType": "Action", + "name": "onDestroy", "sentence": "", "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyEndOpacity" - }, - "parameters": [ - "Object", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ - "const object = objects[0];\r", - "const endOpacity = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setEndOpacity(endOpacity);" + "/** @type {gdjs.CustomRuntimeObject} */", + "const object = objects[0];", + "// Here runtimeScene is the gdjs.CustomRuntimeObjectInstanceContainer inside the custom object.", + "const gameScene = object.getRuntimeScene();", + "", + "object.__particleSystem.dispose();", + "", + "// See doStepPostEvents", + "gameScene.__particleEmmiter3DExtension.emittersCount--;", + "", + "if (gameScene.__particleEmmiter3DExtension.emittersCount === 0) {", + " // Update batch system now because doStepPostEvents won't be called.", + " gameScene.__particleEmmiter3DExtension.layerNames = gameScene.__particleEmmiter3DExtension.layerNames || [];", + " const layerNames = gameScene.__particleEmmiter3DExtension.layerNames;", + " gameScene.getAllLayerNames(layerNames);", + " for (const layerName of layerNames) {", + " const layer = gameScene.getLayer(layerName);", + " if (layer.__particleEmmiter3DExtension) {", + " layer.__particleEmmiter3DExtension.batchSystem.update(object.getElapsedTime() / 1000);", + " }", + " }", + "}" ], "parameterObjects": "Object", "useStrict": true, - "eventsSheetExpanded": false + "eventsSheetExpanded": true } ], "parameters": [ @@ -12877,12 +11229,10 @@ "objectGroups": [] }, { - "description": "the flow of particles of the object (particles per second).", - "fullName": "Flow of particles", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter configuration", - "name": "Flow", - "sentence": "the flow of particles", + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12890,18 +11240,16 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ParticleEmitter3D::ParticleEmitter3D::UpdateFromProperties" }, "parameters": [ - "Object.PropertyFlow()" + "Object", + "" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -12913,11 +11261,12 @@ "objectGroups": [] }, { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "Flow", - "name": "SetFlow", - "sentence": "", + "description": "Update from properties.", + "fullName": "Update from properties", + "functionType": "Action", + "name": "UpdateFromProperties", + "private": true, + "sentence": "Update from properties of _PARAM0_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -12925,231 +11274,299 @@ "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyFlow" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetZ" + }, + "parameters": [ + "Object", + "=", + "Object.Z()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetRotationX" + }, + "parameters": [ + "Object", + "=", + "Object.PropertyRotationX()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetRotationY" + }, + "parameters": [ + "Object", + "=", + "Object.PropertyRotationY()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartColor" + }, + "parameters": [ + "Object", + "=", + "Object.StartColor()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetEndColor" + }, + "parameters": [ + "Object", + "=", + "Object.EndColor()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.StartOpacity()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetEndOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.EndOpacity()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetFlow" + }, + "parameters": [ + "Object", + "=", + "Object.Flow()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartSizeMin" + }, + "parameters": [ + "Object", + "=", + "Object.StartSizeMin()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartSizeMax" + }, + "parameters": [ + "Object", + "=", + "Object.StartSizeMax()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetEndScale" + }, + "parameters": [ + "Object", + "=", + "Object.EndScale()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartSpeedMin" + }, + "parameters": [ + "Object", + "=", + "Object.StartSpeedMin()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetStartSpeedMax" }, "parameters": [ "Object", "=", - "GetArgumentAsNumber(\"Value\")" + "Object.StartSpeedMax()", + "" ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "const flow = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setFlow(flow);\r", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the start min size of the object.", - "fullName": "Start min size", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter configuration", - "name": "StartSizeMin", - "sentence": "the start min size", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { "type": { - "value": "SetReturnNumber" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetLifespanMin" }, "parameters": [ - "Object.PropertyStartSizeMin()" + "Object", + "=", + "Object.LifespanMin()", + "" ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "StartSizeMin", - "name": "SetStartSizeMin", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartSizeMin" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetLifespanMax" }, "parameters": [ "Object", "=", - "GetArgumentAsNumber(\"Value\")" + "Object.LifespanMax()", + "" ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "const startMinSize = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setStartMinSize(startMinSize);" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the start max size of the object.", - "fullName": "Start max size", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter configuration", - "name": "StartSizeMax", - "sentence": "the start max size", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { "type": { - "value": "SetReturnNumber" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetDuration" }, "parameters": [ - "Object.PropertyStartSizeMax()" + "Object", + "=", + "Object.Duration()", + "" ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "StartSizeMax", - "name": "SetStartSizeMax", - "sentence": "", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartSizeMax" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetSpayConeAngle" }, "parameters": [ "Object", "=", - "GetArgumentAsNumber(\"Value\")" + "Object.SpayConeAngle()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetGravity" + }, + "parameters": [ + "Object", + "=", + "Object.Gravity()", + "" + ] + }, + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetGravityTop" + }, + "parameters": [ + "Object", + "=", + "Object.GravityTop()", + "" ] } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "const startMaxSize = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setStartMaxSize(startMaxSize);\r", - "" ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the end scale of the object.", - "fullName": "End scale", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter configuration", - "name": "EndScale", - "sentence": "the end scale", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ParticleEmitter3D::ParticleEmitter3D::PropertyAreParticlesRelative" + }, + "parameters": [ + "Object" + ] + } + ], + "actions": [ + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetAreParticlesRelative" + }, + "parameters": [ + "Object", + "no", + "" + ] + } + ] + }, { - "type": { - "value": "SetReturnNumber" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::PropertyAreParticlesRelative" + }, + "parameters": [ + "Object" + ] + } + ], + "actions": [ + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetAreParticlesRelative" + }, + "parameters": [ + "Object", + "yes", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "Object.PropertyEndScale()" + "comment": "TODO: Blending can't be changed." + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetBlending" + }, + "parameters": [ + "Object", + "=", + "Object.Blending()", + "" + ] + } ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -13162,159 +11579,91 @@ }, { "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "EndScale", - "name": "SetEndScale", + "functionType": "Action", + "name": "doStepPostEvents", "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyEndScale" + "value": "ParticleEmitter3D::ParticleEmitter3D::HasEnded" }, "parameters": [ "Object", - "=", - "GetArgumentAsNumber(\"Value\")" + "" ] } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "const endScale = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setEndScale(endScale);\r", - "" ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the min start speed of the object.", - "fullName": "Min start speed", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter speed configuration", - "name": "StartSpeedMin", - "sentence": "the min start speed", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ParticleEmitter3D::ParticleEmitter3D::Delete" }, "parameters": [ - "Object.PropertyStartSpeedMin()" + "Object", + "" ] } ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "StartSpeedMin", - "name": "SetStartSpeedMin", - "sentence": "", - "events": [ + }, { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartSpeedMin" + "inverted": true, + "value": "ParticleEmitter3D::ParticleEmitter3D::HasEnded" }, "parameters": [ "Object", - "=", - "GetArgumentAsNumber(\"Value\")" + "" ] } - ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "const startSpeedMin = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setStartSpeedMin(startSpeedMin);" ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the max start speed of the object.", - "fullName": "Max start speed", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter speed configuration", - "name": "StartSpeedMax", - "sentence": "the max start speed", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ParticleEmitter3D::ParticleEmitter3D::RegisterInLayer" }, "parameters": [ - "Object.PropertyStartSpeedMax()" + "Object", + "" ] } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {gdjs.CustomRuntimeObject3D} */", + "const object = objects[0];", + "// Here runtimeScene is the gdjs.CustomRuntimeObjectInstanceContainer inside the custom object.", + "const gameScene = object.getRuntimeScene();", + "", + "// Update batch system after having moved every emitter.", + "// See onScenePreEvents", + "gameScene.__particleEmmiter3DExtension.emittersStepped++;", + "if (gameScene.__particleEmmiter3DExtension.emittersStepped === gameScene.__particleEmmiter3DExtension.emittersCount) {", + " gameScene.__particleEmmiter3DExtension.layerNames = gameScene.__particleEmmiter3DExtension.layerNames || [];", + " const layerNames = gameScene.__particleEmmiter3DExtension.layerNames;", + " gameScene.getAllLayerNames(layerNames);", + " for (const layerName of layerNames) {", + " const layer = gameScene.getLayer(layerName);", + " if (layer.__particleEmmiter3DExtension) {", + " layer.__particleEmmiter3DExtension.batchSystem.update(object.getElapsedTime() / 1000);", + " }", + " }", + "}" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -13326,39 +11675,40 @@ "objectGroups": [] }, { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "StartSpeedMax", - "name": "SetStartSpeedMax", - "sentence": "", + "fullName": "Register in layer", + "functionType": "Action", + "name": "RegisterInLayer", + "private": true, + "sentence": "Register _PARAM0_ in layer", "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartSpeedMax" - }, - "parameters": [ - "Object", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ - "const object = objects[0];\r", - "const startSpeedMax = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setStartSpeedMax(startSpeedMax);" + "/** @type {gdjs.CustomRuntimeObject} */", + "const object = objects[0];", + "", + "// TODO Handle layer changes?", + "if (object.__emitterLayerName === undefined) {", + " // Here runtimeScene is the gdjs.CustomRuntimeObjectInstanceContainer inside the custom object.", + " const gameScene = object.getRuntimeScene();", + "", + " const layer = gameScene.getLayer(object.getLayer());", + " layer.__particleEmmiter3DExtension = layer.__particleEmmiter3DExtension || {};", + " if (!layer.__particleEmmiter3DExtension.batchSystem) {", + " const batchSystem = new gdjs.__particleEmmiter3DExtension.BatchedRenderer();", + " const threeScene = layer.getRenderer().getThreeScene();", + " if (threeScene) {", + " threeScene.add(batchSystem);", + " }", + " layer.__particleEmmiter3DExtension.batchSystem = batchSystem;", + " }", + " layer.__particleEmmiter3DExtension.batchSystem.addSystem(object.__particleSystem);", + " object.__emitterLayerName = layer.getName();", + "}" ], "parameterObjects": "Object", "useStrict": true, - "eventsSheetExpanded": false + "eventsSheetExpanded": true } ], "parameters": [ @@ -13372,31 +11722,26 @@ "objectGroups": [] }, { - "description": "the min lifespan of the object.", - "fullName": "Min lifespan", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter configuration", - "name": "LifespanMin", - "sentence": "the min lifespan", + "description": "Delete itself", + "fullName": "Delete itself", + "functionType": "Action", + "name": "Delete", + "private": true, + "sentence": "Delete _PARAM0_", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.PropertyLifespanMin()" - ] - } - ] + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];", + "", + "object.deleteFromScene(object.getParent());", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -13408,78 +11753,28 @@ "objectGroups": [] }, { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "LifespanMin", - "name": "SetLifespanMin", - "sentence": "", + "description": "Check that emission has ended and no particle is alive anymore.", + "fullName": "Emission has ended", + "functionType": "Condition", + "name": "HasEnded", + "sentence": "Emission from _PARAM0_ has ended", "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyLifespanMin" - }, - "parameters": [ - "Object", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ "const object = objects[0];\r", - "const lifespanMin = eventsFunctionContext.getArgument(\"Value\");\r", "\r", - "object.__particleEmitterAdapter.setLifespanMin(lifespanMin);\r", + "eventsFunctionContext.returnValue =\r", + " object._getShouldAutodestruct()\r", + " && object.__particleSystem.emitEnded\r", + " && object.__particleSystem.particleNum === 0;\r", "" ], "parameterObjects": "Object", "useStrict": true, - "eventsSheetExpanded": false - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", - "type": "object" - } - ], - "objectGroups": [] - }, - { - "description": "the max lifespan of the object.", - "fullName": "Max lifespan", - "functionType": "ExpressionAndCondition", - "group": "3D particle emitter configuration", - "name": "LifespanMax", - "sentence": "the max lifespan", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.PropertyLifespanMax()" - ] - } - ] + "eventsSheetExpanded": true } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -13491,35 +11786,19 @@ "objectGroups": [] }, { - "fullName": "", - "functionType": "ActionWithOperator", - "getterName": "LifespanMax", - "name": "SetLifespanMax", - "sentence": "", + "description": "Restart particule emission from the beginning.", + "fullName": "Restart", + "functionType": "Action", + "name": "Restart", + "sentence": "Restart particule emission from _PARAM0_", "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyLifespanMax" - }, - "parameters": [ - "Object", - "=", - "GetArgumentAsNumber(\"Value\")" - ] - } - ] - }, { "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ + "/** @type {gdjs.CustomRuntimeObject} */\r", "const object = objects[0];\r", - "const lifespanMax = eventsFunctionContext.getArgument(\"Value\");\r", "\r", - "object.__particleEmitterAdapter.setLifespanMax(lifespanMax);\r", + "object.__particleSystem.restart();\r", "" ], "parameterObjects": "Object", @@ -13538,12 +11817,13 @@ "objectGroups": [] }, { - "description": "the emission duration of the object.", - "fullName": "Emission duration", + "description": "the Z position of the emitter.", + "fullName": "Z elevaltion (deprecated)", "functionType": "ExpressionAndCondition", - "group": "3D particle emitter configuration", - "name": "Duration", - "sentence": "the emission duration", + "group": "Position", + "name": "Z", + "private": true, + "sentence": "the Z position", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13554,7 +11834,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.PropertyDuration()" + "Object.PropertyZ()" ] } ] @@ -13576,8 +11856,9 @@ { "fullName": "", "functionType": "ActionWithOperator", - "getterName": "Duration", - "name": "SetDuration", + "getterName": "Z", + "name": "SetZ", + "private": true, "sentence": "", "events": [ { @@ -13586,7 +11867,7 @@ "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyDuration" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyZ" }, "parameters": [ "Object", @@ -13595,19 +11876,6 @@ ] } ] - }, - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];\r", - "const duration = eventsFunctionContext.getArgument(\"Value\");\r", - "\r", - "object.__particleEmitterAdapter.setDuration(duration);\r", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false } ], "parameters": [ @@ -13621,37 +11889,32 @@ "objectGroups": [] }, { - "description": "Check if particles move with the emitter.", - "fullName": "Particles move with the emitter", - "functionType": "Condition", - "group": "3D particle emitter speed configuration", - "name": "AreParticlesRelative", - "sentence": "_PARAM0_ particles move with the emitter", + "description": "the rotation on X axis of the emitter.", + "fullName": "Rotation on X axis (deprecated)", + "functionType": "ExpressionAndCondition", + "group": "Angle", + "name": "RotationX", + "private": true, + "sentence": "the rotation on X axis", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::PropertyAreParticlesRelative" - }, - "parameters": [ - "Object" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "SetReturnNumber" }, "parameters": [ - "True" + "Object.PropertyRotationX()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -13663,58 +11926,25 @@ "objectGroups": [] }, { - "description": "Change if particles move with the emitter.", - "fullName": "Particles move with the emitter", - "functionType": "Action", - "group": "3D particle emitter speed configuration", - "name": "SetAreParticlesRelative", - "sentence": "_PARAM0_ particles move with the emitter: _PARAM1_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Value\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyAreParticlesRelative" - }, - "parameters": [ - "Object", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Value\"" - ] - } - ], + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "RotationX", + "name": "SetRotationX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyAreParticlesRelative" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyRotationX" }, "parameters": [ "Object", - "yes" + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -13723,10 +11953,8 @@ "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ "const object = objects[0];\r", - "const areParticlesRelative = eventsFunctionContext.getArgument(\"Value\");\r", "\r", - "object.__particleEmitterAdapter.setParticlesRelative(areParticlesRelative);\r", - "" + "object.__particleSystem.emitter.rotation.x = eventsFunctionContext.getArgument(\"Value\") * Math.PI / 180;" ], "parameterObjects": "Object", "useStrict": true, @@ -13739,24 +11967,18 @@ "name": "Object", "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "defaultValue": "yes", - "description": "AreParticlesRelative", - "name": "Value", - "optional": true, - "type": "yesorno" } ], "objectGroups": [] }, { - "description": "the spay cone angle of the object.", - "fullName": "Spay cone angle", + "description": "the rotation on Y axis of the emitter.", + "fullName": "Rotation on Y axis (deprecated)", "functionType": "ExpressionAndCondition", - "group": "3D particle emitter configuration", - "name": "SpayConeAngle", - "sentence": "the spay cone angle", + "group": "Angle", + "name": "RotationY", + "private": true, + "sentence": "the rotation on Y axis", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13767,7 +11989,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.PropertySpayConeAngle()" + "Object.PropertyRotationY()" ] } ] @@ -13789,8 +12011,9 @@ { "fullName": "", "functionType": "ActionWithOperator", - "getterName": "SpayConeAngle", - "name": "SetSpayConeAngle", + "getterName": "RotationY", + "name": "SetRotationY", + "private": true, "sentence": "", "events": [ { @@ -13799,7 +12022,7 @@ "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertySpayConeAngle" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyRotationY" }, "parameters": [ "Object", @@ -13813,14 +12036,12 @@ "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ "const object = objects[0];\r", - "const sprayConeAngle = eventsFunctionContext.getArgument(\"Value\");\r", "\r", - "object.__particleEmitterAdapter.setSprayConeAngle(sprayConeAngle);\r", - "" + "object.__particleSystem.emitter.rotation.y = (90 + eventsFunctionContext.getArgument(\"Value\")) * Math.PI / 180;" ], "parameterObjects": "Object", "useStrict": true, - "eventsSheetExpanded": true + "eventsSheetExpanded": false } ], "parameters": [ @@ -13834,12 +12055,12 @@ "objectGroups": [] }, { - "description": "the blending of the object.", - "fullName": "Blending", + "description": "the start color of the object.", + "fullName": "Start color", "functionType": "ExpressionAndCondition", "group": "3D particle emitter color configuration", - "name": "Blending", - "sentence": "the blending", + "name": "StartColor", + "sentence": "the start color", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13850,15 +12071,14 @@ "value": "SetReturnString" }, "parameters": [ - "Object.PropertyBlending()" + "Object.PropertyStartColor()" ] } ] } ], "expressionType": { - "supplementaryInformation": "[\"Normal\",\"Additive\",\"Substractive\",\"Multiply\",\"None\"]", - "type": "stringWithSelector" + "type": "color" }, "parameters": [ { @@ -13873,9 +12093,8 @@ { "fullName": "", "functionType": "ActionWithOperator", - "getterName": "Blending", - "name": "SetBlending", - "private": true, + "getterName": "StartColor", + "name": "SetStartColor", "sentence": "", "events": [ { @@ -13884,7 +12103,7 @@ "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyBlending" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartColor" }, "parameters": [ "Object", @@ -13898,14 +12117,13 @@ "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ "const object = objects[0];\r", - "const blending = eventsFunctionContext.getArgument(\"Value\");\r", + "const startColor = eventsFunctionContext.getArgument(\"Value\");\r", "\r", - "object.__particleEmitterAdapter.setBlending(blending);\r", - "" + "object.__particleEmitterAdapter.setStartColor(startColor);" ], "parameterObjects": "Object", "useStrict": true, - "eventsSheetExpanded": true + "eventsSheetExpanded": false } ], "parameters": [ @@ -13919,12 +12137,12 @@ "objectGroups": [] }, { - "description": "the gravity top of the object.", - "fullName": "Gravity top", + "description": "the end color of the object.", + "fullName": "End color", "functionType": "ExpressionAndCondition", - "group": "3D particle emitter speed configuration", - "name": "GravityTop", - "sentence": "the gravity top", + "group": "3D particle emitter color configuration", + "name": "EndColor", + "sentence": "the end color", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -13935,15 +12153,14 @@ "value": "SetReturnString" }, "parameters": [ - "Object.PropertyGravityTop()" + "Object.PropertyEndColor()" ] } ] } ], "expressionType": { - "supplementaryInformation": "[\"Y-\",\"Z+\"]", - "type": "stringWithSelector" + "type": "color" }, "parameters": [ { @@ -13958,8 +12175,8 @@ { "fullName": "", "functionType": "ActionWithOperator", - "getterName": "GravityTop", - "name": "SetGravityTop", + "getterName": "EndColor", + "name": "SetEndColor", "sentence": "", "events": [ { @@ -13968,7 +12185,7 @@ "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyGravityTop" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyEndColor" }, "parameters": [ "Object", @@ -13982,14 +12199,13 @@ "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ "const object = objects[0];\r", - "const gravityTop = eventsFunctionContext.getArgument(\"Value\");\r", + "const endColor = eventsFunctionContext.getArgument(\"Value\");\r", "\r", - "object.__particleEmitterAdapter.setGravityTop(gravityTop);\r", - "" + "object.__particleEmitterAdapter.setEndColor(endColor);" ], "parameterObjects": "Object", "useStrict": true, - "eventsSheetExpanded": true + "eventsSheetExpanded": false } ], "parameters": [ @@ -14003,12 +12219,12 @@ "objectGroups": [] }, { - "description": "the gravity of the object.", - "fullName": "Gravity", + "description": "the start opacity of the object.", + "fullName": "Start opacity", "functionType": "ExpressionAndCondition", - "group": "3D particle emitter speed configuration", - "name": "Gravity", - "sentence": "the gravity", + "group": "3D particle emitter color configuration", + "name": "StartOpacity", + "sentence": "the start opacity", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -14019,7 +12235,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.PropertyGravity()" + "Object.PropertyStartOpacity()" ] } ] @@ -14041,8 +12257,8 @@ { "fullName": "", "functionType": "ActionWithOperator", - "getterName": "Gravity", - "name": "SetGravity", + "getterName": "StartOpacity", + "name": "SetStartOpacity", "sentence": "", "events": [ { @@ -14051,7 +12267,7 @@ "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyGravity" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartOpacity" }, "parameters": [ "Object", @@ -14065,14 +12281,13 @@ "type": "BuiltinCommonInstructions::JsCode", "inlineCode": [ "const object = objects[0];\r", - "const gravity = eventsFunctionContext.getArgument(\"Value\");\r", + "const startOpacity = eventsFunctionContext.getArgument(\"Value\");\r", "\r", - "object.__particleEmitterAdapter.setGravity(gravity);\r", - "" + "object.__particleEmitterAdapter.setStartOpacity(startOpacity);" ], "parameterObjects": "Object", "useStrict": true, - "eventsSheetExpanded": true + "eventsSheetExpanded": false } ], "parameters": [ @@ -14086,37 +12301,31 @@ "objectGroups": [] }, { - "description": "Check if delete when emission ends.", - "fullName": "Delete when emission ends", - "functionType": "Condition", - "group": "3D particle emitter configuration", - "name": "ShouldAutodestruct", - "sentence": "_PARAM0_ delete when emission ends", + "description": "the end opacity of the object.", + "fullName": "End opacity", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter color configuration", + "name": "EndOpacity", + "sentence": "the end opacity", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::PropertyShouldAutodestruct" - }, - "parameters": [ - "Object" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "SetReturnNumber" }, "parameters": [ - "True" + "Object.PropertyEndOpacity()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -14128,61 +12337,122 @@ "objectGroups": [] }, { - "description": "Change if delete when emission ends.", - "fullName": "Delete when emission ends", - "functionType": "Action", - "group": "3D particle emitter configuration", - "name": "SetShouldAutodestruct", - "sentence": "_PARAM0_ delete when emission ends: _PARAM1_", + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "EndOpacity", + "name": "SetEndOpacity", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"Value\"" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyShouldAutodestruct" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyEndOpacity" }, "parameters": [ "Object", - "no" + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const endOpacity = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setEndOpacity(endOpacity);" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the flow of particles of the object (particles per second).", + "fullName": "Flow of particles", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter configuration", + "name": "Flow", + "sentence": "the flow of particles", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "GetArgumentAsBoolean" + "value": "SetReturnNumber" }, "parameters": [ - "\"Value\"" + "Object.PropertyFlow()" ] } - ], + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Flow", + "name": "SetFlow", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], "actions": [ { "type": { - "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyShouldAutodestruct" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyFlow" }, "parameters": [ "Object", - "yes" + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const flow = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setFlow(flow);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false } ], "parameters": [ @@ -14191,806 +12461,698 @@ "name": "Object", "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "defaultValue": "yes", - "description": "ShouldAutodestruct", - "name": "Value", - "optional": true, - "type": "yesorno" } ], "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "255;0;0", - "type": "Color", - "label": "Start color", - "description": "", - "group": "Color", - "extraInformation": [], - "name": "StartColor" - }, - { - "value": "255;255;0", - "type": "Color", - "label": "End color", - "description": "", - "group": "Color", - "extraInformation": [], - "name": "EndColor" - }, - { - "value": "255", - "type": "Number", - "unit": "Dimensionless", - "label": "Start opacity", - "description": "", - "group": "Color", - "extraInformation": [], - "name": "StartOpacity" - }, - { - "value": "0", - "type": "Number", - "unit": "Dimensionless", - "label": "End opacity", - "description": "", - "group": "Color", - "extraInformation": [], - "name": "EndOpacity" - }, - { - "value": "50", - "type": "Number", - "label": "Flow of particles (particles per second)", - "description": "", - "group": "", - "extraInformation": [], - "name": "Flow" - }, - { - "value": "10", - "type": "Number", - "unit": "Pixel", - "label": "Start min size", - "description": "", - "group": "Size", - "extraInformation": [], - "name": "StartSizeMin" - }, - { - "value": "20", - "type": "Number", - "unit": "Pixel", - "label": "Start max size", - "description": "", - "group": "Size", - "extraInformation": [], - "name": "StartSizeMax" - }, - { - "value": "0", - "type": "Number", - "unit": "Dimensionless", - "label": "End scale", - "description": "", - "group": "Size", - "extraInformation": [], - "name": "EndScale" - }, - { - "value": "100", - "type": "Number", - "unit": "PixelSpeed", - "label": "Start min speed", - "description": "", - "group": "Speed", - "extraInformation": [], - "name": "StartSpeedMin" - }, - { - "value": "100", - "type": "Number", - "unit": "PixelSpeed", - "label": "Start max speed", - "description": "", - "group": "Speed", - "extraInformation": [], - "name": "StartSpeedMax" - }, - { - "value": "1", - "type": "Number", - "unit": "Second", - "label": "Min lifespan", - "description": "", - "group": "", - "extraInformation": [], - "name": "LifespanMin" - }, - { - "value": "2", - "type": "Number", - "unit": "Second", - "label": "Max lifespan", - "description": "", - "group": "", - "extraInformation": [], - "name": "LifespanMax" - }, - { - "value": "5", - "type": "Number", - "unit": "Second", - "label": "Emission duration", - "description": "", - "group": "", - "extraInformation": [], - "name": "Duration" - }, - { - "value": "", - "type": "Boolean", - "label": "Particles move with the emitter", - "description": "", - "group": "Speed", - "extraInformation": [], - "name": "AreParticlesRelative" }, { - "value": "30", - "type": "Number", - "unit": "DegreeAngle", - "label": "Spay cone angle", - "description": "", - "group": "Position", - "extraInformation": [], - "name": "SpayConeAngle" - }, - { - "value": "Additive", - "type": "Choice", - "label": "Blending", - "description": "", - "group": "Color", - "extraInformation": [ - "Normal", - "Additive", - "Subtractive", - "Multiply", - "None" - ], - "name": "Blending" - }, - { - "value": "Y-", - "type": "Choice", - "label": "Gravity top", - "description": "", - "group": "Speed", - "extraInformation": [ - "Y-", - "Z+" + "description": "the start min size of the object.", + "fullName": "Start min size", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter configuration", + "name": "StartSizeMin", + "sentence": "the start min size", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.PropertyStartSizeMin()" + ] + } + ] + } ], - "name": "GravityTop" - }, - { - "value": "0", - "type": "Number", - "unit": "PixelAcceleration", - "label": "Gravity", - "description": "", - "group": "Speed", - "extraInformation": [], - "name": "Gravity" - }, - { - "value": "true", - "type": "Boolean", - "label": "Delete when emission ends", - "description": "", - "group": "", - "extraInformation": [], - "name": "ShouldAutodestruct" - }, - { - "value": "Center-center", - "type": "String", - "label": "", - "description": "Only used by the scene editor.", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "ParentOrigin" - }, - { - "value": "0", - "type": "Number", - "unit": "Pixel", - "label": "Z (elevation)", - "description": "", - "group": "Position", - "extraInformation": [], - "name": "Z" + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] }, { - "value": "0", - "type": "Number", - "unit": "DegreeAngle", - "label": "Rotation on X axis", - "description": "", - "group": "Position", - "extraInformation": [], - "name": "RotationX" + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "StartSizeMin", + "name": "SetStartSizeMin", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartSizeMin" + }, + "parameters": [ + "Object", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const startMinSize = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setStartMinSize(startMinSize);" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] }, { - "value": "0", - "type": "Number", - "unit": "DegreeAngle", - "label": "Rotation on Y axis", - "description": "", - "group": "Position", - "extraInformation": [], - "name": "RotationY" - } - ], - "objects": [ - { - "adaptCollisionMaskAutomatically": true, - "assetStoreId": "", - "name": "Particle", - "type": "Sprite", - "updateIfNotVisible": false, - "variables": [], - "effects": [], - "behaviors": [], - "animations": [ + "description": "the start max size of the object.", + "fullName": "Start max size", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter configuration", + "name": "StartSizeMax", + "sentence": "the start max size", + "events": [ { - "name": "Image", - "useMultipleDirections": false, - "directions": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "looping": false, - "timeBetweenFrames": 0.08, - "sprites": [] + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.PropertyStartSizeMax()" + ] } ] } - ] - } - ], - "objectsFolderStructure": { - "folderName": "__ROOT", - "children": [ - { - "objectName": "Particle" - } - ] - } - } - ] - }, - { - "author": "Tristan Rhodes (tristan@victrisgames.com), Entropy", - "category": "Movement", - "extensionNamespace": "", - "fullName": "Screen wrap", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLW1vbml0b3Itc2NyZWVuc2hvdCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik05LDZINVYxMEg3VjhIOU0xOSwxMEgxN1YxMkgxNVYxNEgxOU0yMSwxNkgzVjRIMjFNMjEsMkgzQzEuODksMiAxLDIuODkgMSw0VjE2QTIsMiAwIDAsMCAzLDE4SDEwVjIwSDhWMjJIMTZWMjBIMTRWMThIMjFBMiwyIDAgMCwwIDIzLDE2VjRDMjMsMi44OSAyMi4xLDIgMjEsMiIgLz48L3N2Zz4=", - "name": "ScreenWrap", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/monitor-screenshot.svg", - "shortDescription": "Teleport object when it moves off the screen and immediately appear on the opposite side while maintaining speed and trajectory.", - "version": "0.2.4", - "description": [ - "The teleport happens when the center point of the object crosses a border (this can be adjusted with an offset).", - "By default, the borders of the wrapping area match the screen size, but they can alo be changed.", - "", - "The Asteroid-like example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://space-asteroid))." - ], - "origin": { - "identifier": "ScreenWrap", - "name": "gdevelop-extension-store" - }, - "tags": [ - "screen", - "wrap", - "teleport", - "asteroids" - ], - "authorIds": [ - "q8ubdigLvIRXLxsJDDTaokO41mc2", - "gqDaZjCfevOOxBYkK6zlhtZnXCg1", - "1OgYzWp5UeVPbiWGJwI6vqfgZLC3" - ], - "dependencies": [], - "eventsFunctions": [], - "eventsBasedBehaviors": [ - { - "description": "Teleport the object when leaving one side of the screen so that it immediately reappears on the opposite side, maintaining speed and trajectory.", - "fullName": "Screen Wrap", - "name": "ScreenWrap", - "objectType": "", - "eventsFunctions": [ + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, { "fullName": "", - "functionType": "Action", - "name": "onCreated", + "functionType": "ActionWithOperator", + "getterName": "StartSizeMax", + "name": "SetStartSizeMax", "sentence": "", "events": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Initialize variables (if needed)", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrap::PropertyBorderBottom" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrap::SetBottomBorder" - }, - "parameters": [ - "Object", - "Behavior", - "SceneWindowHeight()", - "" - ] - } + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartSizeMax" + }, + "parameters": [ + "Object", + "=", + "GetArgumentAsNumber(\"Value\")" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const startMaxSize = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setStartMaxSize(startMaxSize);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the end scale of the object.", + "fullName": "End scale", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter configuration", + "name": "EndScale", + "sentence": "the end scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrap::PropertyBorderRight" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "0" - ] - } - ], - "actions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrap::SetRightBorder" - }, - "parameters": [ - "Object", - "Behavior", - "SceneWindowWidth()", - "" - ] - } + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.PropertyEndScale()" ] } - ], - "parameters": [] + ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" } ], "objectGroups": [] }, { "fullName": "", - "functionType": "Action", - "name": "doStepPostEvents", + "functionType": "ActionWithOperator", + "getterName": "EndScale", + "name": "SetEndScale", "sentence": "", "events": [ { - "colorB": 5, - "colorG": 117, - "colorR": 65, - "creationTime": 0, - "name": "ScreenWrap", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Move object to opposite side (if needed)", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [], - "parameters": [] - }, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrap::PropertyHorizontalWrapping" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "PosX" - }, - "parameters": [ - "Object", - "<", - "Object.Behavior::PropertyBorderLeft() - (Object.Width()/2) - Object.Behavior::PropertyTriggerOffset()" - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyBorderRight() - (Object.Width()/2) + Object.Behavior::PropertyTriggerOffset()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "PosX" - }, - "parameters": [ - "Object", - ">", - "Object.Behavior::PropertyBorderRight() - (Object.Width()/2) + Object.Behavior::PropertyTriggerOffset()" - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreX" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyBorderLeft() - (Object.Width()/2) - Object.Behavior::PropertyTriggerOffset()" - ] - } - ] - } + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyEndScale" + }, + "parameters": [ + "Object", + "=", + "GetArgumentAsNumber(\"Value\")" ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrap::PropertyVerticalWrapping" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "PosY" - }, - "parameters": [ - "Object", - "<", - "Object.Behavior::PropertyBorderTop() - (Object.Height()/2) - Object.Behavior::PropertyTriggerOffset()" - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyBorderBottom() - (Object.Height()/2) + Object.Behavior::PropertyTriggerOffset()" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "PosY" - }, - "parameters": [ - "Object", - ">", - "Object.Behavior::PropertyBorderBottom() - (Object.Height()/2) + Object.Behavior::PropertyTriggerOffset()" - ] - } - ], - "actions": [ - { - "type": { - "value": "MettreY" - }, - "parameters": [ - "Object", - "=", - "Object.Behavior::PropertyBorderTop() - (Object.Height()/2) - Object.Behavior::PropertyTriggerOffset()" - ] - } - ] - } + } + ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const endScale = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setEndScale(endScale);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the min start speed of the object.", + "fullName": "Min start speed", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter speed configuration", + "name": "StartSpeedMin", + "sentence": "the min start speed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.PropertyStartSpeedMin()" ] } - ], - "parameters": [] + ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" } ], "objectGroups": [] }, { - "description": "Check if the object is wrapping on the left and right borders.", - "fullName": "Is horizontal wrapping", - "functionType": "Condition", - "name": "IsHorizontalWrapping", - "sentence": "_PARAM0_ is horizontal wrapping", + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "StartSpeedMin", + "name": "SetStartSpeedMin", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "inverted": true, - "value": "ScreenWrap::ScreenWrap::PropertyHorizontalWrapping" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartSpeedMin" }, "parameters": [ "Object", - "Behavior" + "=", + "GetArgumentAsNumber(\"Value\")" ] } + ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const startSpeedMin = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setStartSpeedMin(startSpeedMin);" ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the max start speed of the object.", + "fullName": "Max start speed", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter speed configuration", + "name": "StartSpeedMax", + "sentence": "the max start speed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "SetReturnNumber" }, "parameters": [ - "" + "Object.PropertyStartSpeedMax()" ] } ] - }, + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "StartSpeedMax", + "name": "SetStartSpeedMax", + "sentence": "", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::PropertyHorizontalWrapping" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyStartSpeedMax" }, "parameters": [ "Object", - "Behavior" + "=", + "GetArgumentAsNumber(\"Value\")" ] } + ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const startSpeedMax = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setStartSpeedMax(startSpeedMax);" ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the min lifespan of the object.", + "fullName": "Min lifespan", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter configuration", + "name": "LifespanMin", + "sentence": "the min lifespan", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "SetReturnNumber" }, "parameters": [ - "True" + "Object.PropertyLifespanMin()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" } ], "objectGroups": [] }, { - "description": "Check if the object is wrapping on the top and bottom borders.", - "fullName": "Is vertical wrapping", - "functionType": "Condition", - "name": "IsVerticalWrapping", - "sentence": "_PARAM0_ is vertical wrapping", + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "LifespanMin", + "name": "SetLifespanMin", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "ScreenWrap::ScreenWrap::PropertyVerticalWrapping" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyLifespanMin" }, "parameters": [ - "" + "Object", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const lifespanMin = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setLifespanMin(lifespanMin);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the max lifespan of the object.", + "fullName": "Max lifespan", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter configuration", + "name": "LifespanMax", + "sentence": "the max lifespan", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::PropertyVerticalWrapping" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior" + "Object.PropertyLifespanMax()" ] } - ], + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "LifespanMax", + "name": "SetLifespanMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyLifespanMax" }, "parameters": [ - "True" + "Object", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const lifespanMax = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setLifespanMax(lifespanMax);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false } ], "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" } ], "objectGroups": [] }, { - "description": "Enable wrapping on the left and right borders.", - "fullName": "Enable horizontal wrapping", - "functionType": "Action", - "name": "EnableHorizontalWrapping", - "sentence": "Enable _PARAM0_ horizontal wrapping: _PARAM2_", + "description": "the emission duration of the object.", + "fullName": "Emission duration", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter configuration", + "name": "Duration", + "sentence": "the emission duration", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "conditions": [], + "actions": [ { "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" + "value": "SetReturnNumber" }, "parameters": [ - "\"EnableHorizontalWrapping\"" + "Object.PropertyDuration()" ] } - ], + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Duration", + "name": "SetDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::SetPropertyHorizontalWrapping" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyDuration" }, "parameters": [ "Object", - "Behavior", - "no" + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const duration = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setDuration(duration);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if particles move with the emitter.", + "fullName": "Particles move with the emitter", + "functionType": "Condition", + "group": "3D particle emitter speed configuration", + "name": "AreParticlesRelative", + "sentence": "_PARAM0_ particles move with the emitter", + "events": [ { "type": "BuiltinCommonInstructions::Standard", "conditions": [ { "type": { - "value": "GetArgumentAsBoolean" + "value": "ParticleEmitter3D::ParticleEmitter3D::PropertyAreParticlesRelative" }, "parameters": [ - "\"EnableHorizontalWrapping\"" + "Object" ] } ], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::SetPropertyHorizontalWrapping" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "yes" + "True" ] } ] @@ -15000,28 +13162,19 @@ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" - }, - { - "description": "Value", - "name": "EnableHorizontalWrapping", - "type": "yesorno" } ], "objectGroups": [] }, { - "description": "Enable wrapping on the top and bottom borders.", - "fullName": "Enable vertical wrapping", + "description": "Change if particles move with the emitter.", + "fullName": "Particles move with the emitter", "functionType": "Action", - "name": "EnableVerticalWrapping", - "sentence": "Enable _PARAM0_ vertical wrapping: _PARAM2_", + "group": "3D particle emitter speed configuration", + "name": "SetAreParticlesRelative", + "sentence": "_PARAM0_ particles move with the emitter: _PARAM1_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -15032,18 +13185,17 @@ "value": "GetArgumentAsBoolean" }, "parameters": [ - "\"EnableVerticalWrapping\"" + "\"Value\"" ] } ], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::SetPropertyVerticalWrapping" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyAreParticlesRelative" }, "parameters": [ "Object", - "Behavior", "no" ] } @@ -15057,50 +13209,60 @@ "value": "GetArgumentAsBoolean" }, "parameters": [ - "\"EnableVerticalWrapping\"" + "\"Value\"" ] } ], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::SetPropertyVerticalWrapping" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyAreParticlesRelative" }, "parameters": [ "Object", - "Behavior", "yes" ] } ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const areParticlesRelative = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setParticlesRelative(areParticlesRelative);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false } ], "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" - }, - { - "description": "Value", - "name": "EnableVerticalWrapping", + "defaultValue": "yes", + "description": "AreParticlesRelative", + "name": "Value", + "optional": true, "type": "yesorno" } ], "objectGroups": [] }, { - "description": "Top border (Y position).", - "fullName": "Top border", - "functionType": "Expression", - "name": "BorderTop", - "sentence": "", + "description": "the spay cone angle of the object.", + "fullName": "Spay cone angle", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter configuration", + "name": "SpayConeAngle", + "sentence": "the spay cone angle", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -15111,7 +13273,7 @@ "value": "SetReturnNumber" }, "parameters": [ - "Object.Behavior::PropertyBorderTop()" + "Object.PropertySpayConeAngle()" ] } ] @@ -15124,22 +13286,17 @@ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" } ], "objectGroups": [] }, { - "description": "Left border (X position).", - "fullName": "Left border", - "functionType": "Expression", - "name": "BorderLeft", + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "SpayConeAngle", + "name": "SetSpayConeAngle", "sentence": "", "events": [ { @@ -15148,39 +13305,47 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertySpayConeAngle" }, "parameters": [ - "Object.Behavior::PropertyBorderLeft()" + "Object", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const sprayConeAngle = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setSprayConeAngle(sprayConeAngle);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" } ], "objectGroups": [] }, { - "description": "Right border (X position).", - "fullName": "Right border", - "functionType": "Expression", - "name": "BorderRight", - "sentence": "", + "description": "the blending of the object.", + "fullName": "Blending", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter color configuration", + "name": "Blending", + "sentence": "the blending", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -15188,38 +13353,35 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "SetReturnString" }, "parameters": [ - "Object.Behavior::PropertyBorderRight()" + "Object.PropertyBlending()" ] } ] } ], "expressionType": { - "type": "expression" + "supplementaryInformation": "[\"Normal\",\"Additive\",\"Substractive\",\"Multiply\",\"None\"]", + "type": "stringWithSelector" }, "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" } ], "objectGroups": [] }, { - "description": "Bottom border (Y position).", - "fullName": "Bottom border", - "functionType": "Expression", - "name": "BorderBottom", + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Blending", + "name": "SetBlending", + "private": true, "sentence": "", "events": [ { @@ -15228,39 +13390,47 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyBlending" }, "parameters": [ - "Object.Behavior::PropertyBorderBottom()" + "Object", + "=", + "GetArgumentAsString(\"Value\")" ] } ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const blending = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setBlending(blending);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" } ], "objectGroups": [] }, { - "description": "Number of pixels past the center where the object teleports and appears.", - "fullName": "Trigger offset", - "functionType": "Expression", - "name": "TriggerOffset", - "sentence": "", + "description": "the gravity top of the object.", + "fullName": "Gravity top", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter speed configuration", + "name": "GravityTop", + "sentence": "the gravity top", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -15268,39 +13438,35 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "SetReturnString" }, "parameters": [ - "Object.Behavior::PropertyTriggerOffset()" + "Object.PropertyGravityTop()" ] } ] } ], "expressionType": { - "type": "expression" + "supplementaryInformation": "[\"Y-\",\"Z+\"]", + "type": "stringWithSelector" }, "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" } ], "objectGroups": [] }, { - "description": "Set top border (Y position).", - "fullName": "Set top border", - "functionType": "Action", - "name": "SetTopBorder", - "sentence": "Set _PARAM0_ top border to _PARAM2_", + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "GravityTop", + "name": "SetGravityTop", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -15308,44 +13474,47 @@ "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::SetPropertyBorderTop" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyGravityTop" }, "parameters": [ "Object", - "Behavior", "=", - "GetArgumentAsNumber(\"Value\")" + "GetArgumentAsString(\"Value\")" ] } ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const gravityTop = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setGravityTop(gravityTop);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true } ], "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" - }, - { - "description": "Top border value", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Set left border (X position).", - "fullName": "Set left border", - "functionType": "Action", - "name": "SetLeftBorder", - "sentence": "Set _PARAM0_ left border to _PARAM2_", + "description": "the gravity of the object.", + "fullName": "Gravity", + "functionType": "ExpressionAndCondition", + "group": "3D particle emitter speed configuration", + "name": "Gravity", + "sentence": "the gravity", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -15353,44 +13522,34 @@ "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::SetPropertyBorderLeft" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "Object.PropertyGravity()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" - }, - { - "description": "Left border value", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Set bottom border (Y position).", - "fullName": "Set bottom border", - "functionType": "Action", - "name": "SetBottomBorder", - "sentence": "Set _PARAM0_ bottom border to _PARAM2_", + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Gravity", + "name": "SetGravity", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -15398,58 +13557,67 @@ "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::SetPropertyBorderBottom" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyGravity" }, "parameters": [ "Object", - "Behavior", "=", "GetArgumentAsNumber(\"Value\")" ] } ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];\r", + "const gravity = eventsFunctionContext.getArgument(\"Value\");\r", + "\r", + "object.__particleEmitterAdapter.setGravity(gravity);\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true } ], "parameters": [ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" - }, - { - "description": "Bottom border value", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Set right border (X position).", - "fullName": "Set right border", - "functionType": "Action", - "name": "SetRightBorder", - "sentence": "Set _PARAM0_ right border to _PARAM2_", + "description": "Check if delete when emission ends.", + "fullName": "Delete when emission ends", + "functionType": "Condition", + "group": "3D particle emitter configuration", + "name": "ShouldAutodestruct", + "sentence": "_PARAM0_ delete when emission ends", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::PropertyShouldAutodestruct" + }, + "parameters": [ + "Object" + ] + } + ], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::SetPropertyBorderRight" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "True" ] } ] @@ -15459,42 +13627,65 @@ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" - }, - { - "description": "Right border value", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Set trigger offset (pixels).", - "fullName": "Set trigger offset", + "description": "Change if delete when emission ends.", + "fullName": "Delete when emission ends", "functionType": "Action", - "name": "SetTriggerOffset", - "sentence": "Set _PARAM0_ trigger offset to _PARAM2_ pixels", + "group": "3D particle emitter configuration", + "name": "SetShouldAutodestruct", + "sentence": "_PARAM0_ delete when emission ends: _PARAM1_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyShouldAutodestruct" + }, + "parameters": [ + "Object", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrap::SetPropertyTriggerOffset" + "value": "ParticleEmitter3D::ParticleEmitter3D::SetPropertyShouldAutodestruct" }, "parameters": [ "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "yes" ] } ] @@ -15504,18 +13695,15 @@ { "description": "Object", "name": "Object", + "supplementaryInformation": "ParticleEmitter3D::ParticleEmitter3D", "type": "object" }, { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrap", - "type": "behavior" - }, - { - "description": "SetScreen Offset Leaving Value", + "defaultValue": "yes", + "description": "ShouldAutodestruct", "name": "Value", - "type": "expression" + "optional": true, + "type": "yesorno" } ], "objectGroups": [] @@ -15523,80 +13711,350 @@ ], "propertyDescriptors": [ { - "value": "true", - "type": "Boolean", - "label": "Horizontal wrapping", + "value": "255;0;0", + "type": "Color", + "label": "Start color", "description": "", - "group": "", + "group": "Color", "extraInformation": [], - "name": "HorizontalWrapping" + "name": "StartColor" }, { - "value": "true", - "type": "Boolean", - "label": "Vertical wrapping", + "value": "255;255;0", + "type": "Color", + "label": "End color", "description": "", - "group": "", + "group": "Color", "extraInformation": [], - "name": "VerticalWrapping" + "name": "EndColor" + }, + { + "value": "255", + "type": "Number", + "unit": "Dimensionless", + "label": "Start opacity", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "StartOpacity" }, { "value": "0", "type": "Number", - "unit": "Pixel", - "label": "Top border of wrapped area (Y)", + "unit": "Dimensionless", + "label": "End opacity", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "EndOpacity" + }, + { + "value": "50", + "type": "Number", + "label": "Flow of particles (particles per second)", "description": "", "group": "", "extraInformation": [], - "name": "BorderTop" + "name": "Flow" }, { - "value": "0", + "value": "10", "type": "Number", "unit": "Pixel", - "label": "Left border of wrapped area (X)", + "label": "Start min size", "description": "", - "group": "", + "group": "Size", "extraInformation": [], - "name": "BorderLeft" + "name": "StartSizeMin" }, { - "value": "0", + "value": "20", "type": "Number", "unit": "Pixel", - "label": "Right border of wrapped area (X)", - "description": "If blank, the value will be the scene width.", + "label": "Start max size", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "StartSizeMax" + }, + { + "value": "0", + "type": "Number", + "unit": "Dimensionless", + "label": "End scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "EndScale" + }, + { + "value": "100", + "type": "Number", + "unit": "PixelSpeed", + "label": "Start min speed", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "StartSpeedMin" + }, + { + "value": "100", + "type": "Number", + "unit": "PixelSpeed", + "label": "Start max speed", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "StartSpeedMax" + }, + { + "value": "1", + "type": "Number", + "unit": "Second", + "label": "Min lifespan", + "description": "", "group": "", "extraInformation": [], - "name": "BorderRight" + "name": "LifespanMin" + }, + { + "value": "2", + "type": "Number", + "unit": "Second", + "label": "Max lifespan", + "description": "", + "group": "", + "extraInformation": [], + "name": "LifespanMax" + }, + { + "value": "5", + "type": "Number", + "unit": "Second", + "label": "Emission duration", + "description": "", + "group": "", + "extraInformation": [], + "name": "Duration" + }, + { + "value": "", + "type": "Boolean", + "label": "Particles move with the emitter", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "AreParticlesRelative" + }, + { + "value": "30", + "type": "Number", + "unit": "DegreeAngle", + "label": "Spay cone angle", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "SpayConeAngle" + }, + { + "value": "Additive", + "type": "Choice", + "label": "Blending", + "description": "", + "group": "Color", + "extraInformation": [ + "Normal", + "Additive", + "Subtractive", + "Multiply", + "None" + ], + "name": "Blending" + }, + { + "value": "Y-", + "type": "Choice", + "label": "Gravity top", + "description": "", + "group": "Speed", + "extraInformation": [ + "Y-", + "Z+" + ], + "name": "GravityTop" }, { "value": "0", "type": "Number", - "unit": "Pixel", - "label": "Bottom border of wrapped area (Y)", - "description": "If blank, the value will be scene height.", + "unit": "PixelAcceleration", + "label": "Gravity", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "Gravity" + }, + { + "value": "true", + "type": "Boolean", + "label": "Delete when emission ends", + "description": "", "group": "", "extraInformation": [], - "name": "BorderBottom" + "name": "ShouldAutodestruct" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ParentOrigin" }, { "value": "0", "type": "Number", "unit": "Pixel", - "label": "Number of pixels past the center where the object teleports and appears", + "label": "Z (elevation)", + "description": "Deprecated", + "group": "Position", + "extraInformation": [], + "hidden": true, + "name": "Z" + }, + { + "value": "0", + "type": "Number", + "unit": "DegreeAngle", + "label": "Rotation on X axis", "description": "", - "group": "", + "group": "Position", "extraInformation": [], - "name": "TriggerOffset" + "hidden": true, + "name": "RotationX" + }, + { + "value": "0", + "type": "Number", + "unit": "DegreeAngle", + "label": "Rotation on Y axis", + "description": "", + "group": "Position", + "extraInformation": [], + "hidden": true, + "name": "RotationY" + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Particle", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Image", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] } ], - "sharedPropertyDescriptors": [] - }, + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Particle" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [] + } + ] + }, + { + "author": "Tristan Rhodes (tristan@victrisgames.com), Entropy", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Screen wrap", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLW1vbml0b3Itc2NyZWVuc2hvdCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik05LDZINVYxMEg3VjhIOU0xOSwxMEgxN1YxMkgxNVYxNEgxOU0yMSwxNkgzVjRIMjFNMjEsMkgzQzEuODksMiAxLDIuODkgMSw0VjE2QTIsMiAwIDAsMCAzLDE4SDEwVjIwSDhWMjJIMTZWMjBIMTRWMThIMjFBMiwyIDAgMCwwIDIzLDE2VjRDMjMsMi44OSAyMi4xLDIgMjEsMiIgLz48L3N2Zz4=", + "name": "ScreenWrap", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/monitor-screenshot.svg", + "shortDescription": "Teleport object when it moves off the screen and immediately appear on the opposite side while maintaining speed and trajectory.", + "version": "0.2.4", + "description": [ + "The teleport happens when the center point of the object crosses a border (this can be adjusted with an offset).", + "By default, the borders of the wrapping area match the screen size, but they can alo be changed.", + "", + "The Asteroid-like example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://space-asteroid))." + ], + "origin": { + "identifier": "ScreenWrap", + "name": "gdevelop-extension-store" + }, + "tags": [ + "screen", + "wrap", + "teleport", + "asteroids" + ], + "authorIds": [ + "q8ubdigLvIRXLxsJDDTaokO41mc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "1OgYzWp5UeVPbiWGJwI6vqfgZLC3" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ { "description": "Teleport the object when leaving one side of the screen so that it immediately reappears on the opposite side, maintaining speed and trajectory.", - "fullName": "Screen Wrap (physics objects)", - "name": "ScreenWrapPhysics", + "fullName": "Screen Wrap", + "name": "ScreenWrap", "objectType": "", "eventsFunctions": [ { @@ -15619,7 +14077,7 @@ "conditions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::PropertyBorderBottom" + "value": "ScreenWrap::ScreenWrap::PropertyBorderBottom" }, "parameters": [ "Object", @@ -15632,7 +14090,7 @@ "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetBottomBorder" + "value": "ScreenWrap::ScreenWrap::SetBottomBorder" }, "parameters": [ "Object", @@ -15648,7 +14106,7 @@ "conditions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::PropertyBorderRight" + "value": "ScreenWrap::ScreenWrap::PropertyBorderRight" }, "parameters": [ "Object", @@ -15661,7 +14119,7 @@ "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetRightBorder" + "value": "ScreenWrap::ScreenWrap::SetRightBorder" }, "parameters": [ "Object", @@ -15685,7 +14143,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "supplementaryInformation": "ScreenWrap::ScreenWrap", "type": "behavior" } ], @@ -15694,7 +14152,7 @@ { "fullName": "", "functionType": "Action", - "name": "doStepPreEvents", + "name": "doStepPostEvents", "sentence": "", "events": [ { @@ -15722,29 +14180,16 @@ "conditions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::IsHorizontalWrapping" + "value": "ScreenWrap::ScreenWrap::PropertyHorizontalWrapping" }, "parameters": [ "Object", - "Behavior", - "" + "Behavior" ] } ], "actions": [], "events": [ - { - "type": "BuiltinCommonInstructions::Comment", - "color": { - "b": 109, - "g": 230, - "r": 255, - "textB": 0, - "textG": 0, - "textR": 0 - }, - "comment": "Velocity is saved because Physics2 resets objects velocities when they are moved from the outside of the extension." - }, { "type": "BuiltinCommonInstructions::Standard", "conditions": [ @@ -15760,16 +14205,6 @@ } ], "actions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, { "type": { "value": "MettreX" @@ -15779,16 +14214,6 @@ "=", "Object.Behavior::PropertyBorderRight() - (Object.Width()/2) + Object.Behavior::PropertyTriggerOffset()" ] - }, - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] } ] }, @@ -15807,16 +14232,6 @@ } ], "actions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, { "type": { "value": "MettreX" @@ -15826,16 +14241,6 @@ "=", "Object.Behavior::PropertyBorderLeft() - (Object.Width()/2) - Object.Behavior::PropertyTriggerOffset()" ] - }, - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] } ] } @@ -15846,12 +14251,11 @@ "conditions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::IsVerticalWrapping" + "value": "ScreenWrap::ScreenWrap::PropertyVerticalWrapping" }, "parameters": [ "Object", - "Behavior", - "" + "Behavior" ] } ], @@ -15872,16 +14276,6 @@ } ], "actions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, { "type": { "value": "MettreY" @@ -15891,16 +14285,6 @@ "=", "Object.Behavior::PropertyBorderBottom() - (Object.Height()/2) + Object.Behavior::PropertyTriggerOffset()" ] - }, - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] } ] }, @@ -15919,16 +14303,6 @@ } ], "actions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] - }, { "type": { "value": "MettreY" @@ -15938,23 +14312,85 @@ "=", "Object.Behavior::PropertyBorderTop() - (Object.Height()/2) - Object.Behavior::PropertyTriggerOffset()" ] - }, - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" - }, - "parameters": [ - "Object", - "Behavior", - "" - ] } ] } ] } - ], - "parameters": [] + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is wrapping on the left and right borders.", + "fullName": "Is horizontal wrapping", + "functionType": "Condition", + "name": "IsHorizontalWrapping", + "sentence": "_PARAM0_ is horizontal wrapping", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ScreenWrap::ScreenWrap::PropertyHorizontalWrapping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::PropertyHorizontalWrapping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] } ], "parameters": [ @@ -15966,18 +14402,18 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "supplementaryInformation": "ScreenWrap::ScreenWrap", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Check if the object is wrapping on the left and right borders.", - "fullName": "Is horizontal wrapping", + "description": "Check if the object is wrapping on the top and bottom borders.", + "fullName": "Is vertical wrapping", "functionType": "Condition", - "name": "IsHorizontalWrapping", - "sentence": "_PARAM0_ is horizontal wrapping", + "name": "IsVerticalWrapping", + "sentence": "_PARAM0_ is vertical wrapping", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -15985,7 +14421,7 @@ { "type": { "inverted": true, - "value": "ScreenWrap::ScreenWrapPhysics::PropertyHorizontalWrapping" + "value": "ScreenWrap::ScreenWrap::PropertyVerticalWrapping" }, "parameters": [ "Object", @@ -16009,7 +14445,7 @@ "conditions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::PropertyHorizontalWrapping" + "value": "ScreenWrap::ScreenWrap::PropertyVerticalWrapping" }, "parameters": [ "Object", @@ -16023,12 +14459,250 @@ "value": "SetReturnBoolean" }, "parameters": [ - "True" + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable wrapping on the left and right borders.", + "fullName": "Enable horizontal wrapping", + "functionType": "Action", + "name": "EnableHorizontalWrapping", + "sentence": "Enable _PARAM0_ horizontal wrapping: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableHorizontalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyHorizontalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableHorizontalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyHorizontalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Value", + "name": "EnableHorizontalWrapping", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable wrapping on the top and bottom borders.", + "fullName": "Enable vertical wrapping", + "functionType": "Action", + "name": "EnableVerticalWrapping", + "sentence": "Enable _PARAM0_ vertical wrapping: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableVerticalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyVerticalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableVerticalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyVerticalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Value", + "name": "EnableVerticalWrapping", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Top border (Y position).", + "fullName": "Top border", + "functionType": "Expression", + "name": "BorderTop", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderTop()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Left border (X position).", + "fullName": "Left border", + "functionType": "Expression", + "name": "BorderLeft", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderLeft()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -16038,69 +14712,77 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "supplementaryInformation": "ScreenWrap::ScreenWrap", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Check if the object is wrapping on the top and bottom borders.", - "fullName": "Is vertical wrapping", - "functionType": "Condition", - "name": "IsVerticalWrapping", - "sentence": "_PARAM0_ is vertical wrapping", + "description": "Right border (X position).", + "fullName": "Right border", + "functionType": "Expression", + "name": "BorderRight", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "ScreenWrap::ScreenWrapPhysics::PropertyVerticalWrapping" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "SetReturnNumber" }, "parameters": [ - "" + "Object.Behavior::PropertyBorderRight()" ] } ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Bottom border (Y position).", + "fullName": "Bottom border", + "functionType": "Expression", + "name": "BorderBottom", + "sentence": "", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::PropertyVerticalWrapping" - }, - "parameters": [ - "Object", - "Behavior" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "SetReturnBoolean" + "value": "SetReturnNumber" }, "parameters": [ - "True" + "Object.Behavior::PropertyBorderBottom()" ] } ] } ], + "expressionType": { + "type": "expression" + }, "parameters": [ { "description": "Object", @@ -16110,66 +14792,72 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "supplementaryInformation": "ScreenWrap::ScreenWrap", "type": "behavior" } ], "objectGroups": [] }, { - "description": "Enable wrapping on the left and right borders.", - "fullName": "Enable horizontal wrapping", - "functionType": "Action", - "name": "EnableHorizontalWrapping", - "sentence": "Enable _PARAM0_ horizontal wrapping: _PARAM2_", + "description": "Number of pixels past the center where the object teleports and appears.", + "fullName": "Trigger offset", + "functionType": "Expression", + "name": "TriggerOffset", + "sentence": "", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"EnableHorizontalWrapping\"" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyHorizontalWrapping" + "value": "SetReturnNumber" }, "parameters": [ - "Object", - "Behavior", - "no" + "Object.Behavior::PropertyTriggerOffset()" ] } ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Set top border (Y position).", + "fullName": "Set top border", + "functionType": "Action", + "name": "SetTopBorder", + "sentence": "Set _PARAM0_ top border to _PARAM2_", + "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"EnableHorizontalWrapping\"" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyHorizontalWrapping" + "value": "ScreenWrap::ScreenWrap::SetPropertyBorderTop" }, "parameters": [ "Object", "Behavior", - "yes" + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -16184,71 +14872,37 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "supplementaryInformation": "ScreenWrap::ScreenWrap", "type": "behavior" }, { - "description": "Value", - "name": "EnableHorizontalWrapping", - "type": "yesorno" + "description": "Top border value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Enable wrapping on the top and bottom borders.", - "fullName": "Enable vertical wrapping", + "description": "Set left border (X position).", + "fullName": "Set left border", "functionType": "Action", - "name": "EnableVerticalWrapping", - "sentence": "Enable _PARAM0_ vertical wrapping: _PARAM2_", + "name": "SetLeftBorder", + "sentence": "Set _PARAM0_ left border to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "inverted": true, - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"EnableVerticalWrapping\"" - ] - } - ], - "actions": [ - { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyVerticalWrapping" - }, - "parameters": [ - "Object", - "Behavior", - "no" - ] - } - ] - }, - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "GetArgumentAsBoolean" - }, - "parameters": [ - "\"EnableVerticalWrapping\"" - ] - } - ], + "conditions": [], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyVerticalWrapping" + "value": "ScreenWrap::ScreenWrap::SetPropertyBorderLeft" }, "parameters": [ "Object", "Behavior", - "yes" + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] @@ -16263,23 +14917,23 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "supplementaryInformation": "ScreenWrap::ScreenWrap", "type": "behavior" }, { - "description": "Value", - "name": "EnableVerticalWrapping", - "type": "yesorno" + "description": "Left border value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Top border (Y position).", - "fullName": "Top border", - "functionType": "Expression", - "name": "BorderTop", - "sentence": "", + "description": "Set bottom border (Y position).", + "fullName": "Set bottom border", + "functionType": "Action", + "name": "SetBottomBorder", + "sentence": "Set _PARAM0_ bottom border to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -16287,18 +14941,18 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ScreenWrap::ScreenWrap::SetPropertyBorderBottom" }, "parameters": [ - "Object.Behavior::PropertyBorderTop()" + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -16308,18 +14962,23 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "supplementaryInformation": "ScreenWrap::ScreenWrap", "type": "behavior" + }, + { + "description": "Bottom border value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Left border (X position).", - "fullName": "Left border", - "functionType": "Expression", - "name": "BorderLeft", - "sentence": "", + "description": "Set right border (X position).", + "fullName": "Set right border", + "functionType": "Action", + "name": "SetRightBorder", + "sentence": "Set _PARAM0_ right border to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -16327,18 +14986,18 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ScreenWrap::ScreenWrap::SetPropertyBorderRight" }, "parameters": [ - "Object.Behavior::PropertyBorderLeft()" + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -16348,18 +15007,23 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "supplementaryInformation": "ScreenWrap::ScreenWrap", "type": "behavior" + }, + { + "description": "Right border value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Right border (X position).", - "fullName": "Right border", - "functionType": "Expression", - "name": "BorderRight", - "sentence": "", + "description": "Set trigger offset (pixels).", + "fullName": "Set trigger offset", + "functionType": "Action", + "name": "SetTriggerOffset", + "sentence": "Set _PARAM0_ trigger offset to _PARAM2_ pixels", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -16367,18 +15031,18 @@ "actions": [ { "type": { - "value": "SetReturnNumber" + "value": "ScreenWrap::ScreenWrap::SetPropertyTriggerOffset" }, "parameters": [ - "Object.Behavior::PropertyBorderRight()" + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -16388,37 +15052,173 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "supplementaryInformation": "ScreenWrap::ScreenWrap", "type": "behavior" + }, + { + "description": "SetScreen Offset Leaving Value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "Horizontal wrapping", + "description": "", + "group": "", + "extraInformation": [], + "name": "HorizontalWrapping" }, { - "description": "Bottom border (Y position).", - "fullName": "Bottom border", - "functionType": "Expression", - "name": "BorderBottom", + "value": "true", + "type": "Boolean", + "label": "Vertical wrapping", + "description": "", + "group": "", + "extraInformation": [], + "name": "VerticalWrapping" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Top border of wrapped area (Y)", + "description": "", + "group": "", + "extraInformation": [], + "name": "BorderTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Left border of wrapped area (X)", + "description": "", + "group": "", + "extraInformation": [], + "name": "BorderLeft" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Right border of wrapped area (X)", + "description": "If blank, the value will be the scene width.", + "group": "", + "extraInformation": [], + "name": "BorderRight" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Bottom border of wrapped area (Y)", + "description": "If blank, the value will be scene height.", + "group": "", + "extraInformation": [], + "name": "BorderBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Number of pixels past the center where the object teleports and appears", + "description": "", + "group": "", + "extraInformation": [], + "name": "TriggerOffset" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Teleport the object when leaving one side of the screen so that it immediately reappears on the opposite side, maintaining speed and trajectory.", + "fullName": "Screen Wrap (physics objects)", + "name": "ScreenWrapPhysics", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize variables (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyBorderBottom()" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::PropertyBorderBottom" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetBottomBorder" + }, + "parameters": [ + "Object", + "Behavior", + "SceneWindowHeight()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::PropertyBorderRight" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetRightBorder" + }, + "parameters": [ + "Object", + "Behavior", + "SceneWindowWidth()", + "" + ] + } ] } - ] + ], + "parameters": [] } ], - "expressionType": { - "type": "expression" - }, "parameters": [ { "description": "Object", @@ -16435,68 +15235,269 @@ "objectGroups": [] }, { - "description": "Number of pixels past the center where the object teleports and appears.", - "fullName": "Trigger offset", - "functionType": "Expression", - "name": "TriggerOffset", + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", "sentence": "", "events": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "colorB": 5, + "colorG": 117, + "colorR": 65, + "creationTime": 0, + "name": "ScreenWrap", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ { - "type": { - "value": "SetReturnNumber" - }, - "parameters": [ - "Object.Behavior::PropertyTriggerOffset()" + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object to opposite side (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::IsHorizontalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Velocity is saved because Physics2 resets objects velocities when they are moved from the outside of the extension." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + "<", + "Object.Behavior::PropertyBorderLeft() - (Object.Width()/2) - Object.Behavior::PropertyTriggerOffset()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyBorderRight() - (Object.Width()/2) + Object.Behavior::PropertyTriggerOffset()" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + ">", + "Object.Behavior::PropertyBorderRight() - (Object.Width()/2) + Object.Behavior::PropertyTriggerOffset()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyBorderLeft() - (Object.Width()/2) - Object.Behavior::PropertyTriggerOffset()" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } ] - } - ] - } - ], - "expressionType": { - "type": "expression" - }, - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", - "type": "behavior" - } - ], - "objectGroups": [] - }, - { - "description": "Set top border (Y position).", - "fullName": "Set top border", - "functionType": "Action", - "name": "SetTopBorder", - "sentence": "Set _PARAM0_ top border to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + }, { - "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyBorderTop" - }, - "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::IsVerticalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + "<", + "Object.Behavior::PropertyBorderTop() - (Object.Height()/2) - Object.Behavior::PropertyTriggerOffset()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyBorderBottom() - (Object.Height()/2) + Object.Behavior::PropertyTriggerOffset()" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + ">", + "Object.Behavior::PropertyBorderBottom() - (Object.Height()/2) + Object.Behavior::PropertyTriggerOffset()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyBorderTop() - (Object.Height()/2) - Object.Behavior::PropertyTriggerOffset()" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } ] } - ] + ], + "parameters": [] } ], "parameters": [ @@ -16510,170 +15511,62 @@ "name": "Behavior", "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", "type": "behavior" - }, - { - "description": "Top border value", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Set left border (X position).", - "fullName": "Set left border", - "functionType": "Action", - "name": "SetLeftBorder", - "sentence": "Set _PARAM0_ left border to _PARAM2_", + "description": "Check if the object is wrapping on the left and right borders.", + "fullName": "Is horizontal wrapping", + "functionType": "Condition", + "name": "IsHorizontalWrapping", + "sentence": "_PARAM0_ is horizontal wrapping", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyBorderLeft" + "inverted": true, + "value": "ScreenWrap::ScreenWrapPhysics::PropertyHorizontalWrapping" }, "parameters": [ "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "Behavior" ] } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", - "type": "behavior" - }, - { - "description": "Left border value", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Set bottom border (Y position).", - "fullName": "Set bottom border", - "functionType": "Action", - "name": "SetBottomBorder", - "sentence": "Set _PARAM0_ bottom border to _PARAM2_", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + ], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyBorderBottom" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "" ] } ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", - "type": "behavior" }, - { - "description": "Bottom border value", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Set right border (X position).", - "fullName": "Set right border", - "functionType": "Action", - "name": "SetRightBorder", - "sentence": "Set _PARAM0_ right border to _PARAM2_", - "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyBorderRight" + "value": "ScreenWrap::ScreenWrapPhysics::PropertyHorizontalWrapping" }, "parameters": [ "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "Behavior" ] } - ] - } - ], - "parameters": [ - { - "description": "Object", - "name": "Object", - "type": "object" - }, - { - "description": "Behavior", - "name": "Behavior", - "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", - "type": "behavior" - }, - { - "description": "Right border value", - "name": "Value", - "type": "expression" - } - ], - "objectGroups": [] - }, - { - "description": "Set trigger offset (pixels).", - "fullName": "Set trigger offset", - "functionType": "Action", - "name": "SetTriggerOffset", - "sentence": "Set _PARAM0_ trigger offset to _PARAM2_ pixels", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + ], "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyTriggerOffset" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "=", - "GetArgumentAsNumber(\"Value\")" + "True" ] } ] @@ -16690,57 +15583,62 @@ "name": "Behavior", "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", "type": "behavior" - }, - { - "description": "SetScreen Offset Leaving Value", - "name": "Value", - "type": "expression" } ], "objectGroups": [] }, { - "description": "Save current velocity values.", - "fullName": "Save current velocity values", - "functionType": "Action", - "name": "SaveCurrentVelocities", - "sentence": "Save current velocity values of _PARAM0_", + "description": "Check if the object is wrapping on the top and bottom borders.", + "fullName": "Is vertical wrapping", + "functionType": "Condition", + "name": "IsVerticalWrapping", + "sentence": "_PARAM0_ is vertical wrapping", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], - "actions": [ + "conditions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyAngularVelocity" + "inverted": true, + "value": "ScreenWrap::ScreenWrapPhysics::PropertyVerticalWrapping" }, "parameters": [ "Object", - "Behavior", - "=", - "Object.RequiredPhysicsBehavior::AngularVelocity()" + "Behavior" ] - }, + } + ], + "actions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyLinearVelocityX" + "value": "SetReturnBoolean" }, "parameters": [ - "Object", - "Behavior", - "=", - "Object.RequiredPhysicsBehavior::LinearVelocityX()" + "" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyLinearVelocityY" + "value": "ScreenWrap::ScreenWrapPhysics::PropertyVerticalWrapping" }, "parameters": [ "Object", - "Behavior", - "=", - "Object.RequiredPhysicsBehavior::LinearVelocityY()" + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" ] } ] @@ -16762,47 +15660,59 @@ "objectGroups": [] }, { - "description": "Apply saved velocity values.", - "fullName": "Apply saved velocity values", + "description": "Enable wrapping on the left and right borders.", + "fullName": "Enable horizontal wrapping", "functionType": "Action", - "name": "ApplySavedVelocities", - "sentence": "Apply saved velocity values of _PARAM0_", + "name": "EnableHorizontalWrapping", + "sentence": "Enable _PARAM0_ horizontal wrapping: _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", - "conditions": [], + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableHorizontalWrapping\"" + ] + } + ], "actions": [ { "type": { - "value": "Physics2::AngularVelocity" + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyHorizontalWrapping" }, "parameters": [ "Object", - "RequiredPhysicsBehavior", - "=", - "Object.Behavior::PropertyAngularVelocity()" + "Behavior", + "no" ] - }, + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { "type": { - "value": "Physics2::LinearVelocityX" + "value": "GetArgumentAsBoolean" }, "parameters": [ - "Object", - "RequiredPhysicsBehavior", - "=", - "Object.Behavior::PropertyLinearVelocityX()" + "\"EnableHorizontalWrapping\"" ] - }, + } + ], + "actions": [ { "type": { - "value": "Physics2::LinearVelocityY" + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyHorizontalWrapping" }, "parameters": [ "Object", - "RequiredPhysicsBehavior", - "=", - "Object.Behavior::PropertyLinearVelocityY()" + "Behavior", + "yes" ] } ] @@ -16819,474 +15729,300 @@ "name": "Behavior", "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", "type": "behavior" + }, + { + "description": "Value", + "name": "EnableHorizontalWrapping", + "type": "yesorno" } ], "objectGroups": [] - } - ], - "propertyDescriptors": [ - { - "value": "", - "type": "Behavior", - "label": "Physics Behavior", - "description": "", - "group": "", - "extraInformation": [ - "Physics2::Physics2Behavior" - ], - "name": "RequiredPhysicsBehavior" - }, - { - "value": "true", - "type": "Boolean", - "label": "Horizontal wrapping", - "description": "", - "group": "", - "extraInformation": [], - "name": "HorizontalWrapping" - }, - { - "value": "true", - "type": "Boolean", - "label": "Vertical wrapping", - "description": "", - "group": "", - "extraInformation": [], - "name": "VerticalWrapping" - }, - { - "value": "0", - "type": "Number", - "unit": "Pixel", - "label": "Top border of wrapped area (Y)", - "description": "", - "group": "", - "extraInformation": [], - "name": "BorderTop" - }, - { - "value": "0", - "type": "Number", - "unit": "Pixel", - "label": "Left border of wrapped area (X)", - "description": "", - "group": "", - "extraInformation": [], - "name": "BorderLeft" - }, - { - "value": "0", - "type": "Number", - "unit": "Pixel", - "label": "Right border of wrapped area (X)", - "description": "If blank, the value will be the scene width.", - "group": "", - "extraInformation": [], - "name": "BorderRight" - }, - { - "value": "0", - "type": "Number", - "unit": "Pixel", - "label": "Bottom border of wrapped area (Y)", - "description": "If blank, the value will be scene height.", - "group": "", - "extraInformation": [], - "name": "BorderBottom" - }, - { - "value": "0", - "type": "Number", - "unit": "Pixel", - "label": "Number of pixels past the center where the object teleports and appears", - "description": "", - "group": "", - "extraInformation": [], - "name": "TriggerOffset" - }, - { - "value": "0", - "type": "Number", - "label": "Angular Velocity", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "AngularVelocity" - }, - { - "value": "0", - "type": "Number", - "label": "Linear Velocity X", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "LinearVelocityX" }, { - "value": "0", - "type": "Number", - "label": "Linear Velocity Y", - "description": "", - "group": "", - "extraInformation": [], - "hidden": true, - "name": "LinearVelocityY" - } - ], - "sharedPropertyDescriptors": [] - } - ], - "eventsBasedObjects": [] - }, - { - "author": "D8H", - "category": "Movement", - "extensionNamespace": "", - "fullName": "Stick objects to others", - "helpPath": "", - "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXN0aWNrZXItb3V0bGluZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik01LjUgMkMzLjYgMiAyIDMuNiAyIDUuNVYxOC41QzIgMjAuNCAzLjYgMjIgNS41IDIySDE2TDIyIDE2VjUuNUMyMiAzLjYgMjAuNCAyIDE4LjUgMkg1LjVNNS44IDRIMTguM0MxOS4zIDQgMjAuMSA0LjggMjAuMSA1LjhWMTVIMTguNkMxNi43IDE1IDE1LjEgMTYuNiAxNS4xIDE4LjVWMjBINS44QzQuOCAyMCA0IDE5LjIgNCAxOC4yVjUuOEM0IDQuOCA0LjggNCA1LjggNCIgLz48L3N2Zz4=", - "name": "Sticker", - "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/sticker-outline.svg", - "shortDescription": "Make objects follow the position and rotation of the object they are stuck to.", - "version": "0.5.0", - "description": [ - "This extension can be useful to:", - "* Stick accessories to moving objects", - "* Animate a skeleton", - "* Delete an object with another one", - "", - "An example allows to check it out ([open the project online](https://editor.gdevelop.io/?project=example://stick-objects))." - ], - "origin": { - "identifier": "Sticker", - "name": "gdevelop-extension-store" - }, - "tags": [ - "sticker", - "stick", - "follow", - "skeleton", - "joint", - "pin", - "bind", - "glue", - "tie", - "attach", - "hold", - "paste", - "wear" - ], - "authorIds": [ - "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" - ], - "dependencies": [], - "eventsFunctions": [ - { - "description": "Define helper classes JavaScript code.", - "fullName": "Define helper classes", - "functionType": "Action", - "name": "DefineHelperClasses", - "private": true, - "sentence": "Define helper classes JavaScript code", - "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "if (gdjs._stickerExtension) {", - " return;", - "}", - "", - "// Unstick from deleted objects.", - "gdjs.registerObjectDeletedFromSceneCallback(function (runtimeScene, deletedObject) {", - " const extension = runtimeScene._stickerExtension;", - " if (!extension) {", - " return;", - " }", - " const allStickers = runtimeScene._stickerExtension.allStickers;", - " for (const behavior of allStickers) {", - " const sticker = behavior._sticker;", - " if (sticker.isStuckTo(deletedObject)) {", - " if (behavior._getIsDestroyedWithParent()) {", - " behavior.owner.deleteFromScene(runtimeScene);", - " }", - " sticker.unstick();", - " }", - " }", - "});", - "", - "class Sticker {", - " /** @type {gdjs.RuntimeBehavior} */", - " behavior;", - " /** @type {gdjs.RuntimeObject | null} */", - " basisObject;", - " followingDoneThisFrame = false;", - " relativeX = 0;", - " relativeY = 0;", - " relativeAngle = 0;", - " relativeRotatedX = 0;", - " relativeRotatedY = 0;", - " basisOldX = 0;", - " basisOldY = 0;", - " basisOldAngle = 0;", - " basisOldWidth = 0;", - " basisOldHeight = 0;", - " basisOldCenterXInScene = 0;", - " basisOldCenterYInScene = 0;", - "", - " /**", - " * @param {gdjs.RuntimeBehavior} behavior", - " */", - " constructor(behavior) {", - " this.behavior = behavior;", - " }", - "", - " /**", - " * @param {gdjs.RuntimeObject} basisObject", - " */", - " isStuckTo(basisObject) {", - " return this.basisObject === basisObject;", - " }", - "", - " /**", - " * @param {gdjs.RuntimeObject} basisObject", - " */", - " stickTo(basisObject) {", - " this.basisObject = basisObject;", - " this.updateOldCoordinates();", - " this.updateRelativeCoordinates();", - " }", - "", - " unstick() {", - " this.basisObject = null;", - " }", - "", - " onStepPreEvents() {", - " this.followingDoneThisFrame = false;", - " }", - "", - " /**", - " * Update the coordinates in the basisObject basis.", - " * ", - " * It uses the basisObject coordinates from the previous frame.", - " * This way, the sticker can move relatively to it and still", - " * follow basisObject.", - " * ", - " * @param {gdjs.RuntimeObject} basisObject", - " */", - " updateRelativeCoordinates() {", - " const object = this.behavior.owner;", - "", - " // Update relative coordinates", - " this.relativeX = object.getX() - this.basisOldX;", - " this.relativeY = object.getY() - this.basisOldY;", - " if (!this.behavior._getOnlyFollowPosition()) {", - " this.relativeAngle = object.getAngle() - this.basisOldAngle;", - " this.relativeWidth = object.getWidth() / this.basisOldWidth;", - " this.relativeHeight = object.getHeight() / this.basisOldHeight;", - " const deltaX = object.getCenterXInScene() - this.basisOldCenterXInScene;", - " const deltaY = object.getCenterYInScene() - this.basisOldCenterYInScene;", - " const angle = this.basisOldAngle * Math.PI / 180;", - " this.relativeRotatedX = (deltaX * Math.cos(angle) + deltaY * Math.sin(angle)) / this.basisOldWidth;", - " this.relativeRotatedY = (-deltaX * Math.sin(angle) + deltaY * Math.cos(angle)) / this.basisOldHeight;", - "", - " // Save initial values to avoid calculus and rounding errors", - " this.basisOriginalWidth = this.basisObject.getWidth();", - " this.basisOriginalHeight = this.basisObject.getHeight();", - " this.basisOriginalAngle = this.basisObject.getAngle();", - " }", - " }", - "", - " /**", - " * Copy the coordinates to use it the next frame.", - " */", - " updateOldCoordinates() {", - " const object = this.behavior.owner;", - "", - " this.ownerOldX = object.getX();", - " this.ownerOldY = object.getY();", - "", - " this.basisOldX = this.basisObject.getX();", - " this.basisOldY = this.basisObject.getY();", - "", - " if (!this.behavior._getOnlyFollowPosition()) {", - " this.ownerOldAngle = object.getAngle();", - " this.ownerOldWidth = object.getWidth();", - " this.ownerOldHeight = object.getHeight();", - "", - " this.basisOldAngle = this.basisObject.getAngle();", - " this.basisOldWidth = this.basisObject.getWidth();", - " this.basisOldHeight = this.basisObject.getHeight();", - " this.basisOldCenterXInScene = this.basisObject.getCenterXInScene();", - " this.basisOldCenterYInScene = this.basisObject.getCenterYInScene();", - " }", - " }", - "", - " /**", - " * Follow the basisObject (called in doStepPostEvents).", - " * ", - " * This method is also called by children to ensure", - " * parents are updated first.", - " */", - " followBasisObject() {", - " if (this.followingDoneThisFrame) {", - " return;", - " }", - " this.followingDoneThisFrame = true;", - " const basisObject = this.basisObject;", - " if (basisObject) {", - " // If the behavior on the basis object has a different name,", - " // the objects will still follow their basis objects", - " // but frame delays could happen.", - " const behaviorName = this.behavior.getName();", - " if (basisObject.hasBehavior(behaviorName)) {", - " const basisBehavior = basisObject.getBehavior(behaviorName);", - " if (basisBehavior.type === this.behavior.type) {", - " // Follow parents 1st to avoid frame delays", - " basisBehavior._sticker.followBasisObject();", - " }", - " }", - "", - " const object = this.behavior.owner;", - "", - " if (this.behavior._getOnlyFollowPosition()) {", - " if (object.getX() !== this.ownerOldX", - " || object.getY() !== this.ownerOldY) {", - " this.updateRelativeCoordinates();", - " }", - "", - " if (this.basisOldX !== basisObject.getX() ||", - " this.basisOldY !== basisObject.getY()) {", - " object.setPosition(", - " basisObject.getX() + this.relativeX,", - " basisObject.getY() + this.relativeY);", - " }", - " } else {", - " if (object.getX() !== this.ownerOldX", - " || object.getY() !== this.ownerOldY", - " || object.getAngle() !== this.ownerOldAngle", - " || object.getWidth() !== this.ownerOldWidth", - " || object.getHeight() !== this.ownerOldHeight) {", - " this.updateRelativeCoordinates();", - " }", - "", - " // Follow basisObject", - " if (basisObject.getAngle() === this.basisOriginalAngle && this.basisOriginalAngle === 0) {", - " if (basisObject.getWidth() === this.basisOriginalWidth ||", - " basisObject.getHeight() === this.basisOriginalHeight) {", - " if (this.basisOldX !== basisObject.getX() ||", - " this.basisOldY !== basisObject.getY()) {", - " object.setPosition(", - " basisObject.getX() + this.relativeX,", - " basisObject.getY() + this.relativeY);", - " }", - " } else {", - " object.setPosition(", - " basisObject.getX() + this.relativeRotatedX * basisObject.getWidth(),", - " basisObject.getY() + this.relativeRotatedY * basisObject.getHeight());", - " }", - " } else {", - " object.setAngle(basisObject.getAngle() + this.relativeAngle);", - "", - " const deltaX = this.relativeRotatedX * basisObject.getWidth();", - " const deltaY = this.relativeRotatedY * basisObject.getHeight();", - " const angle = -basisObject.getAngle() * Math.PI / 180;", - " object.setX(basisObject.getCenterXInScene() + object.getX() - object.getCenterXInScene() + deltaX * Math.cos(angle) + deltaY * Math.sin(angle));", - " object.setY(basisObject.getCenterYInScene() + object.getY() - object.getCenterYInScene() - deltaX * Math.sin(angle) + deltaY * Math.cos(angle));", - " }", - " // Unproportional dimensions changes won't work as expected", - " // if the object angle is not null but nothing more can be done", - " // because there is no full affine transformation on objects.", - " if (basisObject.getWidth() !== this.basisOriginalWidth) {", - " object.setWidth(this.relativeWidth * basisObject.getWidth());", - " }", - " if (basisObject.getHeight() !== this.basisOriginalHeight) {", - " object.setHeight(this.relativeHeight * basisObject.getHeight());", - " }", - " }", - "", - " this.updateOldCoordinates();", - " }", - " }", - "}", - "", - "gdjs._stickerExtension = {", - " Sticker", - "}" + "description": "Enable wrapping on the top and bottom borders.", + "fullName": "Enable vertical wrapping", + "functionType": "Action", + "name": "EnableVerticalWrapping", + "sentence": "Enable _PARAM0_ vertical wrapping: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableVerticalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyVerticalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableVerticalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyVerticalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } ], - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [], - "objectGroups": [] - }, - { - "description": "Check if the object is stuck to another object.", - "fullName": "Is stuck to another object", - "functionType": "Condition", - "name": "IsStuck", - "sentence": "_PARAM1_ is stuck to _PARAM3_", - "events": [ + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + }, + { + "description": "Value", + "name": "EnableVerticalWrapping", + "type": "yesorno" + } + ], + "objectGroups": [] + }, { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const stickerBehaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");", - "/** @type {Hashtable} */", - "const stickerObjectsLists = eventsFunctionContext.getObjectsLists(\"Object\");", - "/** @type {Hashtable} */", - "const basisObjectsLists = eventsFunctionContext.getObjectsLists(\"BasisObject\");", - "", - "eventsFunctionContext.returnValue = gdjs.evtTools.object.twoListsTest(", - " (stickerObject, basisObject) => {", - " const sticker = stickerObject.getBehavior(stickerBehaviorName)._sticker;", - " return sticker.isStuckTo(basisObject);", - " },", - " stickerObjectsLists,", - " basisObjectsLists,", - " false", - ");" + "description": "Top border (Y position).", + "fullName": "Top border", + "functionType": "Expression", + "name": "BorderTop", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderTop()" + ] + } + ] + } ], - "parameterObjects": "", - "useStrict": true, - "eventsSheetExpanded": true - } - ], - "parameters": [ + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, { - "description": "Sticker", - "name": "Object", - "type": "objectList" + "description": "Left border (X position).", + "fullName": "Left border", + "functionType": "Expression", + "name": "BorderLeft", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderLeft()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "description": "Sticker behavior", - "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", - "type": "behavior" + "description": "Right border (X position).", + "fullName": "Right border", + "functionType": "Expression", + "name": "BorderRight", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderRight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] }, { - "description": "Basis", - "name": "BasisObject", - "type": "objectList" - } - ], - "objectGroups": [] - } - ], - "eventsBasedBehaviors": [ - { - "description": "Stick the object to another. Use the action to stick the object, or unstick it later.", - "fullName": "Sticker", - "name": "Sticker", - "objectType": "", - "eventsFunctions": [ + "description": "Bottom border (Y position).", + "fullName": "Bottom border", + "functionType": "Expression", + "name": "BorderBottom", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderBottom()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Number of pixels past the center where the object teleports and appears.", + "fullName": "Trigger offset", + "functionType": "Expression", + "name": "TriggerOffset", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTriggerOffset()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, { - "fullName": "", + "description": "Set top border (Y position).", + "fullName": "Set top border", "functionType": "Action", - "name": "onCreated", - "sentence": "", + "name": "SetTopBorder", + "sentence": "Set _PARAM0_ top border to _PARAM2_", "events": [ { "type": "BuiltinCommonInstructions::Standard", @@ -17294,37 +16030,61 @@ "actions": [ { "type": { - "value": "Sticker::DefineHelperClasses" + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyBorderTop" }, "parameters": [ - "", - "" + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" ] } ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" }, { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const Sticker = gdjs._stickerExtension.Sticker;", - "", - "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");", - "const object = objects[0];", - "const behavior = object.getBehavior(behaviorName);", - "", - "behavior._sticker = new Sticker(behavior);", - "", - "// Set up the scene sticker objects list - if not done already.", - "runtimeScene._stickerExtension = runtimeScene._stickerExtension || {", - " allStickers: new Set(),", - "};", - "// Register this object as a sticker.", - "runtimeScene._stickerExtension.allStickers.add(behavior);", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + }, + { + "description": "Top border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set left border (X position).", + "fullName": "Set left border", + "functionType": "Action", + "name": "SetLeftBorder", + "sentence": "Set _PARAM0_ left border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyBorderLeft" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] } ], "parameters": [ @@ -17336,30 +16096,40 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", "type": "behavior" + }, + { + "description": "Left border value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "fullName": "", + "description": "Set bottom border (Y position).", + "fullName": "Set bottom border", "functionType": "Action", - "name": "doStepPreEvents", - "sentence": "", + "name": "SetBottomBorder", + "sentence": "Set _PARAM0_ bottom border to _PARAM2_", "events": [ { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");", - "const object = objects[0];", - "const behavior = object.getBehavior(behaviorName);", - "", - "behavior._sticker.onStepPreEvents();" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": false + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyBorderBottom" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] } ], "parameters": [ @@ -17371,30 +16141,40 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", "type": "behavior" + }, + { + "description": "Bottom border value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "fullName": "", + "description": "Set right border (X position).", + "fullName": "Set right border", "functionType": "Action", - "name": "doStepPostEvents", - "sentence": "", + "name": "SetRightBorder", + "sentence": "Set _PARAM0_ right border to _PARAM2_", "events": [ { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");", - "const object = objects[0];", - "const behavior = object.getBehavior(behaviorName);", - "", - "behavior._sticker.followBasisObject();" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyBorderRight" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] } ], "parameters": [ @@ -17406,35 +16186,40 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", "type": "behavior" + }, + { + "description": "Right border value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Stick on another object.", - "fullName": "Stick", + "description": "Set trigger offset (pixels).", + "fullName": "Set trigger offset", "functionType": "Action", - "name": "Stick", - "sentence": "Stick _PARAM0_ to _PARAM2_", + "name": "SetTriggerOffset", + "sentence": "Set _PARAM0_ trigger offset to _PARAM2_ pixels", "events": [ { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];", - "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");", - "const basisObjects = eventsFunctionContext.getObjects(\"BasisObject\");", - "", - "if (basisObjects.length === 0) return;", - "// An object can stick to only one object.", - "const basisObject = basisObjects[0];", - "object.getBehavior(behaviorName)._sticker.stickTo(basisObject);", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyTriggerOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] } ], "parameters": [ @@ -17446,37 +16231,62 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", "type": "behavior" }, { - "description": "Object to stick to", - "name": "BasisObject", - "type": "objectList" + "description": "SetScreen Offset Leaving Value", + "name": "Value", + "type": "expression" } ], "objectGroups": [] }, { - "description": "Unstick from the object it was stuck to.", - "fullName": "Unstick", + "description": "Save current velocity values.", + "fullName": "Save current velocity values", "functionType": "Action", - "name": "Unstick", - "sentence": "Unstick _PARAM0_", + "name": "SaveCurrentVelocities", + "sentence": "Save current velocity values of _PARAM0_", "events": [ { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const object = objects[0];", - "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");", - "const behavior = object.getBehavior(behaviorName);", - "", - "object.getBehavior(behaviorName)._sticker.unstick();", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyAngularVelocity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.RequiredPhysicsBehavior::AngularVelocity()" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyLinearVelocityX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.RequiredPhysicsBehavior::LinearVelocityX()" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetPropertyLinearVelocityY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.RequiredPhysicsBehavior::LinearVelocityY()" + ] + } + ] } ], "parameters": [ @@ -17488,31 +16298,57 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", "type": "behavior" } ], "objectGroups": [] }, { - "fullName": "", + "description": "Apply saved velocity values.", + "fullName": "Apply saved velocity values", "functionType": "Action", - "name": "onDestroy", - "sentence": "", + "name": "ApplySavedVelocities", + "sentence": "Apply saved velocity values of _PARAM0_", "events": [ - { - "type": "BuiltinCommonInstructions::JsCode", - "inlineCode": [ - "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");", - "const object = objects[0];", - "const behavior = object.getBehavior(behaviorName);", - "", - "runtimeScene._stickerExtension.allStickers.delete(behavior._sticker);", - "" - ], - "parameterObjects": "Object", - "useStrict": true, - "eventsSheetExpanded": true + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Physics2::AngularVelocity" + }, + "parameters": [ + "Object", + "RequiredPhysicsBehavior", + "=", + "Object.Behavior::PropertyAngularVelocity()" + ] + }, + { + "type": { + "value": "Physics2::LinearVelocityX" + }, + "parameters": [ + "Object", + "RequiredPhysicsBehavior", + "=", + "Object.Behavior::PropertyLinearVelocityX()" + ] + }, + { + "type": { + "value": "Physics2::LinearVelocityY" + }, + "parameters": [ + "Object", + "RequiredPhysicsBehavior", + "=", + "Object.Behavior::PropertyLinearVelocityY()" + ] + } + ] } ], "parameters": [ @@ -17524,7 +16360,7 @@ { "description": "Behavior", "name": "Behavior", - "supplementaryInformation": "Sticker::Sticker", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", "type": "behavior" } ], @@ -17534,21 +16370,112 @@ "propertyDescriptors": [ { "value": "", + "type": "Behavior", + "label": "Physics Behavior", + "description": "", + "group": "", + "extraInformation": [ + "Physics2::Physics2Behavior" + ], + "name": "RequiredPhysicsBehavior" + }, + { + "value": "true", "type": "Boolean", - "label": "Only follow the position", + "label": "Horizontal wrapping", "description": "", "group": "", "extraInformation": [], - "name": "OnlyFollowPosition" + "name": "HorizontalWrapping" }, { - "value": "", + "value": "true", "type": "Boolean", - "label": "Destroy when the object it's stuck on is destroyed", + "label": "Vertical wrapping", + "description": "", + "group": "", + "extraInformation": [], + "name": "VerticalWrapping" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Top border of wrapped area (Y)", + "description": "", + "group": "", + "extraInformation": [], + "name": "BorderTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Left border of wrapped area (X)", + "description": "", + "group": "", + "extraInformation": [], + "name": "BorderLeft" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Right border of wrapped area (X)", + "description": "If blank, the value will be the scene width.", + "group": "", + "extraInformation": [], + "name": "BorderRight" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Bottom border of wrapped area (Y)", + "description": "If blank, the value will be scene height.", + "group": "", + "extraInformation": [], + "name": "BorderBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Number of pixels past the center where the object teleports and appears", + "description": "", + "group": "", + "extraInformation": [], + "name": "TriggerOffset" + }, + { + "value": "0", + "type": "Number", + "label": "Angular Velocity", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "AngularVelocity" + }, + { + "value": "0", + "type": "Number", + "label": "Linear Velocity X", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LinearVelocityX" + }, + { + "value": "0", + "type": "Number", + "label": "Linear Velocity Y", "description": "", "group": "", "extraInformation": [], - "name": "IsDestroyedWithParent" + "hidden": true, + "name": "LinearVelocityY" } ], "sharedPropertyDescriptors": [] @@ -17584,6 +16511,8 @@ "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" ], "dependencies": [], + "globalVariables": [], + "sceneVariables": [], "eventsFunctions": [], "eventsBasedBehaviors": [ { @@ -18765,6 +17694,12 @@ ], "eventsBasedObjects": [ { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, "defaultName": "Button", "description": "A button that can be customized.", "fullName": "Button (panel sprite)", @@ -19399,7 +18334,7 @@ "actions": [ { "type": { - "value": "ModVarObjet" + "value": "SetNumberObjectVariable" }, "parameters": [ "Idle", @@ -19410,7 +18345,7 @@ }, { "type": { - "value": "ModVarObjet" + "value": "SetNumberObjectVariable" }, "parameters": [ "Idle", @@ -19717,10 +18652,11 @@ "actions": [ { "type": { - "value": "TextObject::String" + "value": "TextContainerCapability::TextContainerBehavior::SetValue" }, "parameters": [ "Label", + "Text", "=", "GetArgumentAsString(\"LabelText\")" ] @@ -20245,7 +19181,39 @@ "objectName": "Pressed" } ] - } + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [] } ] }, @@ -20298,6 +19266,8 @@ "gqDaZjCfevOOxBYkK6zlhtZnXCg1" ], "dependencies": [], + "globalVariables": [], + "sceneVariables": [], "eventsFunctions": [ { "fullName": "", @@ -20323,7 +19293,7 @@ "actions": [ { "type": { - "value": "SetSceneVariableAsBoolean" + "value": "SetBooleanVariable" }, "parameters": [ "__SwipeGesture.SwipeJustEnded", @@ -20380,7 +19350,7 @@ "actions": [ { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.EndPointX", @@ -20390,7 +19360,7 @@ }, { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.EndPointY", @@ -20427,7 +19397,7 @@ }, { "type": { - "value": "SetSceneVariableAsBoolean" + "value": "SetBooleanVariable" }, "parameters": [ "__SwipeGesture.SwipeInProgress", @@ -20436,7 +19406,7 @@ }, { "type": { - "value": "SetSceneVariableAsBoolean" + "value": "SetBooleanVariable" }, "parameters": [ "__SwipeGesture.SwipeJustEnded", @@ -20507,7 +19477,7 @@ "actions": [ { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.EndPointX", @@ -20517,7 +19487,7 @@ }, { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.EndPointY", @@ -20545,7 +19515,7 @@ "actions": [ { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.StartPointX", @@ -20555,7 +19525,7 @@ }, { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.StartPointY", @@ -20601,7 +19571,7 @@ }, { "type": { - "value": "SetSceneVariableAsBoolean" + "value": "SetBooleanVariable" }, "parameters": [ "__SwipeGesture.SwipeInProgress", @@ -20657,7 +19627,7 @@ "actions": [ { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.Distance", @@ -20673,7 +19643,7 @@ "actions": [ { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.DistanceX", @@ -20689,7 +19659,7 @@ "actions": [ { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.DistanceY", @@ -20717,7 +19687,7 @@ "actions": [ { "type": { - "value": "ModVarScene" + "value": "SetNumberVariable" }, "parameters": [ "__SwipeGesture.Angle", @@ -20762,7 +19732,7 @@ "actions": [ { "type": { - "value": "SetSceneVariableAsBoolean" + "value": "SetBooleanVariable" }, "parameters": [ "__SwipeGesture.Enabled", @@ -20771,7 +19741,7 @@ }, { "type": { - "value": "SetSceneVariableAsBoolean" + "value": "SetBooleanVariable" }, "parameters": [ "__SwipeGesture.SwipeInProgress", @@ -20804,7 +19774,7 @@ "actions": [ { "type": { - "value": "SetSceneVariableAsBoolean" + "value": "SetBooleanVariable" }, "parameters": [ "__SwipeGesture.Enabled", @@ -20987,7 +19957,7 @@ "actions": [ { "type": { - "value": "ModVarSceneTxt" + "value": "SetStringVariable" }, "parameters": [ "__SwipeGesture.Layer", @@ -21299,7 +20269,7 @@ "conditions": [ { "type": { - "value": "SceneVariableAsBoolean" + "value": "BooleanVariable" }, "parameters": [ "__SwipeGesture.SwipeInProgress", @@ -21334,7 +20304,7 @@ "conditions": [ { "type": { - "value": "SceneVariableAsBoolean" + "value": "BooleanVariable" }, "parameters": [ "__SwipeGesture.Enabled", @@ -21354,49 +20324,402 @@ ] } ], - "parameters": [], - "objectGroups": [] - }, - { - "description": "Check if the swipe has just ended.", - "fullName": "Swipe just ended", - "functionType": "Condition", - "name": "HasSwipeJustEnded", - "sentence": "Swipe has just ended", - "events": [ + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the swipe has just ended.", + "fullName": "Swipe just ended", + "functionType": "Condition", + "name": "HasSwipeJustEnded", + "sentence": "Swipe has just ended", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "__SwipeGesture.SwipeJustEnded", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if swipe moved in a given direction.", + "fullName": "Swipe moved in a direction (4-way movement)", + "functionType": "Condition", + "name": "SwipeDirection_4way", + "sentence": "Swipe moved in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SwipeGesture::Distance" + }, + "parameters": [ + "", + ">", + "0", + "" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Range (-180 to 180)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Up", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Up\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "-135" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "-45" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Down", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Down\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "45" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "135" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Left", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Left\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "-180" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "-135" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "135" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "180" + ] + } + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Right", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Right\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "-45" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "45" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "SceneVariableAsBoolean" - }, - "parameters": [ - "__SwipeGesture.SwipeJustEnded", - "True" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" } ], - "parameters": [], "objectGroups": [] }, { "description": "Check if swipe moved in a given direction.", - "fullName": "Swipe moved in a direction (4-way movement)", + "fullName": "Swipe moved in a direction (8-way movement)", "functionType": "Condition", - "name": "SwipeDirection_4way", + "name": "SwipeDirection_8way", "sentence": "Swipe moved in direction _PARAM1_", "events": [ { @@ -21430,7 +20753,506 @@ "colorG": 176, "colorR": 74, "creationTime": 0, - "name": "Up", + "name": "Up", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Up\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "-112.5" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "-67.5" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Down", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Down\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "67.5" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "112.5" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Left", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Left\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "-180" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "-157.5" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "157.5" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "180" + ] + } + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Right", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Right\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "-22.5" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "22.5" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "UpRight", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"UpRight\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "-67.5" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "-22.5" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "UpLeft", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"UpLeft\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "-157.5" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "-112.5" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "DownLeft", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"DownLeft\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + ">=", + "112.5" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SwipeGesture::Angle()", + "<", + "157.5" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "DownRight", "source": "", "type": "BuiltinCommonInstructions::Group", "events": [ @@ -21444,7 +21266,7 @@ "parameters": [ "GetArgumentAsString(\"Direction\")", "=", - "\"Up\"" + "\"DownRight\"" ] } ], @@ -21460,7 +21282,7 @@ "parameters": [ "SwipeGesture::Angle()", ">=", - "-135" + "22.5" ] }, { @@ -21470,7 +21292,7 @@ "parameters": [ "SwipeGesture::Angle()", "<", - "-45" + "67.5" ] } ], @@ -21488,878 +21310,1577 @@ ] } ], - "parameters": [] + "parameters": [] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "", + "extensionNamespace": "", + "fullName": "", + "helpPath": "", + "iconUrl": "", + "name": "LanePlatformer", + "previewIconUrl": "", + "shortDescription": "", + "version": "", + "description": "", + "tags": [], + "authorIds": [], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Switch between lanes of platforms.", + "fullName": "Lane platformer character", + "name": "LaneCharacter", + "objectType": "Scene3D::Model3DObject", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::PropertyHasJustBeenCreated" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::SetPropertyHasJustBeenCreated" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "LanePlatformer::LaneCharacter::SetPropertyLane" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::LaneOf(Object.Object3D::CenterZ())" + ] + }, + { + "type": { + "value": "LanePlatformer::LaneCharacter::SetPropertyTargetedLane" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Lane" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::UpdateLane" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This is done after the events that handles player controls :\n- to avoid a 1-frame delay" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Lane", + "!=", + "TargetedLane" + ] + }, + { + "type": { + "inverted": true, + "value": "Tween::Exists" + }, + "parameters": [ + "Object", + "Tween", + "\"Move\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Tween::AddObjectPositionZTween2" + }, + "parameters": [ + "Object", + "Tween", + "Object3D", + "\"Move\"", + "TargetedLane * LaneDepth", + "\"linear\"", + "LaneChangeDuration", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "- to avoid to cut animation when players move from 2 lanes in a row" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::Name" + }, + "parameters": [ + "Object", + "Animation", + "startsWith", + "\"Run\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Lane", + "=", + "TargetedLane" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "\"Run\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Lane", + "<", + "TargetedLane" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "\"RunRight\"" + ] + } + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Down", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"Down\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "45" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "135" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Lane", + ">", + "TargetedLane" ] } ], - "parameters": [] + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "\"RunLeft\"" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Update lane", + "functionType": "Action", + "name": "UpdateLane", + "sentence": "Update the lane of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::SetPropertyHasChangedOfLane" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Lane", + "!=", + "TargetedLane" + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Left", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"Left\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "BuiltinCommonInstructions::And" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "-180" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "-135" - ] - } - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::And" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "135" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "180" - ] - } - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } + "type": { + "value": "Tween::HasFinished" + }, + "parameters": [ + "Object", + "Tween", + "\"Move\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::SetPropertyLane" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "TargetedLane" + ] + }, + { + "type": { + "value": "Tween::RemoveTween" + }, + "parameters": [ + "Object", + "Tween", + "\"Move\"" + ] + }, + { + "type": { + "value": "LanePlatformer::LaneCharacter::SetPropertyHasChangedOfLane" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Enable platforms on lane", + "functionType": "Action", + "name": "EnablePlatformOnLane", + "sentence": "Enable _PARAM2_ on the same lane as _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "OtherObject", + "conditions": [], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "OtherObject", + "Platform", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::IsObjectOnSameLane" + }, + "parameters": [ + "Object", + "Behavior", + "OtherObject", + "Object3D", + "" ] } ], - "parameters": [] + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "OtherObject", + "Platform", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + }, + { + "description": "Platform", + "name": "OtherObject", + "type": "objectList" + }, + { + "description": "3D capability", + "name": "Object3D", + "supplementaryInformation": "Scene3D::Base3DBehavior", + "type": "behavior" + }, + { + "description": "Platform", + "name": "Platform", + "supplementaryInformation": "PlatformBehavior::PlatformBehavior", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Is on same lane", + "functionType": "Condition", + "name": "IsObjectOnSameLane", + "private": true, + "sentence": "_PARAM0_ on the same lane as _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::LaneOf" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Lane", + "OtherObject.Object3D::CenterZ()", + "Object3D" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + }, + { + "description": "Other object", + "name": "OtherObject", + "type": "objectList" + }, + { + "description": "3D capability", + "name": "Object3D", + "supplementaryInformation": "Scene3D::Base3DBehavior", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Lane of object", + "functionType": "ExpressionAndCondition", + "name": "LaneOf", + "private": true, + "sentence": "the lane of _PARAM2_ according to configuration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "round(CenterZ / LaneDepth)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + }, + { + "description": "Center Z", + "name": "CenterZ", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the lane of the object.", + "fullName": "Lane", + "functionType": "ExpressionAndCondition", + "name": "Lane", + "sentence": "the lane", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Lane" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Lane", + "name": "SetLane", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::SetPropertyLane" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Move left", + "functionType": "Action", + "name": "MoveLeft", + "sentence": "Move _PARAM0_ toward the left lane", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::UpdateLane" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Lane", + "=", + "TargetedLane" + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Right", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"Right\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "-45" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "45" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], - "parameters": [] + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Lane", + ">", + "LaneMin" + ] } ], - "parameters": [] + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::SetPropertyTargetedLane" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "1" + ] + } + ] } - ] + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Move right", + "functionType": "Action", + "name": "MoveRight", + "sentence": "Move _PARAM0_ toward the right lane", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::UpdateLane" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Lane", + "=", + "TargetedLane" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Lane", + "<", + "LaneMax" + ] + } + ], + "actions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::SetPropertyTargetedLane" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if has changed of lane.", + "fullName": "Has changed of lane", + "functionType": "Condition", + "name": "HasChangedOfLane", + "sentence": "_PARAM0_ has changed of lane", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::PropertyHasChangedOfLane" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + } + ], + "objectGroups": [] } ], - "parameters": [ + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Tween", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "160", + "type": "Number", + "unit": "Pixel", + "label": "Lane depth", + "description": "", + "group": "", + "extraInformation": [], + "name": "LaneDepth" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Lane", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Lane" + }, + { + "value": "1", + "type": "Number", + "label": "Targeted lane", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetedLane" + }, { - "description": "Direction", - "name": "Direction", - "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", - "type": "stringWithSelector" + "value": "", + "type": "Boolean", + "label": "Has changed of lane", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HasChangedOfLane" + }, + { + "value": "0", + "type": "Number", + "unit": "Dimensionless", + "label": "Minimum lane", + "description": "", + "group": "", + "extraInformation": [], + "name": "LaneMin" + }, + { + "value": "2", + "type": "Number", + "unit": "Dimensionless", + "label": "Maximum lane", + "description": "", + "group": "", + "extraInformation": [], + "name": "LaneMax" + }, + { + "value": "0.3", + "type": "Number", + "unit": "Second", + "label": "Lane change duration", + "description": "", + "group": "", + "extraInformation": [], + "name": "LaneChangeDuration" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "HasJustBeenCreated" } ], - "objectGroups": [] + "sharedPropertyDescriptors": [] }, { - "description": "Check if swipe moved in a given direction.", - "fullName": "Swipe moved in a direction (8-way movement)", - "functionType": "Condition", - "name": "SwipeDirection_8way", - "sentence": "Swipe moved in direction _PARAM1_", - "events": [ + "description": "Smoothly follow an object on Z axis.", + "fullName": "Smooth camera on Z", + "name": "SmoothCameraZ", + "objectType": "Scene3D::Model3DObject", + "eventsFunctions": [ { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ { - "type": { - "value": "SwipeGesture::Distance" + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 }, - "parameters": [ - "", - ">", - "0", - "" + "comment": "ln((1 - speed)) = ln(1 / 2) / halfwatTime" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "LanePlatformer::SmoothCameraZ::SetPropertyTranslationZLogSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(0.5) / TranslationZHalfwayDuration" + ] + } ] } ], - "actions": [], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::SmoothCameraZ", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", "events": [ { - "colorB": 224, - "colorG": 16, - "colorR": 189, - "creationTime": 0, - "name": "Range (-180 to 180)", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Up", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"Up\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "-112.5" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "-67.5" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], - "parameters": [] - }, - { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Down", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"Down\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "67.5" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "112.5" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Adjusting the default camera position." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterY" + }, + "parameters": [ + "", + "=", + "Object.CenterY() + OffsetY + YFromAngleAndDistance(ElevationAngle + 180, Distance)", + "", + "" + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Left", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"Left\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::Or" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "BuiltinCommonInstructions::And" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "-180" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "-157.5" - ] - } - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::And" - }, - "parameters": [], - "subInstructions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "157.5" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "180" - ] - } - ] - } - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], - "parameters": [] + "type": { + "value": "Scene3D::SetCameraZ" + }, + "parameters": [ + "", + "=", + "Object.Object3D::CenterZ()", + "", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraRotationY" + }, + "parameters": [ + "", + "=", + "-90", + "", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraRotationX" + }, + "parameters": [ + "", + "=", + "-ElevationAngle", + "", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Constant camera movement to follow the player." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Scene3D::SetCameraZ" + }, + "parameters": [ + "", + "=", + "Object.Object3D::CenterZ() + (Scene3D::CameraZ() - Object.Object3D::CenterZ()) * exp(TimeDelta() * TranslationZLogSpeed)", + "", + "" + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "Right", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"Right\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "-22.5" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "22.5" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], - "parameters": [] - }, + "type": { + "value": "SetCameraCenterX" + }, + "parameters": [ + "", + "=", + "Object.CenterX() + OffsetX + XFromAngleAndDistance(ElevationAngle + 180, Distance)", + "", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::SmoothCameraZ", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "X offset", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetX" + }, + { + "value": "-100", + "type": "Number", + "unit": "Pixel", + "label": "Y offset", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetY" + }, + { + "value": "400", + "type": "Number", + "unit": "Pixel", + "label": "Camera distance", + "description": "", + "group": "", + "extraInformation": [], + "name": "Distance" + }, + { + "value": "20", + "type": "Number", + "unit": "DegreeAngle", + "label": "Elevation angle", + "description": "", + "group": "", + "extraInformation": [], + "name": "ElevationAngle" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Halfway time on Z axis", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "TranslationZHalfwayDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TranslationZLogSpeed" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Allow to check the object lane.", + "fullName": "Lane object", + "name": "LaneObject", + "objectType": "Scene3D::Model3DObject", + "eventsFunctions": [ + { + "fullName": "Is on same lane", + "functionType": "Condition", + "name": "IsObjectOnSameLane", + "sentence": "_PARAM0_ on the same lane as _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This behavior only allow to pick the objects where the one from LaneCharacter only pick the characters." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LanePlatformer::LaneCharacter::IsObjectOnSameLane" + }, + "parameters": [ + "Character", + "LaneCharacter", + "Object", + "Object3D", + "" + ] + } + ], + "actions": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "UpRight", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"UpRight\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "-67.5" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "-22.5" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], - "parameters": [] - }, + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "LanePlatformer::LaneObject", + "type": "behavior" + }, + { + "description": "Character", + "name": "Character", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "objectList" + }, + { + "description": "Lane platformer character", + "name": "LaneCharacter", + "supplementaryInformation": "LanePlatformer::LaneCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "", + "extensionNamespace": "", + "fullName": "", + "helpPath": "", + "iconUrl": "", + "name": "Collectible", + "previewIconUrl": "", + "shortDescription": "", + "version": "", + "description": "", + "tags": [], + "authorIds": [], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [ + { + "folded": true, + "name": "RisingPitch", + "type": "number", + "value": 0.8 + } + ], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onScenePreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareTimer" + }, + "parameters": [ + "", + "\"RisingPitch\"", + ">", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "RisingPitch", + "=", + "0.8" + ] + }, + { + "type": { + "value": "RemoveTimer" + }, + "parameters": [ + "", + "\"RisingPitch\"" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Rotate continuously and make a sound when deleted.", + "fullName": "Collectible", + "name": "Collectible", + "objectType": "Scene3D::Model3DObject", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onDestroy", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reseting the rising pitch variable after being adjusted in the coin collision event." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "UpLeft", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"UpLeft\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "-157.5" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "-112.5" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], - "parameters": [] + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "CoinPickUp", + "", + "50", + "Variable(RisingPitch)" + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "DownLeft", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"DownLeft\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "112.5" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "157.5" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], - "parameters": [] + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "RisingPitch", + "*", + "1.03" + ] }, { - "colorB": 228, - "colorG": 176, - "colorR": 74, - "creationTime": 0, - "name": "DownRight", - "source": "", - "type": "BuiltinCommonInstructions::Group", - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareStrings" - }, - "parameters": [ - "GetArgumentAsString(\"Direction\")", - "=", - "\"DownRight\"" - ] - } - ], - "actions": [], - "events": [ - { - "type": "BuiltinCommonInstructions::Standard", - "conditions": [ - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - ">=", - "22.5" - ] - }, - { - "type": { - "value": "BuiltinCommonInstructions::CompareNumbers" - }, - "parameters": [ - "SwipeGesture::Angle()", - "<", - "67.5" - ] - } - ], - "actions": [ - { - "type": { - "value": "SetReturnBoolean" - }, - "parameters": [ - "True" - ] - } - ] - } - ] - } - ], - "parameters": [] + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "", + "\"RisingPitch\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Collectible::Collectible", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Rotating the coins in game." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Scene3D::Base3DBehavior::SetRotationY" + }, + "parameters": [ + "Object", + "Object3D", + "+", + "RotationSpeed * TimeDelta()" + ] } - ], - "parameters": [] + ] } - ] + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Scene3D::Model3DObject", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Collectible::Collectible", + "type": "behavior" + } + ], + "objectGroups": [] } ], - "parameters": [ + "propertyDescriptors": [ { - "description": "Direction", - "name": "Direction", - "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", - "type": "stringWithSelector" + "value": "60", + "type": "Number", + "unit": "AngularSpeed", + "label": "Rotation speed", + "description": "", + "group": "", + "extraInformation": [], + "name": "RotationSpeed" } ], - "objectGroups": [] + "sharedPropertyDescriptors": [] } ], - "eventsBasedBehaviors": [], "eventsBasedObjects": [] } ], @@ -22383,14 +22904,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22407,14 +22921,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22431,14 +22938,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22471,14 +22971,7 @@ "zOrder": 5, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22511,19 +23004,11 @@ "zOrder": 5, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22535,19 +23020,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22559,19 +23036,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22595,7 +23064,7 @@ "gridColor": 10401023, "gridAlpha": 0.8, "snap": true, - "zoomFactor": 0.4633111824513984, + "zoomFactor": 0.5117784035210186, "windowMask": false } }, @@ -22618,14 +23087,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22642,14 +23104,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22666,14 +23121,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22706,19 +23154,11 @@ "zOrder": 5, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22730,19 +23170,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22754,19 +23186,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22778,19 +23202,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22805,8 +23221,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22853,14 +23268,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22877,14 +23285,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22901,14 +23302,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -22928,8 +23322,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22941,19 +23334,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22965,19 +23350,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -22989,19 +23366,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23013,14 +23382,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": -45, @@ -23037,19 +23399,11 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23061,19 +23415,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23085,19 +23431,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23109,14 +23447,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23133,14 +23464,7 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] } ], "editionSettings": { @@ -23176,14 +23500,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23200,14 +23517,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23224,14 +23534,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23264,14 +23567,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23288,19 +23584,11 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23312,19 +23600,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23336,19 +23616,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23360,19 +23632,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23384,19 +23648,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23411,8 +23667,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23427,8 +23682,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23443,8 +23697,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23459,8 +23712,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23475,8 +23727,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23488,19 +23739,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23512,19 +23755,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23571,14 +23806,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23595,14 +23823,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23619,14 +23840,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23659,14 +23873,7 @@ "zOrder": 5, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23699,19 +23906,11 @@ "zOrder": 5, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23723,19 +23922,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23750,8 +23941,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23763,14 +23953,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] } ], "editionSettings": { @@ -23806,14 +23989,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23846,14 +24022,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23870,14 +24039,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -23894,19 +24056,11 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23918,19 +24072,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23942,19 +24088,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23966,19 +24104,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -23990,19 +24120,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24014,19 +24136,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24038,14 +24152,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] } ], "editionSettings": { @@ -24081,14 +24188,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24105,14 +24205,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24129,14 +24222,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24169,14 +24255,7 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24193,19 +24272,11 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24220,8 +24291,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24236,8 +24306,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24252,8 +24321,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24268,8 +24336,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24281,19 +24348,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24305,19 +24364,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24329,19 +24380,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24353,19 +24396,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24380,8 +24415,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24393,19 +24427,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24420,8 +24446,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24433,14 +24458,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": -45, @@ -24457,14 +24475,7 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": -45, @@ -24481,14 +24492,7 @@ "zOrder": 8, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] } ], "editionSettings": { @@ -24524,14 +24528,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24548,14 +24545,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24572,14 +24562,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24599,8 +24582,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24615,8 +24597,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24631,8 +24612,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24647,8 +24627,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24660,19 +24639,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24684,19 +24655,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24708,19 +24671,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24735,8 +24690,7 @@ }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24748,14 +24702,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24788,14 +24735,7 @@ "zOrder": 5, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] } ], "editionSettings": { @@ -24831,14 +24771,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24871,14 +24804,7 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 2 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -24895,19 +24821,11 @@ "zOrder": 4, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 0 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24919,19 +24837,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24943,19 +24853,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24967,19 +24869,11 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, - "customSize": true, - "depth": 10, + "customSize": false, "height": 64, "layer": "", "name": "Coin", @@ -24991,14 +24885,7 @@ "zOrder": 6, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] }, { "angle": 0, @@ -25015,14 +24902,7 @@ "zOrder": 5, "numberProperties": [], "stringProperties": [], - "initialVariables": [ - { - "folded": true, - "name": "Lane", - "type": "number", - "value": 1 - } - ] + "initialVariables": [] } ], "editionSettings": { diff --git a/examples/3d-lane-runner/Camera.png b/examples/3d-lane-runner/Camera.png deleted file mode 100644 index d816b1304..000000000 Binary files a/examples/3d-lane-runner/Camera.png and /dev/null differ