diff --git a/PixelComposer.yyp b/PixelComposer.yyp index c768c9c6a..d31f7898c 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -561,6 +561,12 @@ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"0 introduction.pxc","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"1 image import.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"1 image import.pxc","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"10 RigidSim.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"11 Fluid sim.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"12 Strand sim.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"13 Expression.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"14 Audio.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"15 Optimization.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"2 animation.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"2 animation.pxc","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"3 Group and collection.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, @@ -569,12 +575,20 @@ {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"4 Looping operation.pxc","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"5 Particle and effectors.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"5 Particle and effectors.pxc","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"6 Camera.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"6 Camera.pxc","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"7 Path.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"8 Batch processing.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"9 Armature.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"arrowRight.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"card_back.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"card_clubs_02.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"card_clubs_03.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"card_clubs_04.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"card_clubs_05.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"back-buildings.png","CopyToMask":-1,"filePath":"datafiles/Getting started/cyberpunk street",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"far-buildings.png","CopyToMask":-1,"filePath":"datafiles/Getting started/cyberpunk street",}, + {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"foreground.png","CopyToMask":-1,"filePath":"datafiles/Getting started/cyberpunk street",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"dice_1.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"dice_2.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, {"resourceType":"GMIncludedFile","resourceVersion":"1.0","name":"dice_3.png","CopyToMask":-1,"filePath":"datafiles/Getting started",}, diff --git a/datafiles/Getting started/0 introduction.png b/datafiles/Getting started/0 introduction.png index d8985771d..005c06618 100644 Binary files a/datafiles/Getting started/0 introduction.png and b/datafiles/Getting started/0 introduction.png differ diff --git a/datafiles/Getting started/1 image import.png b/datafiles/Getting started/1 image import.png index f15171dad..fe10c7d23 100644 Binary files a/datafiles/Getting started/1 image import.png and b/datafiles/Getting started/1 image import.png differ diff --git a/datafiles/Getting started/10 RigidSim.png b/datafiles/Getting started/10 RigidSim.png new file mode 100644 index 000000000..6c03490ab Binary files /dev/null and b/datafiles/Getting started/10 RigidSim.png differ diff --git a/datafiles/Getting started/11 Fluid sim.png b/datafiles/Getting started/11 Fluid sim.png new file mode 100644 index 000000000..ca18f88c7 Binary files /dev/null and b/datafiles/Getting started/11 Fluid sim.png differ diff --git a/datafiles/Getting started/12 Strand sim.png b/datafiles/Getting started/12 Strand sim.png new file mode 100644 index 000000000..4cac081d7 Binary files /dev/null and b/datafiles/Getting started/12 Strand sim.png differ diff --git a/datafiles/Getting started/13 Expression.png b/datafiles/Getting started/13 Expression.png new file mode 100644 index 000000000..ad48d28cc Binary files /dev/null and b/datafiles/Getting started/13 Expression.png differ diff --git a/datafiles/Getting started/14 Audio.png b/datafiles/Getting started/14 Audio.png new file mode 100644 index 000000000..bcbfe6ffe Binary files /dev/null and b/datafiles/Getting started/14 Audio.png differ diff --git a/datafiles/Getting started/15 Optimization.png b/datafiles/Getting started/15 Optimization.png new file mode 100644 index 000000000..970183648 Binary files /dev/null and b/datafiles/Getting started/15 Optimization.png differ diff --git a/datafiles/Getting started/2 animation.png b/datafiles/Getting started/2 animation.png index 57528a46a..c192f9041 100644 Binary files a/datafiles/Getting started/2 animation.png and b/datafiles/Getting started/2 animation.png differ diff --git a/datafiles/Getting started/3 Group and collection.png b/datafiles/Getting started/3 Group and collection.png index ef86a7c43..e016e67b8 100644 Binary files a/datafiles/Getting started/3 Group and collection.png and b/datafiles/Getting started/3 Group and collection.png differ diff --git a/datafiles/Getting started/4 Looping operation.png b/datafiles/Getting started/4 Looping operation.png index 923f8b4c3..73b0f39ec 100644 Binary files a/datafiles/Getting started/4 Looping operation.png and b/datafiles/Getting started/4 Looping operation.png differ diff --git a/datafiles/Getting started/5 Particle and effectors.png b/datafiles/Getting started/5 Particle and effectors.png index 9ae624f0f..5548e5ffd 100644 Binary files a/datafiles/Getting started/5 Particle and effectors.png and b/datafiles/Getting started/5 Particle and effectors.png differ diff --git a/datafiles/Getting started/6 Camera.png b/datafiles/Getting started/6 Camera.png new file mode 100644 index 000000000..6f5f1ea32 Binary files /dev/null and b/datafiles/Getting started/6 Camera.png differ diff --git a/datafiles/Getting started/6 Camera.pxc b/datafiles/Getting started/6 Camera.pxc new file mode 100644 index 000000000..7db2dd946 --- /dev/null +++ b/datafiles/Getting started/6 Camera.pxc @@ -0,0 +1,1419 @@ +{ + "addon":{ + }, + "metadata":{ + "tags":[ + ], + "description":"", + "author":"", + "contact":"", + "aut_id":0.0, + "alias":"", + "file_id":0.0 + }, + "preview":"{\"width\":128.0,\"height\":96.0,\"buffer\":\"eJztmj2S3EYMhZXoNk430AUcTODY8dbeQFfz\\\/eRaW9wCwQfgobvJ7hkieKWZ4V8DH\\\/6a2u9\\\/\\\/Pnre6lUKpVKpdJN9O3tr6mabf\\\/dVfzvq9nsi3+\\\/\\\/vnxs\\\/gbts1mk\\\/H79DV8vP\\\/69vj7f31+\\\/vxt+y5\\\/1+fJ79656NgFdl\\\/p3+051vN61zEyhyB\\\/KYal9Rv6HT1j4Rzt9ekZ9xxVR2fX\\\/Fft\\\/6xdrB\\\/O8iW8HuRmV7579V\\\/UhDNZSFtfgj+q0Un+ZvxE\\\/K3eYGmR\\\/n+1Ip7pe22MFesvieNd\\\/Bes\\\/9K+pjzc4viivsPem85\\\/zX7LJ53\\\/CR+5+f8C8\\\/\\\/BphG9kvTz6Pg68Ed9eCT\\\/J5\\\/\\\/oU0X5795TNsuRMVepJ767\\\/hpRv2XNrF2Zfn35AtzPsxlQ2H+d\\\/iS8hGSVf8Xnf+hr0bxJ+ds75wm\\\/gNyyb2nU5MO\\\/Bee\\\/3c9ppN\\\/xpfofPT9v3+t\\\/vq7\\\/sOYkeuN5v8sf8R7grx1Wn45kz+Tg038g\\\/x3+ev5Cc3pwl\\\/Melfnv0r+e9eh33v4H1jp+Z\\\/Y\\\/92VP7Q9mJ+6n4s4EzFicYKsdAxYNmbnf6\\\/3L7L\\\/+\\\/y\\\/ba1UrVb1MeKvrzswIPPfXZMVq0z+W0rM0oi\\\/t56Z+X81\\\/\\\/Ceys90\\\/stevflb1nKDYev+z4pFxH8m+0v5A1+21v2otlP5r\\\/ZB6B4jfWnVOB0Ps\\\/d\\\/KN9Ye5GvD3YM5E\\\/7G9jbxN\\\/apzfwn533FEOi\\\/s3iz+afdZ61VnitNT85vYNed7LHXMbf2tMtwD9az+GzylXzHmqGP9hgXCOvlXtK+X03d+p76vo+cf6H\\\/A1+IX\\\/Ux6JrEzWVOY\\\/Of7QmtP8P8j\\\/kj9ivnv+In1cvEcsgfqzrhtR\\\/OedvnIga3rL\\\/o\\\/kHe6NZsbCzKXov9fHO8we2ttT93bPk\\\/cVaoD3aTmKGa\\\/af5C9iP1X\\\/dd6dNP9LNt39PxnLrf0\\\/4g\\\/Pi\\\/J\\\/EP9w3a9S\\\/1n+Tg25jL+Vpyr+Xf7R\\\/Pd2rP\\\/6c6qnXCW9fsQfCcyPo2Lwkvw3fOHmqq6pI\\\/Z\\\/0p\\\/onSRb00fXfzJGqXwxagDjF3mOfP\\\/o8T+cB+5J2xPlqzjexX+S3PX18G9Yw8j7Hxi2zP834K99RvOfUP9HxhQ1\\\/50wzx78jN4tsLW85f2PVf\\\/f9vOLZOzFvls7SP+dzp+Z\\\/6P5j82faP77EP\\\/nl\\\/DRWTr4OMPf81eyd9D80Ts4572mySkbzwPieFvfzs\\\/Fn8r54f0\\\/a08nfxmf8N6T53\\\/IP5p9ovd\\\/g\\\/if0v9X4z9Lqu+txr+l\\\/sN9Yk\\\/\\\/H7D\\\/f0n+Ub4E\\\/e2s+i\\\/\\\/Vsl6Lv3+d9D+L2Q\\\/a\\\/735iXPdrT\\\/s3pRJ\\\/9sfTnwZ\\\/b\\\/iD\\\/KA+l3kP\\\/m\\\/L9i7iP+khdZ\\\/8NZpIN\\\/S\\\/3\\\/PNfK\\\/yiWXP6WJH9RCzT\\\/5dgjv7D1n5lBJ9V\\\/M2ay\\\/Bt8aOb\\\/w\\\/+782nS\\\/R8cO9SErDr5Z3mEDDvX\\\/Wr8TX8twL+l\\\/sP5v8UGK26c2SHNX85mM\\\/b\\\/i\\\/Pf+TaTh\\\/qaVv7IB4aP5MyAPu\\\/mUebeF2l1\\\/i3z346\\\/tIN5fyzzRl+P8t9hfuBvsbee7+Vyy\\\/4P1C6Tv7JvBv+Weczk32KDx4jh\\\/zD+\\\/kf7dtb+n+Hf6rsk\\\/+2ZqH535X+rDZna\\\/MA9X9b9p63\\\/qAY+U\\\/3vieGkH0P+Fnurrui8Hj3\\\/LcKfiYcUB81f2zKYfcj\\\/YfT\\\/TbPm\\\/4n8mTrQWs+G8pe2M\\\/3f499gz9laIf8j9lPmP203ep443sV\\\/8vwPfTyJPx2bxv0te3bxcAV\\\/9TvNn2V69vw\\\/Of\\\/ZWIjmxsMxVMeZ\\\/b+lqv9N\\\/FvrgNcbzH2DPLcl\\\/yONrv\\\/a1y8+\\\/7dyb6kh7Lqz+So5m\\\/zJnLhD\\\/rfWf+nXr+863434puq\\\/xT+wjcp\\\/3VsW0Ir80Rqic+l6kM1\\\/pg6z8Qyum62V+Ge4X6GMnbr+u\\\/fb4mAx\\\/iP9oet0lO\\\/Mc63vh3orbPv6N7Eey17vOJ3\\\/qAa05JWVa8mcTPtDrh99Vv9K27\\\/Y\\\/O7PvXmpY0jy967teU7LOQf+eg7Q73+ZWb8nlq7g35BvZ0nWAlmro5oyfB0qH7r5e\\\/nv3QPw1\\\/Uya4\\\/+zfJlNvdHM6FzVfrpAebBqGd9vMPPs3VGnKM4GrZW1UeeUR7\\\/q207u86NntkzvXU25xb\\\/H3oCsGOlXnp3RSyietUzG0XvQWb75g4K30cl+xV836Lfw8jZztrLe8eMNbfM\\\/\\\/S5T1KP76beffeZ66Kk9znR+0lrv8ruqcCeyV2bl8eLvdM7M\\\/9Zzt3xwPAYIXS\\\/iPlJ3EpjtOJM3RMj23EmlpjcY89\\\/Rr3Ku4VSXwwMuc+L5Ubp+ZmvWtdq1rmGffW2e6vYl0qlUqlUKpVKpVKpVCqVSqVSqVQqlUqlUulK\\\/QsqzZuP\"}", + "animator":{ + "frames_total":30.0, + "framerate":30.0 + }, + "onion_skin":{ + "alpha":0.5, + "color":[ + 255.0, + 16711680.0 + ], + "on_top":true, + "enabled":false, + "step":1.0, + "range":[ + -1.0, + 1.0 + ] + }, + "version":1440.0, + "nodes":[ + { + "id":"wX5zv4QFHeNmCPba", + "render":true, + "x":96.0, + "preview":true, + "array_process":0.0, + "inspectInputs":[ + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + false, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + false, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + } + ], + "group":-4.0, + "inputs":[ + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":"njyi0zmdvnEPkrjy", + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":0.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + [ + [ + 0.0, + 16.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 16.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 4.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 4.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ] + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + [ + 78.0, + 96.0, + 128.0, + 96.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + 0 + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + 1.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + false, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":"YYcGbUhykUOkZ7BT", + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":0.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ] + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":52.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":"Ltx4zWw2xrOvw8nL", + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":-8.0, + "visible":true, + "from_index":0.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ] + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ] + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + } + ], + "name":"Camera", + "outputs":[ + { + "visible":true + } + ], + "y":64.0, + "iname":"Camera72625", + "attri":{ + "array_process":0.0, + "color_depth":2.0, + "oversample":2.0 + }, + "type":"Node_Camera" + }, + { + "id":"YYcGbUhykUOkZ7BT", + "render":true, + "x":-256.0, + "preview":true, + "inspectInputs":[ + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + false, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + false, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + } + ], + "group":-4.0, + "inputs":[ + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + "D:\\Resources\\Pixel arts\\cyberpunk-street-files\\PNG\\back-buildings.png", + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ] + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + } + ], + "name":"back-buildings", + "outputs":[ + { + "visible":true + }, + { + "visible":true + } + ], + "y":224.0, + "iname":"back-buildings", + "attri":{ + "color_depth":1.0 + }, + "type":"Node_Image" + }, + { + "id":"Ltx4zWw2xrOvw8nL", + "render":true, + "x":-256.0, + "preview":true, + "inspectInputs":[ + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + false, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + false, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + } + ], + "group":-4.0, + "inputs":[ + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + "D:\\Resources\\Pixel arts\\cyberpunk-street-files\\PNG\\foreground.png", + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ] + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + } + ], + "name":"foreground", + "outputs":[ + { + "visible":true + }, + { + "visible":true + } + ], + "y":384.0, + "iname":"foreground", + "attri":{ + "color_depth":1.0 + }, + "type":"Node_Image" + }, + { + "id":"njyi0zmdvnEPkrjy", + "render":true, + "x":-256.0, + "preview":true, + "inspectInputs":[ + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + false, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + false, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + } + ], + "group":-4.0, + "inputs":[ + { + "shift_x":0.0, + "animators":[ + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + "D:\\Resources\\Pixel arts\\cyberpunk-street-files\\PNG\\far-buildings.png", + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":true, + "from_index":-1.0, + "global_key":"", + "on_end":0 + }, + { + "shift_x":0.0, + "animators":[ + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + [ + [ + 0.0, + 0.0, + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ] + ], + "unit":0, + "sep_axis":false, + "from_node":-1.0, + "global_use":false, + "anim":false, + "raw_value":[ + [ + 0.0, + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ], + [ + 0.0, + 0.0 + ], + 0, + 0 + ] + ], + "data":[ + ], + "shift_y":0.0, + "visible":false, + "from_index":-1.0, + "global_key":"", + "on_end":0 + } + ], + "name":"far-buildings", + "outputs":[ + { + "visible":true + }, + { + "visible":true + } + ], + "y":64.0, + "iname":"far-buildings", + "attri":{ + "color_depth":1.0 + }, + "type":"Node_Image" + } + ], + "global_node":{ + "inputs":[ + ] + } +} \ No newline at end of file diff --git a/datafiles/Getting started/7 Path.png b/datafiles/Getting started/7 Path.png new file mode 100644 index 000000000..b9c535ccf Binary files /dev/null and b/datafiles/Getting started/7 Path.png differ diff --git a/datafiles/Getting started/8 Batch processing.png b/datafiles/Getting started/8 Batch processing.png new file mode 100644 index 000000000..fe1c84b5f Binary files /dev/null and b/datafiles/Getting started/8 Batch processing.png differ diff --git a/datafiles/Getting started/9 Armature.png b/datafiles/Getting started/9 Armature.png new file mode 100644 index 000000000..71b0b4ce3 Binary files /dev/null and b/datafiles/Getting started/9 Armature.png differ diff --git a/datafiles/Getting started/cyberpunk street/back-buildings.png b/datafiles/Getting started/cyberpunk street/back-buildings.png new file mode 100644 index 000000000..e42788220 Binary files /dev/null and b/datafiles/Getting started/cyberpunk street/back-buildings.png differ diff --git a/datafiles/Getting started/cyberpunk street/far-buildings.png b/datafiles/Getting started/cyberpunk street/far-buildings.png new file mode 100644 index 000000000..7c8174747 Binary files /dev/null and b/datafiles/Getting started/cyberpunk street/far-buildings.png differ diff --git a/datafiles/Getting started/cyberpunk street/foreground.png b/datafiles/Getting started/cyberpunk street/foreground.png new file mode 100644 index 000000000..f958dae11 Binary files /dev/null and b/datafiles/Getting started/cyberpunk street/foreground.png differ diff --git a/datafiles/Welcome files.zip b/datafiles/Welcome files.zip index e328bc4fe..01c3d8acb 100644 Binary files a/datafiles/Welcome files.zip and b/datafiles/Welcome files.zip differ diff --git a/objects/o_dialog_add_node/Create_0.gml b/objects/o_dialog_add_node/Create_0.gml index 88d4f4077..b5debd6f9 100644 --- a/objects/o_dialog_add_node/Create_0.gml +++ b/objects/o_dialog_add_node/Create_0.gml @@ -292,6 +292,15 @@ event_inherited(); } else if(ADD_NODE_PAGE == NODE_PAGE_DEFAULT) { _list = ds_list_create(); + if(node_called != noone) { + var sug = ds_map_try_get(global.VALUE_SUGGESTION, node_called.type, []); + if(array_length(sug)) { + ds_list_add(_list, "Related"); + for( var i = 0; i < array_length(sug); i++ ) + ds_list_add(_list, ALL_NODES[? sug[i]]); + } + } + ds_list_add(_list, "Favourites"); for( var i = 0; i < array_length(global.FAV_NODES); i++ ) { var _nodeIndex = global.FAV_NODES[i]; diff --git a/objects/o_dialog_splash/Create_0.gml b/objects/o_dialog_splash/Create_0.gml index 865ce1e29..9e5149837 100644 --- a/objects/o_dialog_splash/Create_0.gml +++ b/objects/o_dialog_splash/Create_0.gml @@ -167,7 +167,7 @@ event_inherited(); var sw = sprite_get_width(spr); var sh = sprite_get_height(spr); - var s = min(gw / sw, gh / sh); + var s = 1; var ox = (sprite_get_xoffset(spr) - sw / 2) * s / 2; var oy = (sprite_get_yoffset(spr) - sh / 2) * s / 2; diff --git a/scripts/array_functions/array_functions.gml b/scripts/array_functions/array_functions.gml index ccc18307e..4f7a7cdd8 100644 --- a/scripts/array_functions/array_functions.gml +++ b/scripts/array_functions/array_functions.gml @@ -62,6 +62,17 @@ function array_push_create(arr, val) { return arr; } +function array_get_decimal(arr, index, color = false) { + if(frac(index) == 0) return array_safe_get(arr, index); + + var v0 = array_safe_get(arr, floor(index)); + var v1 = array_safe_get(arr, floor(index) + 1); + + return color? + merge_color(v0, v1, frac(index)) : + lerp(v0, v1, frac(index)); +} + function array_exists(arr, val) { for( var i = 0; i < array_length(arr); i++ ) { if(isEqual(arr[i], val)) return true; diff --git a/scripts/buttonGradient/buttonGradient.gml b/scripts/buttonGradient/buttonGradient.gml index 587e6412e..f4e74e991 100644 --- a/scripts/buttonGradient/buttonGradient.gml +++ b/scripts/buttonGradient/buttonGradient.gml @@ -11,7 +11,7 @@ function buttonGradient(_onApply, dialog = noone) : widget() constructor { static trigger = function() { var dialog = dialogCall(o_dialog_gradient, WIN_W / 2, WIN_H / 2); - dialog.setDefault(current_gradient); + dialog.setDefault(current_gradient.clone()); dialog.onApply = apply; dialog.interactable = interactable; diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index 9aa2d20ab..7af076992 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -69,7 +69,7 @@ globalvar VERSION, SAVE_VERSION, VERSION_STRING, BUILD_NUMBER; VERSION = 1147; - SAVE_VERSION = 1440; + SAVE_VERSION = 1447; VERSION_STRING = "1.14.6n3"; BUILD_NUMBER = 114600; diff --git a/scripts/gradients_function/gradients_function.gml b/scripts/gradients_function/gradients_function.gml index be33e6d80..7ac493aee 100644 --- a/scripts/gradients_function/gradients_function.gml +++ b/scripts/gradients_function/gradients_function.gml @@ -10,7 +10,7 @@ function gradientKey(time, value) constructor { static clone = function() { return new gradientKey(time, value); } - static serialize = function() { return self; } + static serialize = function() { return {time, value}; } } function gradientObject(color = c_black) constructor { @@ -126,8 +126,46 @@ function gradientObject(color = c_black) constructor { return [ _grad_color, _grad_time ]; } + static lerpTo = function(target, amount) { + var grad = new gradientObject(); + grad.keys = []; + grad.type = type; + + var key_count = ceil(lerp(array_length(keys), array_length(target.keys), amount)); + + for( var i = 0; i < key_count; i++ ) { + var rat = i / (key_count - 1); + + var kf = keys[rat * (array_length(keys) - 1)]; + var kt = target.keys[rat * (array_length(target.keys) - 1)]; + + var time = lerp(kf.time, kt.time, amount); + var value = merge_color(eval(time), target.eval(time), amount); + + grad.keys[i] = new gradientKey(time, value); + } + + return grad; + } + + static clone = function() { + var g = new gradientObject(); + g.keys = []; + g.type = type; + + for( var i = 0; i < array_length(keys); i++ ) + g.keys[i] = keys[i].clone(); + + return g; + } + static serialize = function() { - return json_stringify(self, false); + var s = {type}; + s.keys = []; + for( var i = 0; i < array_length(keys); i++ ) + s.keys[i] = keys[i].serialize(); + + return json_stringify(s, false); } static deserialize = function(str) { diff --git a/scripts/node_camera/node_camera.gml b/scripts/node_camera/node_camera.gml index e029eca1d..6049ee9ae 100644 --- a/scripts/node_camera/node_camera.gml +++ b/scripts/node_camera/node_camera.gml @@ -14,44 +14,47 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co uni_fix_bg = shader_get_uniform(shader, "fixBG"); inputs[| 0] = nodeValue("Background", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0); - inputs[| 1] = nodeValue("Focus area", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 16, 16, 4, 4, AREA_SHAPE.rectangle ]) + inputs[| 1] = nodeValue("Focus area", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [ 0, 0, 16, 16, AREA_SHAPE.rectangle ]) .setDisplay(VALUE_DISPLAY.area, function() { return getDimension(0); }); inputs[| 2] = nodeValue("Zoom", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 1) .setDisplay(VALUE_DISPLAY.slider, [ 0.01, 4, 0.01 ]); inputs[| 3] = nodeValue("Oversample mode", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0, "How to deal with pixel outside the surface.\n - Empty: Use empty pixel\n - Clamp: Repeat edge pixel\n - Repeat: Repeat texture.") - .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Empty", "Clamp", "Repeat" ]); + .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Empty", "Repeat" ]); inputs[| 4] = nodeValue("Fix background", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false); outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ - ["Output", true], 0, 4, - ["Camera", false], 1, 2, - ["Elements", true], + ["Background", true], 0, 4, 3, + ["Camera", false], 1, 2, + ["Elements", true], ]; attribute_surface_depth(); - attribute_oversample(); - + input_display_len = array_length(input_display_list); - input_fix_len = ds_list_size(inputs); - data_length = 2; + input_fix_len = ds_list_size(inputs); + data_length = 3; + + temp_surface = [ noone, noone ]; function createNewInput() { var index = ds_list_size(inputs); var _s = floor((index - input_fix_len) / data_length); - inputs[| index + 0] = nodeValue("Element " + string(_s), self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0); + inputs[| index + 0] = nodeValue($"Element {_s}", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, 0); - inputs[| index + 1] = nodeValue("Parallax " + string(_s), self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ] ) + inputs[| index + 1] = nodeValue($"Parallax {_s}", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, [ 0, 0, 0 ] ) .setDisplay(VALUE_DISPLAY.vector) .setUnitRef(function(index) { return getDimension(index); }); - array_push(input_display_list, index + 0); - array_push(input_display_list, index + 1); + inputs[| index + 2] = nodeValue($"Oversample {_s}", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) + .setDisplay(VALUE_DISPLAY.enum_scroll, [ "Empty", "Repeat" ]); + + array_append(input_display_list, [ index + 0, index + 1, index + 2 ]); } if(!LOADING && !APPENDING) createNewInput(); @@ -67,12 +70,15 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co if(inputs[| i].value_from) { ds_list_add(_in, inputs[| i + 0]); ds_list_add(_in, inputs[| i + 1]); + ds_list_add(_in, inputs[| i + 2]); array_push(input_display_list, i + 0); array_push(input_display_list, i + 1); + array_push(input_display_list, i + 2); } else { delete inputs[| i + 0]; delete inputs[| i + 1]; + delete inputs[| i + 2]; } } @@ -101,15 +107,15 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co var _area = current_data[1]; var _zoom = current_data[2]; - var _px = _x + (_area[0] - _area[2] * _zoom) * _s; - var _py = _y + (_area[1] - _area[3] * _zoom) * _s; + var _cam_x = _x + (_area[0] - _area[2] * _zoom) * _s; + var _cam_y = _y + (_area[1] - _area[3] * _zoom) * _s; - draw_surface_ext_safe(_out, _px, _py, _s * _zoom, _s * _zoom); + draw_surface_ext_safe(_out, _cam_x, _cam_y, _s * _zoom, _s * _zoom); inputs[| 1].drawOverlay(active, _x, _y, _s, _mx, _my, _snx, _sny); draw_set_color(COLORS._main_accent); - var x0 = _px; - var y0 = _py; + var x0 = _cam_x; + var y0 = _cam_y; var x1 = x0 + _area[2] * 2 * _zoom * _s; var y1 = y0 + _area[3] * 2 * _zoom * _s; @@ -120,23 +126,26 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co if(!is_surface(_data[0])) return; var _area = _data[1]; var _zoom = _data[2]; - var _samp = struct_try_get(attributes, "oversample"); + var _samp = _data[3]; var _fix = _data[4]; var cDep = attrDepth(); - var _dw = round(surface_valid_size(_area[2]) * 2); - var _dh = round(surface_valid_size(_area[3]) * 2); - _outSurf = surface_verify(_outSurf, _dw, _dh, cDep); - var pingpong = [ surface_create_valid(_dw, _dh, cDep), surface_create_valid(_dw, _dh, cDep) ]; - var ppInd = 0; + var _cam_x = round(_area[0]); + var _cam_y = round(_area[1]); + var _cam_w = round(_area[2]); + var _cam_h = round(_area[3]); + + var _surf_w = round(surface_valid_size(_cam_w * 2)); + var _surf_h = round(surface_valid_size(_cam_h * 2)); + var ppInd = 0; + + _outSurf = surface_verify(_outSurf, _surf_w, _surf_h, cDep); + temp_surface[0] = surface_verify(temp_surface[0], _surf_w, _surf_h, cDep); + temp_surface[1] = surface_verify(temp_surface[1], _surf_w, _surf_h, cDep); - var _px = round(_area[0]); - var _py = round(_area[1]); - var _pw = round(_area[2]); - var _ph = round(_area[3]); var amo = (ds_list_size(inputs) - input_fix_len) / data_length - 1; - surface_set_target(pingpong[0]); + surface_set_target(temp_surface[0]); DRAW_CLEAR BLEND_OVERRIDE; if(amo <= 0) { @@ -144,14 +153,14 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co if(_samp) draw_surface_tiled_safe(_data[0], 0, 0); else draw_surface_safe(_data[0], 0, 0); } else { - var sx = _px / _zoom - _pw; - var sy = _py / _zoom - _ph; + var sx = _cam_x / _zoom - _cam_w; + var sy = _cam_y / _zoom - _cam_h; if(_samp) draw_surface_tiled_ext_safe(_data[0], -sx, -sy, 1 / _zoom, 1 / _zoom, c_white, 1); else draw_surface_ext_safe(_data[0], -sx, -sy, 1 / _zoom, 1 / _zoom, 0, c_white, 1); } } else { - var sx = _px / _zoom - _pw; - var sy = _py / _zoom - _ph; + var sx = _cam_x / _zoom - _cam_w; + var sy = _cam_y / _zoom - _cam_h; if(_fix) draw_surface_safe(_data[0], 0, 0); else draw_surface_tiled_ext_safe(_data[0], sx, sy, 1 / _zoom, 1 / _zoom, c_white, 1); @@ -159,36 +168,38 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co BLEND_NORMAL; surface_reset_target(); - surface_set_target(pingpong[1]); + surface_set_target(temp_surface[1]); DRAW_CLEAR surface_reset_target(); shader_set(shader); - shader_set_uniform_f(uni_dim_cam, _dw, _dh); + shader_set_uniform_f(uni_dim_cam, _surf_w, _surf_h); shader_set_uniform_f(uni_zom, _zoom); - shader_set_uniform_i(uni_sam_mod, _samp); for( var i = 0; i < amo; i++ ) { ppInd = !ppInd; - surface_set_target(pingpong[ppInd]); + surface_set_target(temp_surface[ppInd]); var ind = input_fix_len + i * data_length; - var sz = _data[ind + 1][2]; - var sx = _data[ind + 1][0] * sz * _px; - var sy = _data[ind + 1][1] * sz * _py; - var _surface = _data[ind]; + var sz = _data[ind + 1][2]; + var sx = _data[ind + 1][0] * sz * _cam_x; + var sy = _data[ind + 1][1] * sz * _cam_y; + var _samp = _data[ind + 2]; + var _scnW = surface_get_width(_surface); var _scnH = surface_get_height(_surface); + shader_set_uniform_i(uni_sam_mod, _samp); shader_set_uniform_f(uni_dim_scn, _scnW, _scnH); shader_set_uniform_f(uni_blur, sz); - shader_set_uniform_f(uni_pos, (_px + sx) / _scnW, (_py + sy) / _scnH); + shader_set_uniform_f(uni_pos, (_cam_x + sx) / _scnW, (_cam_y + sy) / _scnH); shader_set_uniform_i(uni_fix_bg, !i && _fix); - texture_set_stage(uni_backg, surface_get_texture(pingpong[!ppInd])); //prev surface + + texture_set_stage(uni_backg, surface_get_texture(temp_surface[!ppInd])); //prev surface texture_set_stage(uni_scene, surface_get_texture(_surface)); //surface to draw - draw_sprite_ext(s_fx_pixel, 0, 0, 0, _dw, _dh, 0, c_white, 1); + draw_sprite_ext(s_fx_pixel, 0, 0, 0, _surf_w, _surf_h, 0, c_white, 1); surface_reset_target(); } @@ -197,13 +208,10 @@ function Node_Camera(_x, _y, _group = noone) : Node_Processor(_x, _y, _group) co surface_set_target(_outSurf); DRAW_CLEAR BLEND_OVERRIDE; - draw_surface_safe(pingpong[ppInd], 0, 0); + draw_surface_safe(temp_surface[ppInd], 0, 0); BLEND_NORMAL; surface_reset_target(); - surface_free(pingpong[0]); - surface_free(pingpong[1]); - return _outSurf; } diff --git a/scripts/node_export/node_export.gml b/scripts/node_export/node_export.gml index 6f045ab7d..cf49c5d15 100644 --- a/scripts/node_export/node_export.gml +++ b/scripts/node_export/node_export.gml @@ -104,6 +104,9 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor inputs[| 11] = nodeValue("Sequence begin", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0) + inputs[| 12] = nodeValue("Frame range", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, [0, -1]) + .setDisplay(VALUE_DISPLAY.slider_range, [0, PROJECT.animator.frames_total, 1]) + outputs[| 0] = nodeValue("Loop exit", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, 0); outputs[| 1] = nodeValue("Preview", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone) @@ -112,7 +115,7 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor input_display_list = [ ["Export", false], 0, 1, 2, 4, ["Format ", false], 3, 9, - ["Settings", false], 8, 5, 6, 7, 10, 11, + ["Settings", false], 12, 8, 5, 6, 7, 10, 11, ]; directory = DIRECTORY + "temp/" + string(irandom_range(100000, 999999)); @@ -369,13 +372,22 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor } static export = function() { - var surf = inputs[| 0].getValue(); - var path = inputs[| 1].getValue(); - var suff = inputs[| 2].getValue(); - var form = inputs[| 3].getValue(); + var surf = inputs[| 0].getValue(); + var path = inputs[| 1].getValue(); + var suff = inputs[| 2].getValue(); + var form = inputs[| 3].getValue(); + var rang = inputs[| 12].getValue(); var _ts = current_time; + if(form >= 1) { + var rng_s = rang[0]; + var rng_e = rang[1] == -1? PROJECT.animator.frames_total : rang[1]; + + if(PROJECT.animator.current_frame < rng_s) return; + if(PROJECT.animator.current_frame > rng_e) return; + } + if(is_array(surf)) { var p = ""; for(var i = 0; i < array_length(surf); i++) { @@ -484,6 +496,8 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor inputs[| 7].setVisible(anim == 2); inputs[| 8].setVisible(anim == 2); inputs[| 11].setVisible(anim == 1); + inputs[| 12].setVisible(anim >= 1); + inputs[| 12].editWidget.maxx = PROJECT.animator.frames_total; if(anim == NODE_EXPORT_FORMAT.gif) { inputs[| 9].display_data = format_animation; @@ -521,12 +535,13 @@ function Node_Export(_x, _y, _group = noone) : Node(_x, _y, _group) constructor if(anim != NODE_EXPORT_FORMAT.gif) return; - var surf = inputs[| 0].getValue(); - var path = inputs[| 1].getValue(); - var suff = inputs[| 2].getValue(); - var extd = inputs[| 9].getValue(); + var surf = inputs[| 0].getValue(); + var path = inputs[| 1].getValue(); + var suff = inputs[| 2].getValue(); + var extd = inputs[| 9].getValue(); + var rang = inputs[| 12].getValue(); var temp_path, target_path; - + if(is_array(surf)) { for(var i = 0; i < array_length(surf); i++) { temp_path = directory + "/" + string(i) + "/" + "*.png"; diff --git a/scripts/node_keyframe/node_keyframe.gml b/scripts/node_keyframe/node_keyframe.gml index 093bfff25..076028f0b 100644 --- a/scripts/node_keyframe/node_keyframe.gml +++ b/scripts/node_keyframe/node_keyframe.gml @@ -97,13 +97,28 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor { static lerpValue = function(from, to, _lrp) { var _f = from.value; var _t = to.value; + + if(is_struct(_f)) { + if(!struct_has(_f, "lerpTo")) return _f; + return _f.lerpTo(_t, _lrp); + } if(prop.type == VALUE_TYPE.color) { - if(is_array(_f)) { - var amo = max(array_length(_f), array_length(_t)); - var res = array_create(amo); - for( var i = 0; i < amo; i++ ) - res[i] = merge_color(array_safe_get(_f, i, 0), array_safe_get(_t, i, 0), _lrp); + if(is_array(_f) && is_array(_t)) { + var _len = ceil(lerp(array_length(_f), array_length(_t), _lrp)); + var res = array_create(_len); + + for( var i = 0; i < _len; i++ ) { + var rat = i / (_len - 1); + + var rf = rat * (array_length(_f) - 1); + var rt = rat * (array_length(_t) - 1); + + var cf = array_get_decimal(_f, rf, true); + var ct = array_get_decimal(_t, rt, true); + + res[i] = merge_color(cf, ct, _lrp); + } return res; } @@ -148,9 +163,6 @@ function valueAnimator(_val, _prop, _sep_axis = false) constructor { if(ds_list_size(values) == 1) return processType(values[| 0].value); - if(prop.type == VALUE_TYPE.gradient) - return values[| 0].value; - if(prop.type == VALUE_TYPE.path) return processType(values[| 0].value); diff --git a/scripts/node_registry/node_registry.gml b/scripts/node_registry/node_registry.gml index c947322ff..ffe2ee632 100644 --- a/scripts/node_registry/node_registry.gml +++ b/scripts/node_registry/node_registry.gml @@ -47,7 +47,7 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { function nodeBuild(_name, _x, _y, _group = PANEL_GRAPH.getCurrentContext()) { if(!ds_map_exists(ALL_NODES, _name)) { - log_warning("LOAD", "Node type " + _name + " not found"); + log_warning("LOAD", $"Node type {_name} not found"); return noone; } @@ -553,7 +553,7 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { addNodeObject(color, "Palette Replace", s_node_palette_replace, "Node_Palette_Replace", [1, Node_Palette_Replace]).setVersion(1120); ds_list_add(color, "Gradient"); - addNodeObject(color, "Gradient", s_node_gradient_out, "Node_6radient_Out", [1, Node_Gradient_Out]); + addNodeObject(color, "Gradient", s_node_gradient_out, "Node_Gradient_Out", [1, Node_Gradient_Out]); addNodeObject(color, "Palette to Gradient", s_node_gradient_palette, "Node_Gradient_Palette", [1, Node_Gradient_Palette],, "Create gradient from palette.").setVersion(1135); addNodeObject(color, "Gradient Shift", s_node_gradient_shift, "Node_Gradient_Shift", [1, Node_Gradient_Shift],, "Move gradients keys."); addNodeObject(color, "Gradient Replace", s_node_gradient_replace, "Node_Gradient_Replace_Color", [1, Node_Gradient_Replace_Color]).setVersion(1135); @@ -619,10 +619,46 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { addNodeObject(hid, "Hexagonal Noise", s_node_grid_hex_noise, "Node_Noise_Hex", [1, Node_Noise_Hex]).setVersion(1090); addNodeObject(hid, "Sort Input", s_node_grid_hex_noise, "Node_Iterator_Sort_Input", [1, Node_Iterator_Sort_Input]); addNodeObject(hid, "Sort Output", s_node_grid_hex_noise, "Node_Iterator_Sort_Output", [1, Node_Iterator_Sort_Output]); - addNodeObject(node, "Onion Skin", s_node_cache, "Node_Onion_Skin", [1, Node_Onion_Skin]).setVersion(1147); + addNodeObject(hid, "Onion Skin", s_node_cache, "Node_Onion_Skin", [1, Node_Onion_Skin]).setVersion(1147); } #endregion +#region node suggestion + global.VALUE_SUGGESTION = ds_map_create(); + + global.VALUE_SUGGESTION[? VALUE_TYPE.integer] = [ "Node_Math", "Node_Equation", "Node_To_Text" ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.float] = [ "Node_Math", "Node_Equation", "Node_To_Text" ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.boolean] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.color] = [ "Node_Solid", "Node_Color_Data", "Node_Color_Mix" ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.surface] = [ "Node_Transform", "Node_Blend", "Node_Composite", "Node_Export" ]; + + global.VALUE_SUGGESTION[? VALUE_TYPE.path] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.curve] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.text] = [ "Node_Text", "Node_To_Number" ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.object] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.node] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.d3object] = [ ]; + + global.VALUE_SUGGESTION[? VALUE_TYPE.any] = [ ]; + + global.VALUE_SUGGESTION[? VALUE_TYPE.pathnode] = [ "Node_Line", "Node_Mesh_Create_Path" ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.particle] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.rigid] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.fdomain] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.struct] = [ "Node_Struct_Get" ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.strands] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.mesh] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.trigger] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.atlas] = [ "Node_Atlas_Draw", "Node_Atlas_Get", "Node_Atlas_Set" ]; + + global.VALUE_SUGGESTION[? VALUE_TYPE.d3vertex] = [ ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.gradient] = [ "Node_Gradient", "Node_Gradient_Extract" ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.armature] = [ "Node_Armature_Pose", "Node_Armature_Bind" ]; + global.VALUE_SUGGESTION[? VALUE_TYPE.buffer] = [ ]; + + global.VALUE_SUGGESTION[? VALUE_TYPE.action] = [ ]; +#endregion + #region node function function nodeLoad(_data, scale = false, _group = PANEL_GRAPH.getCurrentContext()) { if(!is_struct(_data)) return; @@ -691,8 +727,8 @@ function NodeObject(_name, _spr, _node, _create, tags = []) constructor { var splt = string_splice(strs[0], "["); var inp = PROJECT.globalNode.getInput(strs[0]); _val = inp == noone? 0 : inp.getValueRecursive()[0]; - } else if(strs[0] == "Project") { - switch(strs[1]) { + } else if(string_lower(strs[0]) == "project") { + switch(string_lower(strs[1])) { case "frame" : return PROJECT.animator.current_frame; case "frameTotal" : return PROJECT.animator.frames_total; case "fps" : return PROJECT.animator.framerate; diff --git a/scripts/node_value/node_value.gml b/scripts/node_value/node_value.gml index 97221fb17..6bad72430 100644 --- a/scripts/node_value/node_value.gml +++ b/scripts/node_value/node_value.gml @@ -515,7 +515,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru } static isAnimable = function() { - if(type == VALUE_TYPE.gradient) return false; + //if(type == VALUE_TYPE.gradient) return false; if(display_type == VALUE_DISPLAY.text_array) return false; return true; } diff --git a/shaders/sh_camera/sh_camera.fsh b/shaders/sh_camera/sh_camera.fsh index b416773d7..8c136f4f3 100644 --- a/shaders/sh_camera/sh_camera.fsh +++ b/shaders/sh_camera/sh_camera.fsh @@ -21,8 +21,6 @@ vec4 sampleTexture(sampler2D samp, vec2 pos) { if(sampleMode == 0) return vec4(0.); if(sampleMode == 1) - return texture2D(samp, clamp(pos, 0., 1.)); - if(sampleMode == 2) return texture2D(samp, fract(pos)); return vec4(0.);